From e27bd95b72af8a23648b80c65f53099efe16d355 Mon Sep 17 00:00:00 2001
From: wtp <1813748440@qq.com>
Date: Tue, 28 Mar 2023 17:06:05 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
GDZZ.Application/Entity/Balance.cs | 4 -
GDZZ.Application/Entity/BaseUser.cs | 14 +-
GDZZ.Application/Entity/Consume.cs | 35 ++++
GDZZ.Application/Entity/LiveUserFriend.cs | 4 -
GDZZ.Application/GDZZ.Application.xml | 167 ++++++++++++------
GDZZ.Application/Service/Auth/AuthService.cs | 95 ++++++----
.../Service/Auth/DTO/AuthUserOut.cs | 17 +-
.../Service/BaseUser/BaseUserService.cs | 56 +++++-
.../Service/BaseUser/Dto/BaseUserInput.cs | 20 +++
.../Service/LiveChat/ILiveChatService.cs | 18 --
.../Service/LiveChat/LiveChatService.cs | 45 -----
.../Dto/LiveHistoryContactsInput.cs | 11 ++
.../LiveHistoryContactsService.cs | 84 +++++----
.../Service/WXPay/WXPayService.cs | 53 +++++-
GDZZ.Core/Enum/ErrorCode.cs | 19 +-
GDZZ.Core/GDZZ.Core.xml | 25 +++
GDZZ.Core/OAuth/PhoneModel.cs | 9 +-
GDZZ.Core/Service/Role/SysRoleService.cs | 17 ++
.../Upload/Default/400356345643077.jpg | Bin 0 -> 268289 bytes
19 files changed, 479 insertions(+), 214 deletions(-)
create mode 100644 GDZZ.Application/Entity/Consume.cs
delete mode 100644 GDZZ.Application/Service/LiveChat/ILiveChatService.cs
delete mode 100644 GDZZ.Application/Service/LiveChat/LiveChatService.cs
create mode 100644 GDZZ.Web.Entry/wwwroot/Upload/Default/400356345643077.jpg
diff --git a/GDZZ.Application/Entity/Balance.cs b/GDZZ.Application/Entity/Balance.cs
index 24abeb6..e98fe52 100644
--- a/GDZZ.Application/Entity/Balance.cs
+++ b/GDZZ.Application/Entity/Balance.cs
@@ -11,10 +11,6 @@ namespace GDZZ.Application.Entity
[Description("余额表")]
public class Balance : DEntityBase
{
- ///
- /// 租户Id
- ///
- public long TenantId { get; set; }
///
/// 用户ID
///
diff --git a/GDZZ.Application/Entity/BaseUser.cs b/GDZZ.Application/Entity/BaseUser.cs
index 232ddb5..1cc44ca 100644
--- a/GDZZ.Application/Entity/BaseUser.cs
+++ b/GDZZ.Application/Entity/BaseUser.cs
@@ -2,8 +2,6 @@
using SqlSugar;
using System.ComponentModel;
using GDZZ.Core.Entity;
-using GDZZ.Core;
-
namespace GDZZ.Application.Entity
{
///
@@ -20,7 +18,7 @@ namespace GDZZ.Application.Entity
///
/// 用户类型
///
- public UserEnum Type { get; set; }
+ public int Type { get; set; }
///
/// 用户名
///
@@ -32,7 +30,7 @@ namespace GDZZ.Application.Entity
///
/// 公共状态
///
- public CommonStatus Status { get; set; }
+ public int Status { get; set; }
///
/// 微信用户ID
///
@@ -45,5 +43,13 @@ namespace GDZZ.Application.Entity
/// 开发平台ID
///
public string UnionId { get; set; }
+ ///
+ /// 公司ID
+ ///
+ public long CompanyID { get; set; }
+ ///
+ /// 描述
+ ///
+ public string Describe { get; set; }
}
}
\ No newline at end of file
diff --git a/GDZZ.Application/Entity/Consume.cs b/GDZZ.Application/Entity/Consume.cs
new file mode 100644
index 0000000..229962d
--- /dev/null
+++ b/GDZZ.Application/Entity/Consume.cs
@@ -0,0 +1,35 @@
+using System;
+using SqlSugar;
+using System.ComponentModel;
+using GDZZ.Core.Entity;
+namespace GDZZ.Application.Entity
+{
+ ///
+ /// 消费记录
+ ///
+ [SugarTable("mini_consume")]
+ [Description("消费记录")]
+ public class Consume : DEntityBase
+ {
+ ///
+ /// 消费金额
+ ///
+ public decimal CAmount { get; set; }
+ ///
+ /// 余额
+ ///
+ public decimal Surplus { get; set; }
+ ///
+ /// 用户ID
+ ///
+ public long UserID { get; set; }
+ ///
+ /// 消费类型
+ ///
+ public int Sort { get; set; }
+ ///
+ /// 沟通ID
+ ///
+ public long? ResumeID { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/GDZZ.Application/Entity/LiveUserFriend.cs b/GDZZ.Application/Entity/LiveUserFriend.cs
index 9d20003..510c08b 100644
--- a/GDZZ.Application/Entity/LiveUserFriend.cs
+++ b/GDZZ.Application/Entity/LiveUserFriend.cs
@@ -11,10 +11,6 @@ namespace GDZZ.Application.Entity
[Description("聊天用户好友表")]
public class LiveUserFriend : DEntityBase
{
- ///
- /// 租户Id
- ///
- public long TenantId { get; set; }
///
/// 好友ID
///
diff --git a/GDZZ.Application/GDZZ.Application.xml b/GDZZ.Application/GDZZ.Application.xml
index 8ca4238..a689de1 100644
--- a/GDZZ.Application/GDZZ.Application.xml
+++ b/GDZZ.Application/GDZZ.Application.xml
@@ -9,11 +9,6 @@
余额表
-
-
- 租户Id
-
-
用户ID
@@ -69,6 +64,16 @@
开发平台ID
+
+
+ 公司ID
+
+
+
+
+ 描述
+
+
公司属性
@@ -94,6 +99,36 @@
公司详情图片
+
+
+ 消费记录
+
+
+
+
+ 消费金额
+
+
+
+
+ 余额
+
+
+
+
+ 用户ID
+
+
+
+
+ 消费类型
+
+
+
+
+ 沟通ID
+
+
意见反馈
@@ -209,11 +244,6 @@
聊天用户好友表
-
-
- 租户Id
-
-
好友ID
@@ -533,13 +563,6 @@
-
-
- 微信支付
-
-
-
-
业务权限控制
@@ -552,41 +575,34 @@
-
-
- 即时聊天接口
-
-
-
+
- 即时聊天
+
-
+
- 聊天总线
+ 用户ID
-
+
- 聊天服务
+ 余额
-
-
-
+
-
+ 总价格
-
+
- 用户ID
+ 支付金额
-
+
- 余额
+ 充值状态
@@ -605,6 +621,24 @@
+
+
+ 充值记录查询
+
+
+
+
+
+ 修改余额
+
+
+
+
+
+ 查询消费记录
+
+
+
微信小程序支付
@@ -668,14 +702,24 @@
-
+
- 基础用户服务
+
-
+
- 获取配置文件
+ 租户信息
+
+
+
+
+ 公司信息
+
+
+
+
+ 基础用户服务
@@ -685,6 +729,12 @@
+
+
+ 获取教师列表
+
+
+
分页查询基础用户
@@ -860,6 +910,21 @@
主键Id
+
+
+ 职业
+
+
+
+
+ 性别
+
+
+
+
+ 描述
+
+
基础用户输出参数
@@ -1326,6 +1391,11 @@
文件名称
+
+
+ 公司ID
+
+
聊天历史任务列表输出参数
@@ -1396,29 +1466,16 @@
聊天服务
-
+
新增联系人
-
-
- 修改未读消息
-
-
-
-
-
- 删除联系人
-
-
-
- 获取联系人
+ 获取联系人列表
-
diff --git a/GDZZ.Application/Service/Auth/AuthService.cs b/GDZZ.Application/Service/Auth/AuthService.cs
index 34fc7ef..4bcc52e 100644
--- a/GDZZ.Application/Service/Auth/AuthService.cs
+++ b/GDZZ.Application/Service/Auth/AuthService.cs
@@ -16,6 +16,8 @@ using Furion.DynamicApiController;
using Microsoft.AspNetCore.Http;
using GDZZ.Application.Help;
using Microsoft.AspNetCore.Authorization;
+using Mapster;
+using GDZZ.Core.Service;
namespace GDZZ.Application.Service.Auth
{
@@ -27,7 +29,7 @@ namespace GDZZ.Application.Service.Auth
private readonly SqlSugarRepository _sysUserRep; // 用户表仓储
private readonly SqlSugarRepository _sysTenantRep; //租户仓储
private readonly SqlSugarRepository Self; //职业仓储
-
+ private readonly SqlSugarRepository CompanyRep;
private readonly SqlSugarRepository rechargeRep; //充值仓储
private readonly SqlSugarRepository payTakeRep; //支付仓储
#endregion
@@ -51,11 +53,14 @@ namespace GDZZ.Application.Service.Auth
SqlSugarRepository sysTenantRep,
SqlSugarRepository sysUserRep,
SqlSugarRepository Self,
+ SqlSugarRepository CompanyRep,
+ SqlSugarRepository payTakeRep,
ICacheService cacheService,
WechatOAuth wechatOAuth,
IEventPublisher eventPublisher,
IHttpContextAccessor httpContextAccessor)
{
+ this.CompanyRep= CompanyRep;
this._eventPublisher= eventPublisher;
this._sysUserRep = sysUserRep;
this._sysTenantRep = sysTenantRep;
@@ -63,6 +68,7 @@ namespace GDZZ.Application.Service.Auth
this._httpContextAccessor = httpContextAccessor;
this.cacheService= cacheService;
this.Self = Self;
+ this.payTakeRep = payTakeRep;
_wechatOAuth = wechatOAuth;
_oauthConfig = options.Value.Wechat;
}
@@ -75,10 +81,12 @@ namespace GDZZ.Application.Service.Auth
[AllowAnonymous]
public async Task SignInAsync(PhoneModel phoneModel)
{
- AuthUserOut authUserOut = new AuthUserOut();
- //读取凭证
- var tokenModel = await this._wechatOAuth.GetAccessTokenAsync(phoneModel.code);
+ AuthUserOut authUserOut = new AuthUserOut();
+
+ Company company = new Company();
+ //读取凭证
+ var tokenModel = await this._wechatOAuth.GetAccessTokenAsync(phoneModel.code);
//解析电话
var phoneInfo = MiniProgramUtil.AESDecrypt(phoneModel.encryptedDataStr, tokenModel.SessionKey, phoneModel.iv);
@@ -87,6 +95,14 @@ namespace GDZZ.Application.Service.Auth
.Filter("TenantId", true)
.First(x => x.Phone == phoneInfo.PhoneNumber);
+ var wxUser = await this.Baseuser.AsQueryable()
+ .Filter("TenantId", true)
+ .Where(x => x.OpenID == tokenModel.OpenId).SingleAsync();
+
+
+
+
+ //账号不存在 生成系统账号
if (sysUser.IsEmpty())
{
sysUser = await this._sysUserRep.InsertReturnEntityAsync(new SysUser()
@@ -111,30 +127,43 @@ namespace GDZZ.Application.Service.Auth
});
}
- var wxUser = await this.Baseuser.AsQueryable()
- .Filter("TenantId", true)
- .Where(x => x.OpenID == tokenModel.OpenId).SingleAsync();
-
- if (wxUser.IsEmpty())
+ //区分不同类型账号
+ if (phoneModel.logInType ==(int)UserEnum.JOB)
{
- wxUser = await this.Baseuser.InsertReturnEntityAsync(new BaseUser()
+ if (wxUser.IsEmpty())
{
- UnionId = tokenModel.Unionid,
- CreatedUserId = sysUser.Id,
- CreatedTime = DateTime.Now,
- CreatedUserName = sysUser.Name,
- AvatarUrl = "https://gdzongzhi.com/assets/img/logo.png",
- Status = CommonStatus.ENABLE,
- OpenID = tokenModel.OpenId,
- TenantId = 392820661919813,
- Type = UserEnum.JOB,
- UserName = phoneInfo.PhoneNumber,
- });
+ wxUser = await this.Baseuser.InsertReturnEntityAsync(new BaseUser()
+ {
+ UnionId = tokenModel.Unionid,
+ CreatedUserId = sysUser.Id,
+ CreatedTime = DateTime.Now,
+ CreatedUserName = sysUser.Name,
+ AvatarUrl = "https://gdzongzhi.com/assets/img/logo.png",
+ Status =(int)CommonStatus.ENABLE,
+ OpenID = tokenModel.OpenId,
+ TenantId = 392820661919813,
+ Type = (int)UserEnum.JOB,
+ UserName = phoneInfo.PhoneNumber,
+ });
+ }
}
+ else
+ {
+ //如果是企业账号,应该是绑定了企业租户信息
+ if (wxUser.IsEmpty()|| wxUser.CompanyID.IsNullOrZero())
+ throw Oops.Oh(ErrorCode.xg1002);
+
+ //获取公司信息
+ company = await this.CompanyRep.SingleAsync(x=>x.Id == wxUser.CompanyID);
+ authUserOut.companyDto = company.Adapt();
- if(wxUser.IsEmpty()|| sysUser.IsEmpty())
+
+ }
+ if (wxUser.IsEmpty() || sysUser.IsEmpty())
throw Oops.Oh(ErrorCode.xg1002);
+
+
var Self = await this.Self.FirstOrDefaultAsync(x => x.CreatedUserId == sysUser.Id);
// 获取加密后的密码
@@ -143,13 +172,13 @@ namespace GDZZ.Application.Service.Auth
// 验证账号是否被冻结
if (sysUser.Status == CommonStatus.DISABLE)
throw Oops.Oh(ErrorCode.D1017);
-
//获取对应租户
var tenant = this._sysTenantRep.Single(sysUser.TenantId);
if (tenant.IsNullOrZero())
throw Oops.Oh(ErrorCode.F1001);
+
// 生成Token令牌
authUserOut.Token = JWTEncryption.Encrypt(new Dictionary
{
@@ -180,9 +209,11 @@ namespace GDZZ.Application.Service.Auth
authUserOut.Sex = sysUser.Sex;
authUserOut.UserId = sysUser.Id;
authUserOut.UserName = sysUser.Name;
- authUserOut.Self = Self.IsEmpty() ? "未填写" : Self.Name;
- authUserOut.Type = UserEnum.JOB;
+ authUserOut.Self = Self.IsEmpty() ? null : Self.Name;
+ authUserOut.Type = (UserEnum)wxUser.Type;
authUserOut.OpenID = tokenModel.OpenId;
+ authUserOut.Tenant = tenant.Adapt();
+ authUserOut.Describe = wxUser.Describe;
await this.cacheService.SetUserInfoAsync(authUserOut, authUserOut.UserId);
return authUserOut;
@@ -200,17 +231,11 @@ namespace GDZZ.Application.Service.Auth
return await this.cacheService.GetUserInfoAsync(UserManager.UserId);
}
- ///
- /// 微信支付
- ///
- ///
- ///
- [HttpGet("Mini/WxPay")]
- public async Task WxPay(AuthUserInput authUserInput)
- {
- return null;
- }
+
+
+
+
diff --git a/GDZZ.Application/Service/Auth/DTO/AuthUserOut.cs b/GDZZ.Application/Service/Auth/DTO/AuthUserOut.cs
index f60b06b..de75574 100644
--- a/GDZZ.Application/Service/Auth/DTO/AuthUserOut.cs
+++ b/GDZZ.Application/Service/Auth/DTO/AuthUserOut.cs
@@ -1,4 +1,5 @@
using GDZZ.Core;
+using GDZZ.Core.Service;
using Org.BouncyCastle.Bcpg.OpenPgp;
using System;
using System.Collections.Generic;
@@ -55,7 +56,21 @@ namespace GDZZ.Application
///
///
///
- public string OpenID { get; set; }
+ public string OpenID { get; set; }
+ ///
+ ///
+ ///
+ public string Describe { get; set; }
+
+ ///
+ /// 租户信息
+ ///
+ public TenantOutput Tenant { get; set; }
+
+ ///
+ /// 公司信息
+ ///
+ public CompanyDto companyDto { get; set; }
}
}
diff --git a/GDZZ.Application/Service/BaseUser/BaseUserService.cs b/GDZZ.Application/Service/BaseUser/BaseUserService.cs
index 0d899c0..09511b6 100644
--- a/GDZZ.Application/Service/BaseUser/BaseUserService.cs
+++ b/GDZZ.Application/Service/BaseUser/BaseUserService.cs
@@ -21,20 +21,26 @@ namespace GDZZ.Application
public class BaseUserService : IBaseUserService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep;
+ private readonly SqlSugarRepository Self; //职业仓储
+
private readonly SqlSugarRepository _sysUserRep; // 用户表仓储
+ private readonly SqlSugarRepository _sysOnlineUerRep; // 在线用户表仓储
+
- ///
- /// 获取配置文件
- ///
- private readonly ThirdParty _oauthConfig;
- public BaseUserService(SqlSugarRepository rep, SqlSugarRepository _sysUserRep)
+ public BaseUserService(SqlSugarRepository rep,
+ SqlSugarRepository Self,
+
+ SqlSugarRepository _sysOnlineUerRep,
+ SqlSugarRepository _sysUserRep)
{
_rep = rep;
- this._sysUserRep= _sysUserRep;
+ this.Self= Self;
+ this._sysUserRep = _sysUserRep;
+ this._sysOnlineUerRep= _sysOnlineUerRep;
}
@@ -56,15 +62,47 @@ namespace GDZZ.Application
var user = this._rep.AsQueryable()
.Filter("TenantId", true)
.First(x => x.CreatedUserId == UserManager.UserId);
+
+ var Self = await this.Self.FirstOrDefaultAsync(x => x.CreatedUserId == sysuser.Id);
+ if(Self.IsEmpty())
+ {
+ await this.Self.InsertAsync(new SeIF
+ {
+ Name = input.Self,
+ });
+ }
+ else
+ {
+ Self.Name = input.Self;
+ await this.Self.AsUpdateable(Self).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
+ }
+
user.AvatarUrl = input.AvatarUrl;
+ user.Describe = input.Describe;
sysuser.Avatar = input.AvatarUrl;
+ sysuser.Sex = input.Sex;
await this._sysUserRep.AsUpdateable(sysuser).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
await this._rep.AsUpdateable(user).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
-
-
}
+
+ ///
+ /// 获取教师列表
+ ///
+ ///
+ [HttpGet("/Mini/BaseUser/list")]
+ public async Task TeacherList()
+ {
+ var thls = await this._sysUserRep.AsQueryable()
+ .InnerJoin((u, r) => u.Id == r.UserId)
+ .Where(u => u.AdminType == AdminType.None)
+ .ToListAsync();
+ //var user = await _sysOnlineUerRep.AsQueryable()
+ // .Filter("TenantId", true)
+ // .Where(m => m.UserId == entity.OtherUserID).OrderByDescending(x => x.LastTime).FirstAsync();
+ return null;
+ }
///
@@ -130,5 +168,7 @@ namespace GDZZ.Application
+
+
}
}
diff --git a/GDZZ.Application/Service/BaseUser/Dto/BaseUserInput.cs b/GDZZ.Application/Service/BaseUser/Dto/BaseUserInput.cs
index a149850..5f968ee 100644
--- a/GDZZ.Application/Service/BaseUser/Dto/BaseUserInput.cs
+++ b/GDZZ.Application/Service/BaseUser/Dto/BaseUserInput.cs
@@ -102,6 +102,26 @@ namespace GDZZ.Application
[Required(ErrorMessage = "主键Id不能为空")]
public long Id { get; set; }
+
+ ///
+ /// 职业
+ ///
+ public string Self { get; set; }
+
+
+ ///
+ /// 性别
+ ///
+ public Gender Sex { get; set; }
+
+
+ ///
+ /// 描述
+ ///
+ public string Describe { get; set; }
+
+
+
}
public class QueryeBaseUserInput : DeleteBaseUserInput
diff --git a/GDZZ.Application/Service/LiveChat/ILiveChatService.cs b/GDZZ.Application/Service/LiveChat/ILiveChatService.cs
deleted file mode 100644
index 5a2a4c4..0000000
--- a/GDZZ.Application/Service/LiveChat/ILiveChatService.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace GDZZ.Application.Service.LiveChat
-{
- ///
- /// 即时聊天接口
- ///
- public interface ILiveChatService
- {
-
-
-
- }
-}
diff --git a/GDZZ.Application/Service/LiveChat/LiveChatService.cs b/GDZZ.Application/Service/LiveChat/LiveChatService.cs
deleted file mode 100644
index f8eec90..0000000
--- a/GDZZ.Application/Service/LiveChat/LiveChatService.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using GDZZ.Core;
-using GDZZ.Core.Entity;
-using GDZZ.Core.Service;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.SignalR;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using System.Linq;
-using Furion.DependencyInjection;
-using Furion.DynamicApiController;
-
-namespace GDZZ.Application.Service.LiveChat
-{
- ///
- /// 即时聊天
- ///
- [ApiDescriptionSettings("Application", Name = "LiveChat", Order = 1)]
- public class LiveChatService:Hub ,ILiveChatService, IDynamicApiController, ITransient
- {
- ///
- /// 聊天总线
- ///
- private readonly IHubContext _chatHubContext;
-
- private readonly SqlSugarRepository sysOnlineUerRep; // 在线用户表仓储
-
-
- ///
- /// 聊天服务
- ///
- ///
- ///
- public LiveChatService(IHubContext chatHubContext,
- SqlSugarRepository _sysOnlineUerRep)
- {
- this.sysOnlineUerRep = _sysOnlineUerRep;
- _chatHubContext = chatHubContext;
- }
-
-
-
-
-
- }
-}
diff --git a/GDZZ.Application/Service/LiveHistoryContacts/Dto/LiveHistoryContactsInput.cs b/GDZZ.Application/Service/LiveHistoryContacts/Dto/LiveHistoryContactsInput.cs
index 3fc9f37..9ffe22f 100644
--- a/GDZZ.Application/Service/LiveHistoryContacts/Dto/LiveHistoryContactsInput.cs
+++ b/GDZZ.Application/Service/LiveHistoryContacts/Dto/LiveHistoryContactsInput.cs
@@ -116,4 +116,15 @@ namespace GDZZ.Application
///
public string FileName { get; set; }
}
+
+
+ public class AddLiveFriendInput
+ {
+
+ ///
+ /// 公司ID
+ ///
+ public long CompanyID { get; set; }
+
+ }
}
diff --git a/GDZZ.Application/Service/LiveHistoryContacts/LiveHistoryContactsService.cs b/GDZZ.Application/Service/LiveHistoryContacts/LiveHistoryContactsService.cs
index 2d77d2b..d8f3122 100644
--- a/GDZZ.Application/Service/LiveHistoryContacts/LiveHistoryContactsService.cs
+++ b/GDZZ.Application/Service/LiveHistoryContacts/LiveHistoryContactsService.cs
@@ -24,6 +24,8 @@ using Yitter.IdGenerator;
using Microsoft.Extensions.Options;
using ICacheService = GDZZ.Application.Help.ICacheService;
using System.Threading;
+using System.ComponentModel.Design;
+using Furion.FriendlyException;
namespace GDZZ.Application
{
@@ -34,6 +36,7 @@ namespace GDZZ.Application
public class LiveHistoryContactsService : ILiveHistoryContactsService, IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep; //聊天历史任务列表仓储
+ private readonly SqlSugarRepository Baseuser; // wx用户仓储
private readonly SqlSugarRepository liveMessageRep; //消息仓储
private readonly SqlSugarRepository liveUserFriend; //好友表仓储
private readonly SqlSugarRepository _sysUserRep; // 用户表仓储
@@ -45,6 +48,7 @@ namespace GDZZ.Application
public LiveHistoryContactsService(SqlSugarRepository rep,
ICacheService cacheService,
IOptions options,
+ SqlSugarRepository Baseuser,
SqlSugarRepository _sysUserRep,
SqlSugarRepository sysOnlineUerRep,
SqlSugarRepository liveUserFriend,
@@ -54,6 +58,7 @@ namespace GDZZ.Application
_rep = rep;
_options = options.Value;
+ this.Baseuser= Baseuser;
this.cacheService = cacheService;
this._chatHubContext= chatHubContext;
this._sysOnlineUerRep = sysOnlineUerRep;
@@ -64,53 +69,62 @@ namespace GDZZ.Application
#region 聊天列表
+
+
+
///
/// 新增联系人
///
///
[HttpPost("/Mini/LiveHistoryContacts/AddLive")]
- public async Task AddLive(AddLiveHistoryContactsInput input)
+ public async Task AddLive(AddLiveFriendInput input)
{
- var entity = input.Adapt();
- await _rep.InsertAsync(entity);
- await this.cacheService.DelLiveHistoryService(UserManager.UserId);
- }
+ var baseUser = await this.Baseuser.AsQueryable().Filter("TenantId", true).Where(x => x.CompanyID == input.CompanyID).SingleAsync();
+ if (baseUser.IsNullOrZero())
+ throw Oops.Oh(ErrorCode.B1002);
+ var user = await this._sysUserRep.Where(x => x.Id == baseUser.CreatedUserId).SingleAsync();
+ if (user.IsNullOrZero())
+ throw Oops.Oh(ErrorCode.xg1002);
+
+ //判断是是好友
+
+ var fends =await this.liveUserFriend.Where(x => x.FriendID == UserManager.UserId && x.CreatedUserId == user.Id).FirstAsync();
+ if (fends.IsNullOrZero())
+ {
+ List friends = new List();
+ if(user.Id != UserManager.UserId)
+ {
+ friends.Add(new LiveUserFriend()
+ {
+ FriendID = user.Id,
+ });
+ }
- ///
- /// 修改未读消息
- ///
- ///
- [HttpPut("/Mini/LiveHistoryContacts/UPLive")]
- public async Task UPLive(UpdateLiveHistoryContactsInput input)
- {
- //this.cacheService.UpUnreadAsync(input.Id);
- }
+ friends.Add(new LiveUserFriend()
+ {
+ FriendID = UserManager.UserId,
+ CreatedUserId = user.Id
+ });
+ foreach (var item in friends)
+ {
+ await this.liveUserFriend.InsertAsync(item);
+ }
+ }
+ else
+ {
+ }
- ///
- /// 删除联系人
- ///
- ///
- [HttpDelete("/Mini/LiveHistoryContacts/DelLive")]
- public async Task DelLive(long ID)
- {
- var entity = await this.liveUserFriend.SingleAsync(x => x.Id == ID);
- await _rep.DeleteAsync(entity);
await this.cacheService.DelLiveHistoryService(UserManager.UserId);
+ return user;
}
-
-
-
-
-
///
- /// 获取联系人
+ /// 获取联系人列表
///
- ///
///
[HttpGet("/Mini/LiveHistoryContacts/list")]
public async Task> List()
@@ -137,12 +151,12 @@ namespace GDZZ.Application
Id = item.FriendID,
Index = sysUser.Name.Substring(0, 1),
LastSendTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000,
-
+
};
//查询聊天记录
//rm -rf mk dir ls install cd home //ru-rf
- var live = await this.liveMessageRep.Where(x => x.CreatedUserId == UserManager.UserId && x.OtherUserID == item.FriendID || (x.CreatedUserId == item.FriendID && x.OtherUserID == UserManager.UserId)).OrderByDescending(x =>x.CreatedTime).FirstAsync();
+ var live = await this.liveMessageRep.Where(x => x.CreatedUserId == UserManager.UserId && x.OtherUserID == item.FriendID || (x.CreatedUserId == item.FriendID && x.OtherUserID == UserManager.UserId)).OrderByDescending(x => x.CreatedTime).FirstAsync();
if (live != null)
{
@@ -167,6 +181,12 @@ namespace GDZZ.Application
await this.cacheService.SetLiveHistoryService(UserManager.UserId, historyLists);
return historyLists;
}
+
+
+
+
+
+
#endregion
#region 聊天详情
diff --git a/GDZZ.Application/Service/WXPay/WXPayService.cs b/GDZZ.Application/Service/WXPay/WXPayService.cs
index ffc9102..d836a4d 100644
--- a/GDZZ.Application/Service/WXPay/WXPayService.cs
+++ b/GDZZ.Application/Service/WXPay/WXPayService.cs
@@ -22,6 +22,7 @@ using Senparc.Weixin.Exceptions;
using Microsoft.AspNetCore.Authorization;
using System.Collections.Generic;
using Mapster;
+using Furion.FriendlyException;
namespace GDZZ.Application.Service.WXPay
{
@@ -35,6 +36,7 @@ namespace GDZZ.Application.Service.WXPay
private readonly SqlSugarRepository _sysUserRep; // 用户表仓储
private readonly SqlSugarRepository _sysTenantRep; //租户仓储
private readonly SqlSugarRepository self; //职业仓储
+ private readonly SqlSugarRepository ComsumeRep; //消费记录仓储
private readonly SqlSugarRepository balance; //余额仓储
private readonly SqlSugarRepository rechargeRep; //充值仓储
@@ -60,6 +62,7 @@ namespace GDZZ.Application.Service.WXPay
SqlSugarRepository sysTenantRep,
SqlSugarRepository sysUserRep,
SqlSugarRepository balance,
+ SqlSugarRepository ComsumeRep,
SqlSugarRepository Self,
SqlSugarRepository rechargeRep,
SqlSugarRepository payTakeRep,
@@ -67,11 +70,12 @@ namespace GDZZ.Application.Service.WXPay
IHttpContextAccessor _httpContextAccessor,
IEventPublisher eventPublisher)
{
+ this.self = Self;
this.balance = balance;
this.Baseuser = Baseuser;
+ this.ComsumeRep = ComsumeRep;
this._sysUserRep = sysUserRep;
this._sysTenantRep = sysTenantRep;
- this.self = Self;
this.rechargeRep = rechargeRep;
this.payTakeRep = payTakeRep;
this._wechatOAuth = wechatOAuth;
@@ -106,11 +110,53 @@ namespace GDZZ.Application.Service.WXPay
[Route("Mini/v1/GetRechargeList")]
public async Task> GetRechargeList()
{
- var rechargeLiist = this.rechargeRep.Where(x => x.CreatedUserId == UserManager.UserId).ToListAsync();
+ var rechargeLiist =await this.rechargeRep.Where(x => x.CreatedUserId == UserManager.UserId).ToListAsync();
return rechargeLiist.Adapt>();
}
+ ///
+ /// 修改余额
+ ///
+ ///
+ [HttpGet]
+ [Route("Mini/v1/UpBalance")]
+ public async Task UpBalance(decimal Consume,long? ResumeID)
+ {
+
+ var comrep = await this.ComsumeRep.Where(x=>x.ResumeID== ResumeID).FirstAsync();
+ if(!comrep.IsNullOrZero()) //已经消费过了
+ return true;
+
+ var ban = await this.balance.Where(x => x.UserID == UserManager.UserId).FirstAsync();
+ if (ban == null)
+ throw Oops.Oh(ErrorCode.xg1002);
+
+ ban.Amount -= Consume;
+ if (ban.Amount < 0)
+ throw Oops.Oh(ErrorCode.B1001);
+ await this.ComsumeRep.InsertAsync(new Consume()
+ {
+ CAmount= Consume,
+ Surplus = ban.Amount,
+ ResumeID = ResumeID
+ });
+
+ return await this.balance.AsUpdateable(ban).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync()>0;
+ }
+
+
+ ///
+ /// 查询消费记录
+ ///
+ ///
+ [HttpGet]
+ [Route("Mini/v1/GetBalance")]
+ public async Task GetBalance()
+ {
+ return await this.ComsumeRep.Where(x=>x.UserID == UserManager.UserId).ToListAsync();
+ }
+
///
@@ -191,8 +237,7 @@ namespace GDZZ.Application.Service.WXPay
string return_code = resHandler.GetParameter("return_code");
string return_msg = resHandler.GetParameter("return_msg");
- string res = null;
-
+ var res = "";
resHandler.SetKey(Config.SenparcWeixinSetting.TenPayV3_Key);
//验证请求是否从微信发过来(安全)
if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS")
diff --git a/GDZZ.Core/Enum/ErrorCode.cs b/GDZZ.Core/Enum/ErrorCode.cs
index f6c7cd5..bfe7dff 100644
--- a/GDZZ.Core/Enum/ErrorCode.cs
+++ b/GDZZ.Core/Enum/ErrorCode.cs
@@ -392,9 +392,15 @@ public enum ErrorCode
[ErrorCodeItemMetadata("检测数据不存在")]
xg1002,
+ ///
+ /// 请添加数据列
+ ///
[ErrorCodeItemMetadata("请添加数据列")]
db1000,
+ ///
+ /// 数据表不存在
+ ///
[ErrorCodeItemMetadata("数据表不存在")]
db1001,
@@ -408,5 +414,16 @@ public enum ErrorCode
/// 租户不存在
///
[ErrorCodeItemMetadata("租户不存在")]
- F1001
+ F1001,
+
+ ///
+ /// 余额不足
+ ///
+ [ErrorCodeItemMetadata("余额不足")]
+ B1001,
+ ///
+ /// 未绑定公司
+ ///
+ [ErrorCodeItemMetadata("未绑定公司")]
+ B1002
}
diff --git a/GDZZ.Core/GDZZ.Core.xml b/GDZZ.Core/GDZZ.Core.xml
index 7b2a7af..76aefa7 100644
--- a/GDZZ.Core/GDZZ.Core.xml
+++ b/GDZZ.Core/GDZZ.Core.xml
@@ -2560,6 +2560,16 @@
检测数据不存在
+
+
+ 请添加数据列
+
+
+
+
+ 数据表不存在
+
+
表单不存在
@@ -2570,6 +2580,16 @@
租户不存在
+
+
+ 余额不足
+
+
+
+
+ 未绑定公司
+
+
文件扩展枚举
@@ -3535,6 +3555,11 @@
是否租户管理员
+
+
+ 登录类型
+
+
AccessToken参数
diff --git a/GDZZ.Core/OAuth/PhoneModel.cs b/GDZZ.Core/OAuth/PhoneModel.cs
index 4e1f664..9985341 100644
--- a/GDZZ.Core/OAuth/PhoneModel.cs
+++ b/GDZZ.Core/OAuth/PhoneModel.cs
@@ -9,14 +9,17 @@ namespace GDZZ.Core.OAuth
public class PhoneModel
{
+ ///
+ /// 登录类型
+ ///
+ public int logInType { get; set; }
-
public string encryptedDataStr { get; set; }
-
-
public string iv { get; set; }
public string code { get; set; }
+
+
}
}
diff --git a/GDZZ.Core/Service/Role/SysRoleService.cs b/GDZZ.Core/Service/Role/SysRoleService.cs
index 2889931..8622c96 100644
--- a/GDZZ.Core/Service/Role/SysRoleService.cs
+++ b/GDZZ.Core/Service/Role/SysRoleService.cs
@@ -69,10 +69,27 @@ public class SysRoleService : ISysRoleService, IDynamicApiController, ITransient
public async Task QueryRolePageList([FromQuery] RoleInput input)
{
var roles = await _sysRoleRep.AsQueryable()
+ .InnerJoin((u, r) => r.Id == u.TenantId)
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim()))
.Where(u => u.Status == (int)CommonStatus.ENABLE)
.OrderBy(u => u.Sort)
+ .Select((u, r) => new
+ {
+ Tendand = r.Name,
+ Code = u.Code,
+ Name = u.Name,
+ CreatedTime= u.CreatedTime,
+ CreatedUserId = u.CreatedUserId,
+ CreatedUserName = u.CreatedUserName,
+ DataScopeType = u.DataScopeType,
+ ID = u.Id,
+ IsDeleted= u.IsDeleted,
+ RoleType= u.RoleType,
+ Sort = u.Sort,
+ Status = u.Status,
+ TenantId= u.TenantId
+ })
.ToPagedListAsync(input.PageNo, input.PageSize);
return roles.XnPagedResult();
}
diff --git a/GDZZ.Web.Entry/wwwroot/Upload/Default/400356345643077.jpg b/GDZZ.Web.Entry/wwwroot/Upload/Default/400356345643077.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7c9a2b02515a0ae1a2b4a60a1952bb8175a4db72
GIT binary patch
literal 268289
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