From a8030708198bc639eeb8c48cfc691f70b72d09c2 Mon Sep 17 00:00:00 2001 From: SugarChes Date: Tue, 11 Aug 2026 14:18:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9C=E6=9C=9B=E4=B8=8A=E4=BC=A0=EF=BC=8C?= =?UTF-8?q?=E4=B8=AA=E7=A8=8E=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 插件库/Lskj.PubBomImport/FrmProgress.cs | 8 +- 插件库/Lskj.QueryEssentialInfo/FrmMain.cs | 72 ++++++--- .../Lskj.QueryEssentialInfo/QueryApiUtil.cs | 137 +++++++++++++++++- 3 files changed, 192 insertions(+), 25 deletions(-) diff --git a/插件库/Lskj.PubBomImport/FrmProgress.cs b/插件库/Lskj.PubBomImport/FrmProgress.cs index 286c9ed..dddb428 100644 --- a/插件库/Lskj.PubBomImport/FrmProgress.cs +++ b/插件库/Lskj.PubBomImport/FrmProgress.cs @@ -3960,11 +3960,9 @@ namespace Lskj.PubBomImport { long totalSize = fileInfo.Length; // Web 前端上传器同样提示:经过防火墙的环境需要将分片 - // 从 1MB 降到约 0.3MB。仅大文件启用安全分片,避免影响 - // 现有小文件上传速度。 - int pageSize = totalSize > 4L * 1024 * 1024 - ? 320 * 1024 - : 1 * 1024 * 1024; + // 从 1MB 降到约 0.3MB。所有文件统一使用安全分片,兼容 + // 内网网关、透明代理及防火墙对 multipart 请求体的限制。 + int pageSize = 320 * 1024; long position = 0; int confirm = 1; int encode = 4; diff --git a/插件库/Lskj.QueryEssentialInfo/FrmMain.cs b/插件库/Lskj.QueryEssentialInfo/FrmMain.cs index 5fa5cc3..22a53f7 100644 --- a/插件库/Lskj.QueryEssentialInfo/FrmMain.cs +++ b/插件库/Lskj.QueryEssentialInfo/FrmMain.cs @@ -43,6 +43,7 @@ namespace Lskj.QueryEssentialInfo progressBarCurrent.Value = 0; QueryApiUtil.mainRow = BaseImpl.GetDataRowResult(Model.MainSourceSql); QueryApiUtil.detailTab = BaseImpl.GetDataTableResult(Model.DetailSourceSql); + QueryApiUtil.EssentialTabExists(); Task.Factory.StartNew(() => { try @@ -74,12 +75,27 @@ namespace Lskj.QueryEssentialInfo break; case "11": RYJQuery(); - GSSBQuery(); + GSSBSubmit(); Invoke(new Action(() => { MessageUtil.Show("个税申报完成"); })); break; + case "-11": + RYJQuery(); + GSSBInvalidSubmit(); + Invoke(new Action(() => + { + MessageUtil.Show("个税申报作废完成"); + })); + break; + case "111": + GSSBQuery(); + Invoke(new Action(() => + { + MessageUtil.Show("个税申报查询成功"); + })); + break; case "2": RYJQuery(); YLJQuery(); @@ -647,7 +663,7 @@ namespace Lskj.QueryEssentialInfo /// /// 个税申报 /// - private void GSSBQuery() + private void GSSBSubmit() { QueryApiUtil.detailTab = BaseImpl.GetDataTableResult(Model.DetailSourceSql); var rowsEnumerable = QueryApiUtil.detailTab.AsEnumerable(); @@ -662,31 +678,53 @@ namespace Lskj.QueryEssentialInfo { throw new Exception($"个税申报失败\r\n{submitMsg}"); } + Invoke(new Action(() => + { + this.Close(); + })); + } + /// + /// 个税申报作废 + /// + private void GSSBInvalidSubmit() + { + QueryApiUtil.detailTab = BaseImpl.GetDataTableResult(Model.DetailSourceSql); + var rowsEnumerable = QueryApiUtil.detailTab.AsEnumerable(); + int bsFaildCount = rowsEnumerable.Where(n => !(n["p_emp_addTag"] + "").Equals("1")).Count(); + if (bsFaildCount > 0) + { + throw new Exception($"人员未全部报送成功,请稍后再试或联系管理员"); + } + SetProcessMsg($"正在作废个税申报..."); + string submitCode = QueryApiUtil.InvalidSubmit(out string submitResult, out string submitMsg); + if (!submitCode.Equals("0")) + { + throw new Exception($"个税申报作废失败\r\n{submitMsg}"); + } + Invoke(new Action(() => + { + this.Close(); + })); + } + /// + /// 个税申报查询 + /// + private void GSSBQuery() + { SetProcessMsg($"正在查询个税申报结果..."); string submitQueryCode = "-99"; string submitQueryResult = ""; string submitQueryMsg = ""; - for (int i = 0; i < 5; i++) - { - submitQueryResult = ""; - submitQueryMsg = ""; - submitQueryCode = QueryApiUtil.SubmitQuery(out submitQueryResult, out submitQueryMsg); - if (submitQueryCode.Equals("0")) - { - break; - } - else - { - Thread.Sleep(1000); - } - } + submitQueryResult = ""; + submitQueryMsg = ""; + submitQueryCode = QueryApiUtil.SubmitQuery(out submitQueryResult, out submitQueryMsg); if (!submitQueryCode.Equals("0")) { throw new Exception($"个税申报失败\r\n{submitQueryMsg}"); } else { - + throw new Exception($"个税申报成功\r\n{submitQueryMsg}"); } Invoke(new Action(() => { diff --git a/插件库/Lskj.QueryEssentialInfo/QueryApiUtil.cs b/插件库/Lskj.QueryEssentialInfo/QueryApiUtil.cs index 79fb7e6..6f01704 100644 --- a/插件库/Lskj.QueryEssentialInfo/QueryApiUtil.cs +++ b/插件库/Lskj.QueryEssentialInfo/QueryApiUtil.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; +using System.Data.SqlClient; using System.Globalization; using System.IO; using System.Linq; @@ -427,8 +428,16 @@ namespace Lskj.QueryEssentialInfo bizDataJObject.Add("idNumber", detailRow.Table.Columns.Contains("idNumber") ? detailRow["idNumber"] + "" : ""); bizDataJObject.Add("sex", detailRow.Table.Columns.Contains("sex") ? detailRow["sex"] + "" : ""); bizDataJObject.Add("birthday", detailRow.Table.Columns.Contains("birthday") ? detailRow["birthday"] + "" : ""); - bizDataJObject.Add("employType", detailRow.Table.Columns.Contains("employType") ? detailRow["employType"] + "" : ""); - bizDataJObject.Add("employedDate", detailRow.Table.Columns.Contains("employedDate") ? detailRow["employedDate"] + "" : ""); + string employType = detailRow.Table.Columns.Contains("employType") ? detailRow["employType"] + "" : ""; + bizDataJObject.Add("employType", employType); + if (employType.Equals("雇员")) + { + bizDataJObject.Add("employedDate", detailRow.Table.Columns.Contains("employedDate") ? detailRow["employedDate"] + "" : ""); + } + else if (employType.Equals("其他")) + { + bizDataJObject.Add("taxRelatedMatters", detailRow.Table.Columns.Contains("taxRelatedMatters") ? detailRow["taxRelatedMatters"] + "" : ""); + } bizDataJObject.Add("phoneNumber", detailRow.Table.Columns.Contains("phoneNumber") ? detailRow["phoneNumber"] + "" : ""); bizDataJObject.Add("isDeductExpense", detailRow.Table.Columns.Contains("isDeductExpense") ? detailRow["isDeductExpense"] + "" : ""); bizlistJArray.Add(bizDataJObject); @@ -436,6 +445,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("bizDataList", bizlistJArray); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("同步人员", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -478,6 +488,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("operator", mainRow["operator"] + ""); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("查询人员报送情况", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -533,6 +544,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("idNumberList", idNumberjArray); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("同步专项附加", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -588,6 +600,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("idNumberList", idNumberjArray); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("查询专项附加", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -648,6 +661,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("idNumberList", idNumberjArray); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("发起养老金查询", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -705,6 +719,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("idNumberList", idNumberjArray); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("获取养老金明细", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -752,6 +767,55 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("skssqZ", mainRow["skssqZ"] + ""); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("个税申报", JsonConvert.SerializeObject(pmsJObject), resultRead); + if (webResponse != null && !string.IsNullOrEmpty(resultRead)) + { + JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); + code = resultJObject["code"] + ""; + resultMsg = resultJObject["msg"] + ""; + } + } + catch (Exception) + { + throw; + } + return code; + } + /// + /// 个税申报作废 + /// + /// + /// + /// + public static string InvalidSubmit(out string resultRead, out string resultMsg) + { + string code = "-9999"; + resultRead = ""; + resultMsg = ""; + try + { + string url = $"{urlStart}/web/sbmk/personal-tax/api/v1/invalid/submit"; + HttpTools.setting("application/json", null, null, HttpTools.Encode.UTF8); + Dictionary headerDic = new Dictionary(); + DateTime utcNow = DateTime.UtcNow; + string date = utcNow.ToString("r", CultureInfo.InvariantCulture); + string host = "api.baiwangjs.com"; + string x_htjs_nonce = Guid.NewGuid().ToString().ToLower(); + string x_htjs_ua = "1.8.0_181 64 bit, sdk-ver=1.0.0"; + headerDic.Add("Date", DateTime.UtcNow.ToString()); + headerDic.Add("host", host); + headerDic.Add("x-htjs-nonce", x_htjs_nonce); + headerDic.Add("x-htjs-ua", x_htjs_ua); + headerDic.Add("Authorization", $"{GetAuthorization(date, host, x_htjs_nonce, x_htjs_ua)}"); + JObject pmsJObject = new JObject(); + pmsJObject.Add("busiTypeCode", mainRow["busiTypeCode"] + ""); + pmsJObject.Add("qysh", mainRow["qysh"] + ""); + pmsJObject.Add("operator", mainRow["operator"] + ""); + pmsJObject.Add("skssqQ", mainRow["skssqQ"] + ""); + pmsJObject.Add("skssqZ", mainRow["skssqZ"] + ""); + HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); + resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("个税申报作废", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -796,6 +860,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("skssqZ", mainRow["skssqZ"] + ""); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("个税申报查询", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -873,7 +938,7 @@ namespace Lskj.QueryEssentialInfo } else if (typeCode.Equals("101060100010500")) { - + externFieldsJObject.Add("sdxmdm", detailRow["sdxmdm"] + ""); } incomeDataJObject.Add("externFields", externFieldsJObject); incomeDataListJArry.Add(incomeDataJObject); @@ -885,6 +950,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("bizDataList", bizDataListJArry); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("同步收入", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -976,9 +1042,11 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("operator", mainRow["operator"] + ""); pmsJObject.Add("skssqQ", mainRow["skssqQ"] + ""); pmsJObject.Add("skssqZ", mainRow["skssqZ"] + ""); + pmsJObject.Add("incomeTypeCode", mainRow["incomeTypeCode"] + ""); pmsJObject.Add("nsrlxDm", nsrlxdm); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("计算税款", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -1026,6 +1094,7 @@ namespace Lskj.QueryEssentialInfo pmsJObject.Add("nsrlxDm", nsrlxdm); HttpWebResponse webResponse = HttpTools.Post(url, JsonConvert.SerializeObject(pmsJObject), null, headerDic, HttpTools.Method.POST); resultRead = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8).ReadToEnd(); + WriteLogInfo("获取税款计算结果", JsonConvert.SerializeObject(pmsJObject), resultRead); if (webResponse != null && !string.IsNullOrEmpty(resultRead)) { JObject resultJObject = (JObject)JsonConvert.DeserializeObject(resultRead); @@ -1117,5 +1186,67 @@ namespace Lskj.QueryEssentialInfo } return isResult; } + /// + /// 判断表是否存在 + /// + public static void EssentialTabExists() + { + string sql = @"IF OBJECT_ID(N'[dbo].[p_EssentialLogTab]', N'U') IS NULL + BEGIN + CREATE TABLE [dbo].[p_EssentialLogTab] + ( + [Id] INT IDENTITY(1,1) NOT NULL, + [title] NVARCHAR(255) NULL, + [data] NVARCHAR(MAX) NULL, + [datetime] DATETIME NOT NULL DEFAULT(GETDATE()), + [rtnmsg] NVARCHAR(MAX) NULL, + + CONSTRAINT [PK_p_EssentialLogTab] PRIMARY KEY CLUSTERED ([Id] ASC) + ); + END"; + SqlHelper.ExecuteNonQuery(sql); + } + /// + /// 写入日志信息 + /// + public static void WriteLogInfo(string title, string data, string rtnmsg) + { + try + { + string sql = @" + INSERT INTO [dbo].[p_EssentialLogTab] + ( + [title], + [data], + [rtnmsg] + ) + VALUES + ( + @title, + @data, + @rtnmsg + );"; + + SqlParameter[] parameters = + { + new SqlParameter("@title", SqlDbType.NVarChar, 255) + { + Value = title + }, + new SqlParameter("@data", SqlDbType.NVarChar, -1) + { + Value = data.Replace("'","''") + }, + new SqlParameter("@rtnmsg", SqlDbType.NVarChar, -1) + { + Value = rtnmsg.Replace("'","''") + } + }; + SqlHelper.ExecuteNonQuery(CommandType.Text, sql, parameters); + } + catch (Exception) + { + } + } } }