Pengxy 9 maanden geleden
bovenliggende
commit
24da1e8c73

+ 18 - 0
MicroServices/Business/Business.Application.Contracts/Sqe/IJwtService.cs

@@ -0,0 +1,18 @@
+using Business.StructuredDB;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace Business.Sqe
+{
+    public interface IJwtService
+    {
+        string BuildToken(IEnumerable<Claim> claims, JwtOptions options);
+
+        public String ValidateToken(string token, JwtOptions options);
+    }
+}

+ 59 - 0
MicroServices/Business/Business.Application/SqeManagement/JwtService.cs

@@ -0,0 +1,59 @@
+using Business.StructuredDB;
+using Microsoft.IdentityModel.Tokens;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace Business.Sqe
+{
+    public class JwtService : ApplicationService, IJwtService
+    {
+        public JwtService()
+        { 
+        }
+        public string BuildToken(IEnumerable<Claim> claims, JwtOptions options)
+        {
+            //过期时间
+            TimeSpan timeSpan = TimeSpan.FromSeconds(options.ExpireSeconds);//token过期时间
+            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.Key));//加密的token密钥
+            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);//签名证书,其值为securityKey和HmacSha256Signature算法
+            var tokenDescriptor = new JwtSecurityToken(options.Issuer, options.Audience, claims, expires: DateTime.Now.Add(timeSpan), signingCredentials: credentials);//表示jwt token的描述信息,其值包括Issuer签发方,Audience接收方,Claims载荷,过期时间和签名证书
+            return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);//使用该方法转换为字符串形式的jwt token返回
+        }
+
+        public String ValidateToken(string token, JwtOptions options)
+        {
+            if (token == null)
+                return null;
+
+            var tokenHandler = new JwtSecurityTokenHandler();
+            var key = Encoding.UTF8.GetBytes(options.Key);
+            try
+            {
+                tokenHandler.ValidateToken(token, new TokenValidationParameters
+                {
+                    ValidateIssuerSigningKey = true,
+                    IssuerSigningKey = new SymmetricSecurityKey(key),
+                    ValidateIssuer = false,
+                    ValidateAudience = false,
+                    ClockSkew = TimeSpan.Zero
+                }, out SecurityToken validatedToken);
+
+                var jwtToken = (JwtSecurityToken)validatedToken;
+                
+                return jwtToken.Issuer;
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+    }
+
+}

+ 33 - 0
MicroServices/Business/Business.Domain/StructuredDB/Sqe/JwtOptions.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB
+{
+    public class JwtOptions
+    {
+
+        /// <summary>
+        /// 签发者
+        /// </summary>
+        public string Issuer { get; set; }
+
+        /// <summary>
+        /// 接收者
+        /// </summary>
+        public string Audience { get; set; }
+
+        /// <summary>
+        /// 密钥
+        /// </summary>
+        public string Key { get; set; }
+
+        /// <summary>
+        /// 过期时间
+        /// </summary>
+        public int ExpireSeconds { get; set; }
+    }
+
+}

+ 51 - 0
MicroServices/Business/Business.Domain/StructuredDB/Sqe/ResultCode.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB
+{
+    public enum ResultCode
+    {
+        //Code
+        [Display(Name = "成功")]
+        Success = 10000,
+
+        [Display(Name = "失败")]
+        Fail = 40000,
+
+        //SubCode
+        [Display(Name = "服务不可用")]
+        ServiceError = 20000,
+
+        [Display(Name = "授权权限不足")]
+        AuthorityError = 40001,
+
+        [Display(Name = "参数错误")]
+        ParameterError = 40002,
+
+        [Display(Name = "没有符合记录")]
+        ExistsError = 40003,
+
+        [Display(Name = "业务处理失败")]
+        BusinessError = 40004,
+
+        [Display(Name = "账户或密码错误")]
+        UserExistsError = 40005,
+
+        [Display(Name = "该用户没有匹配的产线")]
+        UserLineExistsError = 40006,
+
+        [Display(Name = "没有授权可用功能")]
+        UserRightError = 40007,
+
+        [Display(Name = "该人员已离职")]
+        UserStatusError = 40008,
+
+        [Display(Name = "该产线已被组线生产")]
+        UserLineGroupError = 40009
+    }
+
+}

+ 66 - 0
MicroServices/Business/Business.Domain/StructuredDB/Sqe/ResultHelper.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB
+{
+    public class ResultHelper
+    {
+        public static ResultViewModel CreateResult(int row, string msg)
+        {
+            ResultCode code = ResultCode.Fail, subCode = ResultCode.BusinessError;
+            if (row > 0)
+            {
+                code = ResultCode.Success;
+            }
+            else
+            {
+                if (msg == "")
+                {
+                    subCode = ResultCode.ExistsError;
+                }
+            }
+
+            return CreateResult(code, null, subCode, msg);
+        }
+
+        public static ResultViewModel CreateResult(ResultCode code = ResultCode.Fail, dynamic data = null, ResultCode subCode = ResultCode.Fail, string subMsg = "")
+        {
+            string Msg = GetCustomAttributes(code);
+            if (code == ResultCode.Success)
+            {
+                subCode = code;
+                subMsg = string.IsNullOrEmpty(subMsg) ? Msg : subMsg;
+            }
+            else
+            {
+                subMsg = string.IsNullOrEmpty(subMsg) ? GetCustomAttributes(subCode) : subMsg;
+            }
+
+            return new ResultViewModel()
+            {
+                Code = Convert.ToInt32(code).ToString(),
+                Msg = Msg,
+                SubCode = Convert.ToInt32(subCode).ToString(),
+                SubMsg = subMsg,
+                Data = data
+            };
+        }
+
+        private static string GetCustomAttributes(ResultCode code)
+        {
+            Type type = code.GetType();
+            FieldInfo fieldInfo = type.GetField(code.ToString());
+            var customAttributes = fieldInfo.GetCustomAttributesData();
+            if (customAttributes.Count > 0)
+            {
+                return customAttributes[0].NamedArguments[0].TypedValue.Value.ToString();
+            }
+            return "";
+        }
+    }
+
+}

+ 18 - 0
MicroServices/Business/Business.Domain/StructuredDB/Sqe/ResultViewModel.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB
+{
+    public class ResultViewModel
+    {
+        public string Code { get; set; }
+        public string Msg { get; set; }
+        public string SubCode { get; set; }
+        public string SubMsg { get; set; }
+        public dynamic Data { get; set; }
+    }
+
+}

+ 10 - 0
MicroServices/Business/Business.Host/appsettings.json

@@ -2,6 +2,16 @@
   "App": {
     "CorsOrigins": "https://*.abc.com,http://localhost:9527,http://123.60.181.157:8020,http://123.60.181.157:8022,http://123.60.181.157:8024,http://123.60.180.165:8020,http://123.60.180.165:8022,http://123.60.180.165:8024,http://172.16.8.154:8020"
   },
+  "JWT": {
+    "Issuer": "zzy2025@qq.com",
+    "Audience": "zzy2025@qq.com",
+    "Key": "A86DA1301B954748B3B21B6AA9F2F743", //加密密钥
+    "ExpireSeconds": 86400 //密钥过期时间
+  },
+  "jwtAuthorization": {
+    "userid": "DOP_Reach",
+    "password": "reach.23"
+  },
   "ConnectionStrings": {
     "Default": "Server=123.60.180.165;Database=dopdemorq;uid=sa;pwd=5h3n9)uN;Trusted_Connection=false;TrustServerCertificate=True",
     "DOPLog": "Server=123.60.180.165;Database=dopdemorq;uid=sa;pwd=5h3n9)uN;Trusted_Connection=false;TrustServerCertificate=True",

+ 51 - 9
MicroServices/Business/Business.HttpApi/Controllers/SqeController.cs

@@ -1,6 +1,9 @@
-using Business.StructuredDB.Sqe;
+using Business.Sqe;
+using Business.StructuredDB;
+using Business.StructuredDB.Sqe;
 using Business.VSM;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using NLog.Fluent;
@@ -22,13 +25,42 @@ namespace Business.Controllers
     [Route("api/business/sqe")]
     public class SqeController : AbpController
     {
+
+        public IJwtService _jwtService { set; get; }
+
+        private IConfiguration _configuration;
+
         private readonly ISqeExcelService _SqeExcelService;
 
-        public SqeController(ISqeExcelService SqeExcelService)
+        public SqeController(ISqeExcelService SqeExcelService, IJwtService jwtService, IConfiguration configuration)
         {
             _SqeExcelService = SqeExcelService;
+            _jwtService = jwtService;
+            _configuration = configuration;
         }
 
+        private String CheckToken(string token)
+        {
+            try
+            {
+                JwtOptions jwtOptions = new JwtOptions();
+                jwtOptions.ExpireSeconds = Convert.ToInt32(_configuration["JWT:ExpireSeconds"]);
+                jwtOptions.Issuer = _configuration["JWT:Issuer"];
+                jwtOptions.Audience = _configuration["JWT:Audience"];
+                jwtOptions.Key = _configuration["JWT:Key"];
+                String data = _jwtService.ValidateToken(token, jwtOptions);
+                if (!string.IsNullOrEmpty(data))
+                {
+                    return data;
+                }
+            }
+            catch (Exception ex)
+            {
+            }
+            return null;
+        }
+
+
 
         [HttpGet]
         [Route("import_test")]
@@ -72,21 +104,31 @@ namespace Business.Controllers
 
         [HttpGet]
         [Route("UploadProductionTestData")]
-        public string Import_fct(String data)
+        public string Import_fct(String data, String token)
         {
-            String s = _SqeExcelService.Import_Fct_From_Data(data, "测试用户", DateTime.Now, "测试组织");
+            String userid = CheckToken(token);
             JObject json = new JObject();
-            if (s == null || s.Length == 0)
+            if (userid != null)
             {
-                json["resultCode"] = "OK";
-                json["resultMessage"] = "成功";
+                String s = _SqeExcelService.Import_Fct_From_Data(data, userid, DateTime.Now, userid);
+                if (s == null || s.Length == 0)
+                {
+                    json["resultCode"] = "OK";
+                    json["resultMessage"] = "成功";
+                }
+                else
+                {
+                    json["resultCode"] = "NG";
+                    json["resultMessage"] = s;
+                }
+                return json.ToString();
             }
             else
             {
                 json["resultCode"] = "NG";
-                json["resultMessage"] = s;
+                json["resultMessage"] = "传入配置未通过授权!";
+                return json.ToString();
             }
-            return json.ToString();
         }
     }
 }

+ 114 - 0
MicroServices/Business/Business.HttpApi/Controllers/TokenController.cs

@@ -0,0 +1,114 @@
+using Business.Sqe;
+using Business.StructuredDB;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp;
+using Volo.Abp.AspNetCore.Mvc;
+
+namespace Business.Controllers
+{
+    [RemoteService]
+    [Area("Sqe")]
+    //[AuthAttribute]
+    [Route("api/Token")]
+    //[ApiController]
+    public class TokenController : AbpController
+    {
+        public IJwtService _jwtService { set; get; }
+
+        private IConfiguration _configuration;
+
+        public TokenController(IJwtService jwtService, IConfiguration configuration)
+        {
+            _jwtService = jwtService;
+            _configuration = configuration;
+        }
+
+        //[AllowAnonymous]
+        [HttpGet]
+        [Route("token")]
+        //public async Task<IActionResult> GetToken()
+        public String GetToken(String userid, String password)
+        {
+            ResultCode code = ResultCode.Fail, subCode = ResultCode.Fail;
+            string subMsg = "";
+            string data = "";
+            try
+            {
+                JwtOptions jwtOptions = new JwtOptions();
+                jwtOptions.ExpireSeconds = Convert.ToInt32(_configuration["JWT:ExpireSeconds"]);
+                jwtOptions.Issuer = _configuration["JWT:Issuer"];
+                jwtOptions.Audience = _configuration["JWT:Audience"];
+                jwtOptions.Key = _configuration["JWT:Key"];
+
+                String Userid = _configuration["jwtAuthorization:userid"];
+                String Password = _configuration["jwtAuthorization:password"];
+                if (Userid.CompareTo(userid) != 0 || Password.CompareTo(password) != 0)
+                {
+                    data = "userid or password is wrong!";
+                }
+                else 
+                {
+                    List<Claim> claims = new List<Claim>();
+                    claims.Add(new Claim(ClaimTypes.Name, userid));
+                    data = _jwtService.BuildToken(claims, jwtOptions);
+                    if (!string.IsNullOrEmpty(data))
+                    {
+                        code = ResultCode.Success;
+                        subCode = ResultCode.Success;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                subMsg = ex.Message;
+                code = ResultCode.Fail;
+                subCode = ResultCode.Fail;
+            }
+            ResultViewModel result = ResultHelper.CreateResult(code, data, subCode, subMsg);
+            return JsonConvert.SerializeObject(result);
+        }
+
+        //[HttpGet]
+        //[Route("tokenCheck")]
+        //public String CheckToken(string token)
+        //{
+        //    ResultCode code = ResultCode.Fail, subCode = ResultCode.Fail;
+        //    string subMsg = "";
+        //    string data = "";
+        //    try
+        //    {
+        //        JwtOptions jwtOptions = new JwtOptions();
+        //        jwtOptions.ExpireSeconds = Convert.ToInt32(_configuration["JWT:ExpireSeconds"]);
+        //        jwtOptions.Issuer = _configuration["JWT:Issuer"];
+        //        jwtOptions.Audience = _configuration["JWT:Audience"];
+        //        jwtOptions.Key = _configuration["JWT:Key"];
+        //        data = _jwtService.ValidateToken(token, jwtOptions);
+        //        if (!string.IsNullOrEmpty(data))
+        //        {
+        //            code = ResultCode.Success;
+        //            subCode = ResultCode.Success;
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        subMsg = ex.Message;
+        //        code = ResultCode.Fail;
+        //        subCode = ResultCode.Fail;
+        //    }
+        //    ResultViewModel result = ResultHelper.CreateResult(code, data, subCode, subMsg);
+        //    return result.ToString();
+        //}
+
+    }
+}

+ 12 - 0
MicroServices/Business/QuartzSettings/logs/logs.txt

@@ -3958,3 +3958,15 @@
 {"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2025-06-18T16:54:34.2783889+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"TestTimeOut","GroupName":"systemquartzjob","BeginDate":"2025-06-18T16:54:34.2831408+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"BOM预处理自动任务","GroupName":"BOM预处理自动任务","BeginDate":"2025-06-18T16:54:34.2852978+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:02:02.7653119+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:02:02.8091416+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:02:02.812342+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:02:02.8142567+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"TestTimeOut","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:02:02.819615+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"BOM预处理自动任务","GroupName":"BOM预处理自动任务","BeginDate":"2025-06-25T14:02:02.8213936+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:04:33.4602643+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:04:33.4997264+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:04:33.5024206+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:04:33.5037309+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"TestTimeOut","GroupName":"systemquartzjob","BeginDate":"2025-06-25T14:04:33.5166398+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"BOM预处理自动任务","GroupName":"BOM预处理自动任务","BeginDate":"2025-06-25T14:04:33.5183941+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}