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
{
///
/// 老乡鸡数据传输相关方法
///
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 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(),
//payType = 2,
fromType = 380,
price = orderAmount,
merchantPrice = orderAmount,
merchantBearPrice = 0,
productPrice = orderAmount,
sn = "0",
paymentDetails = new List(),
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
}
}