From 1decebf8f98fdeb3d321b9877ff05bce166a31a1 Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Tue, 3 Sep 2024 10:38:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tiobon.Core.Api/Controllers/FileController.cs | 680 +++++++++++++++++- Tiobon.Core.Api/Tiobon.Core.xml | 7 + .../Extend/Ghrs_UserDataRoleExtend.cs | 15 + Tiobon.Core.Services/BASE/BaseServices.cs | 328 ++++++++- .../Ghre/Ghre_CourseWareServices.cs | 2 +- .../Ghre/Ghre_StudyRecordServices.cs | 78 +- Tiobon.Core/Tiobon.Core.xml | 7 + 7 files changed, 1084 insertions(+), 33 deletions(-) create mode 100644 Tiobon.Core.Model/ViewModels/Extend/Ghrs_UserDataRoleExtend.cs diff --git a/Tiobon.Core.Api/Controllers/FileController.cs b/Tiobon.Core.Api/Controllers/FileController.cs index 495e14cb..b7692662 100644 --- a/Tiobon.Core.Api/Controllers/FileController.cs +++ b/Tiobon.Core.Api/Controllers/FileController.cs @@ -1,4 +1,7 @@ -using SqlSugar; +using System.Net; +using SharpCompress.Common; +using SkyWalking.NetworkProtocol.V3; +using SqlSugar; using Tiobon.Core.DataAccess; namespace Tiobon.Core.Controllers; @@ -109,10 +112,21 @@ public class FileController : BaseApiController string pathHeader = "wwwroot/files/" + filePath; if (!Directory.Exists(pathHeader)) Directory.CreateDirectory(pathHeader); - var fileName = upload.fileName.Replace("." + ext, "_") + DateTime.Now.ToString("yyyyMMddHHmmss"); + //var fileName = upload.fileName.Replace("." + ext, "_") + DateTime.Now.ToString("yyyyMMddHHmmss"); + var fileName = upload.fileName; - filePath = "/files/" + filePath + "/" + $"{fileName}.{ext}"; + filePath = "/files/" + filePath + "/" + $"{upload.fileName}"; //var filepath = Path.Combine(pathHeader, file.FileName); + + #region 判断文件是否重复,重复即删除 + var webRootPath = _hostingEnvironment.WebRootPath; + if (System.IO.File.Exists(webRootPath + filePath)) + System.IO.File.Delete(webRootPath + filePath); + + var file = await _ghre_AttachmentServices.Delete(x => x.AttachmentName == fileName); + + #endregion + using (var stream = global::System.IO.File.Create("wwwroot/" + filePath)) { await upload.file.CopyToAsync(stream); @@ -149,6 +163,20 @@ public class FileController : BaseApiController }); } + + + [HttpPost, Route("CheckExists")] + public ServiceResult CheckExistsAsync([FromBody] FileUpload upload) + { + var filePath = $"/files/upload/{upload.fileName}"; + #region 判断文件是否重复,重复即删除 + var webRootPath = _hostingEnvironment.WebRootPath; + if (System.IO.File.Exists(webRootPath + filePath)) + return Success(true); + #endregion + + return Success(false); + } #endregion @@ -165,37 +193,48 @@ public class FileController : BaseApiController { var webRootPath = _hostingEnvironment.WebRootPath; - using var _context = ContextFactory.CreateContext(); var file = await _ghre_AttachmentServices.QueryById(Id); if (file == null) return Ok("找不到文件"); var filePath = $"{webRootPath}{"\\" + file.PhysicsPath}"; - var contentTypDict = new Dictionary { - {"jpg","image/jpeg"}, - {"jpeg","image/jpeg"}, - {"jpe","image/jpeg"}, - {"png","image/png"}, - {"gif","image/gif"}, - {"ico","image/x-ico"}, - {"tif","image/tiff"}, - {"tiff","image/tiff"}, - {"fax","image/fax"}, - {"wbmp","image//vnd.wap.wbmp"}, - {"rp","image/vnd.rn-realpix"} - }; - var contentTypeStr = "image/jpeg"; - //未知的图片类型 - contentTypeStr = contentTypDict[file.AttachFileExtension]; - - using (var sw = new FileStream(filePath, FileMode.Open)) - { - var bytes = new byte[sw.Length]; - sw.Read(bytes, 0, bytes.Length); - sw.Close(); - return new FileContentResult(bytes, contentTypeStr); - } + //var contentTypeStr = "image/jpeg"; + ////未知的图片类型 + //contentTypeStr = GetMimeType(file.AttachFileExtension); + + //using (var sw = new FileStream(filePath, FileMode.Open)) + //{ + // var bytes = new byte[sw.Length]; + // sw.Read(bytes, 0, bytes.Length); + // sw.Close(); + // return new FileContentResult(bytes, contentTypeStr); + //} + + return File(new FileStream(filePath, FileMode.Open), file.AttachmentType, $"{file.AttachFileName.Replace("." + file.AttachFileExtension, null)}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.{file.AttachFileExtension}"); + + } + catch (Exception ex) + { + return Ok($"下载异常:{ex.Message}"); + } + } + + + /// + /// 获取图片 + /// + /// 主键ID + /// + [HttpGet("DownloadByPath/{path}"), AllowAnonymous] + public async Task DownloadByPath(string path) + { + try + { + path = WebUtility.UrlDecode(path); + var file = await _ghre_AttachmentServices.QuerySingle(x => x.RelativePath == path); + + return await Download(file.Id); } catch (Exception ex) @@ -218,4 +257,589 @@ public class FileController : BaseApiController } #endregion + private static IDictionary _mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { + + #region Big freaking list of mime types + // combination of values from Windows 7 Registry and + // from C:\Windows\System32\inetsrv\config\applicationHost.config + // some added, including .7z and .dat + {".323", "text/h323"}, + {".3g2", "video/3gpp2"}, + {".3gp", "video/3gpp"}, + {".3gp2", "video/3gpp2"}, + {".3gpp", "video/3gpp"}, + {".7z", "application/x-7z-compressed"}, + {".aa", "audio/audible"}, + {".AAC", "audio/aac"}, + {".aaf", "application/octet-stream"}, + {".aax", "audio/vnd.audible.aax"}, + {".ac3", "audio/ac3"}, + {".aca", "application/octet-stream"}, + {".accda", "application/msaccess.addin"}, + {".accdb", "application/msaccess"}, + {".accdc", "application/msaccess.cab"}, + {".accde", "application/msaccess"}, + {".accdr", "application/msaccess.runtime"}, + {".accdt", "application/msaccess"}, + {".accdw", "application/msaccess.webapplication"}, + {".accft", "application/msaccess.ftemplate"}, + {".acx", "application/internet-property-stream"}, + {".AddIn", "text/xml"}, + {".ade", "application/msaccess"}, + {".adobebridge", "application/x-bridge-url"}, + {".adp", "application/msaccess"}, + {".ADT", "audio/vnd.dlna.adts"}, + {".ADTS", "audio/aac"}, + {".afm", "application/octet-stream"}, + {".ai", "application/postscript"}, + {".aif", "audio/x-aiff"}, + {".aifc", "audio/aiff"}, + {".aiff", "audio/aiff"}, + {".air", "application/vnd.adobe.air-application-installer-package+zip"}, + {".amc", "application/x-mpeg"}, + {".application", "application/x-ms-application"}, + {".art", "image/x-jg"}, + {".asa", "application/xml"}, + {".asax", "application/xml"}, + {".ascx", "application/xml"}, + {".asd", "application/octet-stream"}, + {".asf", "video/x-ms-asf"}, + {".ashx", "application/xml"}, + {".asi", "application/octet-stream"}, + {".asm", "text/plain"}, + {".asmx", "application/xml"}, + {".aspx", "application/xml"}, + {".asr", "video/x-ms-asf"}, + {".asx", "video/x-ms-asf"}, + {".atom", "application/atom+xml"}, + {".au", "audio/basic"}, + {".avi", "video/x-msvideo"}, + {".axs", "application/olescript"}, + {".bas", "text/plain"}, + {".bcpio", "application/x-bcpio"}, + {".bin", "application/octet-stream"}, + {".bmp", "image/bmp"}, + {".c", "text/plain"}, + {".cab", "application/octet-stream"}, + {".caf", "audio/x-caf"}, + {".calx", "application/vnd.ms-office.calx"}, + {".cat", "application/vnd.ms-pki.seccat"}, + {".cc", "text/plain"}, + {".cd", "text/plain"}, + {".cdda", "audio/aiff"}, + {".cdf", "application/x-cdf"}, + {".cer", "application/x-x509-ca-cert"}, + {".chm", "application/octet-stream"}, + {".class", "application/x-java-applet"}, + {".clp", "application/x-msclip"}, + {".cmx", "image/x-cmx"}, + {".cnf", "text/plain"}, + {".cod", "image/cis-cod"}, + {".config", "application/xml"}, + {".contact", "text/x-ms-contact"}, + {".coverage", "application/xml"}, + {".cpio", "application/x-cpio"}, + {".cpp", "text/plain"}, + {".crd", "application/x-mscardfile"}, + {".crl", "application/pkix-crl"}, + {".crt", "application/x-x509-ca-cert"}, + {".cs", "text/plain"}, + {".csdproj", "text/plain"}, + {".csh", "application/x-csh"}, + {".csproj", "text/plain"}, + {".css", "text/css"}, + {".csv", "text/csv"}, + {".cur", "application/octet-stream"}, + {".cxx", "text/plain"}, + {".dat", "application/octet-stream"}, + {".datasource", "application/xml"}, + {".dbproj", "text/plain"}, + {".dcr", "application/x-director"}, + {".def", "text/plain"}, + {".deploy", "application/octet-stream"}, + {".der", "application/x-x509-ca-cert"}, + {".dgml", "application/xml"}, + {".dib", "image/bmp"}, + {".dif", "video/x-dv"}, + {".dir", "application/x-director"}, + {".disco", "text/xml"}, + {".dll", "application/x-msdownload"}, + {".dll.config", "text/xml"}, + {".dlm", "text/dlm"}, + {".doc", "application/msword"}, + {".docm", "application/vnd.ms-word.document.macroEnabled.12"}, + {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, + {".dot", "application/msword"}, + {".dotm", "application/vnd.ms-word.template.macroEnabled.12"}, + {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, + {".dsp", "application/octet-stream"}, + {".dsw", "text/plain"}, + {".dtd", "text/xml"}, + {".dtsConfig", "text/xml"}, + {".dv", "video/x-dv"}, + {".dvi", "application/x-dvi"}, + {".dwf", "drawing/x-dwf"}, + {".dwp", "application/octet-stream"}, + {".dxr", "application/x-director"}, + {".eml", "message/rfc822"}, + {".emz", "application/octet-stream"}, + {".eot", "application/octet-stream"}, + {".eps", "application/postscript"}, + {".etl", "application/etl"}, + {".etx", "text/x-setext"}, + {".evy", "application/envoy"}, + {".exe", "application/octet-stream"}, + {".exe.config", "text/xml"}, + {".fdf", "application/vnd.fdf"}, + {".fif", "application/fractals"}, + {".filters", "Application/xml"}, + {".fla", "application/octet-stream"}, + {".flr", "x-world/x-vrml"}, + {".flv", "video/x-flv"}, + {".fsscript", "application/fsharp-script"}, + {".fsx", "application/fsharp-script"}, + {".generictest", "application/xml"}, + {".gif", "image/gif"}, + {".group", "text/x-ms-group"}, + {".gsm", "audio/x-gsm"}, + {".gtar", "application/x-gtar"}, + {".gz", "application/x-gzip"}, + {".h", "text/plain"}, + {".hdf", "application/x-hdf"}, + {".hdml", "text/x-hdml"}, + {".hhc", "application/x-oleobject"}, + {".hhk", "application/octet-stream"}, + {".hhp", "application/octet-stream"}, + {".hlp", "application/winhlp"}, + {".hpp", "text/plain"}, + {".hqx", "application/mac-binhex40"}, + {".hta", "application/hta"}, + {".htc", "text/x-component"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".htt", "text/webviewhtml"}, + {".hxa", "application/xml"}, + {".hxc", "application/xml"}, + {".hxd", "application/octet-stream"}, + {".hxe", "application/xml"}, + {".hxf", "application/xml"}, + {".hxh", "application/octet-stream"}, + {".hxi", "application/octet-stream"}, + {".hxk", "application/xml"}, + {".hxq", "application/octet-stream"}, + {".hxr", "application/octet-stream"}, + {".hxs", "application/octet-stream"}, + {".hxt", "text/html"}, + {".hxv", "application/xml"}, + {".hxw", "application/octet-stream"}, + {".hxx", "text/plain"}, + {".i", "text/plain"}, + {".ico", "image/x-icon"}, + {".ics", "application/octet-stream"}, + {".idl", "text/plain"}, + {".ief", "image/ief"}, + {".iii", "application/x-iphone"}, + {".inc", "text/plain"}, + {".inf", "application/octet-stream"}, + {".inl", "text/plain"}, + {".ins", "application/x-internet-signup"}, + {".ipa", "application/x-itunes-ipa"}, + {".ipg", "application/x-itunes-ipg"}, + {".ipproj", "text/plain"}, + {".ipsw", "application/x-itunes-ipsw"}, + {".iqy", "text/x-ms-iqy"}, + {".isp", "application/x-internet-signup"}, + {".ite", "application/x-itunes-ite"}, + {".itlp", "application/x-itunes-itlp"}, + {".itms", "application/x-itunes-itms"}, + {".itpc", "application/x-itunes-itpc"}, + {".IVF", "video/x-ivf"}, + {".jar", "application/java-archive"}, + {".java", "application/octet-stream"}, + {".jck", "application/liquidmotion"}, + {".jcz", "application/liquidmotion"}, + {".jfif", "image/pjpeg"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".jpb", "application/octet-stream"}, + {".jpe", "image/jpeg"}, + {".jpeg", "image/jpeg"}, + {".jpg", "image/jpeg"}, + {".js", "application/x-javascript"}, + {".jsx", "text/jscript"}, + {".jsxbin", "text/plain"}, + {".latex", "application/x-latex"}, + {".library-ms", "application/windows-library+xml"}, + {".lit", "application/x-ms-reader"}, + {".loadtest", "application/xml"}, + {".lpk", "application/octet-stream"}, + {".lsf", "video/x-la-asf"}, + {".lst", "text/plain"}, + {".lsx", "video/x-la-asf"}, + {".lzh", "application/octet-stream"}, + {".m13", "application/x-msmediaview"}, + {".m14", "application/x-msmediaview"}, + {".m1v", "video/mpeg"}, + {".m2t", "video/vnd.dlna.mpeg-tts"}, + {".m2ts", "video/vnd.dlna.mpeg-tts"}, + {".m2v", "video/mpeg"}, + {".m3u", "audio/x-mpegurl"}, + {".m3u8", "audio/x-mpegurl"}, + {".m4a", "audio/m4a"}, + {".m4b", "audio/m4b"}, + {".m4p", "audio/m4p"}, + {".m4r", "audio/x-m4r"}, + {".m4v", "video/x-m4v"}, + {".mac", "image/x-macpaint"}, + {".mak", "text/plain"}, + {".man", "application/x-troff-man"}, + {".manifest", "application/x-ms-manifest"}, + {".map", "text/plain"}, + {".master", "application/xml"}, + {".mda", "application/msaccess"}, + {".mdb", "application/x-msaccess"}, + {".mde", "application/msaccess"}, + {".mdp", "application/octet-stream"}, + {".me", "application/x-troff-me"}, + {".mfp", "application/x-shockwave-flash"}, + {".mht", "message/rfc822"}, + {".mhtml", "message/rfc822"}, + {".mid", "audio/mid"}, + {".midi", "audio/mid"}, + {".mix", "application/octet-stream"}, + {".mk", "text/plain"}, + {".mmf", "application/x-smaf"}, + {".mno", "text/xml"}, + {".mny", "application/x-msmoney"}, + {".mod", "video/mpeg"}, + {".mov", "video/quicktime"}, + {".movie", "video/x-sgi-movie"}, + {".mp2", "video/mpeg"}, + {".mp2v", "video/mpeg"}, + {".mp3", "audio/mpeg"}, + {".mp4", "video/mp4"}, + {".mp4v", "video/mp4"}, + {".mpa", "video/mpeg"}, + {".mpe", "video/mpeg"}, + {".mpeg", "video/mpeg"}, + {".mpf", "application/vnd.ms-mediapackage"}, + {".mpg", "video/mpeg"}, + {".mpp", "application/vnd.ms-project"}, + {".mpv2", "video/mpeg"}, + {".mqv", "video/quicktime"}, + {".ms", "application/x-troff-ms"}, + {".msi", "application/octet-stream"}, + {".mso", "application/octet-stream"}, + {".mts", "video/vnd.dlna.mpeg-tts"}, + {".mtx", "application/xml"}, + {".mvb", "application/x-msmediaview"}, + {".mvc", "application/x-miva-compiled"}, + {".mxp", "application/x-mmxp"}, + {".nc", "application/x-netcdf"}, + {".nsc", "video/x-ms-asf"}, + {".nws", "message/rfc822"}, + {".ocx", "application/octet-stream"}, + {".oda", "application/oda"}, + {".odc", "text/x-ms-odc"}, + {".odh", "text/plain"}, + {".odl", "text/plain"}, + {".odp", "application/vnd.oasis.opendocument.presentation"}, + {".ods", "application/oleobject"}, + {".odt", "application/vnd.oasis.opendocument.text"}, + {".one", "application/onenote"}, + {".onea", "application/onenote"}, + {".onepkg", "application/onenote"}, + {".onetmp", "application/onenote"}, + {".onetoc", "application/onenote"}, + {".onetoc2", "application/onenote"}, + {".orderedtest", "application/xml"}, + {".osdx", "application/opensearchdescription+xml"}, + {".p10", "application/pkcs10"}, + {".p12", "application/x-pkcs12"}, + {".p7b", "application/x-pkcs7-certificates"}, + {".p7c", "application/pkcs7-mime"}, + {".p7m", "application/pkcs7-mime"}, + {".p7r", "application/x-pkcs7-certreqresp"}, + {".p7s", "application/pkcs7-signature"}, + {".pbm", "image/x-portable-bitmap"}, + {".pcast", "application/x-podcast"}, + {".pct", "image/pict"}, + {".pcx", "application/octet-stream"}, + {".pcz", "application/octet-stream"}, + {".pdf", "application/pdf"}, + {".pfb", "application/octet-stream"}, + {".pfm", "application/octet-stream"}, + {".pfx", "application/x-pkcs12"}, + {".pgm", "image/x-portable-graymap"}, + {".pic", "image/pict"}, + {".pict", "image/pict"}, + {".pkgdef", "text/plain"}, + {".pkgundef", "text/plain"}, + {".pko", "application/vnd.ms-pki.pko"}, + {".pls", "audio/scpls"}, + {".pma", "application/x-perfmon"}, + {".pmc", "application/x-perfmon"}, + {".pml", "application/x-perfmon"}, + {".pmr", "application/x-perfmon"}, + {".pmw", "application/x-perfmon"}, + {".png", "image/png"}, + {".pnm", "image/x-portable-anymap"}, + {".pnt", "image/x-macpaint"}, + {".pntg", "image/x-macpaint"}, + {".pnz", "image/png"}, + {".pot", "application/vnd.ms-powerpoint"}, + {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, + {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, + {".ppa", "application/vnd.ms-powerpoint"}, + {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, + {".ppm", "image/x-portable-pixmap"}, + {".pps", "application/vnd.ms-powerpoint"}, + {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, + {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, + {".ppt", "application/vnd.ms-powerpoint"}, + {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, + {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, + {".prf", "application/pics-rules"}, + {".prm", "application/octet-stream"}, + {".prx", "application/octet-stream"}, + {".ps", "application/postscript"}, + {".psc1", "application/PowerShell"}, + {".psd", "application/octet-stream"}, + {".psess", "application/xml"}, + {".psm", "application/octet-stream"}, + {".psp", "application/octet-stream"}, + {".pub", "application/x-mspublisher"}, + {".pwz", "application/vnd.ms-powerpoint"}, + {".qht", "text/x-html-insertion"}, + {".qhtm", "text/x-html-insertion"}, + {".qt", "video/quicktime"}, + {".qti", "image/x-quicktime"}, + {".qtif", "image/x-quicktime"}, + {".qtl", "application/x-quicktimeplayer"}, + {".qxd", "application/octet-stream"}, + {".ra", "audio/x-pn-realaudio"}, + {".ram", "audio/x-pn-realaudio"}, + {".rar", "application/octet-stream"}, + {".ras", "image/x-cmu-raster"}, + {".rat", "application/rat-file"}, + {".rc", "text/plain"}, + {".rc2", "text/plain"}, + {".rct", "text/plain"}, + {".rdlc", "application/xml"}, + {".resx", "application/xml"}, + {".rf", "image/vnd.rn-realflash"}, + {".rgb", "image/x-rgb"}, + {".rgs", "text/plain"}, + {".rm", "application/vnd.rn-realmedia"}, + {".rmi", "audio/mid"}, + {".rmp", "application/vnd.rn-rn_music_package"}, + {".roff", "application/x-troff"}, + {".rpm", "audio/x-pn-realaudio-plugin"}, + {".rqy", "text/x-ms-rqy"}, + {".rtf", "application/rtf"}, + {".rtx", "text/richtext"}, + {".ruleset", "application/xml"}, + {".s", "text/plain"}, + {".safariextz", "application/x-safari-safariextz"}, + {".scd", "application/x-msschedule"}, + {".sct", "text/scriptlet"}, + {".sd2", "audio/x-sd2"}, + {".sdp", "application/sdp"}, + {".sea", "application/octet-stream"}, + {".searchConnector-ms", "application/windows-search-connector+xml"}, + {".setpay", "application/set-payment-initiation"}, + {".setreg", "application/set-registration-initiation"}, + {".settings", "application/xml"}, + {".sgimb", "application/x-sgimb"}, + {".sgml", "text/sgml"}, + {".sh", "application/x-sh"}, + {".shar", "application/x-shar"}, + {".shtml", "text/html"}, + {".sit", "application/x-stuffit"}, + {".sitemap", "application/xml"}, + {".skin", "application/xml"}, + {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, + {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, + {".slk", "application/vnd.ms-excel"}, + {".sln", "text/plain"}, + {".slupkg-ms", "application/x-ms-license"}, + {".smd", "audio/x-smd"}, + {".smi", "application/octet-stream"}, + {".smx", "audio/x-smd"}, + {".smz", "audio/x-smd"}, + {".snd", "audio/basic"}, + {".snippet", "application/xml"}, + {".snp", "application/octet-stream"}, + {".sol", "text/plain"}, + {".sor", "text/plain"}, + {".spc", "application/x-pkcs7-certificates"}, + {".spl", "application/futuresplash"}, + {".src", "application/x-wais-source"}, + {".srf", "text/plain"}, + {".SSISDeploymentManifest", "text/xml"}, + {".ssm", "application/streamingmedia"}, + {".sst", "application/vnd.ms-pki.certstore"}, + {".stl", "application/vnd.ms-pki.stl"}, + {".sv4cpio", "application/x-sv4cpio"}, + {".sv4crc", "application/x-sv4crc"}, + {".svc", "application/xml"}, + {".swf", "application/x-shockwave-flash"}, + {".t", "application/x-troff"}, + {".tar", "application/x-tar"}, + {".tcl", "application/x-tcl"}, + {".testrunconfig", "application/xml"}, + {".testsettings", "application/xml"}, + {".tex", "application/x-tex"}, + {".texi", "application/x-texinfo"}, + {".texinfo", "application/x-texinfo"}, + {".tgz", "application/x-compressed"}, + {".thmx", "application/vnd.ms-officetheme"}, + {".thn", "application/octet-stream"}, + {".tif", "image/tiff"}, + {".tiff", "image/tiff"}, + {".tlh", "text/plain"}, + {".tli", "text/plain"}, + {".toc", "application/octet-stream"}, + {".tr", "application/x-troff"}, + {".trm", "application/x-msterminal"}, + {".trx", "application/xml"}, + {".ts", "video/vnd.dlna.mpeg-tts"}, + {".tsv", "text/tab-separated-values"}, + {".ttf", "application/octet-stream"}, + {".tts", "video/vnd.dlna.mpeg-tts"}, + {".txt", "text/plain"}, + {".u32", "application/octet-stream"}, + {".uls", "text/iuls"}, + {".user", "text/plain"}, + {".ustar", "application/x-ustar"}, + {".vb", "text/plain"}, + {".vbdproj", "text/plain"}, + {".vbk", "video/mpeg"}, + {".vbproj", "text/plain"}, + {".vbs", "text/vbscript"}, + {".vcf", "text/x-vcard"}, + {".vcproj", "Application/xml"}, + {".vcs", "text/plain"}, + {".vcxproj", "Application/xml"}, + {".vddproj", "text/plain"}, + {".vdp", "text/plain"}, + {".vdproj", "text/plain"}, + {".vdx", "application/vnd.ms-visio.viewer"}, + {".vml", "text/xml"}, + {".vscontent", "application/xml"}, + {".vsct", "text/xml"}, + {".vsd", "application/vnd.visio"}, + {".vsi", "application/ms-vsi"}, + {".vsix", "application/vsix"}, + {".vsixlangpack", "text/xml"}, + {".vsixmanifest", "text/xml"}, + {".vsmdi", "application/xml"}, + {".vspscc", "text/plain"}, + {".vss", "application/vnd.visio"}, + {".vsscc", "text/plain"}, + {".vssettings", "text/xml"}, + {".vssscc", "text/plain"}, + {".vst", "application/vnd.visio"}, + {".vstemplate", "text/xml"}, + {".vsto", "application/x-ms-vsto"}, + {".vsw", "application/vnd.visio"}, + {".vsx", "application/vnd.visio"}, + {".vtx", "application/vnd.visio"}, + {".wav", "audio/wav"}, + {".wave", "audio/wav"}, + {".wax", "audio/x-ms-wax"}, + {".wbk", "application/msword"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wcm", "application/vnd.ms-works"}, + {".wdb", "application/vnd.ms-works"}, + {".wdp", "image/vnd.ms-photo"}, + {".webarchive", "application/x-safari-webarchive"}, + {".webtest", "application/xml"}, + {".wiq", "application/xml"}, + {".wiz", "application/msword"}, + {".wks", "application/vnd.ms-works"}, + {".WLMP", "application/wlmoviemaker"}, + {".wlpginstall", "application/x-wlpg-detect"}, + {".wlpginstall3", "application/x-wlpg3-detect"}, + {".wm", "video/x-ms-wm"}, + {".wma", "audio/x-ms-wma"}, + {".wmd", "application/x-ms-wmd"}, + {".wmf", "application/x-msmetafile"}, + {".wml", "text/vnd.wap.wml"}, + {".wmlc", "application/vnd.wap.wmlc"}, + {".wmls", "text/vnd.wap.wmlscript"}, + {".wmlsc", "application/vnd.wap.wmlscriptc"}, + {".wmp", "video/x-ms-wmp"}, + {".wmv", "video/x-ms-wmv"}, + {".wmx", "video/x-ms-wmx"}, + {".wmz", "application/x-ms-wmz"}, + {".wpl", "application/vnd.ms-wpl"}, + {".wps", "application/vnd.ms-works"}, + {".wri", "application/x-mswrite"}, + {".wrl", "x-world/x-vrml"}, + {".wrz", "x-world/x-vrml"}, + {".wsc", "text/scriptlet"}, + {".wsdl", "text/xml"}, + {".wvx", "video/x-ms-wvx"}, + {".x", "application/directx"}, + {".xaf", "x-world/x-vrml"}, + {".xaml", "application/xaml+xml"}, + {".xap", "application/x-silverlight-app"}, + {".xbap", "application/x-ms-xbap"}, + {".xbm", "image/x-xbitmap"}, + {".xdr", "text/plain"}, + {".xht", "application/xhtml+xml"}, + {".xhtml", "application/xhtml+xml"}, + {".xla", "application/vnd.ms-excel"}, + {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, + {".xlc", "application/vnd.ms-excel"}, + {".xld", "application/vnd.ms-excel"}, + {".xlk", "application/vnd.ms-excel"}, + {".xll", "application/vnd.ms-excel"}, + {".xlm", "application/vnd.ms-excel"}, + {".xls", "application/vnd.ms-excel"}, + {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, + {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"}, + {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, + {".xlt", "application/vnd.ms-excel"}, + {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"}, + {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, + {".xlw", "application/vnd.ms-excel"}, + {".xml", "text/xml"}, + {".xmta", "application/xml"}, + {".xof", "x-world/x-vrml"}, + {".XOML", "text/plain"}, + {".xpm", "image/x-xpixmap"}, + {".xps", "application/vnd.ms-xpsdocument"}, + {".xrm-ms", "text/xml"}, + {".xsc", "application/xml"}, + {".xsd", "text/xml"}, + {".xsf", "text/xml"}, + {".xsl", "text/xml"}, + {".xslt", "text/xml"}, + {".xsn", "application/octet-stream"}, + {".xss", "application/xml"}, + {".xtp", "application/octet-stream"}, + {".xwd", "image/x-xwindowdump"}, + {".z", "application/x-compress"}, + {".zip", "application/x-zip-compressed"}, + #endregion + + }; + + public static string GetMimeType(string extension) + { + if (extension == null) + { + throw new ArgumentNullException("extension"); + } + + if (!extension.StartsWith(".")) + { + extension = "." + extension; + } + + string mime; + + return _mappings.TryGetValue(extension, out mime) ? mime : "application/octet-stream"; + } } \ No newline at end of file diff --git a/Tiobon.Core.Api/Tiobon.Core.xml b/Tiobon.Core.Api/Tiobon.Core.xml index 675be4a8..559d88b5 100644 --- a/Tiobon.Core.Api/Tiobon.Core.xml +++ b/Tiobon.Core.Api/Tiobon.Core.xml @@ -392,6 +392,13 @@ 主键ID + + + 获取图片 + + 主键ID + + 分片上传 diff --git a/Tiobon.Core.Model/ViewModels/Extend/Ghrs_UserDataRoleExtend.cs b/Tiobon.Core.Model/ViewModels/Extend/Ghrs_UserDataRoleExtend.cs new file mode 100644 index 00000000..25cf54f3 --- /dev/null +++ b/Tiobon.Core.Model/ViewModels/Extend/Ghrs_UserDataRoleExtend.cs @@ -0,0 +1,15 @@ +namespace Tiobon.Core.Model.ViewModels.Extend; + +public class Ghrs_UserDataRoleExtend +{ + public int DataRoleID { get; set; } + public int DataRoleType { get; set; } + public int DeptType { get; set; } + public int AllDataBelong { get; set; } + public int AllGrade { get; set; } + public int AllTitle { get; set; } + public int AllZone { get; set; } + public int AllPeriodMaster { get; set; } + public int ALLDL_IDL { get; set; } + public string DataRoleNo { get; set; } +} \ No newline at end of file diff --git a/Tiobon.Core.Services/BASE/BaseServices.cs b/Tiobon.Core.Services/BASE/BaseServices.cs index 72abf90b..ef1696e4 100644 --- a/Tiobon.Core.Services/BASE/BaseServices.cs +++ b/Tiobon.Core.Services/BASE/BaseServices.cs @@ -20,8 +20,8 @@ using Tiobon.Core.Model; using Tiobon.Core.Model.Models; using System.Reflection; using System.Collections; -using Microsoft.IdentityModel.Tokens; -using System.Collections.Generic; +using Tiobon.Core.Model.ViewModels.Extend; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; namespace Tiobon.Core.Services.BASE; @@ -1398,6 +1398,330 @@ public class BaseServices : IBaseServ return StaffId; } + public async Task> GetUserStaffPrivIds(int userId, int? staffId = null, DateTime? date = null) + { + if (date == null) date = DateTime.Now; + var @CDate = date; + var @UserID = userId; + var @StaffID = staffId.IsNullOrEmpty() ? 0 : staffId.Value; + + var @CompanySpecCode = string.Empty; + int @UserDeptID = 0; + int @DataRoleType = 0; //--1 员工自身 2 全部人员 3 按设定 + int @DeptType = 0; //1 按挑选 2 主管(含下阶) 3 主管(不含下阶) 4 部门助理(含下阶) 5 部门助理(不含下阶) 6 所在部门(含下阶) 7 所在部门(不含下阶) 8: 全部部门 + int? @AllDataBelong = 0, + @AllGrade = 0, + @AllTitle = 0, + @AllZone = 0, + @AllPeriodMaster = 0, + @ALLDL_IDL = 0, + @DeptID, + @TitleID, + @GradeID, + @DataBelongID, + @PeriodMasterID, + @ZoneID, + @StaffType1; + var sql = @$"SELECT CompanySpecCode + FROM ghro_company + WHERE IsEnable = 1"; + @CompanySpecCode = await Db.Ado.GetStringAsync(sql); + + //--读取使用者对应的资料权限群组 + sql = @$"SELECT b.DataRoleID, + DataRoleType, + DeptType, + AllDataBelong, + AllGrade, + AllTitle, + AllZone, + AllPeriodMaster, + ALLDL_IDL, + DataRoleNo + FROM Ghrs_UserDataRole a, Ghrs_DataRole b + WHERE UserID = {@UserID} + AND a.IsEnable = 1 + AND b.IsEnable = 1 + AND b.DataRoleId = a.DataRoleId + ORDER BY DataRoleType, DeptType DESC"; + + var dataRoles = await Db.Ado.SqlQueryAsync(sql); + + if (@StaffID.IsNullOrEmpty()) + { + if (dataRoles.Where(x => x.DataRoleType == 2).Any())// 全部人员权限 + return await Db.Queryable().Select(x => x.StaffID).ToListAsync(); + + var dataBelongIDs = new List(); + + return [@StaffID]; + } + else + { + #region 员工默认有自己的权限 + int? @UserStaffID = await Db.Ado.GetIntAsync($"SELECT UserStaffID FROM Ghrs_User WHERE UserId='{userId}'"); + if (staffId == @UserStaffID) + return [@StaffID]; + #endregion + + sql = @$"SELECT DeptID, + TitleID, + GradeID, + ZoneID, + DataBelongID, + PeriodMasterID, + StaffType1 + FROM ghra_Staff + WHERE StaffID = {staffId}"; + + var staff = await Db.Ado.SqlQuerySingleAsync(sql); + if (staff.IsNullOrEmpty()) + return []; + + @DeptID = staff.DeptID; + @TitleID = staff.TitleID; + @GradeID = staff.GradeID; + @ZoneID = staff.ZoneID; + @DataBelongID = staff.DataBelongID; + @PeriodMasterID = staff.PeriodMasterID; + @StaffType1 = staff.StaffType1; + + #region 员工默认有自己下属的权限 + sql = @$"select count(1) from Ghro_Dept + where IsEnable=1 and DeptManagerID={@UserStaffID} + and [dbo].[FDeptAisBChild] ({@DeptID},DeptID{@CDate},1)=1 )"; + + //--副主管也有权限 + int? @IsOneDeptTowManager = await Db.Ado.GetIntAsync($"SELECT dbo.FS_ParameterValue('IsOneDeptTowManager')"); + if (@IsOneDeptTowManager == 1) + sql = @$"select count(1) from Ghro_Dept + where IsEnable=1 and DeptManagerID2={@UserStaffID} + and [dbo].[FDeptAisBChild] ({@DeptID},DeptID{@CDate},1)=1 )"; + #endregion + + for (int i = 0; i < dataRoles.Count; i++) + { + var dataRole = dataRoles[i]; + + if (dataRole.DataRoleType == 2)// 全部人员权限 + return [@StaffID]; + + if (dataRole.DataRoleType == 1 && @UserStaffID == @StaffID) // 员工自身权限 + return [@StaffID]; + + //1 部门编号 + //2 集团数据归属编号 + //3 职等编号 + //4 职称编号 + //5 厂区编号 + //6 计薪类别编号 + //7 直间接编号 + if (dataRole.@AllDataBelong == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 2"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + + if (dataRole.@AllGrade == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 3"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + if (dataRole.@AllTitle == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 4"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + if (dataRole.@AllZone == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 5"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + if (dataRole.@AllPeriodMaster == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 6"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + if (dataRole.ALLDL_IDL == 0) + { + sql = @$"SELECT DataID + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DataBelongID} = DataID + AND DataTypeID = 7"; + var dataIDs = await Db.Ado.SqlQueryAsync(sql); + if (!dataIDs.Any()) + continue; + } + //判断部门的权限 @DeptType + //1 按挑选 + //2 主管(含下阶) + //3 主管(不含下阶) + //4 部门助理(含下阶) + //5 部门助理(不含下阶) + //6 所在部门(含下阶) + //7 所在部门(不含下阶) + + if (dataRole.@DeptType == 7) + { + if (@UserDeptID == 0) + { + sql = $@"SELECT DeptID + FROM Ghra_staff + WHERE StaffID = {@UserStaffID}"; + @UserDeptID = await Db.Ado.GetIntAsync(sql); + } + if (@DeptID != @UserDeptID) + continue; + } + + if (dataRole.@DeptType == 6) + { + if (@UserDeptID == 0) + { + sql = $@"SELECT DeptID + FROM Ghra_staff + WHERE StaffID = {@UserStaffID}"; + @UserDeptID = await Db.Ado.GetIntAsync(sql); + } + sql = @$"SELECT [dbo].[FDeptAisBChild] ({@DeptID}, + {@UserDeptID}, + {@CDate}, + 1)"; + + if (await Db.Ado.GetIntAsync(sql) == 0) + continue; + } + + if (dataRole.@DeptType == 5) + { + sql = @$"SELECT count (1) + FROM Ghro_Dept + WHERE IsEnable = 1 + AND DeptAssID = {@UserStaffID} + AND DeptID = {@DeptID}"; + + if (await Db.Ado.GetIntAsync(sql) == 0) + continue; + } + + if (dataRole.@DeptType == 4) + { + sql = @$"SELECT COUNT (1) + FROM Ghro_Dept + WHERE IsEnable = 1 + AND DeptAssID = {@UserStaffID} + AND [dbo].[FDeptAisBChild] ({@DeptID}, + DeptID, + {@CDate}, + 1) = 1"; + + if (await Db.Ado.GetIntAsync(sql) == 0) + continue; + } + + if (dataRole.@DeptType == 3) + { + sql = @$"SELECT count (1) + FROM Ghro_Dept + WHERE IsEnable = 1 + AND DeptManagerID = {@UserStaffID} + AND DeptID = {@DeptID}"; + + if (await Db.Ado.GetIntAsync(sql) == 0) + continue; + } + + if (dataRole.@DeptType == 2) + { + sql = @$"SELECT count (1) + FROM Ghro_Dept + WHERE IsEnable = 1 + AND DeptManagerID = {@UserStaffID} + AND [dbo].[FDeptAisBChild] ({@DeptID}, + DeptID, + {@CDate}, + 1) = 1"; + + if (await Db.Ado.GetIntAsync(sql) == 0) + continue; + } + + if (dataRole.@DeptType == 1) + { + + sql = @$"SELECT count (1) + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND {@DeptID} = DataID + AND DataTypeID = 1 + AND IncludeSub = 0"; + + var tempId = await Db.Ado.GetIntAsync(sql); + + if (tempId == 0) + { + sql = @$"SELECT count (1) + FROM Ghrs_DataRoleDetail + WHERE IsEnable = 1 + AND DataRoleID = {dataRole.DataRoleID} + AND [dbo].[FDeptAisBChild] ({@DeptID}, + DataID, + {@CDate}, + 1) = 1 + AND DataTypeID = 1 + AND IncludeSub = 1"; + + tempId = await Db.Ado.GetIntAsync(sql); + } + + if (tempId == 0) continue; + + } + return [@StaffID]; + } + } + return default; + + } + //public int GetTotalCount(string sqlSelect) //{ // string sql = string.Empty; diff --git a/Tiobon.Core.Services/Ghre/Ghre_CourseWareServices.cs b/Tiobon.Core.Services/Ghre/Ghre_CourseWareServices.cs index fe0064cd..b41be796 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_CourseWareServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_CourseWareServices.cs @@ -201,7 +201,7 @@ public class Ghre_CourseWareServices : BaseServices.OprateFailed("无效的课件ID!"); var attachments = await _ghre_CourseWareAttachmentServices.Query(x => x.CourseWareId == id); var webRootPath = _hostingEnvironment.WebRootPath; - var outPath = $"/files/upload/{result.CourseWareName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.zip"; + var outPath = $"/files/upload/{result.CourseWareName}_{result.VersionNo}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.zip"; var files = attachments.Select(x => $"{webRootPath}{"\\" + x.RelativePath}").ToArray(); if (files.Length > 0) { diff --git a/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs b/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs index 33f8b1b8..f59864ab 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs @@ -50,7 +50,7 @@ public class Ghre_StudyRecordServices : BaseServices> QueryStaff(QueryBody filter) { - return await QueryFilterPage(filter, $"UserId={App.User.ID}", true); + if (string.IsNullOrWhiteSpace(filter.orderBy)) + filter.orderBy = "CreateTime1 DESC"; + + if (filter.pageSize == 0) + filter.pageSize = 10000; + + var countSql = @$" SELECT COUNT(1) FROM Ghre_StudyRecord_V"; + var sql = @$" SELECT * + FROM Ghre_StudyRecord_V A"; + + string conditions = " WHERE 1=1 "; + var IsEnable = true; + string condition = string.Empty; + if (IsEnable == true) + conditions += " AND IsEnable = 1"; + else if (IsEnable == false) + conditions += " AND IsEnable = 0"; + + if (!string.IsNullOrWhiteSpace(condition)) + conditions += " AND " + condition; + + if (filter.jsonParam != null) + foreach (JProperty jProperty in filter.jsonParam.Properties()) + { + var name = jProperty.Name; + var value = jProperty.Value.ToString(); + if (name == "page" || name == "pageSize") + continue; + if (name == "Date") + { + var jsonParam = JsonConvert.DeserializeObject(value); + conditions += $" AND ((ExamDate BETWEEN '{jsonParam.columnValue[0]}' AND '{jsonParam.columnValue[1]}') OR (CourseBeginTime BETWEEN '{jsonParam.columnValue[0]}' AND '{jsonParam.columnValue[1]}') OR (CourseEndTime BETWEEN '{jsonParam.columnValue[0]}' AND '{jsonParam.columnValue[1]}'))"; + + continue; + } + + if (name == "IsPass" || name == "Source") + { + value = value.Replace("Include", "Equal"); + } + if (!string.IsNullOrWhiteSpace(value)) + conditions = DealConditions(conditions, name, value); + } + + sql += conditions; + countSql += conditions; + int total = await Db.Ado.GetIntAsync(countSql); + + sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql + " "; + sql += ") A ) B ) C"; + + sql += " WHERE NUM <= " + filter.pageNum * filter.pageSize + " AND NUM >" + (filter.pageNum - 1) * filter.pageSize; + + var entitys = await Db.Ado.SqlQueryAsync(sql); + + entitys.ForEach(entity => + { + if (!string.IsNullOrWhiteSpace(entity.Indate)) + entity.Indate = DateTimeHelper.ConvertToDayString(entity.Indate); + entity.ExamDate = DateTimeHelper.ConvertToDayString(entity.ExamDate); + + if (entity.ActualBeginTime != null && entity.ActualEndTime != null) + { + TimeSpan timeDifference = entity.ActualEndTime.Value - entity.ActualBeginTime.Value; + entity.ExamDuration = StringHelper.TrimNumber(Convert.ToDecimal(timeDifference.TotalMinutes), 2); + } + + if (entity.CourseType == "ManualInsert") + entity.UpdateYN = 1; + if (entity.ExamStatus != "SystemEnd" && entity.ExamStatus.IsNotEmptyOrNull()) + entity.IsViewResult = true; + + }); + + return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } public async Task> ExportStaffExcel(QueryExport body) diff --git a/Tiobon.Core/Tiobon.Core.xml b/Tiobon.Core/Tiobon.Core.xml index 675be4a8..559d88b5 100644 --- a/Tiobon.Core/Tiobon.Core.xml +++ b/Tiobon.Core/Tiobon.Core.xml @@ -392,6 +392,13 @@ 主键ID + + + 获取图片 + + 主键ID + + 分片上传