From c61e4fc8b8a2617e59708aee8a6b1a79a75554fe Mon Sep 17 00:00:00 2001 From: tangj Date: Wed, 26 Nov 2025 15:17:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 407 ++++ SHK3CloudWebAPI.sln | 25 + SHK3CloudWebAPI/.config/dotnet-tools.json | 13 + SHK3CloudWebAPI/Common/ApiVersions.cs | 14 + SHK3CloudWebAPI/Common/CommonHelper.cs | 60 + SHK3CloudWebAPI/Common/InvokeHelper.cs | 272 +++ .../Common/RequestLoggingMiddleware.cs | 88 + SHK3CloudWebAPI/Common/WarehouseMapper.cs | 111 + SHK3CloudWebAPI/Controllers/StkController.cs | 355 +++ .../Controllers/XmlToSHController.cs | 108 + SHK3CloudWebAPI/Models/BillOutput.cs | 23 + SHK3CloudWebAPI/Models/BillQuery.cs | 37 + SHK3CloudWebAPI/Models/DeliveryNoticeBill.cs | 26 + .../Models/ERPModels/BD_MATERIALBILL.cs | 9 + SHK3CloudWebAPI/Models/ERPModels/MrappBill.cs | 25 + .../Models/ERPModels/PurchaseOrderBill.cs | 15 + .../Models/ERPModels/ReceiveBill.cs | 25 + .../Models/ERPModels/ReturnNoticeBill.cs | 15 + .../Models/ERPModels/ReturnNoticeBillDets.cs | 23 + .../Models/ERPModels/SerialMainFileBill.cs | 11 + .../Models/ERPModels/TransferApplyBill.cs | 23 + .../Models/ERPModels/TransferOutBill.cs | 27 + SHK3CloudWebAPI/Models/ErpBillData.cs | 8 + SHK3CloudWebAPI/Models/InB2CParameter.cs | 312 +++ SHK3CloudWebAPI/Models/InFinsihParameter.cs | 23 + SHK3CloudWebAPI/Models/InParameter.cs | 104 + SHK3CloudWebAPI/Models/InboundOrders.cs | 98 + SHK3CloudWebAPI/Models/OutB2CParameter.cs | 856 +++++++ SHK3CloudWebAPI/Models/OutFinsihParameter.cs | 23 + SHK3CloudWebAPI/Models/OutParameter.cs | 76 + SHK3CloudWebAPI/Models/OutboundOrders.cs | 249 ++ .../Models/ProductMasterDataParameter.cs | 90 + SHK3CloudWebAPI/Models/PurchaseOrderData.cs | 162 ++ SHK3CloudWebAPI/Models/ReturnNoticeBill.cs | 15 + .../Models/ReturnNoticeBillDets.cs | 23 + SHK3CloudWebAPI/Models/Root.cs | 65 + SHK3CloudWebAPI/Models/loginParameter.cs | 28 + SHK3CloudWebAPI/Program.cs | 60 + .../Properties/launchSettings.json | 31 + SHK3CloudWebAPI/SHK3CloudWebAPI.csproj | 23 + SHK3CloudWebAPI/Service/BillQueryService.cs | 632 +++++ SHK3CloudWebAPI/Service/InService.cs | 2052 +++++++++++++++++ SHK3CloudWebAPI/Service/OutService.cs | 1208 ++++++++++ SHK3CloudWebAPI/appsettings.json | 22 + 44 files changed, 7872 insertions(+) create mode 100644 .gitignore create mode 100644 SHK3CloudWebAPI.sln create mode 100644 SHK3CloudWebAPI/.config/dotnet-tools.json create mode 100644 SHK3CloudWebAPI/Common/ApiVersions.cs create mode 100644 SHK3CloudWebAPI/Common/CommonHelper.cs create mode 100644 SHK3CloudWebAPI/Common/InvokeHelper.cs create mode 100644 SHK3CloudWebAPI/Common/RequestLoggingMiddleware.cs create mode 100644 SHK3CloudWebAPI/Common/WarehouseMapper.cs create mode 100644 SHK3CloudWebAPI/Controllers/StkController.cs create mode 100644 SHK3CloudWebAPI/Controllers/XmlToSHController.cs create mode 100644 SHK3CloudWebAPI/Models/BillOutput.cs create mode 100644 SHK3CloudWebAPI/Models/BillQuery.cs create mode 100644 SHK3CloudWebAPI/Models/DeliveryNoticeBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/BD_MATERIALBILL.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/MrappBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/PurchaseOrderBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/ReceiveBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBillDets.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/SerialMainFileBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/TransferApplyBill.cs create mode 100644 SHK3CloudWebAPI/Models/ERPModels/TransferOutBill.cs create mode 100644 SHK3CloudWebAPI/Models/ErpBillData.cs create mode 100644 SHK3CloudWebAPI/Models/InB2CParameter.cs create mode 100644 SHK3CloudWebAPI/Models/InFinsihParameter.cs create mode 100644 SHK3CloudWebAPI/Models/InParameter.cs create mode 100644 SHK3CloudWebAPI/Models/InboundOrders.cs create mode 100644 SHK3CloudWebAPI/Models/OutB2CParameter.cs create mode 100644 SHK3CloudWebAPI/Models/OutFinsihParameter.cs create mode 100644 SHK3CloudWebAPI/Models/OutParameter.cs create mode 100644 SHK3CloudWebAPI/Models/OutboundOrders.cs create mode 100644 SHK3CloudWebAPI/Models/ProductMasterDataParameter.cs create mode 100644 SHK3CloudWebAPI/Models/PurchaseOrderData.cs create mode 100644 SHK3CloudWebAPI/Models/ReturnNoticeBill.cs create mode 100644 SHK3CloudWebAPI/Models/ReturnNoticeBillDets.cs create mode 100644 SHK3CloudWebAPI/Models/Root.cs create mode 100644 SHK3CloudWebAPI/Models/loginParameter.cs create mode 100644 SHK3CloudWebAPI/Program.cs create mode 100644 SHK3CloudWebAPI/Properties/launchSettings.json create mode 100644 SHK3CloudWebAPI/SHK3CloudWebAPI.csproj create mode 100644 SHK3CloudWebAPI/Service/BillQueryService.cs create mode 100644 SHK3CloudWebAPI/Service/InService.cs create mode 100644 SHK3CloudWebAPI/Service/OutService.cs create mode 100644 SHK3CloudWebAPI/appsettings.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c3c4b13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,407 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea/ + +# Log files +log/ +*.log + +# Application specific +appsettings.Development.json +appsettings.Local.json diff --git a/SHK3CloudWebAPI.sln b/SHK3CloudWebAPI.sln new file mode 100644 index 0000000..2862949 --- /dev/null +++ b/SHK3CloudWebAPI.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35327.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SHK3CloudWebAPI", "SHK3CloudWebAPI\SHK3CloudWebAPI.csproj", "{DC5DCF4E-9E67-4497-9CB5-03C627B3DAD7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DC5DCF4E-9E67-4497-9CB5-03C627B3DAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC5DCF4E-9E67-4497-9CB5-03C627B3DAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC5DCF4E-9E67-4497-9CB5-03C627B3DAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC5DCF4E-9E67-4497-9CB5-03C627B3DAD7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1C3FCF6F-D360-4801-B597-5197D81B8C33} + EndGlobalSection +EndGlobal diff --git a/SHK3CloudWebAPI/.config/dotnet-tools.json b/SHK3CloudWebAPI/.config/dotnet-tools.json new file mode 100644 index 0000000..4f48799 --- /dev/null +++ b/SHK3CloudWebAPI/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "9.0.0", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/SHK3CloudWebAPI/Common/ApiVersions.cs b/SHK3CloudWebAPI/Common/ApiVersions.cs new file mode 100644 index 0000000..bdf0700 --- /dev/null +++ b/SHK3CloudWebAPI/Common/ApiVersions.cs @@ -0,0 +1,14 @@ +namespace SHK3CloudWebAPI +{ + /// + /// + /// + public enum ApiVersions + { + /// + /// 接口 + /// + 接口=0, + + } +} diff --git a/SHK3CloudWebAPI/Common/CommonHelper.cs b/SHK3CloudWebAPI/Common/CommonHelper.cs new file mode 100644 index 0000000..539855a --- /dev/null +++ b/SHK3CloudWebAPI/Common/CommonHelper.cs @@ -0,0 +1,60 @@ +using System.Xml.Serialization; + +namespace SHK3CloudWebAPI.Common +{ + public class CommonHelper + { + public static string SerializeToXml(T obj) + { + XmlSerializer serializer = new XmlSerializer(typeof(T)); + using (StringWriter textWriter = new StringWriter()) + { + serializer.Serialize(textWriter, obj); + return textWriter.ToString(); + } + } + + public static T DeserializeFromXml(string xml) + { + if (string.IsNullOrWhiteSpace(xml)) + { + throw new ArgumentException("XML内容为空,无法反序列化", nameof(xml)); + } + + try + { + XmlSerializer serializer = new XmlSerializer(typeof(T)); + using (StringReader reader = new StringReader(xml)) + { + return (T)serializer.Deserialize(reader); + } + } + catch (InvalidOperationException ex) when (ex.InnerException is System.Xml.XmlException) + { + // XML格式错误 + throw new FormatException("XML格式不正确,无法反序列化为 " + typeof(T).Name, ex); + } + } + + + public static string OigNumber(string HQID) + { + //1318586 205 新中冠智能科技股份有限公司 + //1945324 203 深圳市高飞易科技有限公司 + //3415228 202 厦门鑫亚宝宇信息技术有限公司 + //693465 201 北京方正易通科技有限公司 + //3860141 204 深圳市金文网络科技有限公司 + //3311308 103 皓诺 + + string oidnumber = ""; + + switch (HQID) + { + case "3311308": + oidnumber = "103"; + break; + } + return oidnumber; + } + } +} diff --git a/SHK3CloudWebAPI/Common/InvokeHelper.cs b/SHK3CloudWebAPI/Common/InvokeHelper.cs new file mode 100644 index 0000000..a395627 --- /dev/null +++ b/SHK3CloudWebAPI/Common/InvokeHelper.cs @@ -0,0 +1,272 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using RestSharp; + +namespace SHK3CloudWebAPI +{ + /// + /// + /// + public class InvokeHelper + { + /// + /// url + /// + public string _CloudUrl; + /// + /// 帐套标识 + /// + public string _KDType; + /// + /// 用户 + /// + public string _KDUser; + /// + /// 密码 + /// + public string _KDPwd; + + + /// + /// + /// + public InvokeHelper() + { + + // 创建配置构建器 + var configurationBuilder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + + // 构建配置 + var configuration = configurationBuilder.Build(); + + // 读取配置参数 + _CloudUrl = configuration["AppSettings:CloudUrl"].ToString(); + _KDType = configuration.GetValue("AppSettings:KDType").ToString(); + _KDUser = configuration.GetValue("AppSettings:KDUser").ToString(); + _KDPwd = configuration.GetValue("AppSettings:KDPwd").ToString(); + + } + + /// + /// 登录验证 + /// + /// + public string Login() + { + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc", Method.Post); + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + + loginParameter loginData = new loginParameter(); + loginData.acctID = _KDType; + loginData.username = _KDUser; + loginData.password = _KDPwd; + loginData.lcid = "2052"; + + var login = JsonConvert.SerializeObject(loginData); + + request.AddParameter("application/json", login, ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + + /// + /// 保存 + /// + /// 单据标识 + /// JSON + /// 登录的kdservice-sessionid + /// + public string Save(string formId, string content, string cookie) + { + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc", Method.Post); + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Cookie", string.Format("kdservice-sessionid={0}", cookie)); + + List Parameters = new List(); + //业务对象Id + Parameters.Add(formId); + //Json字串 + Parameters.Add(content); + + var push = JsonConvert.SerializeObject(Parameters); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("parameters", push); + + request.AddParameter("application/json", jsonRoot.ToString(), ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + /// + /// 整单关闭 + /// + /// 单据标识 + /// JSON + /// 登录的kdservice-sessionid + /// + public string BillClose(string formId, string content, string cookie) + { + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc", Method.Post); + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Cookie", string.Format("kdservice-sessionid={0}", cookie)); + + List Parameters = new List(); + //业务对象Id + Parameters.Add(formId); + //业务操作 整单关闭 + Parameters.Add("BillClose"); + //Json字串 + Parameters.Add(content); + + var push = JsonConvert.SerializeObject(Parameters); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("parameters", push); + + request.AddParameter("application/json", jsonRoot.ToString(), ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + + /// + /// 列表查询JSON + /// + /// + /// + /// + public string BillQuery(string content, string cookie) + { + + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", Method.Post); + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Cookie", string.Format("kdservice-sessionid={0}", cookie)); + + List Parameters = new List(); + //Json字串 + Parameters.Add(content); + + var billQuery = JsonConvert.SerializeObject(Parameters); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("parameters", billQuery); + + request.AddParameter("application/json", jsonRoot.ToString(), ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + + + /// + /// 列表查询 + /// + /// + /// /// + /// + public string ExecuteBillQuery(string content, string cookie) + { + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", Method.Post); + + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Cookie", string.Format("kdservice-sessionid={0}", cookie)); + + List Parameters = new List(); + //Json字串 + Parameters.Add(content); + + + var billQuery = JsonConvert.SerializeObject(Parameters); + JObject jsonRoot = new JObject(); + jsonRoot.Add("parameters", billQuery); + + request.AddParameter("application/json", jsonRoot.ToString(), ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + /// + ///单据操作 + /// + /// 单据标识 + /// JSON "BillClose" + /// 登录的kdservice-sessionid + /// + public string BillOperation(string formId, string content, string cookie, string strOperation) + { + var httpClient = new RestClient(_CloudUrl); + + var request = new RestRequest("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc", Method.Post); + + request.AddHeader("Accept", "*/*"); + request.AddHeader("Accept-Encoding", "gzip, deflate, br"); + request.AddHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0"); + request.AddHeader("Connection", "keep-alive"); + request.AddHeader("Content-Type", "application/json"); + request.AddHeader("Cookie", string.Format("kdservice-sessionid={0}", cookie)); + + List Parameters = new List(); + //业务对象Id + Parameters.Add(formId); + //业务操作 整单关闭 + Parameters.Add(strOperation); + //Json字串 + Parameters.Add(content); + + var push = JsonConvert.SerializeObject(Parameters); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("parameters", push); + + request.AddParameter("application/json", jsonRoot.ToString(), ParameterType.RequestBody); + + var response = httpClient.Execute(request); + + return response.Content; + } + } +} diff --git a/SHK3CloudWebAPI/Common/RequestLoggingMiddleware.cs b/SHK3CloudWebAPI/Common/RequestLoggingMiddleware.cs new file mode 100644 index 0000000..16f94d1 --- /dev/null +++ b/SHK3CloudWebAPI/Common/RequestLoggingMiddleware.cs @@ -0,0 +1,88 @@ +using Microsoft.AspNetCore.Http; +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace SHK3CloudWebAPI.Common +{ + public class RequestLoggingMiddleware + { + private readonly RequestDelegate _next; + + public RequestLoggingMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + // 获取请求信息 + var method = context.Request.Method; + var path = context.Request.Path; + var query = context.Request.QueryString.ToString(); + var ipAddress = context.Connection.RemoteIpAddress?.ToString(); + + // 获取 AppKey 和 AppSecret(如果存在) + context.Request.Headers.TryGetValue("AppKey", out var appKey); + context.Request.Headers.TryGetValue("AppSecret", out var appSecret); + + // 读取请求体 + var originalBodyStream = context.Request.Body; + using (var memoryStream = new MemoryStream()) + { + await originalBodyStream.CopyToAsync(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + + var body = await new StreamReader(memoryStream).ReadToEndAsync(); + memoryStream.Seek(0, SeekOrigin.Begin); + context.Request.Body = memoryStream; + + var originalResponseBodyStream = context.Response.Body; + using (var responseBodyStream = new MemoryStream()) + { + context.Response.Body = responseBodyStream; + + await _next(context); + + responseBodyStream.Seek(0, SeekOrigin.Begin); + var responseBody = await new StreamReader(responseBodyStream).ReadToEndAsync(); + responseBodyStream.Seek(0, SeekOrigin.Begin); + await responseBodyStream.CopyToAsync(originalResponseBodyStream); + + // 日志记录路径 + var currentDate = DateTime.Now.ToString("yyyy-MM-dd"); + var folderPath = Path.Combine("C:\\log", currentDate); + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + + var filePath = Path.Combine(folderPath, $"{currentDate}.txt"); + + // 构建日志内容 + var logMessage = new StringBuilder(); + logMessage.AppendLine($"Timestamp: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + logMessage.AppendLine($"IP Address: {ipAddress}"); + logMessage.AppendLine($"Method: {method}"); + logMessage.AppendLine($"Path: {path}"); + logMessage.AppendLine($"QueryString: {query}"); + logMessage.AppendLine($"AppKey: {appKey}"); + logMessage.AppendLine($"AppSecret: {appSecret}"); + + logMessage.AppendLine("Headers:"); + foreach (var header in context.Request.Headers) + { + logMessage.AppendLine($"{header.Key}: {header.Value}"); + } + + logMessage.AppendLine($"Request Body: {body}"); + logMessage.AppendLine($"Response Body: {responseBody}"); + logMessage.AppendLine(new string('-', 80)); + + await File.AppendAllTextAsync(filePath, logMessage.ToString()); + } + } + } + } +} diff --git a/SHK3CloudWebAPI/Common/WarehouseMapper.cs b/SHK3CloudWebAPI/Common/WarehouseMapper.cs new file mode 100644 index 0000000..5e54802 --- /dev/null +++ b/SHK3CloudWebAPI/Common/WarehouseMapper.cs @@ -0,0 +1,111 @@ +using System.Collections.Generic; + +namespace SHK3CloudWebAPI +{ + public static class WarehouseMapper + { + // 定义一个字典存储 whCode 和 FNumber 的映射关系 + //2025年修改,原本是 12234-XMBT01 有对应关系 后来移除掉了 太多地方引用过,所以直接修改了映射关系 + private static readonly Dictionary whCodeToFNumberMap = new Dictionary + { + { "3655708-XMBT01", "XMBT01" }, + { "3655708-XMBT02", "XMBT02" }, + { "3655708-XMBT03", "XMBT03" }, + { "3655708-XMBT04", "XMBT04" }, + { "3655708-XMBT05", "XMBT05" }, + { "3655708-XMBT06", "XMBT06" }, + { "3655708-XMBT07", "XMBT07" }, + { "3655708-XMBT08", "XMBT08" }, + { "3655708-XMBT09", "XMBT09" }, + { "3655708-XMBT10", "XMBT10" }, + { "3655708-XMBT11", "XMBT11" }, + { "3655708-XMBT12", "XMBT12" }, + { "3655708-XMBT13", "XMBT13" }, + { "3655708-XMBT14", "XMBT14" }, + { "3655708-XMBT15", "XMBT15" }, + { "3655708-XMBT16", "XMBT16" }, + { "3655708-XMBT17", "XMBT17" }, + { "3655708-XMBT18", "XMBT18" }, + { "3655708-XMBT19", "XMBT19" }, + { "3655708-XMBT20", "XMBT20" }, + { "3655708-XMBT21", "XMBT21" }, + { "3655708-XMBT22", "XMBT22" }, + { "3655708-XMBT23", "XMBT23" }, + { "3655708-XMBT24", "XMBT24" }, + { "3655708-XMBT25", "XMBT25" }, + { "3655708-XMBT26", "XMBT26" }, + { "3655708-XMBT27", "XMBT27" }, + { "3655708-XMBT28", "XMBT28" }, + { "3655708-XMBT29", "XMBT29" }, + { "3655708-XMBT30", "XMBT30" }, + { "3655708-XMBT31", "XMBT31" }, + { "3655708-XMBT32", "XMBT32" }, + { "3655708-XMBT33", "XMBT33" }, + { "3655708-XMBT34", "XMBT34" }, + { "3655708-XMBT35", "XMBT35" }, + { "3655708-XMBT36", "XMBT36" }, + { "3655708-XMBT37", "XMBT37" }, + { "3655708-XMBT38", "XMBT38" }, + { "3655708-XMBT39", "XMBT39" }, + { "3655708-XMBT40", "XMBT40" }, + { "3655708-XMBT41", "XMBT41" }, + { "3655708-XMBT42", "XMBT42" }, + { "3655708-XMBT43", "XMBT43" }, + { "3655708-XMBT44", "XMBT44" }, + { "3655708-XMBT45", "XMBT45" }, + { "3655708-XMBT46", "XMBT46" }, + { "3655708-XMBT47", "XMBT47" }, + { "3655708-XMBT48", "XMBT48" }, + { "3655708-XMBT49", "XMBT49" }, + { "3655708-XMBT50", "XMBT50" }, + { "3655708-XMBT51", "XMBT51" }, + { "3655708-XMBT52", "XMBT52" }, + { "3655708-XMBT53", "XMBT53" }, + { "3655708-XMBT54", "XMBT54" }, + { "3655708-XMBT55", "XMBT55" }, + { "3655708-XMBT56", "XMBT56" }, + { "3655708-XMBT57", "XMBT57" }, + { "3655708-XMBT58", "XMBT58" }, + { "3655708-XMBT59", "XMBT59" }, + { "3655708-XMBT60", "XMBT60" }, + { "3655708-XMBT61", "XMBT61" }, + { "3655708-XMBT62", "XMBT62" }, + { "3655708-XMBT63", "XMBT63" }, + { "3655708-XMBT64", "XMBT64" }, + { "3655708-XMBT65", "XMBT65" }, + { "3655708-XMBT66", "XMBT66" }, + { "3655708-XMBT67", "XMBT67" }, + { "3655708-XMBT68", "XMBT68" }, + { "3655708-XMBT69", "XMBT69" }, + { "3655708-XMBT70", "XMBT70" }, + { "3655708-XMBT71", "XMBT71" }, + { "3655708-XMBT72", "XMBT72" }, + { "3655708-XMBT73", "XMBT73" }, + { "3655708-XMBT74", "XMBT74" }, + { "3655708-XMBT75", "XMBT75" }, + { "3655708-XMBT76", "XMBT76" }, + { "3655708-XMBT77", "XMBT77" }, + // 添加其他映射关系 + { "2974108-BJ01", "2974108-BJ01" }, + { "2974108-BJ03", "CK002" }, + { "2974108-BJ02", "CK028" } + }; + + /// + /// 根据 whCode 获取对应的 FNumber + /// + /// 传入的仓库编码 + /// 返回对应的 FNumber,如果找不到返回 null 或者一个默认值 + public static string? GetFNumber(string? whCode) + { + if (whCode == null) return null; + + // 从字典中查找,如果找不到可以返回一个默认值 + return whCodeToFNumberMap.TryGetValue(whCode, out var fNumber) ? fNumber : null; + } + + + + + } +} diff --git a/SHK3CloudWebAPI/Controllers/StkController.cs b/SHK3CloudWebAPI/Controllers/StkController.cs new file mode 100644 index 0000000..03d9aeb --- /dev/null +++ b/SHK3CloudWebAPI/Controllers/StkController.cs @@ -0,0 +1,355 @@ +using Microsoft.AspNetCore.Mvc; +using SHK3CloudWebAPI.Models; +using SHK3CloudWebAPI.Models.ERPModels; + +namespace SHK3CloudWebAPI.Controllers +{ + /// + /// 出入库业务 + /// + [ApiController] + [Route("3pl-wms-adapter/2bApi")] + public class StkController : ControllerBase + { + /// + /// 入库接口(采购入库、销售退货、分步式调入) + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("notifyInboundTransaction")] + public ActionResult NotifyInboundTransaction(InParameter parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + #region 通过单据号去查对应的ERP单据上有没有,并且确认是什么单据 + dynamic receive = BillQueryService.ReceiveBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + if (receive.Count > 0) + { + //收料通知 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "Receive"; + erpBillDatas.Add(erpBillData); + } + + dynamic returnNotice = BillQueryService.ReturnNoticeBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + if (returnNotice.Count > 0) + { + //退库通知 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "ReturnNotice"; + erpBillDatas.Add(erpBillData); + } + + dynamic transferOut = BillQueryService.TransferOutBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + if (transferOut.Count > 0) + { + //分布式调出 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "TransferOut"; + erpBillDatas.Add(erpBillData); + } + + #endregion + + if (erpBillDatas.Count > 1) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.inboundNo + "在ERP中不唯一" + }; + + } + else if (erpBillDatas.Count == 0) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.inboundNo + "在ERP中不存在" + }; + } + else + { + if (erpBillDatas[0].BillType == "Receive") + { + billOutput = InService.InStock(parameter); + + } + else if (erpBillDatas[0].BillType == "ReturnNotice") + { + billOutput = InService.ReturnStock(parameter); + } + else if (erpBillDatas[0].BillType == "TransferOut") + { + billOutput = InService.TransferIn(parameter); + } + } + + return billOutput; + } + + + ///// + ///// 出库接口(销售出库、采购退料、分步式调出) + ///// + ///// + ///// + //[ApiExplorerSettings(GroupName = "接口")] + //[HttpGet("XXXX")] + //public string XXXX() + //{ + // return "11"; + //} + + /// + /// 出库接口(销售出库、采购退料、分步式调出) + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("notifyOutboundTransaction")] + public ActionResult notifyOutboundTransaction([FromBody] OutParameter parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + #region 通过单据号去查对应的ERP单据上有没有,并且确认是什么单据 + dynamic deliveryNotice = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + if (deliveryNotice.Count > 0) + { + //发货通知 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "DeliveryNotice"; + erpBillDatas.Add(erpBillData); + } + + dynamic mrapp = BillQueryService.MrappBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + if (mrapp.Count > 0) + { + //退料申请 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "Mrapp"; + erpBillDatas.Add(erpBillData); + } + + dynamic transferApply = BillQueryService.TransferApplyBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + if (transferApply.Count > 0) + { + //调拨申请 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "TransferApply"; + erpBillDatas.Add(erpBillData); + } + #endregion + + if (erpBillDatas.Count > 1) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.outboundNo + "在ERP中不唯一" + }; + + } + else if (erpBillDatas.Count == 0) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.outboundNo + "在ERP中不存在" + }; + } + else + { + if (erpBillDatas[0].BillType == "DeliveryNotice") + { + billOutput = OutService.OutStock(parameter); + + } + else if (erpBillDatas[0].BillType == "Mrapp") + { + billOutput = OutService.PurMRB(parameter); + } + else if (erpBillDatas[0].BillType == "TransferApply") + { + billOutput = OutService.TRANSFEROUT(parameter); + } + + } + + return billOutput; + + } + + /// + /// 入库反馈接口 + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("notifyOrderCreated")] + public ActionResult notifyOrderCreated(InFinsihParameter parameter) + { + var billOutput = new BillOutput(); + billOutput = new BillOutput + { + result = 0, + errorCode = "", + errorMsg = "未知的wms类型: inbound_order3655708-XMBT13" + }; + + return billOutput; + } + + /// + /// 出库反馈接口 + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("notifyInboundFinsih")] + public ActionResult notifyInboundFinsih(OutFinsihParameter parameter) + { + var billOutput = new BillOutput(); + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = "" + }; + + return billOutput; + } + + + + /// + /// 2c销售退货接口 + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("ReturnNotice")] + public ActionResult ReturnNotice(InB2CParameter parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + #region 通过单据号去查对应的ERP单据上有没有,并且确认是什么单据 + + + ReturnNoticeBill returnNotice = BillQueryService.ReturnNoticeBillQuery("FBillNo='" + parameter.inBoundOrderConfirm[0].orderCode + "'"); + + if (returnNotice != null) + { + //退库通知 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "ReturnNotice"; + erpBillDatas.Add(erpBillData); + } + #endregion + + if (erpBillDatas.Count > 1) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.inBoundOrderConfirm[0].orderCode + "在ERP中不唯一" + }; + + } + else if (erpBillDatas.Count == 0) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.inBoundOrderConfirm[0].orderCode + "在ERP中不存在" + }; + } + else + { + + if (erpBillDatas[0].BillType == "ReturnNotice") + { + billOutput = InService.ReturnStock2c(parameter); + } + + } + + return billOutput; + } + + + /// + /// 2c销售出库接口 + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("DeliveryNotice")] + public ActionResult DeliveryNotice(OutB2CParameter parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + #region 通过单据号去查对应的ERP单据上有没有,并且确认是什么单据 + List deliveryNotice = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + parameter.outBoundConfirm[0].orderCode + "'"); + + if (deliveryNotice.Count > 0) + { + //发货通知 + ErpBillData erpBillData = new ErpBillData(); + erpBillData.BillType = "DeliveryNotice"; + erpBillDatas.Add(erpBillData); + } + #endregion + + if (erpBillDatas.Count > 1) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.outBoundConfirm[0].orderCode + "在ERP中不唯一" + }; + + } + else if (erpBillDatas.Count == 0) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = "单据号" + parameter.outBoundConfirm[0].orderCode + "在ERP中不存在" + }; + } + else + { + if (erpBillDatas[0].BillType == "DeliveryNotice") + { + billOutput = OutService.OutStock2c(parameter); + + } + + + } + + return billOutput; + + } + } +} diff --git a/SHK3CloudWebAPI/Controllers/XmlToSHController.cs b/SHK3CloudWebAPI/Controllers/XmlToSHController.cs new file mode 100644 index 0000000..dd0cab4 --- /dev/null +++ b/SHK3CloudWebAPI/Controllers/XmlToSHController.cs @@ -0,0 +1,108 @@ +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using SHK3CloudWebAPI; +using SHK3CloudWebAPI.Common; +using SHK3CloudWebAPI.Models; +using SHK3CloudWebAPI.Models.ERPModels; +using System.Diagnostics.Eventing.Reader; + +namespace SHB2CK3CloudWebAPI.Controllers +{ + [ApiController] + [Route("[controller]")] + public class XmlToSHController : ControllerBase + { + /// + /// E27采购单同步(采购订单) + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("PurchaseOrderData")] + [Consumes("application/json")] + [Produces("application/json")] + public ActionResult PurchaseOrderData([FromBody] PurchaseOrderData parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + billOutput = InService.PurchaseOrder(parameter); + + return billOutput; + } + + /// + /// E01 入库通知单(收料通知单 | 采购入库单) + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("InboundOrders")] + [Consumes("application/json")] + [Produces("application/json")] + public ActionResult InboundOrders([FromBody] InboundOrders parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + if (parameter.InboundOrder.PoType == "10")//采购入库 + { + + billOutput = InService.ReceiveBill(parameter); + } + if (parameter.InboundOrder.PoType == "24")//采退差异 + { + billOutput = InService.InStock3PP(parameter); + } + + return billOutput; + } + + /// + /// E03 采退出库通知单(退料申请单) + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("OutboundOrders")] + [Consumes("application/json")] + [Produces("application/json")] + public ActionResult OutboundOrders([FromBody] OutboundOrders parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + + billOutput = InService.MRAPP(parameter); + + return billOutput; + } + + /// + /// 物料同步接口 + /// + /// + /// + [ApiExplorerSettings(GroupName = "接口")] + [HttpPost("MaterialData")] + [Consumes("application/json")] + [Produces("application/json")] + public ActionResult MaterialData([FromBody] ProductMasterDataParameter parameter) + { + var billOutput = new BillOutput(); + List erpBillDatas = new List(); + string outJson = JsonConvert.SerializeObject(parameter); + List deliveryNotice = BillQueryService.BD_MATERIALBillQuery("FNumber='" + parameter.Variants[0].PartNumber + "' and FUSEORGID.FNumber='100'"); + if (deliveryNotice.Count>0) + { + billOutput = InService.BD_MATERIAL(parameter, deliveryNotice[0].FMATERIALID, deliveryNotice[0].FDOCUMENTSTATUS, "100"); + } + else + { + billOutput = InService.BD_MATERIAL(parameter, "0", "", "100"); + } + + + return billOutput; + } + } +} diff --git a/SHK3CloudWebAPI/Models/BillOutput.cs b/SHK3CloudWebAPI/Models/BillOutput.cs new file mode 100644 index 0000000..231ce20 --- /dev/null +++ b/SHK3CloudWebAPI/Models/BillOutput.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI +{ + /// + /// 返回参数 + /// + public class BillOutput + { + /// + /// 数据接收状态,0失败,1单据创建成功,2待回调告知单据创建完成 + /// + public int result { get; set; } + + /// + /// 错误编码 + /// + public string errorCode { get; set; } + + /// + /// 错误原因 + /// + public string errorMsg { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/BillQuery.cs b/SHK3CloudWebAPI/Models/BillQuery.cs new file mode 100644 index 0000000..925dbb4 --- /dev/null +++ b/SHK3CloudWebAPI/Models/BillQuery.cs @@ -0,0 +1,37 @@ +namespace SHK3CloudWebAPI +{ + /// + /// 查询 + /// + public class BillQuery + { + /// + /// + /// + public string FormId { get; set; } + /// + /// + /// + public int TopRowCount { get; set; } + /// + /// + /// + public int Limit { get; set; } + /// + /// + /// + public int StartRow { get; set; } + /// + /// + /// + public string FilterString { get; set; } + /// + /// + /// + public string OrderString { get; set; } + /// + /// + /// + public string FieldKeys { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/DeliveryNoticeBill.cs b/SHK3CloudWebAPI/Models/DeliveryNoticeBill.cs new file mode 100644 index 0000000..b4b93c5 --- /dev/null +++ b/SHK3CloudWebAPI/Models/DeliveryNoticeBill.cs @@ -0,0 +1,26 @@ +namespace SHK3CloudWebAPI.Models +{ + public class DeliveryNoticeBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public string FDeliveryOrgIDNumber { get; set; } + + public string FCustomerIDNumber { get; set; } + + public int FEntity_FEntryId { get; set; } + + public int FEntity_FSEQ { get; set; } + + public string FMaterialIdNumber { get; set; } + + public string FUnitIdFNumber { get; set; } + + public bool F_UNW_IsSNTrue { get; set; } + + public string FLABEL { get; set; } + + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/BD_MATERIALBILL.cs b/SHK3CloudWebAPI/Models/ERPModels/BD_MATERIALBILL.cs new file mode 100644 index 0000000..eb7cd66 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/BD_MATERIALBILL.cs @@ -0,0 +1,9 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class BD_MATERIALBILL + { + public string FNumber { get; set; } + public string FMATERIALID { get; set; } + public string FDOCUMENTSTATUS { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/MrappBill.cs b/SHK3CloudWebAPI/Models/ERPModels/MrappBill.cs new file mode 100644 index 0000000..fc916ad --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/MrappBill.cs @@ -0,0 +1,25 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class MrappBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public int FEntity_FEntryId { get; set; } + + public int FEntity_FSEQ { get; set; } + + public string FPURCHASEORGIDNumber { get; set; } + + public string FSUPPLIERIDNumber { get; set; } + + public string FMATERIALIDNumber { get; set; } + + public string FUnitIDNumber { get; set; } + + public string FORDERNO { get; set; } + + public int FPOORDERENTRYID { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/PurchaseOrderBill.cs b/SHK3CloudWebAPI/Models/ERPModels/PurchaseOrderBill.cs new file mode 100644 index 0000000..add56e4 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/PurchaseOrderBill.cs @@ -0,0 +1,15 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class PurchaseOrderBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public int FDetailEntity_FEntryId { get; set; } + + //public int FDetailEntity_FSEQ { get; set; } + + public string FMaterialIdNumber { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/ReceiveBill.cs b/SHK3CloudWebAPI/Models/ERPModels/ReceiveBill.cs new file mode 100644 index 0000000..dc3f217 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/ReceiveBill.cs @@ -0,0 +1,25 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class ReceiveBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public string FStockOrgIdNumber { get; set; } + + public string FSupplierIdNumber { get; set; } + + public string FOrderBillNo { get; set; } + + public int FPOORDERENTRYID { get; set; } + + public int FDetailEntity_FEntryId { get; set; } + + public int FDetailEntity_FSEQ { get; set; } + + public string FMaterialIdNumber { get; set; } + + public string FUnitIdFNumber { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBill.cs b/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBill.cs new file mode 100644 index 0000000..1cce857 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBill.cs @@ -0,0 +1,15 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class ReturnNoticeBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public string FOwnerNumber { get; set; } + + public string FSaleOrgIdNumber { get; set; } + + public string FRetcustIdNumber { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBillDets.cs b/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBillDets.cs new file mode 100644 index 0000000..affdeeb --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/ReturnNoticeBillDets.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class ReturnNoticeBillDets + { + public int? FID { get; set; } + + public string? FBillNo { get; set; } + + public string? FOwnerNumber { get; set; } + + public string? FSaleOrgIdNumber { get; set; } + + public string? FRetcustIdNumber { get; set; } + + public string? FMaterialIdNumber { get; set; } + + public string? FUnitIDNumber { get; set; } + + public int? FEntity_FEntryId { get; set; } + + } +} + diff --git a/SHK3CloudWebAPI/Models/ERPModels/SerialMainFileBill.cs b/SHK3CloudWebAPI/Models/ERPModels/SerialMainFileBill.cs new file mode 100644 index 0000000..a21a682 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/SerialMainFileBill.cs @@ -0,0 +1,11 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class SerialMainFileBill + { + public string FNUMBER { get; set; } + + public string FIMEI1 { get; set; } + + public string FIMEI2 { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/TransferApplyBill.cs b/SHK3CloudWebAPI/Models/ERPModels/TransferApplyBill.cs new file mode 100644 index 0000000..d516f7b --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/TransferApplyBill.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class TransferApplyBill + { + + public int FID { get; set; } + + public string FBillNo { get; set; } + + public int FEntity_FEntryId { get; set; } + + public string FAPPORGIDNumber { get; set; } + + public string FMATERIALIDNumber { get; set; } + + public string FUNITIDNumber { get; set; } + + public string FStockInIdNumber { get; set; } + + public string FSrcStockIDNumber { get; set; } + + } +} diff --git a/SHK3CloudWebAPI/Models/ERPModels/TransferOutBill.cs b/SHK3CloudWebAPI/Models/ERPModels/TransferOutBill.cs new file mode 100644 index 0000000..b278795 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ERPModels/TransferOutBill.cs @@ -0,0 +1,27 @@ +namespace SHK3CloudWebAPI.Models.ERPModels +{ + public class TransferOutBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public int FSTKTRSOUTENTRY_FEntryId { get; set; } + + public string FStockOrgIDNumber { get; set; } + + public string FStockInOrgIDNumber { get; set; } + + public string FMaterialIDNumber { get; set; } + + public string FSrcStockIDNumber { get; set; } + + public string FUnitIDNumber { get; set; } + + public string FVESTONWAY { get; set; } + + public string FDestStockStatusIDNumber { get; set; } + + public string FSrcBillNo { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ErpBillData.cs b/SHK3CloudWebAPI/Models/ErpBillData.cs new file mode 100644 index 0000000..dc1e384 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ErpBillData.cs @@ -0,0 +1,8 @@ +namespace SHK3CloudWebAPI.Models +{ + public class ErpBillData + { + public string BillType { get; set; } + + } +} diff --git a/SHK3CloudWebAPI/Models/InB2CParameter.cs b/SHK3CloudWebAPI/Models/InB2CParameter.cs new file mode 100644 index 0000000..6ff8d6f --- /dev/null +++ b/SHK3CloudWebAPI/Models/InB2CParameter.cs @@ -0,0 +1,312 @@ +namespace SHK3CloudWebAPI.Models +{ + /// + /// 入库单批量反馈 + /// + public class InB2CParameter + { + /// + /// 退货订单入库反馈信息 + /// + public List inBoundOrderConfirm { get; set; } + } + + /// + /// 退货订单入库反馈库存明细 + /// + public class InBoundInvLineConfirmItem + { + /// + /// 实际数量 + /// + public decimal qtyActual { get; set; } + /// + /// + /// + public string origin { get; set; } + /// + /// + /// + public string invStatus { get; set; } + /// + /// + /// + public string isSellable { get; set; } + /// + /// 批次号 + /// + public string batchNo { get; set; } + /// + /// 入库批次号 + /// + public string inboundBatchNo { get; set; } + /// + /// 生产日期 + /// + public DateTime? productDate { get; set; } + /// + /// 过期日期 + /// + public DateTime? expireDate { get; set; } + /// + /// + /// + public string extMemo { get; set; } + /// + /// + /// + public string isIqc { get; set; } + /// + /// SN信息 + /// + public List skuSnInfo { get; set; } + /// + /// + /// + public List skuDefectInfo { get; set; } + /// + /// + /// + public string subpackageDate { get; set; } + } + + /// + /// 退货订单入库反馈明细信息 + /// + public class InBoundLineConfirmItem + { + /// + /// 行号 + /// + public string lineNo { get; set; } + /// + /// + /// + public string storeCode { get; set; } + /// + /// 仓库code + /// + public string warehouseCode { get; set; } + /// + /// + /// + public string skuCode { get; set; } + /// + /// + /// + public string extCode { get; set; } + /// + /// erp物料编码 + /// + public string upc { get; set; } + /// + /// + /// + public string extCode3 { get; set; } + /// + /// + /// + public string barCode { get; set; } + /// + /// + /// + public string color { get; set; } + /// + /// + /// + public string size { get; set; } + /// + /// + /// + public string supplierCode { get; set; } + /// + /// + /// + public string comboCode { get; set; } + /// + /// + /// + public string isGift { get; set; } + /// + /// + /// + public string cartonNo { get; set; } + /// + /// 计划数量 + /// + public decimal qtyPlan { get; set; } + /// + /// 退货订单入库反馈库存明细 + /// + public List inBoundInvLineConfirm { get; set; } + /// + /// + /// + public int length { get; set; } + /// + /// + /// + public int width { get; set; } + /// + /// + /// + public int height { get; set; } + /// + /// + /// + public int weight { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string extProps { get; set; } + } + + /// + /// 退货订单入库反馈信息 + /// + public class InBoundOrderConfirmItem + { + /// + /// + /// + public string orderCode { get; set; } + /// + /// + /// + public string preOrderCode { get; set; } + /// + /// + /// + public string platformOrderCode { get; set; } + /// + /// + /// + public string platformRaCode { get; set; } + /// + /// + /// + public string preSourceOrderCode { get; set; } + /// + /// + /// + public string preSourcePlatformOrderCode { get; set; } + /// + /// + /// + public string preSourceWmsOrderCode { get; set; } + /// + /// + /// + public string customerOrderCode { get; set; } + /// + /// + /// + public string storeCode { get; set; } + /// + /// + /// + public string platformSource { get; set; } + /// + /// 客户编码 + /// + public string customerCode { get; set; } + /// + /// 仓库编码 + /// + public string whCode { get; set; } + /// + /// + /// + public string poType { get; set; } + /// + /// + /// + public string extOrderType { get; set; } + /// + /// + /// + public string fromLocation { get; set; } + /// + /// + /// + public string toLocation { get; set; } + /// + /// 实际入库时间 + /// + public string inboundTime { get; set; } + /// + /// + /// + public string packRegistrationTime { get; set; } + /// + /// + /// + public string isIqc { get; set; } + /// + /// + /// + public string qualityInspectionNo { get; set; } + /// + /// + /// + public int ctnPlanned { get; set; } + /// + /// 计划数量 + /// + public decimal ctnActual { get; set; } + /// + /// 实际数量 + /// + public decimal qtyPlanned { get; set; } + /// + /// + /// + public int qtyActual { get; set; } + /// + /// + /// + public int totalLine { get; set; } + /// + /// + /// + public string dataSource { get; set; } + /// + /// + /// + public string transCode { get; set; } + /// + /// + /// + public string transNo { get; set; } + /// + /// + /// + public string extMemo { get; set; } + /// + /// 退货订单入库反馈明细信息 + /// + public List inBoundLineConfirm { get; set; } + /// + /// + /// + public string extProps { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public int feedbackType { get; set; } + /// + /// + /// + public string @operator { get; set; } + } + +} + diff --git a/SHK3CloudWebAPI/Models/InFinsihParameter.cs b/SHK3CloudWebAPI/Models/InFinsihParameter.cs new file mode 100644 index 0000000..7929ce4 --- /dev/null +++ b/SHK3CloudWebAPI/Models/InFinsihParameter.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI.Models +{ + /// + /// 入库反馈 + /// + public class InFinsihParameter + { + /// + /// 仓库code + /// + public string? whCode { get; set; } + + /// + /// ERP订单号 + /// + public string? orderCode { get; set; } + + /// + /// 单据类型, 5001 2C拒收退货入库,5002 采购入库,5003 仓间调入,5004 退货到仓,5006 差异调入,5007 盘点入库,5008 一步调入,5009 品质变更,6001 海关退货,6009 其他入库类型 + /// + public string? preOrderType { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/InParameter.cs b/SHK3CloudWebAPI/Models/InParameter.cs new file mode 100644 index 0000000..ae43fb2 --- /dev/null +++ b/SHK3CloudWebAPI/Models/InParameter.cs @@ -0,0 +1,104 @@ +namespace SHK3CloudWebAPI +{ + /// + /// 入库反馈库存明细 + /// + + public class InboundInvLineConfirmItem + { + /// + /// 实际收货数量 + /// + public decimal qtyReceived { get; set; } + /// + /// 库存状态1-1:良品,1-2:良品不可售(样机),2-1:残次品-不可翻新A:轻微盒损,机器无问题,2-2:残次品-不可翻新B:盒损严重,机器无问题, + /// 2-3:残次品-不可翻新C:盒损严重,机器有使用痕迹,2-4:残次品-不可翻新D:机器有问题,2-5:退货机,3:串货回购机 + /// + public string? invStatus { get; set; } + /// + /// 入库SN号信息 + /// + public List? sns { get; set; } + } + + /// + /// 入库反馈库存明细 + /// + public class InboundInvLineConfirms + { + /// + /// 入库反馈库存明细 + /// + public List? inboundInvLineConfirm { get; set; } + } + + /// + /// 入库反馈行信息 + /// + public class InboundConfirmLineItem + { + /// + /// MPN + /// + public string? extCode { get; set; } + /// + /// 行号 + /// + public string? lineNo { get; set; } + /// + /// 入库反馈库存明细 + /// + public InboundInvLineConfirms? inboundInvLineConfirms { get; set; } + } + + /// + /// 入库反馈行信息 + /// + public class InboundConfirmLines + { + /// + /// + /// + public List? inboundConfirmLine { get; set; } + } + + /// + /// wms反馈erp入库单已入库请求 + /// + public class InParameter + { + /// + /// 消息ID + /// + public string? uuid { get; set; } + /// + /// 数据来源 + /// + public string? dataSource { get; set; } + /// + /// erp单号 + /// + public string? inboundNo { get; set; } + /// + /// 货主 + /// + public string? owner { get; set; } + /// + /// 收货地编码 + /// + public string? toLocation { get; set; } + /// + /// 实际入库时间 + /// + public DateTime? inboundTime { get; set; } + /// + /// 仓库编码 + /// + public string? whCode { get; set; } + /// + /// 入库反馈行信息 + /// + public InboundConfirmLines? inboundConfirmLines { get; set; } + } + +} diff --git a/SHK3CloudWebAPI/Models/InboundOrders.cs b/SHK3CloudWebAPI/Models/InboundOrders.cs new file mode 100644 index 0000000..3792128 --- /dev/null +++ b/SHK3CloudWebAPI/Models/InboundOrders.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace SHK3CloudWebAPI.Models +{ + public class SnLines + { + [XmlText] + public string? Sn { get; set; } + } + + + [XmlRoot("InboundOrders")] + public class InboundOrders + { + [XmlElement("sourceMarkCode")] + public string? SourceMarkCode { get; set; } + + [XmlElement("msgId")] + public string? MsgId { get; set; } + + [XmlElement("InboundOrder")] + public InboundOrder? InboundOrder { get; set; } + } + + public class InboundOrder + { + [XmlElement("UUID")] + public string? Uuid { get; set; } + + [XmlElement("InboundNo")] + public string? InboundNo { get; set; } + + [XmlElement("supplier")] + public string? Supplier { get; set; } + + [XmlElement("PreOrderType")] + public string? PreOrderType { get; set; } + + [XmlElement("PoType")] + public string? PoType { get; set; } + + [XmlElement("Owner")] + public string? Owner { get; set; } + + [XmlElement("FromLocation")] + public string? FromLocation { get; set; } + + [XmlElement("WhCode")] + public string? WhCode { get; set; } + + [XmlElement("PlanQuantity")] + public int? PlanQuantity { get; set; } + + [XmlElement("PlanCartonQty")] + public int? PlanCartonQty { get; set; } + + // 多行商品列表 + [XmlElement("InboundOrderLines")] + public InboundOrderLinese? InboundOrderLines { get; set; } + } + public class InboundOrderLinese + { + [XmlElement("InboundOrderLine")] + public List InboundOrderLinee { get; set; } + } + public class InboundOrderLinee + { + [XmlElement("Upc")] + public string? Upc { get; set; } + + [XmlElement("Mpn")] + public string? Mpn { get; set; } + + [XmlElement("Qty")] + public string? Qty { get; set; } + + [XmlElement("LineNo")] + public string? LineNo { get; set; } + + [XmlElement("CartonNo")] + public string? CartonNo { get; set; } + + [XmlArray("SnLines")] + [XmlArrayItem("Sn")] + public List? SnLines { get; set; } + + [XmlElement("FSBillId")] + public string? FSBillId { get; set; } + + [XmlElement("FSId")] + public string? FSId { get; set; } + + [XmlElement("EcPoCode")] + public string? EcPoCode { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/OutB2CParameter.cs b/SHK3CloudWebAPI/Models/OutB2CParameter.cs new file mode 100644 index 0000000..e1e092c --- /dev/null +++ b/SHK3CloudWebAPI/Models/OutB2CParameter.cs @@ -0,0 +1,856 @@ +namespace SHK3CloudWebAPI.Models +{ + /// + /// + /// + public class OutB2CParameter + { + /// + /// 销售订单出库反馈 + /// + public List outBoundConfirm { get; set; } + } + + public class SkuDefectInfos1Item + { + /// + /// + /// + public string defectWareBarcode { get; set; } + /// + /// + /// + public string defectSource { get; set; } + /// + /// + /// + public string defectType { get; set; } + /// + /// + /// + public string defectReasons { get; set; } + } + + public class SkuSnInfo1Item + { + /// + /// + /// + public string sn { get; set; } + /// + /// + /// + public string extProps { get; set; } + } + + public class OutBoundPackagerLineItem + { + /// + /// + /// + public string storeCode { get; set; } + /// + /// + /// + public string lineNo { get; set; } + /// + /// + /// + public string warehouseCode { get; set; } + /// + /// + /// + public string skuCode { get; set; } + /// + /// + /// + public string extCode { get; set; } + /// + /// + /// + public string upc { get; set; } + /// + /// + /// + public string extCode3 { get; set; } + /// + /// + /// + public string barCode { get; set; } + /// + /// + /// + public string preOrderCode { get; set; } + /// + /// + /// + public string skuName { get; set; } + /// + /// + /// + public int unitPrice { get; set; } + /// + /// + /// + public int actualPrice { get; set; } + /// + /// + /// + public int qty { get; set; } + /// + /// + /// + public int amountBfDiscount { get; set; } + /// + /// + /// + public int lineAmt { get; set; } + /// + /// + /// + public string ownerCode { get; set; } + /// + /// + /// + public string invStatus { get; set; } + /// + /// + /// + public string batchNo { get; set; } + /// + /// + /// + public string inboundBatchNo { get; set; } + /// + /// + /// + public List skuDefectInfos1 { get; set; } + /// + /// + /// + public List skuSnInfo1 { get; set; } + /// + /// + /// + public int isCommon { get; set; } + /// + /// + /// + public string productDate { get; set; } + /// + /// + /// + public string expireDate { get; set; } + /// + /// + /// + public string color { get; set; } + /// + /// + /// + public string size { get; set; } + /// + /// + /// + public string supplierCode { get; set; } + /// + /// + /// + public string comboCode { get; set; } + /// + /// + /// + public string origin { get; set; } + /// + /// + /// + public string isGift { get; set; } + /// + /// + /// + public string outboundItemLineNo { get; set; } + /// + /// + /// + public int planQty { get; set; } + /// + /// + /// + public int actualQty { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string extProps { get; set; } + /// + /// + /// + public string platformLineNo { get; set; } + /// + /// + /// + public string subpackageDate { get; set; } + } + + public class OutboundPackageItem + { + /// + /// + /// + public string transCode { get; set; } + /// + /// + /// + public string transName { get; set; } + /// + /// + /// + public string trackingNumber { get; set; } + /// + /// + /// + public int length { get; set; } + /// + /// + /// + public int width { get; set; } + /// + /// + /// + public int height { get; set; } + /// + /// + /// + public int weight { get; set; } + /// + /// + /// + public int volume { get; set; } + /// + /// + /// + public string consumablesUpc { get; set; } + /// + /// + /// + public int consumablesWeight { get; set; } + /// + /// + /// + public string outboundBoxCode { get; set; } + /// + /// + /// + public string cartonType { get; set; } + /// + /// + /// + public List outBoundPackagerLine { get; set; } + } + + public class Receiver + { + /// + /// + /// + public string name { get; set; } + /// + /// + /// + public string otherName { get; set; } + /// + /// + /// + public string moblie { get; set; } + /// + /// + /// + public string telephone { get; set; } + /// + /// + /// + public string country { get; set; } + /// + /// + /// + public string province { get; set; } + /// + /// + /// + public string province1 { get; set; } + /// + /// + /// + public string city { get; set; } + /// + /// + /// + public string city1 { get; set; } + /// + /// + /// + public string district { get; set; } + /// + /// + /// + public string district1 { get; set; } + /// + /// + /// + public string town { get; set; } + /// + /// + /// + public string town1 { get; set; } + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public string address1 { get; set; } + /// + /// + /// + public string zipcode { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string extProps { get; set; } + } + + public class Sender + { + /// + /// + /// + public string name { get; set; } + /// + /// + /// + public string otherName { get; set; } + /// + /// + /// + public string mobile { get; set; } + /// + /// + /// + public string telephone { get; set; } + /// + /// 中国 + /// + public string country { get; set; } + /// + /// 河南省 + /// + public string province { get; set; } + /// + /// + /// + public string province1 { get; set; } + /// + /// + /// + public string city { get; set; } + /// + /// + /// + public string city1 { get; set; } + /// + /// 二七区 + /// + public string district { get; set; } + /// + /// + /// + public string district1 { get; set; } + /// + /// 新集镇 + /// + public string town { get; set; } + /// + /// + /// + public string town1 { get; set; } + /// + /// 郑州大学 + /// + public string address { get; set; } + /// + /// + /// + public string address1 { get; set; } + /// + /// + /// + public string zipcode { get; set; } + } + + public class SkuDefectInfoItem + { + /// + /// + /// + public string defectWareBarcode { get; set; } + /// + /// + /// + public string defectSource { get; set; } + /// + /// + /// + public string defectType { get; set; } + /// + /// + /// + public string defectReasons { get; set; } + } + + /// + /// SN信息 + /// + public class SkuSnInfoItem + { + /// + /// SN号 + /// + public string sn { get; set; } + /// + /// + /// + public string extProps { get; set; } + } + + public class RfidInfoItem + { + /// + /// + /// + public string rfid { get; set; } + /// + /// + /// + public string tid { get; set; } + /// + /// + /// + public string qrCode { get; set; } + } + + /// + /// 销售订单反馈明细 + /// + public class OutBoundLineConfirmItem + { + /// + /// + /// + public string storeCode { get; set; } + /// + /// + /// + public string lineNo { get; set; } + /// + /// 仓库code + /// + public string warehouseCode { get; set; } + /// + /// + /// + public string skuCode { get; set; } + /// + /// + /// + public string extCode { get; set; } + /// + /// 传erp物料编码 + /// + public string upc { get; set; } + /// + /// + /// + public string extCode3 { get; set; } + /// + /// + /// + public string barCode { get; set; } + /// + /// + /// + public string preOrderCode { get; set; } + /// + /// + /// + public string skuName { get; set; } + /// + /// 折前单价 + /// + public decimal unitPrice { get; set; } + /// + /// 实际购买单价(折后) + /// + public decimal actualPrice { get; set; } + /// + /// 数量 + /// + public decimal qty { get; set; } + /// + /// 折前行总价 + /// + public decimal amountBfDiscount { get; set; } + /// + /// 折后行总金额 + /// + public decimal lineAmt { get; set; } + /// + /// 货主Code + /// + public string ownerCode { get; set; } + /// + /// + /// + public string invStatus { get; set; } + /// + /// 批次号 + /// + public string batchNo { get; set; } + /// + /// 入库批次号 + /// + public string inboundBatchNo { get; set; } + /// + /// 残次信息 + /// + public List skuDefectInfo { get; set; } + /// + /// SN信息 + /// + public List skuSnInfo { get; set; } + /// + /// 商品RFID信息 + /// + public List rfidInfo { get; set; } + /// + /// + /// + public int isCommon { get; set; } + /// + /// 生产日期 + /// + public DateTime? productDate { get; set; } + /// + /// 过期日期 + /// + public DateTime? expireDate { get; set; } + /// + /// 颜色 + /// + public string color { get; set; } + /// + /// 尺码 + /// + public string size { get; set; } + /// + /// + /// + public string supplierCode { get; set; } + /// + /// + /// + public string comboCode { get; set; } + /// + /// + /// + public string origin { get; set; } + /// + /// 是否是赠品 + /// + public string isGift { get; set; } + /// + /// + /// + public string outboundBoxCode { get; set; } + /// + /// + /// + public string outboundItemLineNo { get; set; } + /// + /// 计划数量 + /// + public decimal planQty { get; set; } + /// + /// 实际出库数量 + /// + public decimal actualQty { get; set; } + /// + /// + /// + public string trackingNumber { get; set; } + /// + /// + /// + public string cancelType { get; set; } + /// + /// 备注 + /// + public string remark { get; set; } + /// + /// + /// + public string extProps { get; set; } + /// + /// + /// + public string platformLineNo { get; set; } + /// + /// + /// + public string customStvle { get; set; } + /// + /// + /// + public string customColorlD { get; set; } + /// + /// + /// + public string customSize { get; set; } + /// + /// + /// + public string subpackageDate { get; set; } + /// + /// + /// + public string userDef2 { get; set; } + } + + public class OutBoundInvoiceLineItem + { + /// + /// + /// + public string lineNo { get; set; } + /// + /// + /// + public int qty { get; set; } + /// + /// + /// + public int price { get; set; } + /// + /// + /// + public int amount { get; set; } + /// + /// + /// + public string itemCode { get; set; } + /// + /// + /// + public string skuName { get; set; } + } + + public class OutboundInvoiceConfirmItem + { + /// + /// + /// + public string invoiceCode { get; set; } + /// + /// + /// + public string invoiceDate { get; set; } + /// + /// + /// + public string payer { get; set; } + /// + /// + /// + public int qty { get; set; } + /// + /// + /// + public int actualPrice { get; set; } + /// + /// + /// + public int amt { get; set; } + /// + /// + /// + public string memo { get; set; } + /// + /// + /// + public string payee { get; set; } + /// + /// + /// + public string drawer { get; set; } + /// + /// + /// + public string company { get; set; } + /// + /// + /// + public string identificationNumber { get; set; } + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public string telephone { get; set; } + /// + /// + /// + public List outBoundInvoiceLine { get; set; } + } + + /// + /// 销售订单出库反馈头信息 + /// + public class OutBoundConfirmItem + { + /// + /// 批次号 + /// + public string batchNumber { get; set; } + /// + /// OMS订单号(唯一对接标识),放erp单号 + /// + public string orderCode { get; set; } + /// + /// WMS订单号 + /// + public string preOrderCode { get; set; } + /// + /// + /// + public string platformOrderCode { get; set; } + /// + /// + /// + public string preOmsOrderCode { get; set; } + /// + /// + /// + public string customerOrderCode { get; set; } + /// + /// + /// + public string storeCode { get; set; } + /// + /// 客户编码 + /// + public string customerCode { get; set; } + /// + /// 仓库编码 + /// + public string whCode { get; set; } + /// + /// + /// + public string extOrderType { get; set; } + /// + /// + /// + public int transtimeType { get; set; } + /// + /// + /// + public string expressTypeCode { get; set; } + /// + /// + /// + public string specialDeliveryTypeCode { get; set; } + /// + /// 销售订单包装信息 + /// + public List outboundPackage { get; set; } + /// + /// 收货人信息 + /// + public Receiver receiver { get; set; } + /// + /// 发件人信息 + /// + public Sender sender { get; set; } + /// + /// 销售订单反馈明细 + /// + public List outBoundLineConfirm { get; set; } + /// + /// + /// + public int wmsOdoStatus { get; set; } + /// + /// + /// + public int outboundType { get; set; } + /// + /// + /// + public string o2oShopCode { get; set; } + /// + /// + /// + public string extStoreCode { get; set; } + /// + /// 销售订单反馈发票 + /// + public List outboundInvoiceConfirm { get; set; } + /// + /// + /// + public string dataSource { get; set; } + /// + /// 出库时间 + /// + public string outboundTime { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string extProps { get; set; } + /// + /// + /// + public string platformSource { get; set; } + /// + /// + /// + public string orderSpecialType { get; set; } + /// + /// + /// + public string @operator { get; set; } + /// + /// + /// + public string version { get; set; } + /// + /// + /// + public string dataStatus { get; set; } + } + + +} diff --git a/SHK3CloudWebAPI/Models/OutFinsihParameter.cs b/SHK3CloudWebAPI/Models/OutFinsihParameter.cs new file mode 100644 index 0000000..a4972c0 --- /dev/null +++ b/SHK3CloudWebAPI/Models/OutFinsihParameter.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI.Models +{ + /// + /// 出库反馈 + /// + public class OutFinsihParameter + { + /// + /// 仓库code + /// + public string? whCode { get; set; } + + /// + /// ERP订单号 + /// + public string? orderCode { get; set; } + + /// + /// 状态 0:创单失败 1:创单成功,示例值(1) + /// + public int status { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/OutParameter.cs b/SHK3CloudWebAPI/Models/OutParameter.cs new file mode 100644 index 0000000..48f8cc5 --- /dev/null +++ b/SHK3CloudWebAPI/Models/OutParameter.cs @@ -0,0 +1,76 @@ +namespace SHK3CloudWebAPI +{ + /// + /// 出库反馈 + /// + public class OutParameter + { + /// + /// 消息ID + /// + public string? uuid { get; set; } + /// + /// ERP单号 + /// + public string? outboundNo { get; set; } + /// + /// 上位系统单据类型1001 2C销售出库,1002 仓间调出,5003 仓间调入,1003 大仓分货,1004 退回工厂,1005 差异调出,1006 盘点出库,1007 礼品出库,1008 残次品处理 + /// + public string? preOrderType { get; set; } + /// + /// 出库时间,format: yyyy-MM-dd HH:mm:ss + /// + public string? outboundTime { get; set; } + /// + /// 预计发货时间,format: yyyy-MM-dd HH:mm:ss + /// + public string? scheduleOutboundDate { get; set; } + /// + /// 货主 owner + /// + public string? owner { get; set; } + /// + /// 仓库编码 Warehouse Code + /// + public string? whCode { get; set; } + /// + /// 数据来源 区分上位系统 Data source + /// + public string? dataSource { get; set; } + /// + /// 销售订单反馈明细 + /// + public List? outboundConfirmLines { get; set; } + } + + /// + /// 销售订单反馈明细 + /// + public class OutboundConfirmLinesItem + { + /// + /// 订单行号(唯一)OMS order line number(Unique) + /// + public string? lineNo { get; set; } + /// + /// MPN + /// + public string? extCode { get; set; } + /// + /// 数量 + /// + public decimal? qty { get; set; } + /// + /// 库存状态1-1:良品,1-2:良品不可售(样机),2-1:残次品-不可翻新A:轻微盒损,机器无问题,2-2:残次品-不可翻新B:盒损严重,机器无问题, + /// 2-3:残次品-不可翻新C:盒损严重,机器有使用痕迹,2-4:残次品-不可翻新D:机器有问题,2-5:退货机,3:串货回购机 + /// + public string? invStatus { get; set; } + /// + /// 出库SN号信息 + /// + public List? sns { get; set; } + } + + + +} diff --git a/SHK3CloudWebAPI/Models/OutboundOrders.cs b/SHK3CloudWebAPI/Models/OutboundOrders.cs new file mode 100644 index 0000000..9e8722e --- /dev/null +++ b/SHK3CloudWebAPI/Models/OutboundOrders.cs @@ -0,0 +1,249 @@ +using System.Xml.Serialization; + +namespace SHK3CloudWebAPI.Models +{ + public class Receiver2 + { + /// + /// 收货人姓名 + /// + [XmlElement("ReceiverName")] + public string? ReceiverName { get; set; } + + /// + /// 收货人电话 + /// + [XmlElement("ReceiverPhone")] + public string? ReceiverPhone { get; set; } + + /// + /// 收货人手机号 + /// + [XmlElement("ReceiverMobile")] + public string? ReceiverMobile { get; set; } + + /// + /// 国家 + /// + [XmlElement("Country")] + public string? Country { get; set; } + + /// + /// 省份 + /// + [XmlElement("Province")] + public string? Province { get; set; } + + /// + /// 城市 + /// + [XmlElement("City")] + public string? City { get; set; } + + /// + /// 区县 + /// + [XmlElement("District")] + public string? District { get; set; } + + /// + /// 街道 + /// + [XmlElement("Address")] + public string? Address { get; set; } + + /// + /// 详细地址 + /// + [XmlElement("ExtMemo")] + public string? ExtMemo { get; set; } + } + + public class OutboundLine + { + /// + /// 电商采购单号 + /// + [XmlElement("EcPoCode")] + public string? EcPoCode { get; set; } + + /// + /// 行号 + /// + [XmlElement("LineNo")] + public string? LineNo { get; set; } + + /// + /// MPN编码 + /// + [XmlElement("Mpn")] + public string? Mpn { get; set; } + + /// + /// UPC编码 + /// + [XmlElement("Upc")] + public string? Upc { get; set; } + + /// + /// 实退价 + /// + [XmlElement("LinePrice")] + public string? LinePrice { get; set; } + + /// + /// 数量 + /// + [XmlElement("Qty")] + public string? Qty { get; set; } + + /// + /// 库存状态 + /// + [XmlElement("InvStatus")] + public string? InvStatus { get; set; } + /// + /// 源单内码 + /// + [XmlElement("FSBillId")] + public string? FSBillId { get; set; } + /// + /// 源单分录内码 + /// + [XmlElement("FSId")] + public string? FSId { get; set; } + + } + + public class OutboundOrder + { + /// + /// 采退出库单编号 + /// + [XmlElement("OutboundNo")] + public string? OutboundNo { get; set; } + + /// + /// 原始采退申请编号 + /// + [XmlElement("CustomerOrderCode")] + public string? CustomerOrderCode { get; set; } + + /// + /// 货主(T2 HQID) + /// + [XmlElement("Owner")] + public string? Owner { get; set; } + + /// + /// 单据类型代码(采退为固定值 21) + /// + [XmlElement("OrderType")] + public string? OrderType { get; set; } + + /// + /// 单据创建时间 + /// + [XmlElement("OrderCreateTime")] + public string? OrderCreateRaw { get; set; } + + /// + /// 下单日期,解析为 DateTime?(通过 OrderTimeRaw 转换) + /// + [XmlIgnore] + public DateTime? OrderCreateTime + { + get + { + if (DateTime.TryParse(OrderCreateRaw, out var dt)) + return dt; + return null; + } + } + + /// + /// 出库数量 + /// + [XmlElement("Qty")] + public string? Qty { get; set; } + + /// + /// 数据来源 + /// + [XmlElement("DataSource")] + public string? DataSource { get; set; } + + /// + /// 出库仓库编码 + /// + [XmlElement("WhCode")] + public string? WhCode { get; set; } + + /// + /// 出库单目标仓库编码,即供应商编码 + /// + [XmlElement("OutboundTargetWhcode")] + public string? OutboundTargetWhcode { get; set; } + + /// + /// 最迟发货时间,格式:yyyy-MM-dd HH:mm:ss + /// + [XmlElement("LatestOutboundTime")] + + public string? LatestOutboundTimeRaw { get; set; } + + /// + /// 下单日期,解析为 DateTime?(通过 OrderTimeRaw 转换) + /// + [XmlIgnore] + public DateTime? LatestOutboundTime + { + get + { + if (DateTime.TryParse(LatestOutboundTimeRaw, out var dt)) + return dt; + return null; + } + } + + /// + /// 收货人地址信息 + /// + [XmlElement("Receiver")] + public Receiver2? Receiver { get; set; } + + /// + /// 出库行信息 + /// + [XmlElement("OutboundLines")] + public OutboundLines? OutboundLines { get; set; } + // public List? OutboundLines { get; set; } + } + public class OutboundLines + { + [XmlElement("OutboundLine")] + public List? OutboundLine { get; set; } + } + + [XmlRoot("OutboundOrders")] + public class OutboundOrders + { + /// + /// 标识源系统的唯一值 + /// + [XmlElement("sourceMarkCode")] + public string? SourceMarkCode { get; set; } + + /// + /// 消息唯一标识 + /// + [XmlElement("msgId")] + public string? MsgId { get; set; } + + /// + /// 出库订单主信息 + /// + [XmlElement("OutboundOrder")] + public OutboundOrder? OutboundOrder { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ProductMasterDataParameter.cs b/SHK3CloudWebAPI/Models/ProductMasterDataParameter.cs new file mode 100644 index 0000000..d8332e3 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ProductMasterDataParameter.cs @@ -0,0 +1,90 @@ +using Newtonsoft.Json; + +namespace SHK3CloudWebAPI.Models +{ + public class ProductMasterDataParameter + { + [JsonProperty("sourceMarkCode")] + public string? SourceMarkCode { get; set; } + + [JsonProperty("variants")] + public List? Variants { get; set; } + } + public class Variant + { + [JsonProperty("高(mm)")] + public string? HeightMm { get; set; } + + [JsonProperty("SPU编码")] + public string? SpuCode { get; set; } + + [JsonProperty("Part Number")] + public string? PartNumber { get; set; } + + [JsonProperty("是否SN号管理")] + public string? IsSnManaged { get; set; } + //一级分类 + [JsonProperty("一级分类")] + public string? CategoryLevel1 { get; set; } + + [JsonProperty("sellerName")] + public string? SellerName { get; set; } + //二级分类 + [JsonProperty("二级分类")] + public string? CategoryLevel2 { get; set; } + + [JsonProperty("吊牌价/ListPrice(元)")] + public string? ListPrice { get; set; } + + [JsonProperty("商品税务编码")] + public string? TaxCode { get; set; } + //UPC编码(SKU唯一码) + [JsonProperty("UPC编码(SKU唯一码)")] + public string? Upc { get; set; } + + [JsonProperty("productTypeEN")] + public string? ProductTypeEN { get; set; } + + [JsonProperty("productNameEN")] + public string? ProductNameEN { get; set; } + + [JsonProperty("productTypeCN")] + public string? ProductTypeCN { get; set; } + + [JsonProperty("销售属性(规格)")] + public string? Spec { get; set; } + + [JsonProperty("categoryEN")] + public string? CategoryEN { get; set; } + + [JsonProperty("品牌")] + public string? Brand { get; set; } + + [JsonProperty("宽(mm)")] + public string? WidthMm { get; set; } + + [JsonProperty("三级分类")] + public string? CategoryLevel3 { get; set; } + + [JsonProperty("重量(kg)")] + public string? WeightKg { get; set; } + + [JsonProperty("imgUrl")] + public string? ImgUrl { get; set; } + + [JsonProperty("商品名称")] + public string? ProductNameCN { get; set; } + + [JsonProperty("sellerID")] + public string? SellerID { get; set; } + //销售属性(颜色) + [JsonProperty("销售属性(颜色)")] + public string? Color { get; set; } + + [JsonProperty("productShortNameCN")] + public string? ProductShortNameCN { get; set; } + + [JsonProperty("长(mm)")] + public string? LengthMm { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/PurchaseOrderData.cs b/SHK3CloudWebAPI/Models/PurchaseOrderData.cs new file mode 100644 index 0000000..99e540c --- /dev/null +++ b/SHK3CloudWebAPI/Models/PurchaseOrderData.cs @@ -0,0 +1,162 @@ +using System.Xml.Serialization; +namespace SHK3CloudWebAPI.Models +{ + /// + /// XML 根节点:采购订单数据 + /// + [XmlRoot("PurchaseOrderData", Namespace = "")] + public class PurchaseOrderData + { + /// + /// 消息唯一 ID + /// + [XmlElement("msgId")] + public string? MsgId { get; set; } + + /// + /// 路由编码(上下游系统约定在网关层的编码) + /// + [XmlElement("sourceMarkCode")] + public string? SourceMarkCode { get; set; } + + /// + /// 采购订单头 + /// + [XmlElement("purchaseOrder")] + public PurchaseOrder? PurchaseOrder { get; set; } + } + + /// + /// 采购订单头信息 + /// + public class PurchaseOrder + { + /// + /// 采购订单唯一标识(部分 XML 没有这个字段) + /// + [XmlElement("uuid")] + public string? UUID { get; set; } + + /// + /// MAP 采购单号 + /// + [XmlElement("purchaseOrder")] + public string? PurchaseOrderNo { get; set; } + + /// + /// 币种,固定值 CNY + /// + [XmlElement("currency")] + public string? Currency { get; set; } + + /// + /// 含税总金额 + /// + [XmlElement("totalPriceWithTax")] + public string? TotalPriceWithTax { get; set; } + + /// + /// 供应商编码 + /// + [XmlElement("vendorCode")] + public string? VendorCode { get; set; } + + /// + /// 备注,允许自闭合标签 <remark /> + /// + [XmlElement("remark", IsNullable = true)] + public string? Remark { get; set; } + + /// + /// 下单日期,原始字符串(例如:2025-09-02 17:13:30) + /// + [XmlElement("orderTime")] + public string? OrderTimeRaw { get; set; } + + /// + /// 下单日期,解析为 DateTime?(通过 OrderTimeRaw 转换) + /// + [XmlIgnore] + public DateTime? OrderTime + { + get + { + if (DateTime.TryParse(OrderTimeRaw, out var dt)) + return dt; + return null; + } + } + + /// + /// 采购单状态:1 审核通过,3 已取消,5 已关闭 + /// + [XmlElement("status")] + public string? Status { get; set; } + + /// + /// 采购商品行信息(可能有一个或多个) + /// + [XmlElement("purchaseOrderLines")] + public List? PurchaseOrderLines { get; set; } + } + + /// + /// 采购订单行信息 + /// + public class PurchaseOrderLine + { + /// + /// 商品 UPC 编码 + /// + [XmlElement("upc")] + public string? Upc { get; set; } + + /// + /// 商品 MPN 编码 + /// + [XmlElement("mpn")] + public string? Mpn { get; set; } + + /// + /// 采购数量 + /// + [XmlElement("qty")] + public decimal Qty { get; set; } + + /// + /// 信用模式:1 现金结算,2 账期结算,3 铺货代销 + /// + [XmlElement("creditType")] + public int CreditType { get; set; } + + /// + /// 含税单价 + /// + [XmlElement("priceWithTax")] + public decimal PriceWithTax { get; set; } + + /// + /// 含税总金额 + /// + [XmlElement("totalPriceWithTax")] + public decimal TotalPriceWithTax { get; set; } + + /// + /// 入库仓库,收货仓编码 + /// + [XmlElement("warehouseCode")] + public string? WarehouseCode { get; set; } + + /// + /// 入库库存主体,T2 HQID + /// + [XmlElement("ownerCode")] + public string? OwnerCode { get; set; } + + /// + /// 行号 + /// + [XmlElement("lineno")] + public string? LineNo { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ReturnNoticeBill.cs b/SHK3CloudWebAPI/Models/ReturnNoticeBill.cs new file mode 100644 index 0000000..5b5b3c5 --- /dev/null +++ b/SHK3CloudWebAPI/Models/ReturnNoticeBill.cs @@ -0,0 +1,15 @@ +namespace SHK3CloudWebAPI.Models +{ + public class ReturnNoticeBill + { + public int FID { get; set; } + + public string FBillNo { get; set; } + + public string FOwnerNumber { get; set; } + + public string FSaleOrgIdNumber { get; set; } + + public string FRetcustIdNumber { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Models/ReturnNoticeBillDets.cs b/SHK3CloudWebAPI/Models/ReturnNoticeBillDets.cs new file mode 100644 index 0000000..bfa672b --- /dev/null +++ b/SHK3CloudWebAPI/Models/ReturnNoticeBillDets.cs @@ -0,0 +1,23 @@ +namespace SHK3CloudWebAPI.Models +{ + public class ReturnNoticeBillDets + { + public int? FID { get; set; } + + public string? FBillNo { get; set; } + + public string? FOwnerNumber { get; set; } + + public string? FSaleOrgIdNumber { get; set; } + + public string? FRetcustIdNumber { get; set; } + + public string? FMaterialIdNumber { get; set; } + + public string? FUnitIDNumber { get; set; } + + public int? FEntity_FEntryId { get; set; } + + } +} + diff --git a/SHK3CloudWebAPI/Models/Root.cs b/SHK3CloudWebAPI/Models/Root.cs new file mode 100644 index 0000000..f6248ae --- /dev/null +++ b/SHK3CloudWebAPI/Models/Root.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SHK3CloudWebAPI +{ + public class ErrorsItem + { + + public string FieldName { get; set; } + + public string Message { get; set; } + + public int DIndex { get; set; } + + } + + public class SuccessEntityItem + { + + public string Number { get; set; } + + public int Id { get; set; } + + public int DIndex { get; set; } + } + + + + public class ResponseStatus + { + + public int ErrorCode { get; set; } + + public Boolean IsSuccess { get; set; } + + public List Errors { get; set; } + + public List SuccessEntitys { get; set; } + + public List SuccessMessages { get; set; } + + } + + + + public class Result + { + + public ResponseStatus ResponseStatus { get; set; } + + public string Id { get; set; } + + } + + + + public class Root + { + + public Result Result { get; set; } + + } +} diff --git a/SHK3CloudWebAPI/Models/loginParameter.cs b/SHK3CloudWebAPI/Models/loginParameter.cs new file mode 100644 index 0000000..4bcaf6c --- /dev/null +++ b/SHK3CloudWebAPI/Models/loginParameter.cs @@ -0,0 +1,28 @@ +namespace SHK3CloudWebAPI +{ + /// + /// 登录 + /// + public class loginParameter + { + /// + /// 帐套标识 + /// + public string acctID { get; set; } + + /// + /// 用户 + /// + public string username { get; set; } + + /// + /// 密码 + /// + public string password { get; set; } + + /// + /// 语言标识 + /// + public string lcid { get; set; } + } +} diff --git a/SHK3CloudWebAPI/Program.cs b/SHK3CloudWebAPI/Program.cs new file mode 100644 index 0000000..a6984da --- /dev/null +++ b/SHK3CloudWebAPI/Program.cs @@ -0,0 +1,60 @@ +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using SHK3CloudWebAPI; +using SHK3CloudWebAPI.Common; +using System; +using System.Reflection; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +//builder.Services.AddControllers(); +builder.Services.AddControllers().AddNewtonsoftJson(options => +{ + //ӿڷֵʱʽ + options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; +}); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(options => { + var xmlfilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlfilename), true); + options.OrderActionsBy(o => o.RelativePath); + typeof(ApiVersions).GetEnumNames().ToList().ForEach(name => + { + options.SwaggerDoc(name, new OpenApiInfo + { + Title = $"ǿռɽӿ", + Version = name, + Description = $"ǿռɽӿ:{name}" + }); + }); + + +}); + +var app = builder.Build(); + +app.UseMiddleware(); // ע־м + +app.UseSwagger(); +app.UseSwaggerUI(options => +{ + //options.SwaggerEndpoint($"/swagger/V1/swagger.json", $"ǿռɽӿ"); + typeof(ApiVersions).GetEnumNames().ToList().ForEach(version => + { + options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"{version}"); + }); + //·ǰ׺ + options.RoutePrefix = ""; + +}); + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/SHK3CloudWebAPI/Properties/launchSettings.json b/SHK3CloudWebAPI/Properties/launchSettings.json new file mode 100644 index 0000000..54145ca --- /dev/null +++ b/SHK3CloudWebAPI/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:47195", + "sslPort": 44316 + } + }, + "profiles": { + "SHK3CloudWebAPI": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "", + "applicationUrl": "https://localhost:7155;http://localhost:5226", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/SHK3CloudWebAPI/SHK3CloudWebAPI.csproj b/SHK3CloudWebAPI/SHK3CloudWebAPI.csproj new file mode 100644 index 0000000..d3836dc --- /dev/null +++ b/SHK3CloudWebAPI/SHK3CloudWebAPI.csproj @@ -0,0 +1,23 @@ + + + + net6.0 + enable + enable + True + + + + + + + + + + + + + + + + diff --git a/SHK3CloudWebAPI/Service/BillQueryService.cs b/SHK3CloudWebAPI/Service/BillQueryService.cs new file mode 100644 index 0000000..7317bc1 --- /dev/null +++ b/SHK3CloudWebAPI/Service/BillQueryService.cs @@ -0,0 +1,632 @@ +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using SHK3CloudWebAPI.Models.ERPModels; + +namespace SHK3CloudWebAPI +{ + /// + /// 查询 + /// + public static class BillQueryService + { + /// + /// 收料通知单查询 + /// + /// + /// + public static dynamic ReceiveBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "PUR_ReceiveBill", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FStockOrgId.FNumber as FStockOrgIdNumber,FSupplierId.FNumber as FSupplierIdNumber,FOrderBillNo,FPOORDERENTRYID,FDetailEntity_FEntryId,FDetailEntity_FSEQ,FMaterialId.FNumber as FMaterialIdNumber,FUnitId.FNumber as FUnitIdFNumber" + }; + var wrappedData = new + { + data = billQuery + }; + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FStockOrgIdNumber = entry[2], + FSupplierIdNumber = entry[3], + FOrderBillNo = entry[4], + FPOORDERENTRYID = entry[5], + FDetailEntity_FEntryId = entry[6], + FDetailEntity_FSEQ = entry[7], + FMaterialIdNumber = entry[8], + FUnitIdFNumber = entry[9] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FStockOrgIdNumber = entry != null && entry.Count > 2 ? entry[2] : null, + FSupplierIdNumber = entry != null && entry.Count > 3 ? entry[3] : null, + FOrderBillNo = entry != null && entry.Count > 4 ? entry[4] : null, + FPOORDERENTRYID = entry != null && entry.Count > 5 ? entry[5] : null, + FDetailEntity_FEntryId = entry != null && entry.Count > 6 ? entry[6] : null, + FDetailEntity_FSEQ = entry != null && entry.Count > 7 ? entry[7] : null, + FMaterialIdNumber = entry != null && entry.Count > 8 ? entry[8] : null, + FUnitIdFNumber = entry != null && entry.Count > 9 ? entry[9] : null + }); + } + } + } + + resulted = receive; + } + + return resulted; + } + + + /// + /// 发货通知单查询 + /// + /// + /// + public static dynamic DeliveryNoticeBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "SAL_DELIVERYNOTICE", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FDeliveryOrgID.FNumber as FDeliveryOrgIDNumber,FCustomerID.FNumber as FCustomerIDNumber,FEntity_FEntryId,FEntity_FSEQ,FMaterialId.FNumber as FMaterialIdNumber,FUnitId.FNumber as FUnitIdFNumber,FORDERNO" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FDeliveryOrgIDNumber = entry[2], + FCustomerIDNumber = entry[3], + FEntity_FEntryId = entry[4], + FEntity_FSEQ = entry[5], + FMaterialIdNumber = entry[6], + FUnitIdFNumber = entry[7], + FORDERNO = entry[8] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FDeliveryOrgIDNumber = entry != null && entry.Count > 2 ? entry[2] : null, + FCustomerIDNumber = entry != null && entry.Count > 3 ? entry[3] : null, + FEntity_FEntryId = entry != null && entry.Count > 4 ? entry[4] : null, + FEntity_FSEQ = entry != null && entry.Count > 5 ? entry[5] : null, + FMaterialIdNumber = entry != null && entry.Count > 6 ? entry[6] : null, + FUnitIdFNumber = entry != null && entry.Count > 7 ? entry[7] : null, + FORDERNO = entry != null && entry.Count > 8 ? entry[8] : null + }); + } + } + } + + resulted = receive; + } + + return resulted; + } + + /// + /// 调拨申请 + /// + /// + /// + public static dynamic TransferApplyBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "STK_TRANSFERAPPLY", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FEntity_FEntryId,FAPPORGID.FNumber as FAPPORGIDNumber,FMATERIALID.FNumber as FMATERIALIDNumber,FUNITID.FNumber as FUNITIDNumber,FStockInId.FNumber as FStockInIdNumber,FStockId.FNumber as FSrcStockIDNumber" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FEntity_FEntryId = entry[2], + FAPPORGIDNumber = entry[3], + FMATERIALIDNumber = entry[4], + FUNITIDNumber = entry[5], + FStockInIdNumber = entry[6], + FSrcStockIDNumber = entry[7] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FEntity_FEntryId = entry != null && entry.Count > 2 ? entry[2] : null, + FAPPORGIDNumber = entry != null && entry.Count > 3 ? entry[3] : null, + FMATERIALIDNumber = entry != null && entry.Count > 4 ? entry[4] : null, + FUNITIDNumber = entry != null && entry.Count > 5 ? entry[5] : null, + FStockInIdNumber = entry != null && entry.Count > 6 ? entry[6] : null, + FSrcStockIDNumber = entry != null && entry.Count > 7 ? entry[7] : null + }); + } + } + } + + resulted = receive; + } + + return resulted; + } + + /// + /// 分布式调拨出库 + /// + /// + /// + public static dynamic TransferOutBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "STK_TRANSFEROUT", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FSTKTRSOUTENTRY_FEntryId,FStockOrgID.FNumber as FStockOrgIDNumber,FStockInOrgID.FNumber as FStockInOrgIDNumber,FMaterialID.FNumber as FMaterialIDNumber,FSrcStockID.FNumber as FSrcStockIDNumber,FUnitID.FNumber as FUnitIDNumber,FVESTONWAY,FDestStockStatusID.FNumber as FDestStockStatusIDNumber" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FSTKTRSOUTENTRY_FEntryId = entry[2], + FStockOrgIDNumber = entry[3], + FStockInOrgIDNumber = entry[4], + FMaterialIDNumber = entry[5], + FSrcStockIDNumber = entry[6], + FUnitIDNumber = entry[7], + FVESTONWAY = entry[8], + FDestStockStatusIDNumber = entry[9] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FSTKTRSOUTENTRY_FEntryId = entry != null && entry.Count > 2 ? entry[2] : null, + FStockOrgIDNumber = entry != null && entry.Count > 3 ? entry[3] : null, + FStockInOrgIDNumber = entry != null && entry.Count > 4 ? entry[4] : null, + FMaterialIDNumber = entry != null && entry.Count > 5 ? entry[5] : null, + FSrcStockIDNumber = entry != null && entry.Count > 6 ? entry[6] : null, + FUnitIDNumber = entry != null && entry.Count > 7 ? entry[7] : null, + FVESTONWAY = entry != null && entry.Count > 8 ? entry[8] : null, + FDestStockStatusIDNumber = entry != null && entry.Count > 9 ? entry[9] : null + }); + } + } + } + + resulted = receive; + } + + return resulted; + } + /// + /// 物料 + /// + /// + /// + public static List BD_MATERIALBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + List resulted = new List(); + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "BD_MATERIAL", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FNumber,FMATERIALID,FDOCUMENTSTATUS " + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.ExecuteBillQuery(json.ToString(), cookie); + + List item = JsonConvert.DeserializeObject>(relJson); + + foreach (var row in item) + { + BD_MATERIALBILL returnNoticeBill = new BD_MATERIALBILL + { + FNumber = row[0], + FMATERIALID = row[1], + FDOCUMENTSTATUS = row[2] + }; + + resulted.Add(returnNoticeBill); + } + } + + return resulted; + } + /// + /// 退料申请 + /// + /// + /// + public static dynamic MrappBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "PUR_MRAPP", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FEntity_FEntryId,FEntity_FSEQ ,FPURCHASEORGID.FNumber as FPURCHASEORGIDNumber,FSUPPLIERID.FNumber as FSUPPLIERIDNumber,FMATERIALID.FNumber as FMATERIALIDNumber,FUnitID.FNumber as FUnitIDNumber,FORDERNO,FPOORDERENTRYID" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FEntity_FEntryId = entry[2], + FEntity_FSEQ = entry[3], + FPURCHASEORGIDNumber = entry[4], + FSUPPLIERIDNumber = entry[5], + FMATERIALIDNumber = entry[6], + FUnitIDNumber = entry[7], + FORDERNO = entry[8], + FPOORDERENTRYID = entry[9] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FEntity_FEntryId = entry != null && entry.Count > 2 ? entry[2] : null, + FEntity_FSEQ = entry != null && entry.Count > 3 ? entry[3] : null, + FPURCHASEORGIDNumber = entry != null && entry.Count > 4 ? entry[4] : null, + FSUPPLIERIDNumber = entry != null && entry.Count > 5 ? entry[5] : null, + FMATERIALIDNumber = entry != null && entry.Count > 6 ? entry[6] : null, + FUnitIDNumber = entry != null && entry.Count > 7 ? entry[7] : null, + FORDERNO = entry != null && entry.Count > 8 ? entry[8] : null, + FPOORDERENTRYID = entry != null && entry.Count > 9 ? entry[9] : null + }); + } + } + } + + resulted = receive; + } + + return resulted; + } + + /// + /// 退货通知 + /// + /// + /// + public static dynamic ReturnNoticeBillQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + dynamic resulted = null; + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "SAL_RETURNNOTICE", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FSaleOrgId.FNumber as FSaleOrgIdNumber,FRetcustId.FNumber as FRetcustIdNumber, FMaterialId.FNumber as FMaterialIdNumber,FUnitID.FNumber as FUnitIDNumber,FEntity_FEntryId" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.BillQuery(json.ToString(), cookie); + + dynamic item = JsonConvert.DeserializeObject(relJson); + + // 初始化返回结果 + var receive = new List(); + + // 检查 item 是否有数据 + if (item != null && item is JArray && item.Count > 0) + { + foreach (var entry in item) + { + // 检查当前 entry 是否包含足够的字段 + if (entry != null && entry.Count >= 10) + { + receive.Add(new + { + FID = entry[0], + FBillNo = entry[1], + FSaleOrgIdNumber = entry[2], + FRetcustIdNumber = entry[3], + FMaterialIdNumber = entry[4], + FUnitIDNumber = entry[5], + FEntity_FEntryId = entry[6] + }); + } + else + { + // 如果数据不完整,填充默认值 + receive.Add(new + { + FID = entry != null && entry.Count > 0 ? entry[0] : null, + FBillNo = entry != null && entry.Count > 1 ? entry[1] : null, + FSaleOrgIdNumber = entry != null && entry.Count > 2 ? entry[2] : null, + FRetcustIdNumber = entry != null && entry.Count > 3 ? entry[3] : null, + FMaterialIdNumber = entry != null && entry.Count > 4 ? entry[4] : null, + FUnitIDNumber = entry != null && entry.Count > 5 ? entry[5] : null, + FEntity_FEntryId = entry != null && entry.Count > 6 ? entry[6] : null + }); + } + } + } + + + resulted = receive; + } + + return resulted; + } + + /// + /// 退货通知明细 + /// + /// + /// + public static ReturnNoticeBillDets ReturnNoticeBillDetsQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + ReturnNoticeBillDets resulted = new ReturnNoticeBillDets(); + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "SAL_RETURNNOTICE", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FSaleOrgId.FNumber as FSaleOrgIdNumber,FRetcustId.FNumber as FRetcustIdNumber, FMaterialId.FNumber as FMaterialIdNumber,FUnitID.FNumber as FUnitIDNumber,FEntity_FEntryId,FOwnerID.FNumber as FOwnerNumber" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var relJson = invokeHelper.ExecuteBillQuery(json.ToString(), cookie); + + var item = JsonConvert.DeserializeObject(relJson); + + ReturnNoticeBillDets returnNoticeBillDets = new ReturnNoticeBillDets + { + FID = int.Parse(item[0]), + FBillNo = item[1], + FSaleOrgIdNumber = item[2], + FRetcustIdNumber = item[3], + FMaterialIdNumber = item[4], + FUnitIDNumber = item[5], + FEntity_FEntryId = int.Parse(item[6]), + FOwnerNumber = item[7], + }; + + resulted = returnNoticeBillDets; + } + + return resulted; + } + + + + + /// + /// 采购订单查询 + /// + /// + /// + public static List PurchaseOrderQuery(string strJson) + { + InvokeHelper invokeHelper = new InvokeHelper(); + List resulted = new List(); + var result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + BillQuery billQuery = new BillQuery + { + FormId = "PUR_PurchaseOrder", + TopRowCount = 0, + Limit = 0, + StartRow = 0, + FilterString = strJson, + OrderString = "", + FieldKeys = "FID,FBillNo,FPOOrderEntry_FEntryId,FMaterialId.FNumber as FMaterialIdNumber" + }; + + string json = JsonConvert.SerializeObject(billQuery); + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + dynamic relJson = invokeHelper.ExecuteBillQuery(json.ToString(), cookie); + List item1 = JsonConvert.DeserializeObject>(relJson); + + foreach (var row in item1) + { + PurchaseOrderBill purchaseOrderBill = new PurchaseOrderBill + { + FID = int.Parse(row[0]), + FBillNo = row[1], + FDetailEntity_FEntryId = int.Parse(row[2]), + FMaterialIdNumber = row[3] + }; + + resulted.Add(purchaseOrderBill); + } + } + + return resulted; + } + } +} diff --git a/SHK3CloudWebAPI/Service/InService.cs b/SHK3CloudWebAPI/Service/InService.cs new file mode 100644 index 0000000..5d6a7c8 --- /dev/null +++ b/SHK3CloudWebAPI/Service/InService.cs @@ -0,0 +1,2052 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using SHK3CloudWebAPI; +using SHK3CloudWebAPI.Common; +using SHK3CloudWebAPI.Models; +using SHK3CloudWebAPI.Models.ERPModels; +using System; + +namespace SHK3CloudWebAPI +{ + /// + /// 入库业务 + /// + public class InService + { + #region 采购入库 + + /// + /// 采购入库 + /// + /// + /// + public static BillOutput InStock(InParameter parameter) + { + var billOutput = new BillOutput(); + + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取收料通知单 + dynamic receive = BillQueryService.ReceiveBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = STK_InStock(receive, parameter); + + string saveJson = invokeHelper.Save("STK_InStock", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + + } + + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + + + return billOutput; + + } + + /// + /// 组装JSON + /// + /// 收料通知单数据 + /// wms参数 + /// + private static JObject STK_InStock(dynamic receive, InParameter purin) + { + JObject jsonRoot = new JObject(); + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + jsonRoot.Add("IsAutoAdjustField", true); + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNumber", "RKD01_SYS"); + model.Add("FBillTypeID", basedata); + + //单据编号 + model.Add("FBillNo", ""); + //日期 + model.Add("FDate", purin.inboundTime); + //是否WMS回传 + model.Add("FIsWMS", true); + //UUID + model.Add("FUUID", purin.uuid); + //收料组织 + basedata = new JObject(); + basedata.Add("FNumber", receive[0].FStockOrgIdNumber); + model.Add("FStockOrgId", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", receive[0].FStockOrgIdNumber); + model.Add("FPurchaseOrgId", basedata); + + // 需求组织 + basedata = new JObject(); + basedata.Add("FNumber", receive[0].FStockOrgIdNumber); + model.Add("FDemandOrgId", basedata); + + + + + basedata = new JObject(); + basedata.Add("FNumber", receive[0].FSupplierIdNumber); + model.Add("FSupplierId", basedata); + + + //业务类型 + //model.Add("FBusinessType", "CG"); + + //model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + //货主 + //basedata = new JObject(); + //basedata.Add("FNumber", purin.owner); + //model.Add("FOwnerIdHead", basedata); + + basedata = new JObject(); + //结算组织 + //JObject fSettleOrgId = new JObject(); + //fSettleOrgId.Add("FNumber", receive[0].FStockOrgIdNumber); + //basedata.Add("FSettleOrgId", fSettleOrgId); + + + // 汇率 + basedata.Add("FExchangeRate", 1); + // 汇率类型(FExchangeTypeId):基础资料 + JObject fExchangeTypeId = new JObject(); + fExchangeTypeId.Add("FNumber", "HLTX01_SYS"); + basedata.Add("FExchangeTypeId", fExchangeTypeId); + //结算币别 + JObject fSettleCurrId = new JObject(); + fSettleCurrId.Add("FNumber", "PRE001"); + basedata.Add("FSettleCurrId", fSettleCurrId); + + //// 本位币(FLocalCurrId):基础资料 + //JObject fLocalCurrId = new JObject(); + //fLocalCurrId.Add("FNumber", "PRE001"); + //basedata.Add("FLocalCurrId", fLocalCurrId); + + model.Add("FInStockFin", basedata); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FInStockEntry"; + model.Add(entityKey, entryRows); + + // 通过循环创建单据体行 + foreach (var row in purin.inboundConfirmLines.inboundConfirmLine) + { + //查询指定收料通知单明细行 + dynamic receiveDet = BillQueryService.ReceiveBillQuery("FBillNo='" + purin.inboundNo + "' and FDetailEntity_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + //entryRow.Add("FEntryID", 0); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", receiveDet[0].FMaterialIdNumber); + entryRow.Add("FMaterialId", basedata); + + // 实退数量 + entryRow.Add("FRealQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + //收货仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(purin.whCode)); + entryRow.Add("FStockId", basedata); + + + // 单位(FUnitId):基础资料,填写编码 + //basedata = new JObject(); + //basedata.Add("FNumber", receiveDet[0].FUnitIdFNumber); + //entryRow.Add("FUnitId", basedata); + + //计价单位 + //basedata = new JObject(); + //basedata.Add("FNumber", receiveDet[0].FUnitIdFNumber); + //entryRow.Add("FPriceUnitID", basedata); + + //采购单位 + //basedata = new JObject(); + //basedata.Add("FNumber", receiveDet[0].FUnitIdFNumber); + //entryRow.Add("FRemainInStockUnitId", basedata); + + //库存状态 + //basedata = new JObject(); + //basedata.Add("FNumber", "KCZT01_SYS"); + //entryRow.Add("FSTOCKSTATUSID", basedata); + + //entryRow.Add("FMustQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + + + + //entryRow.Add("FOWNERTYPEID", "BD_OwnerOrg"); + //货主 + //basedata = new JObject(); + //basedata.Add("FNumber", purin.owner); + //entryRow.Add("FOWNERID", basedata); + + #region 建立单据关系 + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与收料通知单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSrcBillTypeId", "PUR_ReceiveBill"); + + //收料订单号 + entryRow.Add("FSrcBillNo", purin.inboundNo); + //源单单据体行内码 + entryRow.Add("FSRCRowId", receiveDet[0].FDetailEntity_FEntryId); + //采购订单号 + entryRow.Add("FPOOrderNo", receiveDet[0].FOrderBillNo); + + //采购订单分录内码 + entryRow.Add("FPOORDERENTRYID", receiveDet[0].FPOORDERENTRYID); + + + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "PUR_ReceiveBill-STK_InStock"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_PUR_ReceiveEntry"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, receiveDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, receiveDet[0].FDetailEntity_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + #endregion + + #region 处理SN + if (row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + } + + return jsonRoot; + } + + #endregion + + #region 2b销售退货 + + /// + /// 2b销售退货 + /// + /// + /// + public static BillOutput ReturnStock(InParameter parameter) + { + var billOutput = new BillOutput(); + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取退货通知单 + dynamic returnNotice = BillQueryService.ReturnNoticeBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = SAL_RETURNSTOCK(returnNotice, parameter); + + string saveJson = invokeHelper.Save("SAL_RETURNSTOCK", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + } + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + } + + return billOutput; + } + + /// + /// 退货 + /// + /// + /// + /// + private static JObject SAL_RETURNSTOCK(dynamic returnNotice, InParameter inStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据编号 + model.Add("FBillNo", ""); + + //日期 + model.Add("FDate", inStock.inboundTime); + + //销售组织 + JObject basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + model.Add("FSaleOrgId", basedata); + + //客户 + basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + model.Add("FRetcustId", basedata); + + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FSettleCusId", basedata); + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FPayCusId", basedata); + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FReceiveCusId", basedata); + + //库存组织 + basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + model.Add("FStockOrgId", basedata); + + model.Add("FIsWMS", true); + //UUID + model.Add("FUUID", inStock.uuid); + + model.Add("F_BJYC_PTID", ""); + model.Add("F_BJYC_PTDH", ""); + model.Add("F_BJYC_SHDH", ""); + model.Add("F_BJYC_KDDH", ""); + ////单据类型 + //basedata = new JObject(); + //basedata.Add("FNumber", "XSTHD01_SYS"); + //model.Add("FBillTypeID", basedata); + + //model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", inStock.owner); + //model.Add("FOwnerIdHead", basedata); + + ////业务类型 + //model.Add("FBusinessType", "NORMAL"); + + basedata = new JObject(); + + //结算币别 + JObject fSettleCurrId = new JObject(); + fSettleCurrId.Add("FNumber","PRE001"); + basedata.Add("FSettleCurrId", fSettleCurrId); + //结算组织 + JObject fSettleOrgId = new JObject(); + fSettleOrgId.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + basedata.Add("FSettleOrgId", fSettleOrgId); + + //// 汇率类型(FExchangeTypeId):基础资料 + //JObject fExchangeTypeId = new JObject(); + //fExchangeTypeId.Add("FNumber", arrival.ExchangeTypeCode); + //basedata.Add("FExchangeTypeId", fExchangeTypeId); + //// 本位币(FLocalCurrId):基础资料 + //JObject fLocalCurrId = new JObject(); + //fLocalCurrId.Add("FNumber", arrival.LocalCurrCode); + //basedata.Add("FLocalCurrId", fLocalCurrId); + //// 汇率 + //basedata.Add("FExchangeRate", arrival.ExchangeRate); + model.Add("SubHeadEntity", basedata); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FEntity"; + model.Add(entityKey, entryRows); + + foreach (var row in inStock.inboundConfirmLines.inboundConfirmLine) + { + //查询指定退货通知单明细行 + dynamic returnNoticeDet = BillQueryService.ReturnNoticeBillQuery("FBillNo='" + inStock.inboundNo + "' and FEntity_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + //entryRow.Add("FEntryID", 0); + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", returnNoticeDet[0].FMaterialIdNumber); + entryRow.Add("FMaterialId", basedata); + // 数量(FQty) + entryRow.Add("FRealQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + //是否赠品 + entryRow.Add("FIsFree", false); + + // 单位(FUnitId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", returnNoticeDet[0].FUnitIDNumber); + entryRow.Add("FUnitId", basedata); + //库存状态 + basedata = new JObject(); + basedata.Add("FNumber", "KCZT01_SYS"); + entryRow.Add("FSTOCKSTATUSID", basedata); + // 数量(FQty):数量字段 + entryRow.Add("FMustqty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + //仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(inStock.whCode));//inStock.whCode + entryRow.Add("FStockId", basedata); + //退料单分录内码 + entryRow.Add("FMrbEntryId", returnNoticeDet[0].FEntity_FEntryId); + //退料单编码_序号 + entryRow.Add("FMrbBillNo", returnNoticeDet[0].FBillNo); + + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", inStock.owner); + //entryRow.Add("FOwnerId", basedata); + + + //退货日期 + entryRow.Add("FDeliveryDate", inStock.inboundTime); + //退货类型 + basedata = new JObject(); + basedata.Add("FNumber", "THLX01_SYS"); + entryRow.Add("FReturnType", basedata); + + #region 建立单据关系 + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与收料通知单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSrcBillTypeID", "SAL_RETURNNOTICE"); + entryRow.Add("FSrcBillNo", returnNoticeDet[0].FBillNo); + + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "SalReturnNotice-SalReturnStock"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_SAL_RETURNNOTICEENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, returnNoticeDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, returnNoticeDet[0].FEntity_FEntryId); + + + //decimal num = decimal.Parse(item.GetType().GetProperty("CheckInNum").GetValue(item, null).ToString()); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + #endregion + + #region 处理SN + if (row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + #endregion + + #region 分步式调拨入库 + + /// + /// 调拨入库 + /// + /// + /// + public static BillOutput TransferIn(InParameter parameter) + { + var billOutput = new BillOutput(); + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取调拨出库 + dynamic transferin = BillQueryService.TransferOutBillQuery("FBillNo='" + parameter.inboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = STK_TRANSFERIN(transferin, parameter); + + string saveJson = invokeHelper.Save("STK_TRANSFERIN", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + } + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + } + + return billOutput; + } + + /// + /// 调入 + /// + /// + /// + /// + private static JObject STK_TRANSFERIN(dynamic transferin, InParameter inStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + // model.Add("FID", 0); + + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNumber", "FBDR01_SYS"); + model.Add("FBillTypeID", basedata); + + //单据编号 + //model.Add("FBillNo", ""); + //日期 + model.Add("FDate", inStock.inboundTime); + //UUID + model.Add("FUUID", inStock.uuid); + //调出货主类型 + model.Add("FOwnerTypeOutIdHead", "BD_OwnerOrg"); + //调出货主 + basedata = new JObject(); + basedata.Add("FNumber", transferin[0].FStockInOrgIDNumber);//inStock.owner + model.Add("FOwnerOutIdHead", basedata); + //调拨类型 + model.Add("FTransferBizType", "InnerOrgTransfer"); + //调拨方向 + model.Add("FTransferDirect", "GENERAL"); + //调拨方式 + model.Add("FTransferMode", "INDIRECT"); + //调入货主类型 + model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + //调入货主 + basedata = new JObject(); + basedata.Add("FNumber",transferin[0].FStockInOrgIDNumber );//inStock.owner + model.Add("FOwnerIdHead", basedata); + + //调入组织 + basedata = new JObject(); + basedata.Add("FNumber", transferin[0].FStockInOrgIDNumber); + model.Add("FStockOrgID", basedata); + + //调出组织 + basedata = new JObject(); + basedata.Add("FNumber", transferin[0].FStockOrgIDNumber); + model.Add("FStockOutOrgID", basedata); + + //basedata = new JObject(); + //basedata.Add("FNumber", "VEN00006"); + //model.Add("FSUPPLIERID", basedata); + + + //携带在途归属 + model.Add("FVESTONWAY", transferin[0].FVESTONWAY); + //业务类型 + model.Add("FBizType", "NORMAL"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FSTKTRSINENTRY"; + model.Add(entityKey, entryRows); + + foreach (var row in inStock.inboundConfirmLines.inboundConfirmLine) + { + //查询指定调拨出库单明细行 + dynamic outDet = BillQueryService.TransferOutBillQuery("FBillNo='" + inStock.inboundNo + "' and FSTKTRSOUTENTRY_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + //entryRow.Add("FEntryID", 0); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FMaterialIDNumber); + entryRow.Add("FMaterialId", basedata); + + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FMaterialIDNumber); + entryRow.Add("FSrcMaterialId", basedata); + + // 库存单位(FUnitId):基础资料 + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FUnitIDNumber); + entryRow.Add("FUnitID", basedata); + + // 单位(FUnitId): + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FUnitIDNumber); + entryRow.Add("FBaseUnitID", basedata); + + //在途库存状态 + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FDestStockStatusIDNumber); + entryRow.Add("FSrcStockStatusID", basedata); + + // 调入数量 + entryRow.Add("FQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + entryRow.Add("FPlanTransferQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + entryRow.Add("FTranferQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + entryRow.Add("FBaseQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + entryRow.Add("FBasePlanTransQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + entryRow.Add("FBaseTransferQty", row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + //调出仓库 + basedata = new JObject(); + basedata.Add("FNumber", outDet[0].FSrcStockIDNumber); + entryRow.Add("FSrcStockID", basedata); + //调入仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(inStock.whCode));//inStock.whCode + entryRow.Add("FDestStockID", basedata); + + //调出货主类型 + entryRow.Add("FOwnerTypeOutID", "BD_OwnerOrg"); + //调出货主 + basedata = new JObject(); + basedata.Add("FNumber", transferin[0].FStockInOrgIDNumber);//inStock.owner + entryRow.Add("FOwnerOutID", basedata); + + //调入货主类型 + entryRow.Add("FOwnerTypeID", "BD_OwnerOrg"); + + //调入货主 + basedata = new JObject(); + basedata.Add("FNumber", transferin[0].FStockInOrgIDNumber);//inStock.owner + entryRow.Add("FOwnerID", basedata); + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与采购入库单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSrcBillType", "STK_TRANSFEROUT"); + entryRow.Add("FSrcBillNo", outDet[0].FBillNo); + + basedata = new JObject(); + basedata.Add("FNumber", "FBDC01_SYS"); + entryRow.Add("FSRCBILLNAME", basedata); + + + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", "FSTKTSTKRANSFERINENTRY"); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "STK_TRANSFEROUT-STK_TRANSFERIN"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_STK_STKTRANSFEROUTENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, outDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, outDet[0].FSTKTRSOUTENTRY_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseTransferQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseTransferQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.inboundInvLineConfirms.inboundInvLineConfirm[0].qtyReceived); + + #region 处理SN + if (row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.inboundInvLineConfirms.inboundInvLineConfirm[0].sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + + + #endregion + + #region 2c销售退货 + + /// + /// 2c销售退货 + /// + /// + /// + public static BillOutput ReturnStock2c(InB2CParameter parameter) + { + var billOutput = new BillOutput(); + try + { + string inJson = JsonConvert.SerializeObject(parameter); + + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取退货通知单 + ReturnNoticeBill returnNotice = BillQueryService.ReturnNoticeBillQuery("FBillNo='" + parameter.inBoundOrderConfirm[0].orderCode + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = SAL_RETURNSTOCK2c(returnNotice, parameter); + + string saveJson = invokeHelper.Save("SAL_RETURNSTOCK", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + return billOutput; + } + + /// + /// 退货 + /// + /// + /// + /// + private static JObject SAL_RETURNSTOCK2c(dynamic returnNotice, InB2CParameter inStock) + { + + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据编号 + model.Add("FBillNo", ""); + + //日期 + model.Add("FDate", inStock.inBoundOrderConfirm[0].inboundTime); + + + //销售组织 + JObject basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + model.Add("FSaleOrgId", basedata); + + //客户 + basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + model.Add("FRetcustId", basedata); + + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FSettleCusId", basedata); + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FPayCusId", basedata); + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FRetcustIdNumber); + //model.Add("FReceiveCusId", basedata); + + //库存组织 + basedata = new JObject(); + basedata.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + model.Add("FStockOrgId", basedata); + + model.Add("FIsWMS", true); + //UUID + //model.Add("FUUID", inStock.uuid); + + model.Add("F_BJYC_PTID", ""); + model.Add("F_BJYC_PTDH", ""); + model.Add("F_BJYC_SHDH", ""); + model.Add("F_BJYC_KDDH", ""); + + + //单据类型 + //basedata = new JObject(); + //basedata.Add("FNumber", "XSTHD01_SYS"); + //model.Add("FBillTypeID", basedata); + + //model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + //货主 + //basedata = new JObject(); + //basedata.Add("FNumber", returnNotice[0].FOwnerNumber); + //model.Add("FOwnerIdHead", basedata); + + //业务类型 + //model.Add("FBusinessType", "NORMAL"); + + //basedata = new JObject(); + + //结算币别 + JObject fSettleCurrId = new JObject(); + fSettleCurrId.Add("FNumber", "PRE001"); + basedata.Add("FSettleCurrId", fSettleCurrId); + + //结算组织 + JObject fSettleOrgId = new JObject(); + fSettleOrgId.Add("FNumber", returnNotice[0].FSaleOrgIdNumber); + basedata.Add("FSettleOrgId", fSettleOrgId); + + //// 汇率类型(FExchangeTypeId):基础资料 + //JObject fExchangeTypeId = new JObject(); + //fExchangeTypeId.Add("FNumber", arrival.ExchangeTypeCode); + //basedata.Add("FExchangeTypeId", fExchangeTypeId); + //// 本位币(FLocalCurrId):基础资料 + //JObject fLocalCurrId = new JObject(); + //fLocalCurrId.Add("FNumber", arrival.LocalCurrCode); + //basedata.Add("FLocalCurrId", fLocalCurrId); + //// 汇率 + //basedata.Add("FExchangeRate", arrival.ExchangeRate); + //model.Add("FSAL_RETURNSTOCKFIN", basedata); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FEntity"; + model.Add(entityKey, entryRows); + + foreach (var row in inStock.inBoundOrderConfirm[0].inBoundLineConfirm) + { + foreach (var item in row.inBoundInvLineConfirm) + { + //查询指定退货通知单明细行 + ReturnNoticeBillDets returnNoticeDet = BillQueryService.ReturnNoticeBillDetsQuery("FBillNo='" + inStock.inBoundOrderConfirm[0].orderCode + "' and FEntity_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + //entryRow.Add("FEntryID", 0); + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", returnNoticeDet.FMaterialIdNumber); + entryRow.Add("FMaterialId", basedata); + // 数量(FQty) + entryRow.Add("FRealQty", item.qtyActual); + //是否赠品 + entryRow.Add("FIsFree", false); + + // 单位(FUnitId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", returnNoticeDet.FUnitIDNumber); + entryRow.Add("FUnitId", basedata); + + //库存状态 + basedata = new JObject(); + basedata.Add("FNumber", "KCZT01_SYS"); + entryRow.Add("FSTOCKSTATUSID", basedata); + // 数量(FQty):数量字段 + entryRow.Add("FMustqty", item.qtyActual); + //entryRow.Add("FRealQty", item.qtyActual); + + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", returnNoticeDet.FOwnerNumber); + //entryRow.Add("FOwnerId", basedata); + //仓库 + basedata = new JObject(); + basedata.Add("FNumber", row.warehouseCode); + entryRow.Add("FStockId", basedata); + + //退料单分录内码 + entryRow.Add("FMrbEntryId", returnNoticeDet.FEntity_FEntryId); + //退料单编码_序号 + entryRow.Add("FMrbBillNo", returnNoticeDet.FBillNo); + //退货日期 + entryRow.Add("FDeliveryDate", inStock.inBoundOrderConfirm[0].inboundTime); + //退货类型 + basedata = new JObject(); + basedata.Add("FNumber", "THLX01_SYS"); + entryRow.Add("FReturnType", basedata); + + #region 建立单据关系 + + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与收料通知单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSrcBillTypeID", "SAL_RETURNNOTICE"); + entryRow.Add("FSrcBillNo", returnNoticeDet.FBillNo); + entryRow.Add("FSRCRowId", returnNoticeDet.FEntity_FEntryId); + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "SalReturnNotice-SalReturnStock"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_SAL_RETURNNOTICEENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, returnNoticeDet.FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, returnNoticeDet.FEntity_FEntryId); + + + //decimal num = decimal.Parse(item.GetType().GetProperty("CheckInNum").GetValue(item, null).ToString()); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, item.qtyActual); + + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, item.qtyActual); + + #endregion + + #region 处理SN + if (item.skuSnInfo.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var snNo in item.skuSnInfo) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", snNo.sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + } + + + } + + return jsonRoot; + } + #endregion + + + + + #region 采购订单3PP + + /// + /// 采购订单 + /// + /// + /// + public static BillOutput PurchaseOrder(PurchaseOrderData parameter) + { + var billOutput = new BillOutput(); + string inXml = string.Empty; + string saveXml = string.Empty; + + try + { + // 1. 对象转 XML + inXml = CommonHelper.SerializeToXml(parameter); + + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + if (parameter.PurchaseOrder.Status=="3") + { + JObject close= new JObject(); + close.Add("Numbers", parameter.PurchaseOrder.PurchaseOrderNo); + string closeJson = invokeHelper.BillClose("PUR_PurchaseOrder", close.ToString(), cookie); + Root closeRoot = JsonConvert.DeserializeObject(closeJson); + if (closeRoot.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = closeRoot.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = closeRoot.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = closeRoot.Result.ResponseStatus.Errors[0].Message + }; + } + return billOutput; + } + var save = PUR_PurchaseOrder(parameter); + + string saveJson = invokeHelper.Save("PUR_PurchaseOrder", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + return billOutput; + } + + + private static JObject PUR_PurchaseOrder(PurchaseOrderData purin) + { + string FLog_Txt = CommonHelper.SerializeToXml(purin); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsVerifyBaseDataField", true); + + JObject model = new JObject(); + jsonRoot.Add("Model", model); + + //单据编号 + model.Add("FBillNo", purin.PurchaseOrder.PurchaseOrderNo); + + //日期 + model.Add("FDate", purin.PurchaseOrder.OrderTime); + + //供应商 + JObject basedata = new JObject(); + basedata.Add("FNumber",purin.PurchaseOrder.VendorCode); + model.Add("FSupplierId", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", CommonHelper.OigNumber(purin.PurchaseOrder.PurchaseOrderLines[0].OwnerCode)); + model.Add("FPurchaseOrgId", basedata); + + //json + model.Add("FLog_Txt", FLog_Txt); + + //是否3PP单据 + model.Add("F_UNW_Is3PP", "true"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FPOOrderEntry"; + model.Add(entityKey, entryRows); + + // 通过循环创建单据体行 + foreach (var row in purin.PurchaseOrder.PurchaseOrderLines) + { + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + entryRow.Add("F_KDYC_POH","测试PO"); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", row.Mpn); + entryRow.Add("FMaterialId", basedata); + + //数量 + entryRow.Add("FQty", row.Qty); + + + //收货仓库 + basedata = new JObject(); + basedata.Add("FNumber", row.WarehouseCode); + entryRow.Add("FStockId", basedata); + + } + + return jsonRoot; + } + #endregion + + #region 收料通知单3PP + /// + /// 收料通知单 + /// + /// + /// + public static BillOutput ReceiveBill(InboundOrders parameter) + { + var billOutput = new BillOutput(); + string inXml = string.Empty; + string saveXml = string.Empty; + + try + { + // 1. 对象转 XML + inXml = CommonHelper.SerializeToXml(parameter); + + InvokeHelper invokeHelper = new InvokeHelper(); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + + var save = PUR_ReceiveBill(parameter); + + string saveJson = invokeHelper.Save("PUR_ReceiveBill", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + + } + + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + + return billOutput; + } + + private static JObject PUR_ReceiveBill(InboundOrders parameter) + { + string FLog_Txt = CommonHelper.SerializeToXml(parameter); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("IsAutoSubmitAndAudit", false); //是否自动审核 + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsVerifyBaseDataField", true); + + JObject model = new JObject(); + jsonRoot.Add("Model", model); + + //单据编号 + model.Add("FBillNo", parameter.InboundOrder.InboundNo); + + //日期 + model.Add("FDate", DateTime.Now.ToString()); + + //供应商 + JObject basedata = new JObject(); + basedata.Add("FNumber", "VEN00003"); + model.Add("FSupplierId", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", CommonHelper.OigNumber(parameter.InboundOrder.Owner)); + model.Add("FStockOrgId", basedata); + + //json + model.Add("FLog_Txt", FLog_Txt); + + //是否3PP单据 + model.Add("F_UNW_Is3PP", "true"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FDetailEntity"; + model.Add(entityKey, entryRows); + + // 通过循环创建单据体行 + foreach (var row in parameter.InboundOrder.InboundOrderLines.InboundOrderLinee) + { + + //查询采购订单明细 + //List PurchaseOrder = BillQueryService.PurchaseOrderQuery("FBillNo='" + parameter.InboundOrder.InboundOrderLines.InboundOrderLinee[0].EcPoCode + "' and FMaterialId.FNumber='" + parameter.InboundOrder.InboundOrderLines.InboundOrderLinee[0].Mpn + " '"); + List PurchaseOrder = BillQueryService.PurchaseOrderQuery("FBillNo='" + row.EcPoCode + "' and FMaterialId.FNumber='" + row.Mpn + " '"); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", row.Mpn); + entryRow.Add("FMaterialId", basedata); + + //数量 + entryRow.Add("FActReceiveQty", row.Qty); + + //箱号 + entryRow.Add("F_UNW_XiangHao", row.CartonNo); + //UPC + entryRow.Add("F_UNW_UPC", row.Upc); + //LineNo + entryRow.Add("F_UNW_LineNo", row.LineNo); + + //收货仓库 + basedata = new JObject(); + basedata.Add("FNumber", parameter.InboundOrder.WhCode); + entryRow.Add("FStockID", basedata); + + entryRow.Add("F_KDYC_FHRQ", DateTime.Now); + entryRow.Add("F_KDYC_POH", "测试PO"); + + #region 建立单据关系 + + + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "PUR_PurchaseOrder-PUR_ReceiveBill"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_PUR_POOrderEntry"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, PurchaseOrder[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, PurchaseOrder[0].FDetailEntity_FEntryId); + + #endregion + + #region 处理SN + if (row.SnLines.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.SnLines) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn.Sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + } + + return jsonRoot; + } + #endregion + + #region 采购退料出库3PP + + /// + /// 退料申请单 + /// + /// + /// + public static BillOutput MRAPP(OutboundOrders parameter) + { + var billOutput = new BillOutput(); + string inXml = string.Empty; + string saveXml = string.Empty; + + try + { + + // 1. 对象转 XML + inXml = CommonHelper.SerializeToXml(parameter); + + InvokeHelper invokeHelper = new InvokeHelper(); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + + var save = PUR_MRAPP(parameter); + + string saveJson = invokeHelper.Save("PUR_MRAPP", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + + } + + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + + return billOutput; + } + + private static JObject PUR_MRAPP(OutboundOrders purin) + { + string FLog_Txt = CommonHelper.SerializeToXml(purin); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsVerifyBaseDataField", true); + + JObject model = new JObject(); + jsonRoot.Add("Model", model); + + //单据编号 + model.Add("FBillNo", purin.OutboundOrder.OutboundNo); + + //日期 + model.Add("FDate", purin.OutboundOrder.OrderCreateTime); + + //供应商 + JObject basedata = new JObject(); + //basedata.Add("FNumber", "VEN00001"); + basedata.Add("FNumber", "VEN00003"); + model.Add("FSUPPLIERID", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", CommonHelper.OigNumber(purin.OutboundOrder.Owner)); + model.Add("FAPPORGID", basedata); + + //json + model.Add("FLog_Txt", FLog_Txt); + + //是否3PP单据 + model.Add("F_UNW_Is3PP", "true"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FEntity"; + model.Add(entityKey, entryRows); + + // 通过循环创建单据体行 + foreach (var row in purin.OutboundOrder.OutboundLines.OutboundLine) + { + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", row.Mpn); + entryRow.Add("FMaterialId", basedata); + + //数量 + entryRow.Add("FMRAPPQTY", row.Qty); + + //UPC + entryRow.Add("F_UNW_UPC", row.Upc); + //LineNo + entryRow.Add("F_UNW_LineNo", row.LineNo); + //收货仓库 + basedata = new JObject(); + basedata.Add("FNumber", purin.OutboundOrder.WhCode); + entryRow.Add("FStockId", basedata); + + } + + return jsonRoot; + } + #endregion + + #region 采购入库单3PP + + /// + /// 采购入库单 + /// + /// + /// + public static BillOutput InStock3PP(InboundOrders parameter) + { + var billOutput = new BillOutput(); + string inXml = string.Empty; + string saveXml = string.Empty; + + try + { + // 1. 对象转 XML + inXml = CommonHelper.SerializeToXml(parameter); + + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + + var save = STK_InStock3PP(parameter); + + string saveJson = invokeHelper.Save("STK_InStock", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + return billOutput; + } + + + private static JObject STK_InStock3PP(InboundOrders parameter) + { + string FLog_Txt = CommonHelper.SerializeToXml(parameter); + + JObject jsonRoot = new JObject(); + jsonRoot.Add("IsAutoSubmitAndAudit", false); //是否自动审核 + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsVerifyBaseDataField", true); + + JObject model = new JObject(); + jsonRoot.Add("Model", model); + + //单据编号 + model.Add("FBillNo", parameter.InboundOrder.InboundNo); + + //日期 + model.Add("FDate", DateTime.Now.ToString()); + + //供应商 + JObject basedata = new JObject(); + //basedata.Add("FNumber", "VEN00001"); + basedata.Add("FNumber", "VEN00003"); + model.Add("FSupplierId", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", CommonHelper.OigNumber(parameter.InboundOrder.Owner)); + model.Add("FStockOrgId", basedata); + + //json + model.Add("FLog_Txt", FLog_Txt); + + //是否3PP单据 + model.Add("F_UNW_Is3PP", "true"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FInStockEntry"; + model.Add(entityKey, entryRows); + + // 通过循环创建单据体行 + foreach (var row in parameter.InboundOrder.InboundOrderLines.InboundOrderLinee) + { + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", row.Mpn); + entryRow.Add("FMaterialId", basedata); + + //数量 + entryRow.Add("FRealQty", row.Qty); + + //箱号 + entryRow.Add("F_UNW_XiangHao", row.CartonNo); + + //收货仓库 + basedata = new JObject(); + basedata.Add("FNumber", parameter.InboundOrder.WhCode); + entryRow.Add("FStockID", basedata); + + + #region 处理SN + if (row.SnLines.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.SnLines) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn.Sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + } + + return jsonRoot; + } + #endregion + + + /// + /// 物料 + /// + /// + /// + /// + public static JObject BD_MATERIALJSON(ProductMasterDataParameter BD_MATERIAL, string FMATERIALID, string FOrgNumber) + { + string outJson = JsonConvert.SerializeObject(BD_MATERIAL); + + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + if (FMATERIALID=="0") + { + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + } + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //单据编号 + model.Add("FMATERIALID", FMATERIALID); + //创建组织 + JObject basedata = new JObject(); + basedata.Add("FNumber", "100"); + model.Add("FCreateOrgId", basedata); + //使用组织 + basedata = new JObject(); + basedata.Add("FNumber", "100"); + model.Add("FUseOrgId", basedata); + //物料编码 + model.Add("FNumber", BD_MATERIAL.Variants[0].PartNumber); + //物料名称 + model.Add("FName", BD_MATERIAL.Variants[0].ProductNameCN); + //规格型号 + model.Add("FSpecification", BD_MATERIAL.Variants[0].Spec); + //助记码 + model.Add("FMnemonicCode", BD_MATERIAL.Variants[0].SpuCode); + //旧物料编码 FOldNumber--UPC + model.Add("FOldNumber", BD_MATERIAL.Variants[0].Upc); + model.Add("F_VNEI_FISJDLSUCCESS",0); + + //物料分组 + basedata = new JObject(); + basedata.Add("FNumber", "3PP"); + model.Add("FMaterialGroup", basedata); + //产品大类 + basedata = new JObject(); + basedata.Add("FNumber", "3PP"); + model.Add("F_KDYC_LOB", basedata); + //产品小类 + basedata = new JObject(); + basedata.Add("FNumber", "3PP"); + model.Add("F_KDYC_BRAND", basedata); + + JObject entryRow = new JObject(); + + basedata = new JObject(); + basedata.Add("FNumber", "CHLB01_SYS"); + entryRow.Add("FCategoryID", basedata); + + basedata = new JObject(); + basedata.Add("FNumber", "UOM002"); + entryRow.Add("FBaseUnitId", basedata); + + //json + entryRow.Add("FLog_Txt", outJson); + //长 + entryRow.Add("FLENGTH", BD_MATERIAL.Variants[0].LengthMm); + //宽 + entryRow.Add("FWIDTH", BD_MATERIAL.Variants[0].WidthMm); + //高 + entryRow.Add("FHEIGHT", BD_MATERIAL.Variants[0].HeightMm); + //毛重 + entryRow.Add("FGROSSWEIGHT", BD_MATERIAL.Variants[0].WeightKg); + string entityKey = "SubHeadEntity"; + model.Add(entityKey, entryRow); + + if (FMATERIALID == "0") + { + basedata = new JObject(); + //basedata.Add("FIsSNManage", BD_MATERIAL.Variants[0].IsSnManaged == "是" ? true : false); + basedata.Add("FIsSNManage",true); + + JObject xlh = new JObject(); + xlh.Add("FNumber", "PHBM001"); + basedata.Add("FSNCodeRule", xlh); + + model.Add("SubHeadEntity1", basedata); + } + return jsonRoot; + } + public static BillOutput BD_MATERIAL(ProductMasterDataParameter parameter, string FMATERIALID, string FDOCUMENTSTATUS, string FOrgNumber) + { + var billOutput = new BillOutput(); + try + { + string outJson = JsonConvert.SerializeObject(parameter); + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + if (FMATERIALID != "0") + { + JObject close = new JObject(); + close.Add("Ids", FMATERIALID); + //if (FDOCUMENTSTATUS == "C") + //{ + // string closeJson = invokeHelper.BillOperation("BD_MATERIAL", close.ToString(), cookie, "UnAudit"); + // Root closeRoot = JsonConvert.DeserializeObject(closeJson); + // if (!closeRoot.Result.ResponseStatus.IsSuccess) + // { + // billOutput = new BillOutput + // { + // result = 0, + // errorCode = closeRoot.Result.ResponseStatus.ErrorCode.ToString(), + // errorMsg = closeRoot.Result.ResponseStatus.Errors[0].Message + // }; + + // //Log.AddLog("M07 商品主档数据推送", outJson, "", closeJson, "失败"); + // return billOutput; + // } + //} + } + var save = BD_MATERIALJSON(parameter, FMATERIALID, FOrgNumber); + + string saveJson = invokeHelper.Save("BD_MATERIAL", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + + //Log.AddLog("M07 商品主档数据推送", outJson, save.ToString(), saveJson, "成功"); + } + else + { + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + //Log.AddLog("M07 商品主档数据推送", outJson, save.ToString(), saveJson, "失败"); + } + + + } + + //var aa = DataStorageHelp.SH_K3_BD_MATERIALSAVE("", "", "", parameter); + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + //Log.AddLog("M07 商品主档数据推送", "", "", ex.Message, "失败"); + + } + + return billOutput; + } + public static BillOutput TestSaveBD_MATERIAL() + { + InvokeHelper invokeHelper = new InvokeHelper(); + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + } + return null; + } + } +} diff --git a/SHK3CloudWebAPI/Service/OutService.cs b/SHK3CloudWebAPI/Service/OutService.cs new file mode 100644 index 0000000..e5ea3d3 --- /dev/null +++ b/SHK3CloudWebAPI/Service/OutService.cs @@ -0,0 +1,1208 @@ +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using SHK3CloudWebAPI; +using System; +using SHK3CloudWebAPI.Models; + +namespace SHK3CloudWebAPI +{ + /// + /// 出库业务 + /// + public class OutService + { + #region 2b销售出库 + /// + /// 2b销售出库 + /// + /// + /// + public static BillOutput OutStock(OutParameter parameter) + { + var billOutput = new BillOutput(); + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取发货通知单 + dynamic delivery = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = SAL_OUTSTOCK(delivery, parameter); + + string saveJson = invokeHelper.Save("SAL_OUTSTOCK", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突")|| errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + } + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + } + + return billOutput; + } + + /// + /// 出库 + /// + /// + /// + /// + public static JObject SAL_OUTSTOCK(dynamic delivery, OutParameter outStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoSubmitAndAudit", true);//是否自动审核 + jsonRoot.Add("IsVerifyBaseDataField", true); + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNUMBER", "XSCKD01_SYS"); + model.Add("FBillTypeID", basedata); + + //单据编号 + model.Add("FBillNo", ""); + //日期 + model.Add("FDate", outStock.outboundTime); + //是否WMS + model.Add("FIsWMS", true); + //UUID + model.Add("FUUID", outStock.uuid); + //是否是t2 + if (delivery[0].FDeliveryOrgIDNumber == 100) + { + model.Add("FIsT2", true); + } + //销售组织 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + model.Add("FSaleOrgId", basedata); + + //发货组织 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + model.Add("FStockOrgId", basedata); + + + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + model.Add("FPAYORGID", basedata); + + //客户 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + model.Add("FCustomerID", basedata); + + model.Add("F_BJYC_PTID", ""); + model.Add("F_BJYC_PTDH", ""); + model.Add("F_BJYC_XTDH", ""); + + //basedata = new JObject(); + //basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + //model.Add("FReceiverID", basedata); + + //basedata = new JObject(); + //basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + //model.Add("FSettleId", basedata); + + //basedata = new JObject(); + //basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + //model.Add("FPayerID", basedata); + + + + //业务类型 + //model.Add("FBusinessType", "NORMAL"); + + ////货主类型 + ////model.Add("FOwnerTypeIdHead", shipments.OwnerTypeCode); + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //model.Add("FOwnerIdHead", basedata); + + //basedata = new JObject(); + ////结算组织 + //JObject fSettleOrgId = new JObject(); + //fSettleOrgId.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + //basedata.Add("FSettleOrgID", fSettleOrgId); + + + basedata = new JObject(); + //结算币别 + JObject fSettleCurrId = new JObject(); + fSettleCurrId.Add("FNumber", "PRE001"); + basedata.Add("FSettleCurrID", fSettleCurrId); + // 汇率类型(FExchangeTypeId):基础资料 + JObject fExchangeTypeId = new JObject(); + fExchangeTypeId.Add("FNumber", "HLTX01_SYS"); + basedata.Add("FExchangeTypeId", fExchangeTypeId); + // 汇率 + basedata.Add("FExchangeRate", 1); + model.Add("SubHeadEntity", basedata); + + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FEntity"; + model.Add(entityKey, entryRows); + + foreach (var row in outStock.outboundConfirmLines) + { + //查询指定发货通知单明细行 + dynamic deliveryDet = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + outStock.outboundNo + "' and FEntity_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + // entryRow.Add("FEntryID", 0); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", deliveryDet[0].FMaterialIdNumber); + entryRow.Add("FMaterialId", basedata); + + // 实发数量 + entryRow.Add("FRealQty", row.qty); + + //仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(outStock.whCode)); + entryRow.Add("FSTOCKID", basedata); + + // 是否赠品 + entryRow.Add("FIsFree", false); + //批号 + basedata = new JObject(); + basedata.Add("FNumber", ""); + entryRow.Add("FLOT", basedata); + + // 库存单位(FUnitId):基础资料 + //basedata = new JObject(); + //basedata.Add("FNumber", deliveryDet[0].FUnitIdFNumber); + //entryRow.Add("FUnitId", basedata); + + ////计价单位 + //basedata = new JObject(); + //basedata.Add("FNumber", dtentry.Rows[j]["FPriceUnitID"].ToString()); + //entryRow.Add("FPriceUnitID", basedata); + + ////销售单位 + //basedata = new JObject(); + //basedata.Add("FNumber", dtentry.Rows[j]["FSalUnitID"].ToString()); + //entryRow.Add("FSalUnitID", basedata); + + //库存状态 + //basedata = new JObject(); + //basedata.Add("FNumber", detail.StockStatusCode); + //entryRow.Add("FSTOCKSTATUSID", basedata); + + // 应发数量 + //entryRow.Add("FMustQty", row.qty); + + ////单价 + //entryRow.Add("FPrice", detail.Price); + ////含税单价 + //entryRow.Add("FTaxPrice", detail.TaxPrice); + ////税率(%) + //entryRow.Add("FEntryTaxRate", detail.TaxRate); + + ////货主类型 + //entryRow.Add("FOwnerTypeID", detail.OwnerTypeCode); + //货主 + basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //entryRow.Add("FOWNERID", basedata); + + #region 关联关系 + //创建与源单之间的关联关系,以支持上查与反写源单 + // 源单类型、源单编号 + entryRow.Add("FSrcType", "SAL_DELIVERYNOTICE"); + entryRow.Add("FSrcBillNo", deliveryDet[0].FBillNo); + //源单单据体行内码 + entryRow.Add("FSRCRowId", deliveryDet[0].FEntity_FEntryId); + // 销售订单号 + entryRow.Add("FSoorDerno", deliveryDet[0].FORDERNO); + + ////收料单编码_序号 + //entryRow.Add("FReceiveBillno", deliveryDet[0].FEntity_FSEQ); + ////收料单分录ID + //entryRow.Add("FReceiveEntryId", deliveryDet[0].FEntity_FEntryId); + + // 创建Link行集合 + JArray linkRows = new JArray(); + + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "DeliveryNotice-OutStock"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_SAL_DELIVERYNOTICEENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, deliveryDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, deliveryDet[0].FEntity_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.qty); + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.qty); + + // FSalBaseQtyOld :控制字段实际值,本单实际填写了多少 + string FSalBaseQtyOld = string.Format("{0}_FSalBaseQtyOld", linkEntityKey); + linkRow.Add(FSalBaseQtyOld, row.qty); + + #endregion + + #region 处理SN + if (row.sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + + #endregion + + #region 采购退料 + + /// + /// 采购退料 + /// + /// + /// + public static BillOutput PurMRB(OutParameter parameter) + { + var billOutput = new BillOutput(); + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取退料申请 + dynamic mrapp = BillQueryService.MrappBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = PUR_MRB(mrapp, parameter); + + string saveJson = invokeHelper.Save("PUR_MRB", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + } + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + } + + return billOutput; + } + + /// + /// 退料 + /// + /// + /// + /// + private static JObject PUR_MRB(dynamic mrapp, OutParameter outStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + // model.Add("FID", 0); + + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNumber", "TLD01_SYS"); + model.Add("FBillTypeID", basedata); + + //单据编号 + model.Add("FBillNo", ""); + //日期 + model.Add("FDate", outStock.outboundTime); + + model.Add("FIsWMS", true); + model.Add("FUUID", outStock.uuid); + model.Add("FMRTYPE", "B"); + model.Add("FMRMODE", "B"); + + //退料组织 + basedata = new JObject(); + basedata.Add("FNumber", mrapp[0].FPURCHASEORGIDNumber); + model.Add("FStockOrgId", basedata); + + //需求组织 + basedata = new JObject(); + basedata.Add("FNumber", mrapp[0].FPURCHASEORGIDNumber); + model.Add("FRequireOrgId", basedata); + + //采购组织 + basedata = new JObject(); + basedata.Add("FNumber", mrapp[0].FPURCHASEORGIDNumber); + model.Add("FPurchaseOrgId", basedata); + //供应商 + basedata = new JObject(); + basedata.Add("FNumber", mrapp[0].FSUPPLIERIDNumber); + model.Add("FSupplierId", basedata); + + //业务类型 + //model.Add("FBusinessType", "CG"); + + model.Add("FREPLENISHMODE", ""); + + + basedata = new JObject(); + //结算组织 + JObject fSettleOrgId = new JObject(); + fSettleOrgId.Add("FNumber", mrapp[0].FPURCHASEORGIDNumber); + basedata.Add("FSettleOrgId", fSettleOrgId); + //结算币别 + JObject fSettleCurrId = new JObject(); + fSettleCurrId.Add("FNumber", "PRE001"); + basedata.Add("FSettleCurrId", fSettleCurrId); + + model.Add("FPURMRBFIN", basedata); + + + ////退料类型 + //model.Add("FMRTYPE", "B"); + + ////退料方式 + //model.Add("FMRMODE","A"); + + ////补料方式 + //model.Add("FREPLENISHMODE", "B"); + + ////货主类型 + //model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //model.Add("FOwnerIdHead", basedata); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FPURMRBENTRY"; + model.Add(entityKey, entryRows); + + foreach (var row in outStock.outboundConfirmLines) + { + //查询指定退料申请单明细行 + dynamic mrappDet = BillQueryService.MrappBillQuery("FBillNo='" + outStock.outboundNo + "' and FEntity_FSEQ=" + row.lineNo + ""); + + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + //entryRow.Add("FEntryID", 0); + + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", mrappDet[0].FMATERIALIDNumber); + entryRow.Add("FMaterialId", basedata); + + // 实退数量 + entryRow.Add("FRMREALQTY", row.qty); + + + //// 库存单位(FUnitId):基础资料 + //basedata = new JObject(); + //basedata.Add("FNumber", mrappDet[0].FUnitIDNumber); + //entryRow.Add("FUnitID", basedata); + + ////库存状态 + //basedata = new JObject(); + //basedata.Add("FNumber", "KCZT01_SYS"); + //entryRow.Add("FSTOCKSTATUSID", basedata); + + + + //仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(outStock.whCode)); + entryRow.Add("FStockId", basedata); + + ////货主类型 + //entryRow.Add("FOWNERTYPEID", "BD_OwnerOrg"); + ////货主 + //basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //entryRow.Add("FOWNERID", basedata); + + //订单单号 + entryRow.Add("FORDERNO", mrappDet[0].FORDERNO); + //采购订单分录内码 + entryRow.Add("FPOORDERENTRYID", mrappDet[0].FPOORDERENTRYID); + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与采购入库单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSRCBillTypeId", "PUR_MRAPP"); + entryRow.Add("FSRCBillNo", mrappDet[0].FBillNo); + entryRow.Add("FSRCSeq", mrappDet[0].FEntity_FSEQ); + + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "PUR_MRAPP-PUR_MRB"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_PUR_MRAPPENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, mrappDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, mrappDet[0].FEntity_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.qty); + + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.qty); + + #region 处理SN + if (row.sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + + #endregion + + #region 分步式调拨出库 + + /// + /// 分步式调拨出库 + /// + /// + /// + public static BillOutput TRANSFEROUT(OutParameter parameter) + { + var billOutput = new BillOutput(); + try + { + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取调拨申请 + dynamic transferout = BillQueryService.TransferApplyBillQuery("FBillNo='" + parameter.outboundNo + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = STK_TRANSFEROUT(transferout, parameter); + + string saveJson = invokeHelper.Save("STK_TRANSFEROUT", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + + } + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + + } + + return billOutput; + } + + /// + /// 调出 + /// + /// + /// + /// + private static JObject STK_TRANSFEROUT(dynamic transferout, OutParameter outStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据编号 + model.Add("FBillNo", ""); + //UUID + model.Add("FUUID", outStock.uuid); + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNumber", "FBDC01_SYS"); + model.Add("FBillTypeID", basedata); + + //调出货主 + basedata = new JObject(); + basedata.Add("FNumber", transferout[0].FAPPORGIDNumber);// outStock.owner + model.Add("FOwnerIdHead", basedata); + //调入货主 + basedata = new JObject(); + basedata.Add("FNumber", transferout[0].FAPPORGIDNumber); //outStock.owner + model.Add("FOwnerInIdHead", basedata); + //调入组织 + basedata = new JObject(); + basedata.Add("FNumber", transferout[0].FAPPORGIDNumber); + model.Add("FStockOrgID", basedata); + //调出组织 + basedata = new JObject(); + basedata.Add("FNumber", transferout[0].FAPPORGIDNumber); + model.Add("FStockInOrgID", basedata); + + + //日期 + model.Add("FDate", outStock.outboundTime); + + ////调出货主类型 + //model.Add("FOwnerTypeIdHead", "BD_OwnerOrg"); + + ////调拨类型 + //model.Add("FTransferBizType", "InnerOrgTransfer"); + ////调拨方向 + //model.Add("FTransferDirect", "GENERAL"); + ////调入货主类型 + //model.Add("FOwnerTypeInIdHead", "BD_OwnerOrg"); + + + + + + + ////业务类型 + //model.Add("FBizType", "NORMAL"); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FSTKTRSOUTENTRY"; + model.Add(entityKey, entryRows); + + foreach (var row in outStock.outboundConfirmLines) + { + //查询指定调拨申请单明细行 + dynamic applyDet = BillQueryService.TransferApplyBillQuery("FBillNo='" + outStock.outboundNo + "' and FEntity_FSEQ=" + row.lineNo + ""); + + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + // entryRow.Add("FEntryID", 0); + + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", applyDet[0].FMATERIALIDNumber); + entryRow.Add("FMaterialId", basedata); + + // 调出数量 + entryRow.Add("FQty", row.qty); + + //调出仓库 + basedata = new JObject(); + basedata.Add("FNumber", WarehouseMapper.GetFNumber(outStock.whCode)); + entryRow.Add("FSrcStockID", basedata); + //调入仓库 + basedata = new JObject(); + basedata.Add("FNumber", applyDet[0].FStockInIdNumber); + entryRow.Add("FDestStockID", basedata); + + + //basedata = new JObject(); + //basedata.Add("FNumber", applyDet[0].FMATERIALIDNumber); + //entryRow.Add("FDestMaterialID", basedata); + + //// 库存单位(FUnitId):基础资料 + //basedata = new JObject(); + //basedata.Add("FNumber", applyDet[0].FUNITIDNumber); + //entryRow.Add("FUnitID", basedata); + + ////库存状态 + //basedata = new JObject(); + //basedata.Add("FNumber", "KCZT01_SYS"); + //entryRow.Add("FSTOCKSTATUSID", basedata); + + + + + + ////调出货主类型 + //entryRow.Add("FOwnerTypeID", "BD_OwnerOrg"); + ////调出货主 + //basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //entryRow.Add("FOwnerID", basedata); + + ////调入货主类型 + //entryRow.Add("FOwnerTypeInID", "BD_OwnerOrg"); + + ////调入货主 + //basedata = new JObject(); + //basedata.Add("FNumber", outStock.owner); + //entryRow.Add("FOwnerInID", basedata); + + // 创建与源单之间的关联关系,以支持上查与反写源单 + // 创建与采购入库单之间的关联关系 + // 源单类型、源单编号 + entryRow.Add("FSrcBillTypeId", "STK_TRANSFERAPPLY"); + entryRow.Add("FSrcBillNo", applyDet[0].FBillNo); + entryRow.Add("FSRCRowId", applyDet[0].FEntity_FEntryId); + // 创建Link行集合 + JArray linkRows = new JArray(); + + // 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link + string linkEntityKey = string.Format("{0}_Link", "FSTKTSTKRANSFEROUTENTRY"); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "STK_TRANSFERAPPLY-STK_TRANSFEROUT"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_STK_STKTRANSFERAPPENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, applyDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, applyDet[0].FEntity_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.qty); + + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.qty); + + #region 处理SN + if (row.sns.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.sns) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + + #endregion + + #region 2C销售出库 + /// + /// 2C销售出库 + /// + /// + /// + public static BillOutput OutStock2c(OutB2CParameter parameter) + { + var billOutput = new BillOutput(); + try + { + string inJson = JsonConvert.SerializeObject(parameter); + + JObject strJson = new JObject(); + InvokeHelper invokeHelper = new InvokeHelper(); + //获取发货通知单 + List delivery = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + parameter.outBoundConfirm[0].orderCode + "'"); + + string result = invokeHelper.Login(); + var iResult = JObject.Parse(result)["LoginResultType"].Value(); + if (iResult == 1 || iResult == -5) + { + string cookie = JObject.Parse(result)["KDSVCSessionId"].Value(); + var save = SAL_OUTSTOCK2c(delivery, parameter); + + string saveJson = invokeHelper.Save("SAL_OUTSTOCK", save.ToString(), cookie); + + Root root = JsonConvert.DeserializeObject(saveJson); + + //保存成功 + if (root.Result.ResponseStatus.IsSuccess) + { + billOutput = new BillOutput + { + result = 1, + errorCode = "", + errorMsg = root.Result.ResponseStatus.SuccessEntitys[0].Number + }; + } + else + { + string errorMessage = root.Result.ResponseStatus.Errors[0].Message; + + // 判断错误信息是否包含 "冲突" + if (errorMessage.Contains("冲突") || errorMessage.Contains("死锁") || errorMessage.Contains("牺牲")) + { + Thread.Sleep(10000); // 延迟 10 秒 + } + + billOutput = new BillOutput + { + result = 0, + errorCode = root.Result.ResponseStatus.ErrorCode.ToString(), + errorMsg = root.Result.ResponseStatus.Errors[0].Message + }; + } + + + } + } + catch (Exception ex) + { + billOutput = new BillOutput + { + result = 0, + errorCode = "999", + errorMsg = ex.Message + }; + } + + return billOutput; + } + + + /// + /// 出库 + /// + /// + /// + /// + public static JObject SAL_OUTSTOCK2c(List delivery, OutB2CParameter outStock) + { + JObject jsonRoot = new JObject(); + // Creator: 创建用户 + jsonRoot.Add("Creator", "Demo"); + //jsonRoot.Add("NeedUpDateFields", new JArray("")); + jsonRoot.Add("IsAutoAdjustField", true); + jsonRoot.Add("IsAutoSubmitAndAudit", true); //是否自动审核 + JObject model = new JObject(); + jsonRoot.Add("Model", model); + //model.Add("FID", 0); + + //单据类型 + JObject basedata = new JObject(); + basedata.Add("FNumber", "XSCKD01_SYS"); + model.Add("FBillTypeID", basedata); + + //单据编号 + model.Add("FBillNo", ""); + //日期 + model.Add("FDate", outStock.outBoundConfirm[0].outboundTime); + //是否WMS + model.Add("FIsWMS", true); + //UUID + //model.Add("FUUID", outStock.uuid); + + //销售组织 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + model.Add("FSaleOrgId", basedata); + + //客户 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + model.Add("FCustomerID", basedata); + + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + model.Add("FReceiverID", basedata); + + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + model.Add("FSettleId", basedata); + + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FCustomerIDNumber); + model.Add("FPayerID", basedata); + + //发货组织 + basedata = new JObject(); + basedata.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + model.Add("FStockOrgId", basedata); + + //业务类型 + model.Add("FBusinessType", "NORMAL"); + + //货主类型 + //model.Add("FOwnerTypeIdHead", shipments.OwnerTypeCode); + //货主 + basedata = new JObject(); + basedata.Add("FNumber", outStock.outBoundConfirm[0].outBoundLineConfirm[0].ownerCode); + model.Add("FOwnerIdHead", basedata); + + basedata = new JObject(); + //结算组织 + JObject fSettleOrgId = new JObject(); + fSettleOrgId.Add("FNumber", delivery[0].FDeliveryOrgIDNumber); + basedata.Add("FSettleOrgID", fSettleOrgId); + + + ////结算币别 + //JObject fSettleCurrId = new JObject(); + //fSettleCurrId.Add("FNumber", shipments.SettleCurrCode); + //basedata.Add("FSettleCurrId", fSettleCurrId); + //// 汇率类型(FExchangeTypeId):基础资料 + //JObject fExchangeTypeId = new JObject(); + //fExchangeTypeId.Add("FNumber", shipments.ExchangeTypeCode); + //basedata.Add("FExchangeTypeId", fExchangeTypeId); + //// 本位币(FLocalCurrId):基础资料 + //JObject fLocalCurrId = new JObject(); + //fLocalCurrId.Add("FNumber", shipments.LocalCurrCode); + //basedata.Add("FLocalCurrID", fLocalCurrId); + //// 汇率 + ////basedata.Add("FExchangeRate", shipments.ExchangeRate); + ////model.Add("SAL_OUTSTOCK__SubHeadEntity", basedata); + + // 开始构建单据体参数:集合参数JArray + JArray entryRows = new JArray(); + // 把单据体行集合,添加到model中,以单据体Key为标识 + string entityKey = "FEntity"; + model.Add(entityKey, entryRows); + + foreach (var row in outStock.outBoundConfirm[0].outBoundLineConfirm) + { + //查询指定发货通知单明细行 + List deliveryDet = BillQueryService.DeliveryNoticeBillQuery("FBillNo='" + outStock.outBoundConfirm[0].orderCode + "' and FEntity_FSEQ=" + row.lineNo + ""); + + // 添加新行,把新行加入到单据体行集合 + JObject entryRow = new JObject(); + entryRows.Add(entryRow); + + // 给新行,设置关键字段值 + // 单据体主键:必须填写,系统据此判断是新增还是修改行 + entryRow.Add("FEntryID", 0); + + //物料(FMaterialId):基础资料,填写编码 + basedata = new JObject(); + basedata.Add("FNumber", deliveryDet[0].FMaterialIdNumber); + entryRow.Add("FMaterialId", basedata); + + // 库存单位(FUnitId):基础资料 + basedata = new JObject(); + basedata.Add("FNumber", deliveryDet[0].FUnitIdFNumber); + entryRow.Add("FUnitId", basedata); + + ////计价单位 + //basedata = new JObject(); + //basedata.Add("FNumber", dtentry.Rows[j]["FPriceUnitID"].ToString()); + //entryRow.Add("FPriceUnitID", basedata); + + ////销售单位 + //basedata = new JObject(); + //basedata.Add("FNumber", dtentry.Rows[j]["FSalUnitID"].ToString()); + //entryRow.Add("FSalUnitID", basedata); + + //库存状态 + //basedata = new JObject(); + //basedata.Add("FNumber", detail.StockStatusCode); + //entryRow.Add("FSTOCKSTATUSID", basedata); + + // 应发数量 + entryRow.Add("FMustQty", row.actualQty); + // 实发数量 + entryRow.Add("FRealQty", row.actualQty); + ////单价 + //entryRow.Add("FPrice", detail.Price); + ////含税单价 + //entryRow.Add("FTaxPrice", detail.TaxPrice); + ////税率(%) + //entryRow.Add("FEntryTaxRate", detail.TaxRate); + //仓库 + basedata = new JObject(); + basedata.Add("FNumber", row.warehouseCode); + entryRow.Add("FSTOCKID", basedata); + ////货主类型 + //entryRow.Add("FOwnerTypeID", detail.OwnerTypeCode); + //货主 + basedata = new JObject(); + basedata.Add("FNumber", row.ownerCode); + entryRow.Add("FOWNERID", basedata); + + #region 关联关系 + //创建与源单之间的关联关系,以支持上查与反写源单 + // 源单类型、源单编号 + entryRow.Add("FSRCTYPE", "SAL_DELIVERYNOTICE"); + entryRow.Add("FSrcBillNo", deliveryDet[0].FBillNo); + //收料单编码_序号 + entryRow.Add("FReceiveBillno", deliveryDet[0].FEntity_FSEQ); + //收料单分录ID + entryRow.Add("FReceiveEntryId", deliveryDet[0].FEntity_FEntryId); + + // 创建Link行集合 + JArray linkRows = new JArray(); + + string linkEntityKey = string.Format("{0}_Link", entityKey); + entryRow.Add(linkEntityKey, linkRows); + + // 创建Link行: + // 如有多条源单行,则分别创建Link行记录各条源单行信息 + JObject linkRow = new JObject(); + linkRows.Add(linkRow); + + string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey); + linkRow.Add(fldRuleIdKey, "DeliveryNotice-OutStock"); + + string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey); + linkRow.Add(fldSTableNameKey, "T_SAL_DELIVERYNOTICEENTRY"); + + // FSBillId :必填,源单单据内码 + string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey); + linkRow.Add(fldSBillIdKey, deliveryDet[0].FID); + + // FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码 + string fldSIdKey = string.Format("{0}_FSId", linkEntityKey); + linkRow.Add(fldSIdKey, deliveryDet[0].FEntity_FEntryId); + + // FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来 + string fldBaseQtyOldKey = string.Format("{0}_FBaseUnitQtyOld", linkEntityKey); + linkRow.Add(fldBaseQtyOldKey, row.actualQty); + + // FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少 + string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey); + linkRow.Add(fldBaseQtyKey, row.actualQty); + + #endregion + + #region 处理SN + if (row.skuSnInfo.Count > 0) + { + JArray entrySnRows = new JArray(); + // 把SN单据体行集合,添加到model中,以单据体Key为标识 + string entitySnKey = "FSerialSubEntity"; + entryRow.Add(entitySnKey, entrySnRows); + + foreach (var sn in row.skuSnInfo) + { + JObject snbasedata = new JObject(); + snbasedata.Add("FSerialNo", sn.sn); + entrySnRows.Add(snbasedata); + } + } + #endregion + + } + + return jsonRoot; + } + #endregion + } +} diff --git a/SHK3CloudWebAPI/appsettings.json b/SHK3CloudWebAPI/appsettings.json new file mode 100644 index 0000000..5a18ab2 --- /dev/null +++ b/SHK3CloudWebAPI/appsettings.json @@ -0,0 +1,22 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + //"AllowedHosts": "*", + //"AppSettings": { + // "CloudUrl": "http://47.95.40.103/K3Cloud/", + // "KDType": "6758eb76b9ec73", + // "KDUser": "Administrator", + // "KDPwd": "1qaz2wsx" + //} + "AllowedHosts": "*", + "AppSettings": { + "CloudUrl": "http://123.56.29.156/K3Cloud/", + "KDType": "5f23ccc5efaaf0", + "KDUser": "Administrator", + "KDPwd": "1qaz2wsx" + } +}