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 } }