diff --git a/Myshipping.Application/EDI/Yard/XiahuozhiHelpler.cs b/Myshipping.Application/EDI/Yard/XiahuozhiHelpler.cs index 9a2743f3..c54ecc7e 100644 --- a/Myshipping.Application/EDI/Yard/XiahuozhiHelpler.cs +++ b/Myshipping.Application/EDI/Yard/XiahuozhiHelpler.cs @@ -1,10 +1,13 @@ using Furion; using Furion.Logging; +using Furion.RemoteRequest.Extensions; +using Microsoft.Extensions.Logging; using Myshipping.Application.ConfigOption; using Myshipping.Application.Entity; using Myshipping.Core; using Myshipping.Core.Entity; using Myshipping.Core.Service; +using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections.Generic; @@ -13,25 +16,25 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Myshipping.Application.EDI.Yard +namespace Myshipping.Application.EDI { /// /// 下货纸辅助类 /// public static class XiahuozhiHelpler { + private static readonly string EdiFilePath = "XHZ"; + public static bool Send( - //SqlSugarRepository repOrder, - //SqlSugarRepository repCtn, - //SqlSugarRepository repDictType, - //SqlSugarRepository repDictData, - //SqlSugarRepository repBookingFile, - //SqlSugarRepository repEdiSetting, - long bookingId, string filerole, out string msg, string attShowName = "系统") + long bookingId, string filerole, out string msg) { - var sugerClient = App.GetService(); + var repOrder = App.GetService>(); + var repCtn = App.GetService>(); + var repBookingFile = App.GetService>(); + + var cacheService = App.GetService(); - var order = sugerClient.Queryable().First(o => o.Id == bookingId); + var order = repOrder.FirstOrDefault(o => o.Id == bookingId); if (order == null) { msg = "订舱信息未找到"; @@ -64,9 +67,9 @@ namespace Myshipping.Application.EDI.Yard } var fileOpt = App.GetOptions(); - if (!Directory.Exists(fileOpt.basePath)) + if (string.IsNullOrEmpty(fileOpt.basePath)) { - Directory.CreateDirectory(fileOpt.basePath); + fileOpt.basePath = AppDomain.CurrentDomain.BaseDirectory; } @@ -91,20 +94,23 @@ namespace Myshipping.Application.EDI.Yard var paraXHZ = GetAllTenantParam().Result.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "CODE_GLJ_XHZ"); if (paraXHZ == null || string.IsNullOrEmpty(paraXHZ.ItemCode)) { - msg = "下货纸代号未找到或配置有误"; + msg = $"{order.TenantName} 港联捷场站 下货纸代号未找到或配置有误"; return false; } var ediFileName = $"{paraXHZ.ItemCode}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; - var ediFileRela = Path.Combine("XHZ", ediFileName); - var ediFileAbs = Path.Combine(fileOpt.basePath, ediFileRela); + var ediFileRela = Path.Combine(EdiFilePath, ediFileName); + var ediPathAbs = Path.Combine(fileOpt.basePath, EdiFilePath); + var ediFileAbs = Path.Combine(ediPathAbs, ediFileRela); + if (!Directory.Exists(ediPathAbs)) + { + Directory.CreateDirectory(ediPathAbs); + } //港联捷所有用户使用一个ftp用户名和密码发送报文,使用文件名中的下货纸代号进行区分 - var dicTypeGLJ = repDictType.FirstOrDefault(x => x.Code == "booking_ftp_setting_glj"); - var dicDataGLJ = repDictData.Where(x => x.TypeId == dicTypeGLJ.Id).ToList(); - var paraServer = dicDataGLJ.FirstOrDefault(x => x.Code == "ftp_server").Value; - var paraUser = dicDataGLJ.FirstOrDefault(x => x.Code == "username").Value; - var paraPwd = dicDataGLJ.FirstOrDefault(x => x.Code == "pwd").Value; + var paraServer = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "ftp_server"); + var paraUser = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "username"); + var paraPwd = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "pwd"); if (paraServer == null || paraUser == null || paraPwd == null) { @@ -132,7 +138,7 @@ namespace Myshipping.Application.EDI.Yard var ctnCodes = GetAllCodeCtn().Result.Select(x => new { x.Code, x.Size }).ToList(); var ctnEdiList = GetAllMappingCtn().Result.AsQueryable().Where(x => x.Module == "XHZ_GLJ" && x.CarrierCode == order.CARRIERID).ToList(); - var ctns = sugerClient.Queryable().Where(c => c.BILLID == bookingId).ToList(); + var ctns = repCtn.Where(c => c.BILLID == bookingId).ToList(); foreach (var ctn in ctns) { var ctnFind = ctnCodes.FirstOrDefault(c => c.Code == ctn.CTNCODE); @@ -156,15 +162,27 @@ namespace Myshipping.Application.EDI.Yard File.WriteAllText(ediFileAbs, sbData.ToString()); //发送ftp - //BackgroundTaskFtp ftpTask = new BackgroundTaskFtp(); - //ftpTask.GID = Guid.NewGuid().ToString(); - //ftpTask.FtpHost = paraServer.PARAMVALUE; - //ftpTask.FtpUser = paraUser.PARAMVALUE; - //ftpTask.FtpPassword = paraPwd.PARAMVALUE; - //ftpTask.FtpData = FtpTaskHelper.GenTaskJson("", ediFile, null); - //ftpTask.Type = BackgroundTaskFtp.TypeFtpUpload; - //commonData.BackgroundTaskFtp.Add(ftpTask); - //commonData.SaveChanges(); + var ftpPostObj = new + { + host = paraServer.Value, + username = paraUser.Value, + pwd = paraPwd.Value, + path = "/" + }; + var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); + var res = ftpSpiderUrl + .SetContentType("multipart/form-data") + .SetBody(ftpPostObj) + .SetBodyBytes(("file", Encoding.UTF8.GetBytes(sbData.ToString()), ediFileName)) + .PostAsStringAsync(); + Log.Information($"发送ftp返回:{res}"); + var jobjRetn = JObject.Parse(res.Result); + if (jobjRetn.GetStringValue("status") != "1") + { + msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; + return false; + } //挂载附件 var attFile = new BookingFile(); @@ -174,7 +192,7 @@ namespace Myshipping.Application.EDI.Yard attFile.TypeCode = "xiahuozhi"; attFile.TypeName = "下货纸"; attFile.TenantName = order.TenantName; - sugerClient.Insertable(attFile).ExecuteCommand(); + repBookingFile.Insert(attFile); msg = "已发送"; return true; @@ -209,17 +227,22 @@ namespace Myshipping.Application.EDI.Yard } var ediFileName = $"{order.VESSEL}_{order.VOYNO}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; - var ediFileRela = Path.Combine("XHZ", ediFileName); - var ediFileAbs = Path.Combine(fileOpt.basePath, ediFileRela); + var ediFileRela = Path.Combine(EdiFilePath, ediFileName); + var ediPathAbs = Path.Combine(fileOpt.basePath, EdiFilePath); + var ediFileAbs = Path.Combine(ediPathAbs, ediFileRela); + if (!Directory.Exists(ediPathAbs)) + { + Directory.CreateDirectory(ediPathAbs); + } DjyEdiSetting ftpset = null; if (order.YARD == "港捷丰场站") { - ftpset = repEdiSetting.FirstOrDefault(f => f.EDINAME == "XHZ_GJF" && f.TenantId == order.TenantId); + ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_GJF" && f.TenantId == order.TenantId); } else if (order.YARD == "捷丰场站") { - ftpset = repEdiSetting.FirstOrDefault(f => f.EDINAME == "XHZ_JIEFENG" && f.TenantId == order.TenantId); + ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_JIEFENG" && f.TenantId == order.TenantId); } if (ftpset == null) @@ -406,15 +429,27 @@ namespace Myshipping.Application.EDI.Yard File.WriteAllText(ediFileAbs, strJoin, Encoding.Default); //后续发送 - //BackgroundTaskFtp ftpTask = new BackgroundTaskFtp(); - //ftpTask.GID = Guid.NewGuid().ToString(); - //ftpTask.FtpHost = ftpset.SERVERIP; - //ftpTask.FtpUser = ftpset.USERNAME; - //ftpTask.FtpPassword = ftpset.PASSWORD; - //ftpTask.FtpData = FtpTaskHelper.GenTaskJson(ftpset.FOLDERNAME, ediFile, null); - //ftpTask.Type = BackgroundTaskFtp.TypeFtpUpload; - //commonData.BackgroundTaskFtp.Add(ftpTask); - //commonData.SaveChanges(); + var ftpPostObj = new + { + host = ftpset.SERVERIP, + username = ftpset.USERNAME, + pwd = ftpset.PASSWORD, + path = ftpset.FOLDERNAME + }; + var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); + var res = ftpSpiderUrl + .SetContentType("multipart/form-data") + .SetBody(ftpPostObj) + .SetBodyBytes(("file", Encoding.UTF8.GetBytes(strJoin), ediFileName)) + .PostAsStringAsync(); + Log.Information($"发送ftp返回:{res}"); + var jobjRetn = JObject.Parse(res.Result); + if (jobjRetn.GetStringValue("status") != "1") + { + msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; + return false; + } //挂载附件 @@ -439,7 +474,7 @@ namespace Myshipping.Application.EDI.Yard var pGlxEdi = GetAllTenantParam().Result.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "XIAHUOZHI_GLX_SEND_TYPE"); if (order.YARD == "港联欣场站" && pGlxEdi != null && pGlxEdi.ItemCode == "EDI_GLJ") { - var ftpset = repEdiSetting.FirstOrDefault(f => f.EDINAME == "XHZ_GLX" && f.TenantId == order.TenantId); + var ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_GLX" && f.TenantId == order.TenantId); if (ftpset == null) { msg = "港联欣下货纸ftp设置未找到"; @@ -454,8 +489,13 @@ namespace Myshipping.Application.EDI.Yard } var ediFileName = $"{paraXHZ.ItemCode}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; - var ediFileRela = Path.Combine("XHZ", ediFileName); - var ediFileAbs = Path.Combine(fileOpt.basePath, ediFileRela); + var ediFileRela = Path.Combine(EdiFilePath, ediFileName); + var ediPathAbs = Path.Combine(fileOpt.basePath, EdiFilePath); + var ediFileAbs = Path.Combine(ediPathAbs, ediFileRela); + if (!Directory.Exists(ediPathAbs)) + { + Directory.CreateDirectory(ediPathAbs); + } StringBuilder sbData = new StringBuilder(); sbData.AppendLine($"01:{order.VESSEL}:{order.VOYNO}"); //船名 航次 @@ -495,15 +535,27 @@ namespace Myshipping.Application.EDI.Yard File.WriteAllText(ediFileAbs, sbData.ToString()); //后续发送 - //BackgroundTaskFtp ftpTask = new BackgroundTaskFtp(); - //ftpTask.GID = Guid.NewGuid().ToString(); - //ftpTask.FtpHost = ftpset.SERVERIP; - //ftpTask.FtpUser = ftpset.USERNAME; - //ftpTask.FtpPassword = ftpset.PASSWORD; - //ftpTask.FtpData = FtpTaskHelper.GenTaskJson("", ediFile, null); - //ftpTask.Type = BackgroundTaskFtp.TypeFtpUpload; - //commonData.BackgroundTaskFtp.Add(ftpTask); - //commonData.SaveChanges(); + var ftpPostObj = new + { + host = ftpset.SERVERIP, + username = ftpset.USERNAME, + pwd = ftpset.PASSWORD, + path = ftpset.FOLDERNAME + }; + var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); + var res = ftpSpiderUrl + .SetContentType("multipart/form-data") + .SetBody(ftpPostObj) + .SetBodyBytes(("file", Encoding.UTF8.GetBytes(sbData.ToString()), ediFileName)) + .PostAsStringAsync(); + Log.Information($"发送ftp返回:{res}"); + var jobjRetn = JObject.Parse(res.Result); + if (jobjRetn.GetStringValue("status") != "1") + { + msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; + return false; + } //挂载附件 var attFile = new BookingFile(); @@ -522,53 +574,53 @@ namespace Myshipping.Application.EDI.Yard msg = "场站联系人邮箱不能为空"; return false; } -// MailDataContext mailData = new MailDataContext(); -// var userMail = mailData.UserAccounts.AsNoTracking().FirstOrDefault(ua => ua.UserId == order.USERID); -// if (userMail == null -// || string.IsNullOrEmpty(userMail.SmtpServer) -// || userMail.SmtpPort == 0) -// { -// msg = "发件邮箱未配置"; -// return false; -// } - - -// var userbase = sugerClient.Queryable().First(u => u.Id == order.CreatedUserId); -// var title = $"下货纸:{order.MBLNO}/{order.CARRIER}/{order.VESSEL}/{order.VOYNO}/{order.TenantName}"; - -// var bodyExt = string.Empty; -// if (order.CARGOID == "R") -// { -// bodyExt = $@"温度:{order.TEMPSET}{order.TEMPID}
-//通风:{order.REEFERF}
-//湿度:{order.HUMIDITY}
"; -// } -// else if (order.CARGOID == "D") -// { -// bodyExt = $@"危险品等级:{order.DCLASS}
-//危险品编号:{order.DUNNO}
-//危险品联系方式:{order.LINKMAN}
"; -// } - -// var body = $@"提单号:{order.MBLNO}
-//船名航次:{order.VESSEL}/{order.VOYNO}
-//起运港:{order.PORTLOAD},{order.PORTLOADID}
-//目的港:{order.PORTDISCHARGE},{order.PORTDISCHARGEID}
-//目的地:{order.DESTINATION},{order.DESTINATIONID}
-//预计船期:{(order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : "")}
-//箱型箱量:{order.CNTRTOTAL}
-//件重尺:{order.PKGS} {order.KINDPKGS}/{order.KGS}KGS/{order.CBM}CBM
-//货物描述:{order.DESCRIPTION}
-//{bodyExt} -//备注:{order.YARDREMARK}
-//
-//订舱代理:{order.TenantName}
-//联系人:{order.CreatedUserName}
-//电话:{userbase.Tel} 手机:{userbase.Phone}
-//邮箱:{userbase.Email}
-//"; - -// MailHelper.SendMail(userMail.GID, title, body, order.YardContractEmail, customerSend: true); + // MailDataContext mailData = new MailDataContext(); + // var userMail = mailData.UserAccounts.AsNoTracking().FirstOrDefault(ua => ua.UserId == order.USERID); + // if (userMail == null + // || string.IsNullOrEmpty(userMail.SmtpServer) + // || userMail.SmtpPort == 0) + // { + // msg = "发件邮箱未配置"; + // return false; + // } + + + // var userbase = sugerClient.Queryable().First(u => u.Id == order.CreatedUserId); + // var title = $"下货纸:{order.MBLNO}/{order.CARRIER}/{order.VESSEL}/{order.VOYNO}/{order.TenantName}"; + + // var bodyExt = string.Empty; + // if (order.CARGOID == "R") + // { + // bodyExt = $@"温度:{order.TEMPSET}{order.TEMPID}
+ //通风:{order.REEFERF}
+ //湿度:{order.HUMIDITY}
"; + // } + // else if (order.CARGOID == "D") + // { + // bodyExt = $@"危险品等级:{order.DCLASS}
+ //危险品编号:{order.DUNNO}
+ //危险品联系方式:{order.LINKMAN}
"; + // } + + // var body = $@"提单号:{order.MBLNO}
+ //船名航次:{order.VESSEL}/{order.VOYNO}
+ //起运港:{order.PORTLOAD},{order.PORTLOADID}
+ //目的港:{order.PORTDISCHARGE},{order.PORTDISCHARGEID}
+ //目的地:{order.DESTINATION},{order.DESTINATIONID}
+ //预计船期:{(order.ETD.HasValue ? order.ETD.Value.ToString("yyyy-MM-dd") : "")}
+ //箱型箱量:{order.CNTRTOTAL}
+ //件重尺:{order.PKGS} {order.KINDPKGS}/{order.KGS}KGS/{order.CBM}CBM
+ //货物描述:{order.DESCRIPTION}
+ //{bodyExt} + //备注:{order.YARDREMARK}
+ //
+ //订舱代理:{order.TenantName}
+ //联系人:{order.CreatedUserName}
+ //电话:{userbase.Tel} 手机:{userbase.Phone}
+ //邮箱:{userbase.Email}
+ //"; + + // MailHelper.SendMail(userMail.GID, title, body, order.YardContractEmail, customerSend: true); } msg = "已发送"; return true; diff --git a/Myshipping.Application/Myshipping.Application.csproj b/Myshipping.Application/Myshipping.Application.csproj index 55cdecab..a22ccd2b 100644 --- a/Myshipping.Application/Myshipping.Application.csproj +++ b/Myshipping.Application/Myshipping.Application.csproj @@ -13,7 +13,6 @@ - @@ -35,8 +34,4 @@ - - - - diff --git a/Myshipping.Application/Myshipping.Application.xml b/Myshipping.Application/Myshipping.Application.xml index c08d43e2..ea8e20f2 100644 --- a/Myshipping.Application/Myshipping.Application.xml +++ b/Myshipping.Application/Myshipping.Application.xml @@ -34,6 +34,81 @@ 订舱附件文件配置 + + + 下货纸辅助类 + + + + + 各种文本转义字符(东胜7移植) + + 文件类型(例如:txt、xml) + 文本字符串 + + + + + 获取箱型的EDI代码 + + + + + + + + 获取所有箱型(使用缓存) + + + + + + 获取所有船司(使用缓存) + + + + + + 获取所有箱型映射(使用缓存) + + + + + + 获取所有船司映射(使用缓存) + + + + + + 获取所有付费方式(使用缓存) + + + + + + 获取所有付费方式映射(使用缓存) + + + + + + 获取所有公司参数(使用缓存) + + + + + + 获取所有船名(使用缓存) + + + + + + 获取所有船名映射(使用缓存) + + + diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index db7418b2..b33585aa 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -30,6 +30,7 @@ using Myshipping.Core.Entity; using Furion.RemoteRequest.Extensions; using System.Net.Http; using Myshipping.Core.Service; +using Myshipping.Application.EDI; namespace Myshipping.Application { diff --git a/Myshipping.Application/Service/BookingPrintTemplate/BookingPrintTemplateService.cs b/Myshipping.Application/Service/BookingPrintTemplate/BookingPrintTemplateService.cs index ebf58f21..fb4e1a5f 100644 --- a/Myshipping.Application/Service/BookingPrintTemplate/BookingPrintTemplateService.cs +++ b/Myshipping.Application/Service/BookingPrintTemplate/BookingPrintTemplateService.cs @@ -14,6 +14,8 @@ using Myshipping.Application.ConfigOption; using System.IO; using Yitter.IdGenerator; using Furion.FriendlyException; +using Furion.RemoteRequest.Extensions; +using System.Text; namespace Myshipping.Application { @@ -202,5 +204,6 @@ namespace Myshipping.Application //{ // return await _rep.ToListAsync(); //} + } } diff --git a/Myshipping.Core/Extension/JsonExtension.cs b/Myshipping.Core/Extension/JsonExtension.cs new file mode 100644 index 00000000..59ce6451 --- /dev/null +++ b/Myshipping.Core/Extension/JsonExtension.cs @@ -0,0 +1,134 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Myshipping.Core +{ + public static class JsonExtension + { + /// + /// 获取JObject + /// + /// + /// + /// + public static JObject GetJObjectValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return null; + } + + return jt as JObject; + } + + /// + /// 获取字符串值 + /// + /// + /// + /// + public static string GetStringValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return string.Empty; + } + + return jt.ToString(); + } + + /// + /// 获取int值 + /// + /// + /// + /// + public static int GetIntValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return 0; + } + + var strVal = jt.ToString(); + int rtnVal = 0; + int.TryParse(strVal, out rtnVal); + return rtnVal; + } + + /// + /// 获取decimal值 + /// + /// + /// + /// + public static decimal GetDecimalValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return 0; + } + + var strVal = jt.ToString(); + decimal rtnVal = 0; + decimal.TryParse(strVal, out rtnVal); + return rtnVal; + } + + /// + /// 获取datetime值 + /// + /// + /// + /// + public static DateTime? GetDateTimeValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return null; + } + + var strVal = jt.ToString(); + DateTime rtnVal = DateTime.MinValue; + if (DateTime.TryParse(strVal, out rtnVal)) + { + return rtnVal; + } + + return null; + } + + /// + /// 获取datetime值,不带秒(yyyy-MM-dd HH:mm) + /// + /// + /// + /// + public static DateTime? GetDateTimeMinuteValue(this JObject jobj, string prop) + { + var jt = jobj[prop]; + if (jt == null) + { + return null; + } + + var strVal = jt.ToString() + ":00"; + DateTime rtnVal = DateTime.MinValue; + if (DateTime.TryParse(strVal, out rtnVal)) + { + return rtnVal; + } + + return null; + } + } +} diff --git a/Myshipping.Core/Myshipping.Core.xml b/Myshipping.Core/Myshipping.Core.xml index d7ab1bf0..c3185754 100644 --- a/Myshipping.Core/Myshipping.Core.xml +++ b/Myshipping.Core/Myshipping.Core.xml @@ -4492,6 +4492,54 @@ 降序排序(不要问我为什么是descend不是desc,前端约定参数就是这样) + + + 获取JObject + + + + + + + + 获取字符串值 + + + + + + + + 获取int值 + + + + + + + + 获取decimal值 + + + + + + + + 获取datetime值 + + + + + + + + 获取datetime值,不带秒(yyyy-MM-dd HH:mm) + + + + + 分页拓展类