377 lines
21 KiB
C#
377 lines
21 KiB
C#
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 + "×tamp=" +
|
||
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
|
||
}
|
||
}
|