添加项目文件。
This commit is contained in:
535
SAL_OUTSTOCK/IssueAnInvoiceFormPlugIn.cs
Normal file
535
SAL_OUTSTOCK/IssueAnInvoiceFormPlugIn.cs
Normal file
@@ -0,0 +1,535 @@
|
||||
using Kingdee.BOS.Core.DynamicForm.PlugIn;
|
||||
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
|
||||
using Kingdee.BOS.Util;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SAL_OUTSTOCK.Utils;
|
||||
using SAL_OUTSTOCK.Request;
|
||||
using static SAL_OUTSTOCK.Request.GP_FPKJ;
|
||||
using static SAL_OUTSTOCK.Request.BaseRequest;
|
||||
using Kingdee.BOS.Orm.DataEntity;
|
||||
using System.IO;
|
||||
using System.Net.Security;
|
||||
using System.Net;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using Kingdee.BOS.Core.DynamicForm;
|
||||
using SAL_OUTSTOCK.Response;
|
||||
using Kingdee.BOS.App.Data;
|
||||
using ExtensionMethods;
|
||||
|
||||
namespace SAL_OUTSTOCK
|
||||
{
|
||||
[Description("销售出库单-表单插件-发票开具"), HotUpdate]
|
||||
public class IssueAnInvoiceFormPlugIn : AbstractDynamicFormPlugIn
|
||||
{
|
||||
private bool _doingButtonFlag = false;
|
||||
public override void BarItemClick(BarItemClickEventArgs e)
|
||||
{
|
||||
base.BarItemClick(e);
|
||||
|
||||
//数电普票
|
||||
if (e.BarItemKey.Equals("tbElectronic030", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ToExecuteRequest("030");
|
||||
}
|
||||
|
||||
//数电专票
|
||||
if (e.BarItemKey.Equals("tbElectronic032", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ToExecuteRequest("032");
|
||||
}
|
||||
|
||||
//增值税专票(纸质)
|
||||
if (e.BarItemKey.Equals("tbPaper004", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ToExecuteRequest("004");
|
||||
}
|
||||
|
||||
//增值税普票(纸质)
|
||||
if (e.BarItemKey.Equals("tbPaper007", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ToExecuteRequest("007");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开始执行
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
public void ToExecuteRequest(string FPLXDM)
|
||||
{
|
||||
if (!_doingButtonFlag)
|
||||
{
|
||||
var org = this.View.Model.GetValue("FStockOrgId") as DynamicObject;
|
||||
if (org != null && org["Id"].Long2Int() == 101542)
|
||||
{
|
||||
_doingButtonFlag = true;
|
||||
|
||||
long orgId = org["Id"].Long2Int();
|
||||
//orgId = this.Context.CurrentOrganizationInfo.ID;
|
||||
SendRequest(FPLXDM, orgId);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.View.ShowMessage("此功能未开放!如有需要请联系管理员!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置content报文明文信息
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM">发票类型</param>
|
||||
/// <param name="invoiceInfo">开票信息</param>
|
||||
/// <param name="errMsg">返回信息</param>
|
||||
/// <returns></returns>
|
||||
public GP_FPKJ SetRequestCommonFPKJ(string FPLXDM, DynamicObject invoiceInfo, ref StringBuilder errMsg)
|
||||
{
|
||||
var headKey = "FBillHead";
|
||||
var localeId = 2052;
|
||||
|
||||
//客户信息
|
||||
var cust = this.View.Model.GetValue("FCustomerID") as DynamicObject;
|
||||
var multiLanguage = cust["MultiLanguageText"] as DynamicObjectCollection;
|
||||
|
||||
//申领单位
|
||||
var applicant = this.View.Model.GetValue("F_QNV_Base1") as DynamicObject;
|
||||
var deptMulti = applicant["MultiLanguageText"] as DynamicObjectCollection;
|
||||
|
||||
var headEntity = this.View.BusinessInfo.GetEntity(headKey);
|
||||
var entity = this.View.BusinessInfo.GetEntity("FEntity");
|
||||
var subHeadEntity = this.View.BusinessInfo.GetEntity("SubHeadEntity");
|
||||
|
||||
var entrys = this.View.Model.GetEntityDataObject(entity);
|
||||
var sHeadInfo = this.View.Model.GetEntityDataObject(subHeadEntity, 0);
|
||||
|
||||
var result = new GP_FPKJ();
|
||||
var fpkj = result.FPKJ = new REQUEST_COMMON_FPKJ();
|
||||
errMsg = new StringBuilder();
|
||||
#region 针对非农产收购发票
|
||||
|
||||
#region 基础信息
|
||||
|
||||
fpkj.FPQQLSH = $"{invoiceInfo["FFIRMCODE"]}{DateTime.Now.ToString("yyyyMMddHHmm")}{invoiceInfo["FSERIALNUMBER"]}";
|
||||
fpkj.FPLXDM = FPLXDM;
|
||||
|
||||
if (FPLXDM.Equals("030") || FPLXDM.Equals("032"))
|
||||
fpkj.SBLX = "6";
|
||||
else if (FPLXDM.Equals("007") || FPLXDM.Equals("004"))
|
||||
fpkj.SBLX = "4";
|
||||
|
||||
//是否纸质发票
|
||||
bool isPaper = fpkj.SBLX == "4";
|
||||
|
||||
if (isPaper)
|
||||
fpkj.KPZDDM = "cszp";
|
||||
|
||||
fpkj.KPLX = "0";
|
||||
fpkj.ZSFS = "0";
|
||||
|
||||
fpkj.JSHJ = sHeadInfo["BillAllAmount"].ToDecimalR().ToString();
|
||||
fpkj.HJJE = sHeadInfo["BillAmount"].ToDecimalR().ToString();
|
||||
fpkj.HJSE = sHeadInfo["BillTaxAmount"].ToDecimalR().ToString();
|
||||
|
||||
#endregion 基础信息
|
||||
|
||||
#region 销售方
|
||||
|
||||
fpkj.XSF_NSRSBH = invoiceInfo["FTAXCODE"].ToString();
|
||||
fpkj.XSF_MC = invoiceInfo["FINVOICETITLE"].ToString();
|
||||
fpkj.XSF_DZDH = $"{invoiceInfo["FINVOICEADDRESS"]} {invoiceInfo["FINVOICETEL"]}";
|
||||
fpkj.XSF_YHZH = $"{invoiceInfo["FINVOICEBANKNAME"]} {invoiceInfo["FINVOICEBANKACCOUNT"]}";
|
||||
|
||||
//fpkj.SKR = "收款人";
|
||||
//fpkj.FHR = "复核人";
|
||||
fpkj.KPR = invoiceInfo["FDRAWER"].ToString();
|
||||
|
||||
fpkj.BZ = deptMulti.FirstOrDefault(w => w["LocaleId"].Long2Int() == localeId)["Name"].ToString();
|
||||
|
||||
#endregion 销售方
|
||||
|
||||
#region 购买方(客户信息)
|
||||
|
||||
string cName = cust["INVOICETITLE"].IsNullOrEmpty() ? "" : cust["INVOICETITLE"].ToString();
|
||||
if (cName == string.Empty)
|
||||
cName = multiLanguage.FirstOrDefault(w => w["LocaleId"].Long2Int() == localeId)["Name"].ToString();
|
||||
|
||||
var cAddress = cust["INVOICEADDRESS"].IsNullOrEmpty() ? (cust["ADDRESS"].IsNullOrEmpty() ? "" : cust["ADDRESS"]) : cust["INVOICEADDRESS"];
|
||||
var cTel = cust["INVOICETEL"].IsNullOrEmpty() ? (cust["TEL"].IsNullOrEmpty() ? "" : cust["TEL"]) : cust["INVOICETEL"];
|
||||
fpkj.GMF_MC = cName;
|
||||
//纳税人识别号/统一社会信用代码
|
||||
fpkj.GMF_NSRSBH = (cust["SOCIALCRECODE"].IsNullOrEmpty() ? (cust["FTAXREGISTERCODE"].IsNullOrEmpty() ? "" : cust["FTAXREGISTERCODE"]) : cust["SOCIALCRECODE"]).ToString();
|
||||
fpkj.GMF_DZDH = $"{cAddress} {cTel}";
|
||||
fpkj.GMF_YHZH = $"{cust["INVOICEBANKNAME"]} {cust["INVOICEBANKACCOUNT"]}";
|
||||
|
||||
if (fpkj.GMF_MC == string.Empty)
|
||||
errMsg.AppendLine("购买方(客户信息)名称不能为空!");
|
||||
|
||||
if (fpkj.GMF_NSRSBH == string.Empty)
|
||||
errMsg.AppendLine("购买方(客户信息)统一社会信用代码或纳税人识别号不能为空!");
|
||||
|
||||
if (isPaper && fpkj.GMF_DZDH == string.Empty)
|
||||
errMsg.AppendLine("开具纸质发票时,购买方(客户信息)电话地址不完整!请检查是否缺少地址信息,电话信息");
|
||||
|
||||
if (isPaper && fpkj.GMF_YHZH == string.Empty)
|
||||
errMsg.AppendLine("开具纸质发票时,购买方(客户信息)银行信息不完整!请检查是否缺少银行信息,银行账号信息");
|
||||
|
||||
#endregion 购买方
|
||||
|
||||
#region 明细信息
|
||||
var details = fpkj.COMMON_FPKJ_XMXX = new List<COMMON_FPKJ_XMXX>();
|
||||
if (!entrys.IsNullOrEmpty() && entrys.Any())
|
||||
{
|
||||
var DataInfo = this.Model.DataObject;
|
||||
var fid = DataInfo["Id"].Long2Int();
|
||||
var checkTaxCategroupSql = $@"
|
||||
SELECT
|
||||
a.FMASTERID,
|
||||
a.FNUMBER,
|
||||
a.FMATERIALID ,
|
||||
b.FTAXCATEGORYCODEID ,
|
||||
c.FTAXCODE ,
|
||||
d.FENTRYID
|
||||
FROM
|
||||
T_BD_MATERIAL a
|
||||
LEFT JOIN T_BD_MATERIALSALE b ON a.FMATERIALID = b.FMATERIALID
|
||||
INNER JOIN T_IV_GTTAXCODE c ON b.FTAXCATEGORYCODEID = c.FID
|
||||
INNER JOIN T_SAL_OUTSTOCKENTRY d ON d.FMATERIALID = a.FMATERIALID
|
||||
WHERE
|
||||
c.FDOCUMENTSTATUS = 'C'
|
||||
AND d.FID = {fid}";
|
||||
|
||||
var dbList = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{checkTaxCategroupSql}");
|
||||
|
||||
foreach (var entry in entrys)
|
||||
{
|
||||
var material = entry["MaterialID"] as DynamicObject;
|
||||
if (dbList == null || !dbList.Any())
|
||||
{
|
||||
errMsg.AppendLine($"物料:{material["Number"]} 缺少税收分类编码!");
|
||||
continue;
|
||||
}
|
||||
|
||||
var dbRow = dbList.FirstOrDefault(w => w["FENTRYID"].Long2Int() == entry["Id"].Long2Int());
|
||||
if (dbRow == null)
|
||||
{
|
||||
errMsg.AppendLine($"物料:{material["Number"]} 缺少税收分类编码!");
|
||||
continue;
|
||||
}
|
||||
|
||||
var materialMulti = (material["MultiLanguageText"] as DynamicObjectCollection).FirstOrDefault(w => w["LocaleId"].Long2Int() == localeId);
|
||||
var priceUnit = entry["PriceUnitId"] as DynamicObject;
|
||||
var priceUnitMulti = (priceUnit["MultiLanguageText"] as DynamicObjectCollection).FirstOrDefault(w => w["LocaleId"].Long2Int() == localeId);
|
||||
|
||||
var dPrice = entry["Price"];
|
||||
var dSalunitQty = entry["SALUNITQTY"];
|
||||
details.Add(new COMMON_FPKJ_XMXX
|
||||
{
|
||||
FPHXZ = "0",
|
||||
SPBM = dbRow["FTAXCODE"].ToString(),
|
||||
//ZXBM = material["Number"].ToString(),
|
||||
XMMC = materialMulti["Name"].ToString(),
|
||||
XMSL = dSalunitQty.ToDecimal().ToString("F6"),
|
||||
GGXH = materialMulti["Specification"].ToString(),
|
||||
DW = priceUnitMulti["Name"].ToString(),
|
||||
XMDJ = dPrice.ToDecimal().ToString("F6"),
|
||||
XMJE = entry["Amount"].ToDecimal().ToString("F2"),
|
||||
SL = (entry["TaxRate"].ToDecimal() * 0.01M).ToString("F2"),
|
||||
SE = entry["TaxAmount"].ToDecimal().ToString("F2"),
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion 明细信息
|
||||
|
||||
#endregion 针对非农产收购发票
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送报文信息处理
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
/// <returns></returns>
|
||||
public BaseRequest RequestDataHandle(string FPLXDM, long orgId, ref bool isTestUrl)
|
||||
{
|
||||
//发票开具接口Code
|
||||
string interfaceCode = "GP_FPKJ";
|
||||
|
||||
string whereSql = $" AND {((FPLXDM.Equals("007") || FPLXDM.Equals("004")) ? "FIsDeviceType4" : "FIsDeviceType6")} = 1 ";
|
||||
#region 获取对应开票信息
|
||||
var iinfoSQL = $@"
|
||||
SELECT TOP 1
|
||||
FID,
|
||||
FUSEORGID,
|
||||
FAPPID,
|
||||
FTAXCODE,
|
||||
FDRAWER,
|
||||
FINVOICEBANKNAME,
|
||||
FINVOICEBANKACCOUNT,
|
||||
FINVOICEADDRESS,
|
||||
FINVOICETEL,
|
||||
FINVOICETITLE,
|
||||
FFIRMCODE,
|
||||
FSERIALNUMBER,
|
||||
FENCRYPTIONKEY,
|
||||
FISDEFAULT,
|
||||
FISTESTINFO
|
||||
FROM
|
||||
T_BD_INVOICEINFORMATION
|
||||
WHERE
|
||||
FDOCUMENTSTATUS = 'C'
|
||||
AND FUSEORGID = {orgId} {whereSql}
|
||||
ORDER BY
|
||||
FISDEFAULT DESC , FISTESTINFO DESC ";
|
||||
|
||||
var iinfoDB = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{iinfoSQL}");
|
||||
|
||||
if (iinfoDB == null || !iinfoDB.Any())
|
||||
throw new Exception("使用组织没有配对的开票系统信息!");
|
||||
|
||||
var iiDt = iinfoDB[0];
|
||||
//是否测试数据
|
||||
isTestUrl = iiDt["FISTESTINFO"].Long2Int() == 1;
|
||||
string appId = iiDt["FAPPID"].ToString();
|
||||
string key = iiDt["FENCRYPTIONKEY"].ToString();
|
||||
|
||||
#endregion 获取对应开票信息
|
||||
|
||||
var requestBase = new BaseRequest();
|
||||
requestBase._interface = new Interface();
|
||||
var date = DateTime.Now;
|
||||
|
||||
string newDate = date.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
string newDate2 = date.ToString("yyyyMMdd");
|
||||
|
||||
string no = Guid.NewGuid().ToString("N").Substring(0, 9).ToUpper();
|
||||
//数据交换id
|
||||
string dataExchangeId = "DZFPQZ" + "DFXJ1001" + newDate2 + no;
|
||||
|
||||
requestBase._interface.globalInfo.appId = appId;
|
||||
requestBase._interface.globalInfo.interfaceCode = interfaceCode;
|
||||
requestBase._interface.globalInfo.requestTime = newDate;
|
||||
requestBase._interface.globalInfo.dataExchangeId = dataExchangeId;
|
||||
|
||||
StringBuilder errMsg = new StringBuilder();
|
||||
try
|
||||
{
|
||||
var requestCommonFPKJ = SetRequestCommonFPKJ(FPLXDM, iiDt, ref errMsg);
|
||||
|
||||
if (!errMsg.IsNullOrEmpty() && errMsg.Length > 0)
|
||||
throw new Exception(errMsg.ToString());
|
||||
|
||||
//更新对应开票信息的流水号记录
|
||||
var serialNumber = iiDt["FSERIALNUMBER"].Long2Int();
|
||||
var newSNumber = (serialNumber > 998 ? 1 : serialNumber + 1).ToString("D3");
|
||||
var updSql = $"/*dialect*/UPDATE T_BD_INVOICEINFORMATION SET FSERIALNUMBER = '{newSNumber}' WHERE FID = {iiDt["FID"]}";
|
||||
var isFlag = DBUtils.Execute(this.Context, updSql);
|
||||
|
||||
var contentBefore = JsonConvert.SerializeObject(requestCommonFPKJ);
|
||||
//发票报文加密处理处理
|
||||
string content = Base64Helper.Base64Encode(contentBefore);
|
||||
string contentSHA256 = SHA256Helper.SHA256EncryptString(content);
|
||||
|
||||
//使用加密密钥再次加密
|
||||
string contentKey = AESHepler.AesEncryptorBase64(contentSHA256, key);
|
||||
|
||||
requestBase._interface.data.content = content;
|
||||
requestBase._interface.data.contentKey = contentKey;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return requestBase;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送报文,获取结果
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
public void SendRequest(string FPLXDM, long orgId)
|
||||
{
|
||||
var result = string.Empty;
|
||||
//var jsonStr = string.Empty;
|
||||
try
|
||||
{
|
||||
var DataInfo = this.Model.DataObject;
|
||||
var fid = DataInfo["Id"].Long2Int();
|
||||
//财务信息
|
||||
var invoiveUrl = this.View.Model.GetValue("FInvoiceNumber");
|
||||
if (invoiveUrl != null && invoiveUrl.ToString().Trim().Length > 0)
|
||||
{
|
||||
this.View.ShowErrMessage($"此出库订单已经打印发票【财务信息】查看对应发票信息");
|
||||
return;
|
||||
}
|
||||
bool isTestUrl = false;
|
||||
var requestData = RequestDataHandle(FPLXDM, orgId, ref isTestUrl);
|
||||
var postData = JsonConvert.SerializeObject(requestData);
|
||||
|
||||
//jsonStr = Base64Helper.Base64Decode(requestData._interface.data.content);
|
||||
|
||||
var url = "https://dev.fapiao.com:18944/fpt-rhqz/prepose";//双向通道地址
|
||||
if (isTestUrl)
|
||||
url = "https://dev.fapiao.com:18944/fpt-rhqz/prepose";//双向通道地址-测试
|
||||
|
||||
result = DoPost(url, postData);
|
||||
|
||||
var responseData = JsonConvert.DeserializeObject<BaseRequest>(result);
|
||||
var returnStateInfo = responseData._interface.returnStateInfo;
|
||||
if (returnStateInfo != null)
|
||||
{
|
||||
if (returnStateInfo.returnCode.Equals("0000"))
|
||||
{
|
||||
this.View.ShowMessage($"报文处理成功,正在回填发票信息【财务信息】");
|
||||
var resultData = JsonConvert.DeserializeObject<ResultData>(Base64Helper.Base64Decode(responseData._interface.data.content));
|
||||
|
||||
var fpInfo = string.Empty;
|
||||
var data = resultData.DATA;
|
||||
//回填发票下载地址
|
||||
if (FPLXDM.Equals("030") || FPLXDM.Equals("032"))
|
||||
fpInfo = data.PDF_URL;
|
||||
else if (FPLXDM.Equals("007") || FPLXDM.Equals("004"))
|
||||
fpInfo = data.FP_MW;
|
||||
|
||||
this.View.Model.SetValue("FInvoiceUrl", fpInfo);
|
||||
this.View.Model.SetValue("FInvoiceNumber", data.FP_HM);
|
||||
this.View.Model.SetValue("FFPLXDM", data.FPLXDM);
|
||||
this.View.Model.SetValue("FFPQQLSH", data.FPQQLSH);
|
||||
|
||||
var updSql = $@"/*dialect*/
|
||||
UPDATE T_SAL_OUTSTOCKFIN
|
||||
SET FINVOICEURL = '{fpInfo}'
|
||||
,FFPLXDM = '{data.FPLXDM}'
|
||||
,FFPQQLSH = '{data.FPQQLSH}'
|
||||
,FINVOICENUMBER = '{data.FP_HM}'
|
||||
WHERE
|
||||
FID = {fid}";
|
||||
|
||||
//发票信息址回填到数据库
|
||||
var isFlag = DBUtils.Execute(this.Context, updSql);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception(returnStateInfo.returnMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (JsonSerializationException ex)
|
||||
{
|
||||
this.View.ShowMessage($"错误信息:{result}", MessageBoxType.Error);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
this.View.ShowErrMessage($"错误信息:{ex.Message}");
|
||||
|
||||
//IOperationResult opResult = new OperationResult();
|
||||
|
||||
//opResult.OperateResult.Add(new OperateResult()
|
||||
//{
|
||||
// Name = "信息提示",
|
||||
// Message = ex.Message,
|
||||
// SuccessStatus = false
|
||||
//});
|
||||
|
||||
//opResult.OperateResult.Add(new OperateResult()
|
||||
//{
|
||||
// Name = "信息提示",
|
||||
// Message = jsonStr,
|
||||
// SuccessStatus = false
|
||||
//});
|
||||
|
||||
|
||||
//this.View.ShowOperateResult(opResult.OperateResult);
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
_doingButtonFlag = false;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// post请求
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="postData"></param>
|
||||
/// <returns></returns>
|
||||
private static string DoPost(string url, string postData)
|
||||
{
|
||||
try
|
||||
{
|
||||
string result = string.Empty;
|
||||
|
||||
HttpWebRequest request = null;
|
||||
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
request = WebRequest.Create(url) as HttpWebRequest;
|
||||
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
|
||||
request.ProtocolVersion = HttpVersion.Version11;
|
||||
// 这里设置了协议类型。
|
||||
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2;
|
||||
request.KeepAlive = false;
|
||||
ServicePointManager.CheckCertificateRevocationList = true;
|
||||
ServicePointManager.DefaultConnectionLimit = 100;
|
||||
ServicePointManager.Expect100Continue = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
request = (HttpWebRequest)WebRequest.Create(url);
|
||||
}
|
||||
|
||||
string str1 = AppDomain.CurrentDomain.BaseDirectory;
|
||||
|
||||
//证书
|
||||
var keystorefile = str1 + @"\bin\ISSUE\testISSUE.pfx";
|
||||
var key = "123456";
|
||||
|
||||
var cer = new X509Certificate2(keystorefile, key);
|
||||
|
||||
request.ClientCertificates.Add(cer);
|
||||
request.Method = "POST"; //使用get方式发送数据
|
||||
request.ContentType = "application/json;charset=utf-8";
|
||||
|
||||
byte[] data = Encoding.UTF8.GetBytes(postData);
|
||||
Stream newStream = request.GetRequestStream();
|
||||
newStream.Write(data, 0, data.Length);
|
||||
newStream.Close();
|
||||
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
Stream stream = response.GetResponseStream();
|
||||
|
||||
using (StreamReader sr = new StreamReader(stream))
|
||||
{
|
||||
result = sr.ReadToEnd();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
|
||||
{
|
||||
if (errors == SslPolicyErrors.None)
|
||||
return true; //总是接受
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
560
SAL_OUTSTOCK/MergePrintIssueAnInvPlugIn.cs
Normal file
560
SAL_OUTSTOCK/MergePrintIssueAnInvPlugIn.cs
Normal file
@@ -0,0 +1,560 @@
|
||||
using ExtensionMethods;
|
||||
using Kingdee.BOS.App.Data;
|
||||
using Kingdee.BOS.Core.DynamicForm;
|
||||
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
|
||||
using Kingdee.BOS.Core.List.PlugIn;
|
||||
using Kingdee.BOS.Core.Validation;
|
||||
using Kingdee.BOS.Orm.DataEntity;
|
||||
using Kingdee.BOS.Util;
|
||||
using Newtonsoft.Json;
|
||||
using SAL_OUTSTOCK.Request;
|
||||
using SAL_OUTSTOCK.Response;
|
||||
using SAL_OUTSTOCK.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Text;
|
||||
using static SAL_OUTSTOCK.Request.BaseRequest;
|
||||
using static SAL_OUTSTOCK.Request.GP_FPKJ;
|
||||
|
||||
namespace SAL_OUTSTOCK
|
||||
{
|
||||
[Description("销售出库单-列表插件-发票开具合并打印"), HotUpdate]
|
||||
public class MergePrintIssueAnInvPlugIn : AbstractListPlugIn
|
||||
{
|
||||
private bool _doingButtonFlag = false;
|
||||
private IOperationResult opResult = new OperationResult();
|
||||
public override void BarItemClick(BarItemClickEventArgs e)
|
||||
{
|
||||
base.BarItemClick(e);
|
||||
|
||||
//数电普票
|
||||
if (e.BarItemKey.Equals("tbElectronic030", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
DoCheckConditions("030");
|
||||
return;
|
||||
}
|
||||
|
||||
//数电专票
|
||||
if (e.BarItemKey.Equals("tbElectronic032", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
DoCheckConditions("032");
|
||||
return;
|
||||
}
|
||||
|
||||
//增值税专票(纸质)
|
||||
if (e.BarItemKey.Equals("tbPaper004", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
DoCheckConditions("004");
|
||||
return;
|
||||
}
|
||||
|
||||
//增值税普票(纸质)
|
||||
if (e.BarItemKey.Equals("tbPaper007", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
DoCheckConditions("007");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检测选中数据是否符合执行条件
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
public void DoCheckConditions(string FPLXDM)
|
||||
{
|
||||
if (!_doingButtonFlag)
|
||||
{
|
||||
_doingButtonFlag = true;
|
||||
var orgId = 0L;
|
||||
var list = this.ListView.SelectedRowsInfo;
|
||||
var orgIdList = list.Select(x => x.MainOrgId).Distinct();
|
||||
if (orgIdList.Count() == 1)
|
||||
{
|
||||
orgId = orgIdList.First();
|
||||
if (orgId != 101542)
|
||||
DoIssueAnInvoice2List(FPLXDM, orgId);
|
||||
else
|
||||
this.View.ShowMessage("此功能未开放!如有需要请联系管理员!");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.View.ShowMessage("选择的单据的组织不统一!");
|
||||
}
|
||||
}
|
||||
_doingButtonFlag = false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置content报文明文信息
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM">发票类型</param>
|
||||
/// <param name="invoiceInfo">开票信息</param>
|
||||
/// <param name="errMsg">返回信息</param>
|
||||
/// <returns></returns>
|
||||
public string ListMergeInv_FPKJ(string FPLXDM, DynamicObject invoiceInfo)
|
||||
{
|
||||
var list = this.ListView.SelectedRowsInfo;
|
||||
var fidList = list.Select(x => x.FormID).Distinct();
|
||||
|
||||
//var sHeadInfo = this.View.Model.GetEntityDataObject(subHeadEntity, 0);
|
||||
|
||||
var result = new GP_FPKJ();
|
||||
var fpkj = result.FPKJ = new REQUEST_COMMON_FPKJ();
|
||||
|
||||
var headSql = $@"SELECT
|
||||
ID,APPLYID,APPLYNAME,BILLALLAMOUNT,BILLAMOUNT,BILLTAXAMOUNT,
|
||||
CUSTID,CUSTNAME,INVOICETITLE,
|
||||
INVOICEBANKNAME,INVOICEBANKACCOUNT,FTAXREGISTERCODE,SOCIALCRECODE,INVOICETEL,INVOICEADDRESS
|
||||
FROM V_OUTSTOCKINVINFO_HEAD
|
||||
WHERE ID IN ({string.Join(",", fidList)})
|
||||
";
|
||||
|
||||
#region 针对非农产收购发票
|
||||
|
||||
#region 基础信息
|
||||
|
||||
var sHeadInfos = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{headSql}");
|
||||
|
||||
var custIds = sHeadInfos.Select(x => x["CUSTID"].Long2Int()).Distinct();
|
||||
if (custIds.Count() > 1)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "客户信息",
|
||||
Message = "选择的开票数据客户信息不统一!",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
var applyIds = sHeadInfos.Select(x => x["APPLYID"].Long2Int()).Distinct();
|
||||
if (applyIds.Count() > 1)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "申领单位",
|
||||
Message = "选择的开票数据申领单位不统一!",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
fpkj.FPQQLSH = $"{invoiceInfo["FFIRMCODE"]}{DateTime.Now.ToString("yyyyMMddHHmm")}{invoiceInfo["FSERIALNUMBER"]}";
|
||||
fpkj.FPLXDM = FPLXDM;
|
||||
|
||||
if (FPLXDM.Equals("030") || FPLXDM.Equals("032"))
|
||||
fpkj.SBLX = "6";
|
||||
else if (FPLXDM.Equals("007") || FPLXDM.Equals("004"))
|
||||
fpkj.SBLX = "4";
|
||||
|
||||
//是否纸质发票
|
||||
bool isPaper = fpkj.SBLX == "4";
|
||||
|
||||
if (isPaper)
|
||||
fpkj.KPZDDM = "cszp";
|
||||
|
||||
fpkj.KPLX = "0";
|
||||
fpkj.ZSFS = "0";
|
||||
|
||||
fpkj.JSHJ = sHeadInfos.Sum(x => x["BILLALLAMOUNT"].ToDecimalR()).ToString();
|
||||
fpkj.HJJE = sHeadInfos.Sum(x => x["BILLAMOUNT"].ToDecimalR()).ToString();
|
||||
fpkj.HJSE = sHeadInfos.Sum(x => x["BILLTAXAMOUNT"].ToDecimalR()).ToString();
|
||||
|
||||
#endregion 基础信息
|
||||
|
||||
#region 销售方
|
||||
|
||||
fpkj.XSF_NSRSBH = invoiceInfo["FTAXCODE"].ToString();
|
||||
fpkj.XSF_MC = invoiceInfo["FINVOICETITLE"].ToString();
|
||||
fpkj.XSF_DZDH = $"{invoiceInfo["FINVOICEADDRESS"]} {invoiceInfo["FINVOICETEL"]}";
|
||||
fpkj.XSF_YHZH = $"{invoiceInfo["FINVOICEBANKNAME"]} {invoiceInfo["FINVOICEBANKACCOUNT"]}";
|
||||
|
||||
fpkj.KPR = invoiceInfo["FDRAWER"].ToString();
|
||||
|
||||
////申领单位
|
||||
//var applicant = this.View.Model.GetValue("F_QNV_Base1") as DynamicObject;
|
||||
//var deptMulti = applicant["MultiLanguageText"] as DynamicObjectCollection;
|
||||
|
||||
#endregion 销售方
|
||||
|
||||
#region 购买方(客户信息)
|
||||
|
||||
var sHeadInfo = sHeadInfos[0];
|
||||
|
||||
fpkj.BZ = sHeadInfo["APPLYNAME"].ToString();
|
||||
|
||||
fpkj.GMF_MC = (sHeadInfo["INVOICETITLE"].IsNullOrEmpty() ? (sHeadInfo["CUSTNAME"].IsNullOrEmpty() ? "" : sHeadInfo["CUSTNAME"]) : sHeadInfo["INVOICETITLE"]).ToString();
|
||||
//纳税人识别号/统一社会信用代码
|
||||
fpkj.GMF_NSRSBH = (sHeadInfo["SOCIALCRECODE"].IsNullOrEmpty() ? (sHeadInfo["FTAXREGISTERCODE"].IsNullOrEmpty() ? "" : sHeadInfo["FTAXREGISTERCODE"]) : sHeadInfo["SOCIALCRECODE"]).ToString();
|
||||
fpkj.GMF_DZDH = $"{sHeadInfo["INVOICEADDRESS"]} {sHeadInfo["INVOICETEL"]}";
|
||||
fpkj.GMF_YHZH = $"{sHeadInfo["INVOICEBANKNAME"]} {sHeadInfo["INVOICEBANKACCOUNT"]}";
|
||||
|
||||
if (fpkj.GMF_MC == string.Empty)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "客户信息",
|
||||
Message = "购买方(客户信息)名称不能为空!",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
if (fpkj.GMF_NSRSBH == string.Empty)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "客户信息",
|
||||
Message = "购买方(客户信息)统一社会信用代码或纳税人识别号不能为空!",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
if (isPaper && fpkj.GMF_DZDH == string.Empty)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "客户信息",
|
||||
Message = "开具纸质发票时,购买方(客户信息)开票电话地址不完整!请检查是否缺少地址信息,电话信息",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
if (isPaper && fpkj.GMF_YHZH == string.Empty)
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "客户信息",
|
||||
Message = "开具纸质发票时,购买方(客户信息)开票银行信息不完整!请检查是否缺少银行信息,银行账号信息",
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
#endregion 购买方
|
||||
|
||||
#region 明细信息
|
||||
var details = fpkj.COMMON_FPKJ_XMXX = new List<COMMON_FPKJ_XMXX>();
|
||||
if (!opResult.OperateResult.Any())
|
||||
{
|
||||
var checkTaxCategroupSql = $@"
|
||||
SELECT
|
||||
a.FMASTERID,
|
||||
a.FNUMBER,
|
||||
a.FMATERIALID ,
|
||||
b.FTAXCATEGORYCODEID ,
|
||||
c.FTAXCODE ,
|
||||
d.FENTRYID
|
||||
FROM
|
||||
T_BD_MATERIAL a
|
||||
LEFT JOIN T_BD_MATERIALSALE b ON a.FMATERIALID = b.FMATERIALID
|
||||
INNER JOIN T_IV_GTTAXCODE c ON b.FTAXCATEGORYCODEID = c.FID
|
||||
INNER JOIN T_SAL_OUTSTOCKENTRY d ON d.FMATERIALID = a.FMATERIALID
|
||||
WHERE
|
||||
c.FDOCUMENTSTATUS = 'C'
|
||||
AND d.FID in ({string.Join(",", fidList)}) ";
|
||||
|
||||
var entrySql = $@"
|
||||
SELECT
|
||||
ID,FTAXCATEGORYCODEID,Number,TaxCode,MaterialName,Salunitqty,Specification,UnitName,Price,Amount,TaxRate,TaxAmount
|
||||
from V_OUTSTOCKINVINFO_ENTRY
|
||||
|
||||
AND ID in ({string.Join(",", fidList)})
|
||||
";
|
||||
|
||||
var dbList = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{entrySql}");
|
||||
|
||||
foreach (var item in dbList)
|
||||
{
|
||||
|
||||
if (item["FTAXCATEGORYCODEID"].IsNullOrEmpty())
|
||||
{
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = item["Number"].ToString(),
|
||||
Message = $"物料:{item["Number"]} 缺少税收分类编码!",
|
||||
SuccessStatus = false
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
details.Add(new COMMON_FPKJ_XMXX
|
||||
{
|
||||
FPHXZ = "0",
|
||||
SPBM = item["TaxCode"].ToString(),
|
||||
//ZXBM = material["Number"].ToString(),
|
||||
XMMC = item["MaterialName"].ToString(),
|
||||
XMSL = item["Salunitqty"].ToDecimal().ToString("F6"),
|
||||
GGXH = item["Specification"].ToString(),
|
||||
DW = item["UnitName"].ToString(),
|
||||
XMDJ = item["Price"].ToDecimal().ToString("F6"),
|
||||
XMJE = item["Amount"].ToDecimal().ToString("F2"),
|
||||
SL = (item["TaxRate"].ToDecimal() * 0.01M).ToString("F2"),
|
||||
SE = item["TaxAmount"].ToDecimal().ToString("F2"),
|
||||
});
|
||||
}
|
||||
|
||||
if (opResult.OperateResult.Any())
|
||||
throw new Exception("物料缺少税收分类编码");
|
||||
|
||||
}
|
||||
|
||||
#endregion 明细信息
|
||||
|
||||
#endregion 针对非农产收购发票
|
||||
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送报文信息处理
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
/// <param name="iiDt"></param>
|
||||
/// <param name="contentAction"></param>
|
||||
/// <returns></returns>
|
||||
public BaseRequest InterfaceDataHandle(string FPLXDM, DynamicObject invInfo
|
||||
, Func<string, DynamicObject, string> contentAction)
|
||||
{
|
||||
//发票开具接口Code
|
||||
//string interfaceCode = "GP_FPKJ";
|
||||
|
||||
string appId = invInfo["FAPPID"].ToString();
|
||||
string encodeKey = invInfo["FENCRYPTIONKEY"].ToString();
|
||||
|
||||
var requestBase = new BaseRequest();
|
||||
requestBase._interface = new Interface();
|
||||
var date = DateTime.Now;
|
||||
|
||||
string newDate = date.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
string newDate2 = date.ToString("yyyyMMdd");
|
||||
|
||||
string no = Guid.NewGuid().ToString("N").Substring(0, 9).ToUpper();
|
||||
//数据交换id
|
||||
string dataExchangeId = "DZFPQZ" + "DFXJ1001" + newDate2 + no;
|
||||
|
||||
requestBase._interface.globalInfo.appId = appId;
|
||||
//requestBase._interface.globalInfo.interfaceCode = interfaceCode;
|
||||
requestBase._interface.globalInfo.requestTime = newDate;
|
||||
requestBase._interface.globalInfo.dataExchangeId = dataExchangeId;
|
||||
|
||||
StringBuilder errMsg = new StringBuilder();
|
||||
try
|
||||
{
|
||||
//var requestCommonFPKJ = SetRequestCommonFPKJ(FPLXDM, iiDt, ref errMsg);
|
||||
|
||||
if (!errMsg.IsNullOrEmpty() && errMsg.Length > 0)
|
||||
throw new Exception(errMsg.ToString());
|
||||
|
||||
string contentDecode = contentAction(FPLXDM, invInfo);
|
||||
|
||||
//发票报文加密处理处理
|
||||
string content = Base64Helper.Base64Encode(contentDecode);
|
||||
string contentSHA256 = SHA256Helper.SHA256EncryptString(content);
|
||||
|
||||
//使用加密密钥再次加密
|
||||
string contentKey = AESHepler.AesEncryptorBase64(contentSHA256, encodeKey);
|
||||
|
||||
requestBase._interface.data.content = content;
|
||||
requestBase._interface.data.contentKey = contentKey;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return requestBase;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送报文,获取结果
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
/// <param name="orgId"></param>
|
||||
/// <param name="contentAction"></param>
|
||||
/// <param name="endAction"></param>
|
||||
public void RequestDataHandle(string FPLXDM, long orgId, string _interfaceCode,
|
||||
Func<string, DynamicObject, string> contentAction,
|
||||
Func<string, DynamicObject, bool> endAction)
|
||||
{
|
||||
|
||||
var result = string.Empty;
|
||||
try
|
||||
{
|
||||
|
||||
#region 获取对应开票信息
|
||||
string whereSql = $" AND {((FPLXDM.Equals("007") || FPLXDM.Equals("004")) ? "FIsDeviceType4" : "FIsDeviceType6")} = 1 ";
|
||||
var iinfoSQL = $@"
|
||||
SELECT TOP 1
|
||||
FID,
|
||||
FUSEORGID,
|
||||
FAPPID,
|
||||
FTAXCODE,
|
||||
FDRAWER,
|
||||
FINVOICEBANKNAME,
|
||||
FINVOICEBANKACCOUNT,
|
||||
FINVOICEADDRESS,
|
||||
FINVOICETEL,
|
||||
FINVOICETITLE,
|
||||
FFIRMCODE,
|
||||
FSERIALNUMBER,
|
||||
FENCRYPTIONKEY,
|
||||
FISDEFAULT,
|
||||
FISTESTINFO,
|
||||
FCERTIFICATE2NAME,
|
||||
FCERTIFICATE2KEY,
|
||||
FREQUESTURL
|
||||
FROM
|
||||
T_BD_INVOICEINFORMATION
|
||||
WHERE
|
||||
FDOCUMENTSTATUS = 'C'
|
||||
AND FUSEORGID = {orgId} {whereSql}
|
||||
ORDER BY
|
||||
FISDEFAULT DESC , FISTESTINFO DESC ";
|
||||
|
||||
var iinfoDB = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{iinfoSQL}");
|
||||
|
||||
if (iinfoDB == null || !iinfoDB.Any())
|
||||
throw new Exception("使用组织没有配对的开票系统信息!");
|
||||
|
||||
var info = iinfoDB[0];
|
||||
bool isTest = info["FISTESTINFO"].Long2Int() == 1;
|
||||
|
||||
var requestData = InterfaceDataHandle(FPLXDM, info, contentAction);
|
||||
|
||||
requestData._interface.globalInfo.interfaceCode = _interfaceCode;
|
||||
|
||||
var postData = JsonConvert.SerializeObject(requestData);
|
||||
#endregion 获取对应开票信息
|
||||
|
||||
var url = info["FREQUESTURL"].ToString();//双向通道地址
|
||||
if (url.IsNullOrEmptyOrWhiteSpace())
|
||||
url = "https://dev.fapiao.com:18944/fpt-rhqz/prepose";
|
||||
|
||||
var cerName = info["FCERTIFICATE2NAME"].ToString();//证书密钥
|
||||
if (cerName.IsNullOrEmptyOrWhiteSpace())
|
||||
cerName = "testISSUE.pfx";
|
||||
|
||||
//证书文件存放地址
|
||||
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
var keyStoreFile = baseDirectory + $@"\bin\ISSUE\{cerName}";
|
||||
|
||||
var cerKey = info["FCERTIFICATE2KEY"].ToString();
|
||||
if (cerKey.IsNullOrEmptyOrWhiteSpace())
|
||||
cerKey = "123456";
|
||||
|
||||
var certificate2 = new X509Certificate2(keyStoreFile, cerKey);
|
||||
|
||||
result = HttpWebHelper.DoPost(url, postData, certificate2);
|
||||
|
||||
var responseData = JsonConvert.DeserializeObject<BaseRequest>(result);
|
||||
var returnStateInfo = responseData._interface.returnStateInfo;
|
||||
if (returnStateInfo != null)
|
||||
{
|
||||
if (returnStateInfo.returnCode.Equals("0000"))
|
||||
{
|
||||
var resContent = Base64Helper.Base64Decode(responseData._interface.data.content);
|
||||
var isFlag = endAction(resContent, info);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception(returnStateInfo.returnMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (JsonSerializationException ex)
|
||||
{
|
||||
opResult.OperateResult.Add(new OperateResult()
|
||||
{
|
||||
Name = "信息提示",
|
||||
Message = ex.Message,
|
||||
SuccessStatus = false
|
||||
});
|
||||
|
||||
opResult.OperateResult.Add(new OperateResult()
|
||||
{
|
||||
Name = "信息提示",
|
||||
Message = result,
|
||||
SuccessStatus = false
|
||||
});
|
||||
//this.View.ShowMessage($"错误信息:{result}", MessageBoxType.Error);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//this.View.ShowErrMessage($"错误信息:{ex.Message}");
|
||||
|
||||
opResult.OperateResult.Add(new OperateResult()
|
||||
{
|
||||
Name = "信息提示",
|
||||
Message = ex.Message,
|
||||
SuccessStatus = false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 列表发票开具
|
||||
/// </summary>
|
||||
/// <param name="FPLXDM"></param>
|
||||
public void DoIssueAnInvoice2List(string FPLXDM, long orgId)
|
||||
{
|
||||
try
|
||||
{
|
||||
RequestDataHandle(FPLXDM, orgId, "GP_FPKJ", ListMergeInv_FPKJ, DataBackFill);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
opResult.OperateResult.Add(new OperateResult
|
||||
{
|
||||
Name = "错误提示",
|
||||
Message = ex.Message,
|
||||
SuccessStatus = false
|
||||
});
|
||||
}
|
||||
finally
|
||||
{
|
||||
_doingButtonFlag = false;
|
||||
if (opResult.OperateResult.Any())
|
||||
this.View.ShowOperateResult(opResult.OperateResult);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 数据回填更新到数据库
|
||||
/// </summary>
|
||||
/// <param name="content">回调数据</param>
|
||||
/// <param name="invInfo"></param>
|
||||
/// <returns></returns>
|
||||
private bool DataBackFill(string content, DynamicObject invInfo)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.View.ShowMessage($"报文处理成功,正在回填发票信息【财务信息】");
|
||||
|
||||
var idList = this.ListView.SelectedRowsInfo.Select(x => x.FormID).Distinct();
|
||||
|
||||
//更新对应开票信息的流水号记录
|
||||
var serialNumber = invInfo["FSERIALNUMBER"].Long2Int();
|
||||
var newSNumber = (serialNumber > 998 ? 1 : serialNumber + 1).ToString("D3");
|
||||
var updInvSql = $"/*dialect*/UPDATE T_BD_INVOICEINFORMATION SET FSERIALNUMBER = '{newSNumber}' WHERE FID = {invInfo["FID"]}";
|
||||
DBUtils.Execute(this.Context, updInvSql);
|
||||
|
||||
var resultData = JsonConvert.DeserializeObject<ResultData>(content);
|
||||
|
||||
var fpInfo = string.Empty;
|
||||
var data = resultData.DATA;
|
||||
//回填发票下载地址
|
||||
if (data.FPLXDM.Equals("030") || data.FPLXDM.Equals("032"))
|
||||
fpInfo = data.PDF_URL;
|
||||
else if (data.FPLXDM.Equals("007") || data.FPLXDM.Equals("004"))
|
||||
fpInfo = data.FP_MW;
|
||||
|
||||
var updSql = $@"/*dialect*/
|
||||
UPDATE T_SAL_OUTSTOCKFIN
|
||||
SET FINVOICEURL = '{fpInfo}'
|
||||
,FFPLXDM = '{data.FPLXDM}'
|
||||
,FFPQQLSH = '{data.FPQQLSH}'
|
||||
,FINVOICENUMBER = '{data.FP_HM}'
|
||||
WHERE
|
||||
FID in ({string.Join(",", idList)}) ";
|
||||
|
||||
//发票信息回填到数据库
|
||||
var isFlag = DBUtils.Execute(this.Context, updSql);
|
||||
return isFlag > 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
36
SAL_OUTSTOCK/Properties/AssemblyInfo.cs
Normal file
36
SAL_OUTSTOCK/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// 有关程序集的一般信息由以下
|
||||
// 控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("SAL_OUTSTOCK")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("SAL_OUTSTOCK")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2023")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||
//请将此类型的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||
[assembly: Guid("12b329e1-c4f2-4ca7-bf3e-313f22ad527a")]
|
||||
|
||||
// 程序集的版本信息由下列四个值组成:
|
||||
//
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
72
SAL_OUTSTOCK/Request/BaseRequest.cs
Normal file
72
SAL_OUTSTOCK/Request/BaseRequest.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Request
|
||||
{
|
||||
public class BaseRequest
|
||||
{
|
||||
[JsonProperty(propertyName: "interface")]
|
||||
public Interface _interface { get; set; }
|
||||
|
||||
public class Interface
|
||||
{
|
||||
public Interface()
|
||||
{
|
||||
globalInfo = new Globalinfo();
|
||||
returnStateInfo = new Returnstateinfo();
|
||||
data = new Data();
|
||||
}
|
||||
|
||||
public Globalinfo globalInfo { get; set; }
|
||||
public Returnstateinfo returnStateInfo { get; set; }
|
||||
public Data data { get; set; }
|
||||
}
|
||||
|
||||
public class Globalinfo
|
||||
{
|
||||
public Globalinfo()
|
||||
{
|
||||
this.requestCode = "DZFPQZ";
|
||||
this.responseCode = "DS";
|
||||
}
|
||||
public string appId { get; set; }
|
||||
public string interfaceId { get; set; }
|
||||
public string interfaceCode { get; set; }
|
||||
public string requestCode { get; set; }
|
||||
public string requestTime { get; set; }
|
||||
public string responseCode { get; set; }
|
||||
public string dataExchangeId { get; set; }
|
||||
}
|
||||
|
||||
public class Returnstateinfo
|
||||
{
|
||||
public string returnCode { get; set; }
|
||||
public string returnMessage { get; set; }
|
||||
}
|
||||
|
||||
public class Data
|
||||
{
|
||||
public Data()
|
||||
{
|
||||
dataDescription = new Datadescription();
|
||||
}
|
||||
public Datadescription dataDescription { get; set; }
|
||||
public string content { get; set; }
|
||||
public string contentKey { get; set; }
|
||||
}
|
||||
|
||||
public class Datadescription
|
||||
{
|
||||
public Datadescription()
|
||||
{
|
||||
this.zipCode = "0";
|
||||
}
|
||||
|
||||
public string zipCode { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
439
SAL_OUTSTOCK/Request/GP_FPKJ.cs
Normal file
439
SAL_OUTSTOCK/Request/GP_FPKJ.cs
Normal file
@@ -0,0 +1,439 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Request
|
||||
{
|
||||
public class GP_FPKJ
|
||||
{
|
||||
[JsonProperty(propertyName: "REQUEST_COMMON_FPKJ")]
|
||||
public REQUEST_COMMON_FPKJ FPKJ { get; set; }
|
||||
public class REQUEST_COMMON_FPKJ
|
||||
{
|
||||
/// <summary>
|
||||
/// 设备编号
|
||||
/// </summary>
|
||||
public string SBLX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备类型 必填
|
||||
/// 1-税控盘 2-金税盘 3-Ukey 4-老税控服务器 6-数电
|
||||
/// </summary>
|
||||
public string SBBH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发票请求流水号 必填
|
||||
/// 企业内部唯一请求开票流
|
||||
/// 水号,每个请求流水号只能
|
||||
/// 开一次, 流水号前面以公司
|
||||
/// 名称前缀例如国信电票:
|
||||
/// GXDP201604201454001
|
||||
/// </summary>
|
||||
public string FPQQLSH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开票终端代码
|
||||
/// </summary>
|
||||
public string KPZDDM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发票类型代码
|
||||
/// 026增值税普票(电票)
|
||||
/// 004增值税专票(纸票)
|
||||
/// 028增值税专票(电票)
|
||||
/// 007增值税普票(纸票)
|
||||
/// 030数电普票
|
||||
/// 032数电专票
|
||||
/// </summary>
|
||||
public string FPLXDM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开票类型 必填
|
||||
/// 0-蓝字发票;1-红字发票
|
||||
/// </summary>
|
||||
public string KPLX { get; set; }
|
||||
|
||||
|
||||
public string BMB_BBH { get; set; }
|
||||
/// <summary>
|
||||
/// 征税方式 必填
|
||||
/// 0:普通征税
|
||||
/// 1:减按计征
|
||||
/// 2:差额征税
|
||||
/// </summary>
|
||||
public string ZSFS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 征税方式信息 数电
|
||||
/// 需要开具减按计征/差额征税的票此节点必填,否则可省略
|
||||
/// 报文结构见:八、征税方式报文
|
||||
/// </summary>
|
||||
public ZSFSXX ZSFSXX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 销售方纳税人识别号
|
||||
/// </summary>
|
||||
public string XSF_NSRSBH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 销售方名称
|
||||
/// </summary>
|
||||
public string XSF_MC { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 销售方地址 电话
|
||||
/// </summary>
|
||||
public string XSF_DZDH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 销售方银行账号
|
||||
/// 销售方开户行销售方银行账号(以空格分隔开户行账号)
|
||||
/// </summary>
|
||||
public string XSF_YHZH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方纳税人识别号
|
||||
/// </summary>
|
||||
public string GMF_NSRSBH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方名称
|
||||
/// </summary>
|
||||
public string GMF_MC { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方地址 电话
|
||||
/// </summary>
|
||||
public string GMF_DZDH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方银行账号
|
||||
/// 购买方开户行购买方银行账号(以空格分隔开户行账号)
|
||||
/// </summary>
|
||||
public string GMF_YHZH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方手机号
|
||||
/// </summary>
|
||||
public string GMF_SJH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方电子邮箱
|
||||
/// </summary>
|
||||
public string GMF_DZYX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方发票通平台账户
|
||||
/// 发票通平台(Fapiao.com)注册账户名,用于接收和归集电子发票
|
||||
/// </summary>
|
||||
public string FPT_ZH { get; set; }
|
||||
|
||||
|
||||
public string WX_OPENID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开票人 必填
|
||||
/// </summary>
|
||||
public string KPR { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 收款人
|
||||
/// </summary>
|
||||
public string SKR { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 复核人
|
||||
/// </summary>
|
||||
public string FHR { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原发票代码
|
||||
/// 红字票时必填(数电不需要填)
|
||||
/// </summary>
|
||||
public string YFP_DM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原发票号码
|
||||
/// 红字发票时必填
|
||||
/// </summary>
|
||||
public string YFP_HM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 价税合计 必填
|
||||
/// 单位:元(2位小数)
|
||||
/// </summary>
|
||||
public string JSHJ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 合计金额 必填
|
||||
/// 不含税,单位:元(2位小数)
|
||||
/// </summary>
|
||||
public string HJJE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 合计税额 必填
|
||||
/// 单位:元(2位小数)
|
||||
/// </summary>
|
||||
public string HJSE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 扣除额
|
||||
/// 小数点后2位,当ZSFS为2时扣除额为必填项
|
||||
/// </summary>
|
||||
public string KCE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注 长度240
|
||||
/// 电普备注长度应减去”对应正数发票代码:XXXXXXXXXXXX号码:YYYYYYYY\n”字样长度,长度剩余160。
|
||||
/// 专票,最大长度为184。若zsfs同时为2,备注长度为160。
|
||||
/// 普票,最大长度138。若zsfs同时为2,备注长度为114。
|
||||
/// 蓝票差额216
|
||||
/// 蓝票无差额240
|
||||
/// 红票差额181
|
||||
/// 红票无差额205
|
||||
/// </summary>
|
||||
public string BZ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原发票类型
|
||||
/// 红字发票时必填(数电不需要填)
|
||||
/// </summary>
|
||||
public string YFP_LX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原发票日期
|
||||
/// 若使用金税盘盘柜,则YFP_RQ格式为YYYYMM;
|
||||
/// 若SBLX=4,红字发票时必填,YYYYMMDD
|
||||
/// 若SBLX = 6,数电红字发票时必填,yyyy-MM-ddHH:mm:ss
|
||||
/// </summary>
|
||||
public string YFP_RQ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 冲红原因代码
|
||||
/// SBLX=4(旧税控) SBLX=6(数电)
|
||||
/// 红字发票时必填 1-销货退回 2-开票有误
|
||||
/// </summary>
|
||||
public string CHYYDM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 3%税率开具发票理由
|
||||
/// 2、前期已开具3%征收率发票,发生销售折让、中止或者退回等情形需要开具红字发票,或者开票有误需要重新开具。
|
||||
/// 3、因为实际经营业务需要,放弃享受减按1%征收率征收增值税政策。
|
||||
/// </summary>
|
||||
public string SSLKJLY { get; set; }
|
||||
public string BY1 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备用字段2 订单号
|
||||
/// </summary>
|
||||
public string BY2 { get; set; }
|
||||
public string BY3 { get; set; }
|
||||
public string BY4 { get; set; }
|
||||
public string BY5 { get; set; }
|
||||
public string BY6 { get; set; }
|
||||
public string BY7 { get; set; }
|
||||
public string BY8 { get; set; }
|
||||
public string BY9 { get; set; }
|
||||
public string BY10 { get; set; }
|
||||
public string WX_ORDER_ID { get; set; }
|
||||
public string WX_APP_ID { get; set; }
|
||||
public string ZFB_UID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 特殊代码标识 见:6.3.特殊票种(特定要素类型)代码
|
||||
/// </summary>
|
||||
public string TSPZ { get; set; }
|
||||
public TSPZXX TSPZXX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 全局唯一订单ID
|
||||
/// 通过税号、内部唯一流水号等做MD5后的值
|
||||
/// </summary>
|
||||
public string QJ_ORDER_ID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 清单标志
|
||||
/// 纸票字段 0无清单 1有清单
|
||||
/// </summary>
|
||||
public string QDBZ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 通知单编号
|
||||
/// 非数电专票字段:16位数字,通知单编号
|
||||
/// 数电专票或普票字段:代表信息表编号(XXBBH)
|
||||
/// 数电开具红票,若已申请红字确认单,则必填
|
||||
/// </summary>
|
||||
public string TZDBH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 红字确认单UUID
|
||||
/// 数电非必填
|
||||
/// 数电开具红票,若已申请红
|
||||
/// 字确认单,则必填
|
||||
/// </summary>
|
||||
public string HZQRDUUID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 经办人证件号码 数电
|
||||
/// </summary>
|
||||
public string JBRZJHM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 经办人证件种类代码 数电
|
||||
/// 见:6.1经办人证件种类代码码表
|
||||
/// </summary>
|
||||
public string JBRZJZLDM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 经办人国籍代码 数电
|
||||
/// 见:6.2经办人国籍代码
|
||||
/// </summary>
|
||||
public string JBRGJDM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 经办人纳税人识别号 数电
|
||||
/// </summary>
|
||||
public string JBRZRRNSRSBH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 经办人姓名 数电
|
||||
/// </summary>
|
||||
public string JBRXM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 购买方自然人标识 数电
|
||||
/// 默认N Y-是N-否
|
||||
/// </summary>
|
||||
public string GMF_ZRRBS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否展示购买方银行账号 数电
|
||||
/// Y-是N-否
|
||||
/// </summary>
|
||||
public string SFZSGMFYHZH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否展示销售方银行账号 数电
|
||||
/// Y-是N-否
|
||||
/// </summary>
|
||||
public string SFZSXSFYHZH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目明细(最大100条)
|
||||
/// </summary>
|
||||
public List<COMMON_FPKJ_XMXX> COMMON_FPKJ_XMXX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 回调地址 500 仅异步返回时生效
|
||||
/// </summary>
|
||||
public string CALLBACK_URL { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流水号 36 供异步返回或异步推送时使用,请求唯一,除非是二次查询结果的重复请求
|
||||
/// </summary>
|
||||
public string LSH { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class ZSFSXX
|
||||
{
|
||||
}
|
||||
public class TSPZXX
|
||||
{
|
||||
public object[] TDYS { get; set; }
|
||||
}
|
||||
|
||||
public class COMMON_FPKJ_XMXX
|
||||
{
|
||||
/// <summary>
|
||||
/// 发票行性质 必填 0正常行、1折扣行、2被折扣行
|
||||
/// </summary>
|
||||
public string FPHXZ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商品编码 必填
|
||||
/// </summary>
|
||||
public string SPBM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自行编码
|
||||
/// </summary>
|
||||
public string ZXBM { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 优惠政策标识
|
||||
/// 0:不使用,1:使用
|
||||
/// </summary>
|
||||
public string YHZCBS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 零税率标识
|
||||
/// 空:非零税率,1:免税,2:不征收,3普通零税率
|
||||
/// </summary>
|
||||
public string LSLBS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 增值税特殊管理
|
||||
/// </summary>
|
||||
public string ZZSTSGL { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目名称 必填
|
||||
/// 如果为折扣行,商品名称须与被折扣行的商品名称相同,不能多行折扣。
|
||||
/// </summary>
|
||||
public string XMMC { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 规格型号
|
||||
/// </summary>
|
||||
public string GGXH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 计量单位
|
||||
/// 若TSPZ为08,此项必填,必须为“吨”或者“升”
|
||||
/// </summary>
|
||||
public string DW { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目数量
|
||||
/// 总长度包含小数点不能超过15位;若TSPZ为08,此项必填,不能为0。
|
||||
/// </summary>
|
||||
public string XMSL { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目单价
|
||||
/// 卷票为含税,其他不含税。
|
||||
/// 总长度包含小数点不能超过15位(只有当ZSFS为1时,此处填含税单价)
|
||||
/// 若TSPZ为08,此项必填,不能为0。
|
||||
/// </summary>
|
||||
public string XMDJ { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 项目金额 必填
|
||||
/// 卷票为含税,其他不含税。单位:元(最多保留2位小数)
|
||||
/// (只有当ZSFS为1时,此处填含税金额)
|
||||
/// </summary>
|
||||
public string XMJE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 税率 必填
|
||||
/// 2位小数,例1%为0.01
|
||||
/// </summary>
|
||||
public string SL { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 税额 必填
|
||||
/// 单位:元(2位小数)
|
||||
/// </summary>
|
||||
public string SE { get; set; }
|
||||
public string BY1 { get; set; }
|
||||
public string BY2 { get; set; }
|
||||
public string BY3 { get; set; }
|
||||
public string BY4 { get; set; }
|
||||
public string BY5 { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
32
SAL_OUTSTOCK/Response/ResultData.cs
Normal file
32
SAL_OUTSTOCK/Response/ResultData.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Response
|
||||
{
|
||||
public class ResultData
|
||||
{
|
||||
|
||||
public string CODE { get; set; }
|
||||
public string MESSAGE { get; set; }
|
||||
public GP_FPKJ_DATA DATA { get; set; }
|
||||
|
||||
|
||||
public class GP_FPKJ_DATA
|
||||
{
|
||||
public string FPQQLSH { get; set; }
|
||||
public string FPLXDM { get; set; }
|
||||
public string FP_DM { get; set; }
|
||||
public string FP_HM { get; set; }
|
||||
public string KPRQ { get; set; }
|
||||
public string JYM { get; set; }
|
||||
public string FP_MW { get; set; }
|
||||
public string PDF_URL { get; set; }
|
||||
public string OFD_URL { get; set; }
|
||||
public string XML_URL { get; set; }
|
||||
public string SP_URL { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
84
SAL_OUTSTOCK/SAL_OUTSTOCK.csproj
Normal file
84
SAL_OUTSTOCK/SAL_OUTSTOCK.csproj
Normal file
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{12B329E1-C4F2-4CA7-BF3E-313F22AD527A}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>SAL_OUTSTOCK</RootNamespace>
|
||||
<AssemblyName>SAL_OUTSTOCK</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Kingdee.BOS">
|
||||
<HintPath>..\..\..\..\..\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\Kingdee.BOS.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Kingdee.BOS.App">
|
||||
<HintPath>..\..\..\..\..\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\Kingdee.BOS.App.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Kingdee.BOS.Core">
|
||||
<HintPath>..\..\..\..\..\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\Kingdee.BOS.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Kingdee.BOS.DataEntity">
|
||||
<HintPath>..\..\..\..\..\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\Kingdee.BOS.DataEntity.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Utils\AESHepler.cs" />
|
||||
<Compile Include="Utils\Base64Helper.cs" />
|
||||
<Compile Include="Utils\HttpWebHelper.cs" />
|
||||
<Compile Include="Utils\SHA256Helper.cs" />
|
||||
<Compile Include="MergePrintIssueAnInvPlugIn.cs" />
|
||||
<Compile Include="Request\BaseRequest.cs" />
|
||||
<Compile Include="Request\GP_FPKJ.cs" />
|
||||
<Compile Include="IssueAnInvoiceFormPlugIn.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Response\ResultData.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ISSUE\证书\testISSUE.pfx" />
|
||||
<None Include="ISSUE\证书\testISSUEWithKey.pem" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="ISSUE\证书\密码.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Extensions\ExtensionMethods.csproj">
|
||||
<Project>{50532462-8f7f-455c-b4b3-732ed764e2fa}</Project>
|
||||
<Name>ExtensionMethods</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
57
SAL_OUTSTOCK/Utils/AESHepler.cs
Normal file
57
SAL_OUTSTOCK/Utils/AESHepler.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Utils
|
||||
{
|
||||
internal static class AESHepler
|
||||
{
|
||||
/// <summary>
|
||||
/// AES 算法加密(ECB模式) 将明文加密,加密后进行base64编码,返回密文
|
||||
/// </summary>
|
||||
/// <param name="EncryptStr">明文</param>
|
||||
/// <param name="Key">密钥</param>
|
||||
/// <returns>加密后base64编码的密文</returns>
|
||||
public static string AesEncryptorBase64(string EncryptStr, string Key)
|
||||
{
|
||||
try
|
||||
{
|
||||
//byte[] keyArray = Encoding.UTF8.GetBytes(Key);
|
||||
byte[] toEncryptArray = Encoding.UTF8.GetBytes(EncryptStr);
|
||||
|
||||
RijndaelManaged rDel = new RijndaelManaged();
|
||||
//rDel.Key = keyArray;
|
||||
rDel.Key = Encoding.UTF8.GetBytes(Key);
|
||||
rDel.Mode = CipherMode.ECB;
|
||||
rDel.Padding = PaddingMode.PKCS7;
|
||||
|
||||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
|
||||
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ex.Message;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
private static byte[] hexStringToByteArray(string strHex)
|
||||
{
|
||||
strHex = strHex.Replace(" ", "");
|
||||
byte[] buffer = new byte[strHex.Length / 2];
|
||||
for (int i = 0; i < strHex.Length; i += 2)
|
||||
{
|
||||
buffer[i / 2] = (byte)Convert.ToByte(strHex.Substring(i, 2), 16);
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
74
SAL_OUTSTOCK/Utils/Base64Helper.cs
Normal file
74
SAL_OUTSTOCK/Utils/Base64Helper.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Utils
|
||||
{
|
||||
|
||||
public static class Base64Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// Base64加密,采用utf8编码方式加密
|
||||
/// </summary>
|
||||
/// <param name="source">待加密的明文</param>
|
||||
/// <returns>加密后的字符串</returns>
|
||||
public static string Base64Encode(string source)
|
||||
{
|
||||
return Base64Encode(Encoding.UTF8, source);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Base64加密
|
||||
/// </summary>
|
||||
/// <param name="encodeType">加密采用的编码方式</param>
|
||||
/// <param name="source">待加密的明文</param>
|
||||
/// <returns></returns>
|
||||
public static string Base64Encode(Encoding encodeType, string source)
|
||||
{
|
||||
string encode = string.Empty;
|
||||
byte[] bytes = encodeType.GetBytes(source);
|
||||
try
|
||||
{
|
||||
encode = Convert.ToBase64String(bytes);
|
||||
}
|
||||
catch
|
||||
{
|
||||
encode = source;
|
||||
}
|
||||
return encode;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Base64解密,采用utf8编码方式解密
|
||||
/// </summary>
|
||||
/// <param name="result">待解密的密文</param>
|
||||
/// <returns>解密后的字符串</returns>
|
||||
public static string Base64Decode(string result)
|
||||
{
|
||||
return Base64Decode(Encoding.UTF8, result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Base64解密
|
||||
/// </summary>
|
||||
/// <param name="encodeType">解密采用的编码方式,注意和加密时采用的方式一致</param>
|
||||
/// <param name="result">待解密的密文</param>
|
||||
/// <returns>解密后的字符串</returns>
|
||||
public static string Base64Decode(Encoding encodeType, string result)
|
||||
{
|
||||
string decode = string.Empty;
|
||||
byte[] bytes = Convert.FromBase64String(result);
|
||||
try
|
||||
{
|
||||
decode = encodeType.GetString(bytes);
|
||||
}
|
||||
catch
|
||||
{
|
||||
decode = result;
|
||||
}
|
||||
return decode;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
99
SAL_OUTSTOCK/Utils/HttpWebHelper.cs
Normal file
99
SAL_OUTSTOCK/Utils/HttpWebHelper.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Security;
|
||||
using System.Net;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Utils
|
||||
{
|
||||
public static class HttpWebHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// post请求
|
||||
/// </summary>
|
||||
/// <param name="url">请求地址</param>
|
||||
/// <param name="postData">请求数据</param>
|
||||
/// <param name="certificate2">证书</param>
|
||||
/// <returns></returns>
|
||||
public static string DoPost(string url, string postData, X509Certificate2 certificate2)
|
||||
{
|
||||
try
|
||||
{
|
||||
string result = string.Empty;
|
||||
|
||||
HttpWebRequest request = null;
|
||||
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
request = WebRequest.Create(url) as HttpWebRequest;
|
||||
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
|
||||
request.ProtocolVersion = HttpVersion.Version11;
|
||||
// 这里设置了协议类型。
|
||||
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2;
|
||||
request.KeepAlive = false;
|
||||
ServicePointManager.CheckCertificateRevocationList = true;
|
||||
ServicePointManager.DefaultConnectionLimit = 100;
|
||||
ServicePointManager.Expect100Continue = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
request = (HttpWebRequest)WebRequest.Create(url);
|
||||
}
|
||||
|
||||
//string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
|
||||
////证书
|
||||
//var keystorefile = baseDirectory + @"\bin\ISSUE\testISSUE.pfx";
|
||||
//var key = "123456";
|
||||
//var cer = new X509Certificate2(keystorefile, key);
|
||||
|
||||
if (certificate2 != null)
|
||||
request.ClientCertificates.Add(certificate2);
|
||||
|
||||
request.Method = "POST"; //使用get方式发送数据
|
||||
request.ContentType = "application/json;charset=utf-8";
|
||||
|
||||
byte[] data = Encoding.UTF8.GetBytes(postData);
|
||||
Stream newStream = request.GetRequestStream();
|
||||
newStream.Write(data, 0, data.Length);
|
||||
newStream.Close();
|
||||
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
Stream stream = response.GetResponseStream();
|
||||
|
||||
using (StreamReader sr = new StreamReader(stream))
|
||||
{
|
||||
result = sr.ReadToEnd();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// post请求
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="postData"></param>
|
||||
/// <returns></returns>
|
||||
public static string DoPost(string url, string postData)
|
||||
{
|
||||
return DoPost(url, postData, null);
|
||||
}
|
||||
|
||||
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
|
||||
{
|
||||
if (errors == SslPolicyErrors.None)
|
||||
return true; //总是接受
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
44
SAL_OUTSTOCK/Utils/SHA256Helper.cs
Normal file
44
SAL_OUTSTOCK/Utils/SHA256Helper.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace SAL_OUTSTOCK.Utils
|
||||
{
|
||||
internal static class SHA256Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// SHA256加密
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public static string SHA256EncryptString(string data)
|
||||
{
|
||||
byte[] bytes = Encoding.UTF8.GetBytes(data);
|
||||
byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int i = 0; i < hash.Length; i++)
|
||||
{
|
||||
builder.Append(hash[i].ToString("x2"));
|
||||
}
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SHA256加密
|
||||
/// </summary>
|
||||
/// <param name="StrIn">待加密字符串</param>
|
||||
/// <returns>加密数组</returns>
|
||||
public static Byte[] SHA256EncryptByte(string StrIn)
|
||||
{
|
||||
var sha256 = new SHA256Managed();
|
||||
var Asc = new ASCIIEncoding();
|
||||
var tmpByte = Asc.GetBytes(StrIn);
|
||||
var EncryptBytes = sha256.ComputeHash(tmpByte);
|
||||
sha256.Clear();
|
||||
return EncryptBytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user