2025-03-28 09:49:56 +08:00

377 lines
21 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using HCC = HZQR.Common.Common;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using HZQR.Common;
namespace ThirdPartyClient.Method
{
/// <summary>
/// 老乡鸡数据传输相关方法
/// </summary>
public class LXJHelper
{
#region ->
public static void pushOrder(OracleHelper oracleHelper, OracleHelper oracleHelperEx)
{
string ServerpartShopCode, extStoreId, SQLString;
for (int curNum = 0; curNum < Config.AppSettings.ServerpartShopCode.Split(',').Length; curNum++)
{
ServerpartShopCode = Config.AppSettings.ServerpartShopCode.Split(',')[curNum];
extStoreId = Config.AppSettings.LXJExtStoreId.Split(',')[curNum];
SQLString = string.Format(@"SELECT
A.ENDACCOUNT_ID,A.SERVERPART_NAME,A.SHOPNAME,A.MACHINECODE,
A.ENDACCOUNT_STARTDATE,A.ENDACCOUNT_DATE
FROM
HIGHWAY_SELLDATA.T_ENDACCOUNT A
WHERE
A.VALID = 1 AND A.CHECK_INFO IS NOT NULL AND
A.SERVERPARTCODE = '{0}' AND A.SHOPCODE = '{1}' AND
NOT EXISTS (SELECT 1 FROM PLATFORM_FRAMEWORK.T_BUSINESSLOG B
WHERE A.ENDACCOUNT_ID = B.BUSINESS_ID AND
B.BUSINESSLOG_TYPE = 30 AND B.CHECK_STATE = 1)",
ServerpartShopCode.Substring(0, 6), ServerpartShopCode.Substring(6));
DataTable dtEndaccount = oracleHelper.ExcuteSqlGetDataSet(SQLString).Tables[0];
foreach (DataRow drEndaccount in dtEndaccount.Select("", "ENDACCOUNT_STARTDATE"))
{
//查询交易订单记录
SQLString = string.Format(@"SELECT
SELLMASTER_CODE,SERVERPARTCODE,SERVERPART_NAME,SHOPCODE,SHOPNAME,MACHINECODE,
SELLMASTER_DATE,TICKET_CODE,SELLMASTER_COUNT,SELLMASTER_OFFPRICE,SELLMASTER_AMOUNT,
CASH_AMOUNT,INTERNAL_AMOUNT,PAYMENT_TYPE,COUPON_TYPE,PAYMENT_GROUP,
MERCHANT_ORDER,REFUND_ORDER,SELLMASTER_STATE,SELLMASTER_DESC
FROM
HIGHWAY_SELLDATA.T_YSSELLMASTER A
WHERE
SELLMASTER_STATE > 0 AND SERVERPARTCODE = '{0}' AND
SHOPCODE = '{1}' AND MACHINECODE = '{2}' AND
SELLMASTER_DATE >= {3} AND SELLMASTER_DATE <= {4}",
ServerpartShopCode.Substring(0, 6), ServerpartShopCode.Substring(6), drEndaccount["MACHINECODE"],
Convert.ToDateTime(drEndaccount["ENDACCOUNT_STARTDATE"]).ToString("yyyyMMddHHmmss"),
Convert.ToDateTime(drEndaccount["ENDACCOUNT_DATE"]).ToString("yyyyMMddHHmmss"));
DataTable dtSellMaster = oracleHelperEx.ExcuteSqlGetDataSet(SQLString).Tables[0];
//查询交易明细记录
List<string> SellCodeList = CommonHelper.JoinListFromDataTable(dtSellMaster, "SELLMASTER_CODE");
SQLString = string.Format(@"SELECT
SELLMASTER_CODE,COMMODITY_BARCODE,COMMODITY_NAME,SELLDETAILS_PRICE,
SUM(SELLDETAILS_COUNT) AS SELLDETAILS_COUNT,
SUM(SELLDETAILS_AMOUNT) AS SELLDETAILS_AMOUNT
FROM
HIGHWAY_SELLDATA.T_YSSELLDETAILS
WHERE
{0}
GROUP BY
SELLMASTER_CODE,COMMODITY_BARCODE,COMMODITY_NAME,SELLDETAILS_PRICE",
HCC.Common.GetInString("SELLMASTER_CODE", SellCodeList));
DataTable dtSellDetail = oracleHelperEx.ExcuteSqlGetDataSet(SQLString).Tables[0];
int successCount = 0, errorCount = 0, Data_Consistency = 1, Check_State = 1;
pushOrder(dtSellMaster, dtSellDetail, extStoreId, ref successCount, ref errorCount);
string LogCentent = "" + drEndaccount["SERVERPART_NAME"] + drEndaccount["SHOPNAME"] +
"【" + ServerpartShopCode + "" + extStoreId + "】【" + drEndaccount["ENDACCOUNT_DATE"] +
"】" + drEndaccount["MACHINECODE"] + ",共计" + dtSellMaster.Rows.Count + "条流水数据";
if (successCount == dtSellMaster.Rows.Count)
{
LogCentent += ",数据传输无异常";
}
else
{
LogCentent += $"{ successCount }条成功,{ errorCount }条失败";
Data_Consistency = 0;
if (successCount == 0)
{
Check_State = 0;
}
}
BusinessLogHelper.RecordBusinessLog(oracleHelper, 30, drEndaccount["ENDACCOUNT_ID"].TryParseToInt(),
"T_ENDACCOUNT", "HIGHWAY_SELLDATA", LogCentent, Data_Consistency, Check_State,
ServerpartShopCode.Substring(0, 6), ServerpartShopCode.Substring(6), drEndaccount["MACHINECODE"].ToString(),
long.Parse(Convert.ToDateTime(drEndaccount["ENDACCOUNT_DATE"]).ToString("yyyyMMddHHmmss")));
LogUtil.WriteLog(LogCentent);
}
}
}
#endregion
#region ->
public static void pushOrder(DataTable dtSellMaster, DataTable dtSellDetail,
string extStoreId, ref int successCount, ref int errorCount)
{
foreach (DataRow drSellMaster in dtSellMaster.Select("", "SELLMASTER_CODE"))
{
int sellCount = drSellMaster["SELLMASTER_COUNT"].TryParseToInt();
decimal orderAmount = drSellMaster["SELLMASTER_AMOUNT"].TryParseToDecimal();
decimal totalAmount = 0, payAmount = 0, productAmount = 0;
Model.LXJParameterModel lXJParameterModel = new Model.LXJParameterModel
{
accessKey = Config.AppSettings.LXJaccessKey,
actionName = "candao.order.pushOrder.async",
timestamp = Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds),
ticket = Guid.NewGuid().ToString(),
};
if (orderAmount > 0)
{
string orderNo = "YD" + drSellMaster["SERVERPARTCODE"] + drSellMaster["SHOPCODE"] +
drSellMaster["MACHINECODE"] + drSellMaster["SELLMASTER_DATE"].ToString().Substring(2);
#region
Model.LXJOrderModel lXJOrderModel = new Model.LXJOrderModel
{
orderId = orderNo,
orderNo = orderNo,
extStoreId = extStoreId,
counts = sellCount,
orderStatus = 10, //商家已确认
products = new List<Model.LXJProductModel>(),
//payType = 2,
fromType = 380,
price = orderAmount,
merchantPrice = orderAmount,
merchantBearPrice = 0,
productPrice = orderAmount,
sn = "0",
paymentDetails = new List<Model.LXJPaymentDetailModel>(),
brandId = 976,
brandName = "老乡鸡",
realTimeProductPrice = orderAmount,
isInvoice = false,
thirdSn = "0",
thirdPlatformBearPrice = 0,
sendType = 3,
discountTotalPrice = 0,
orderDate = HCC.Common.TranslateDateTime(drSellMaster["SELLMASTER_DATE"].ToString()).Replace("/", "-"),
sendTime = HCC.Common.TranslateDateTime(drSellMaster["SELLMASTER_DATE"].ToString()).Replace("/", "-"),
isPayed = true,
};
foreach (DataRow drDetail in dtSellDetail.Select("SELLMASTER_CODE = '" + drSellMaster["SELLMASTER_CODE"] + "'"))
{
lXJOrderModel.products.Add(new Model.LXJProductModel
{
realTimePrice = drDetail["SELLDETAILS_PRICE"].TryParseToDecimal(),
sharePrice = drDetail["SELLDETAILS_AMOUNT"].TryParseToDecimal(),
totalPrice = drDetail["SELLDETAILS_AMOUNT"].TryParseToDecimal(),
realTimeTotalPrice = drDetail["SELLDETAILS_AMOUNT"].TryParseToDecimal(),
price = drDetail["SELLDETAILS_PRICE"].TryParseToDecimal(),
num = drDetail["SELLDETAILS_COUNT"].TryParseToInt(),
name = drDetail["COMMODITY_NAME"].ToString(),
extId = drDetail["COMMODITY_BARCODE"].ToString(),
});
}
#region
if (drSellMaster["PAYMENT_GROUP"].TryParseToInt() == 1)
{
if (drSellMaster["SELLMASTER_DESC"].ToString() != "")
{
lXJOrderModel.payType = 3;//混合支付(线下+线上)
#region +/
string onlinePayDesc = drSellMaster["SELLMASTER_DESC"].ToString().ToUpper();
Model.LXJPaymentDetailModel paymentDetailModel = new Model.LXJPaymentDetailModel
{
money = drSellMaster["CASH_AMOUNT"].TryParseToDecimal(),
tradeNo = lXJOrderModel.orderNo,
paySub = Enums.LXJPaySubEnum..ToInt32().ToString(),
typeName = "人民币",
type = Enums.LXJPayTypeEnum..ToInt32()
};
lXJOrderModel.paymentDetails.Add(paymentDetailModel);
if (onlinePayDesc.StartsWith("WECHAT"))
{
Model.LXJPaymentDetailModel onlinePaymentDetailModel = new Model.LXJPaymentDetailModel
{
money = onlinePayDesc.Split(':')[1].TryParseToDecimal(),
tradeNo = lXJOrderModel.orderNo,
paySub = Enums.LXJPaySubEnum..ToInt32().ToString(),
typeName = "微信支付",
type = Enums.LXJPayTypeEnum..ToInt32(),
};
lXJOrderModel.paymentDetails.Add(onlinePaymentDetailModel);
}
else if (onlinePayDesc.StartsWith("ALIPAY"))
{
Model.LXJPaymentDetailModel onlinePaymentDetailModel = new Model.LXJPaymentDetailModel
{
money = onlinePayDesc.Split(':')[1].TryParseToDecimal(),
tradeNo = lXJOrderModel.orderNo,
paySub = Enums.LXJPaySubEnum..ToInt32().ToString(),
typeName = "支付宝支付",
type = Enums.LXJPayTypeEnum..ToInt32(),
};
lXJOrderModel.paymentDetails.Add(onlinePaymentDetailModel);
}
#endregion
}
else
{
Model.LXJPaymentDetailModel paymentDetailModel = new Model.LXJPaymentDetailModel
{
money = orderAmount,
tradeNo = lXJOrderModel.orderNo,
};
switch (drSellMaster["PAYMENT_TYPE"].TryParseToInt())
{
case 1000:
lXJOrderModel.payType = 1;//线下支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "人民币";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
case 1010:
lXJOrderModel.payType = 2;//在线支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "微信支付";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
case 1020:
lXJOrderModel.payType = 2;//在线支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "支付宝支付";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
}
lXJOrderModel.paymentDetails.Add(paymentDetailModel);
}
}
else
{
Model.LXJPaymentDetailModel paymentDetailModel = new Model.LXJPaymentDetailModel
{
money = orderAmount,
tradeNo = lXJOrderModel.orderNo,
};
switch (drSellMaster["PAYMENT_TYPE"].TryParseToInt())
{
case 1000:
lXJOrderModel.payType = 1;//线下支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "人民币";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
case 1010:
lXJOrderModel.payType = 2;//在线支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "微信支付";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
case 1020:
lXJOrderModel.payType = 2;//在线支付
paymentDetailModel.paySub = Enums.LXJPaySubEnum..ToInt32().ToString();
paymentDetailModel.typeName = "支付宝支付";
paymentDetailModel.type = Enums.LXJPayTypeEnum..ToInt32();
break;
}
lXJOrderModel.paymentDetails.Add(paymentDetailModel);
}
#endregion
#endregion
totalAmount = lXJOrderModel.price;
payAmount = lXJOrderModel.paymentDetails.Sum(o => o.money);
productAmount = lXJOrderModel.products.Sum(o => o.totalPrice);
lXJParameterModel.data = lXJOrderModel;
}
else
{
//如果是退款交易延迟1分钟执行
Thread.Sleep(60 * 1000);
string orderNo;
if (dtSellMaster.Select("MERCHANT_ORDER = '" + drSellMaster["REFUND_ORDER"] + "'").Length > 0)
{
DataRow drOrder = dtSellMaster.Select("MERCHANT_ORDER = '" +
drSellMaster["REFUND_ORDER"] + "'")[0];
orderNo = "YD" + drOrder["SERVERPARTCODE"] + drOrder["SHOPCODE"] +
drOrder["MACHINECODE"] + drOrder["SELLMASTER_DATE"].ToString().Substring(2);
}
else if (dtSellMaster.Select("TICKET_CODE = '" + drSellMaster["REFUND_ORDER"] + "'").Length > 0)
{
DataRow drOrder = dtSellMaster.Select("TICKET_CODE = '" +
drSellMaster["REFUND_ORDER"] + "'")[0];
orderNo = "YD" + drOrder["SERVERPARTCODE"] + drOrder["SHOPCODE"] +
drOrder["MACHINECODE"] + drOrder["SELLMASTER_DATE"].ToString().Substring(2);
}
else
{
LogUtil.WriteLog(null, drSellMaster["SERVERPART_NAME"] + "" + drSellMaster["SHOPNAME"] +
"订单号【" + drSellMaster["SELLMASTER_CODE"] + "】同步异常:不存在退款原单据" +
"\r\n 传输报文:" + JsonConvert.SerializeObject(lXJParameterModel),
DateTime.Now.ToString("yyyyMMdd") + "_Error");
continue;
}
lXJParameterModel.actionName = "candao.order.updateOrderStatus";
lXJParameterModel.data = RefundOrder(orderNo);
}
//拼接签名文本
string _SignstringTemp = "accessKey=" + lXJParameterModel.accessKey + "&actionName=" +
lXJParameterModel.actionName + "&secret=" + Config.AppSettings.LXJsecret + "&timestamp=" +
lXJParameterModel.timestamp + "&data=" + JsonConvert.SerializeObject(lXJParameterModel.data);
//生成签名参数
lXJParameterModel.sign = MD5Util.GetMD5(_SignstringTemp);
//调用接口获取交易记录
string postResult = HttpUtil.HttpUrlPost(JsonConvert.SerializeObject(lXJParameterModel),
Config.AppSettings.LXJHostUrls_Test, "application/json");
try
{
JObject keyValuePairs = JObject.Parse(postResult);
if (keyValuePairs["status"].ToString() == "1")
{
LogUtil.WriteLog(drSellMaster["SERVERPART_NAME"] + "" + drSellMaster["SHOPNAME"] +
"订单号【" + drSellMaster["SELLMASTER_CODE"] + "】同步成功:" + keyValuePairs["msg"] +
"。订单金额" + totalAmount + ",明细金额" + productAmount + ",支付明细金额" + payAmount);
successCount++;
}
else
{
LogUtil.WriteLog(null, drSellMaster["SERVERPART_NAME"] + "" + drSellMaster["SHOPNAME"] +
"订单号【" + drSellMaster["SELLMASTER_CODE"] + "】同步异常:" + keyValuePairs["msg"] +
"\r\n 传输报文:" + JsonConvert.SerializeObject(lXJParameterModel),
DateTime.Now.ToString("yyyyMMdd") + "_Error");
errorCount++;
}
}
catch (Exception ex)
{
LogUtil.WriteLog(ex, drSellMaster["SERVERPART_NAME"] + "" + drSellMaster["SHOPNAME"] +
"订单号【" + drSellMaster["SELLMASTER_CODE"] + "】同步异常:" + postResult +
"\r\n 传输报文:" + JsonConvert.SerializeObject(lXJParameterModel),
DateTime.Now.ToString("yyyyMMdd") + "_Error");
errorCount++;
}
}
}
#endregion
#region -> 退
public static Model.LXJRefundModel RefundOrder(string orderNo)
{
Model.LXJRefundModel lXJRefundModel = new Model.LXJRefundModel
{
orderId = orderNo,
status = -1,
};
return lXJRefundModel;
}
#endregion
}
}