529 lines
20 KiB
C#
529 lines
20 KiB
C#
using Quartz;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using WX.CRM.BLL.Base;
|
||
using WX.CRM.BLL.Level2;
|
||
using WX.CRM.BLL.Util;
|
||
using WX.CRM.BLL.Wx;
|
||
using WX.CRM.Common;
|
||
using WX.CRM.Model.Entity;
|
||
using WX.CRM.Model.Enum;
|
||
|
||
namespace WX.CRM.CRMServices.Level2
|
||
{
|
||
public class TDOrder
|
||
{
|
||
WX_TDORDER_BL wx_TDOrder_BL = new WX_TDORDER_BL();
|
||
WX_ORDEREXT_BL wx_OrderExt_BL = new WX_ORDEREXT_BL();
|
||
WX_SZZYORDER_BL wx_SzzyOrder_BL = new WX_SZZYORDER_BL();
|
||
WX_SZZYPRODUCT_BL wx_SzzyProduct_BL = new WX_SZZYPRODUCT_BL();
|
||
WX_SZZYSUBPRODUCT_BL wx_SzzySubProduct_BL = new WX_SZZYSUBPRODUCT_BL();
|
||
L2_SOFT_REFUNDAPPLAY_BL refundApplay_q = new L2_SOFT_REFUNDAPPLAY_BL();
|
||
int pageSize = 50;
|
||
int errorNum = 0;
|
||
int i = 0;
|
||
string errorOrderId = string.Empty;
|
||
string errorOrderExtId = string.Empty;
|
||
List<WX_SZZYPRODUCT> productList = new List<WX_SZZYPRODUCT>();
|
||
List<WX_SZZYSUBPRODUCT> subProductList = new List<WX_SZZYSUBPRODUCT>();
|
||
|
||
public void Start()
|
||
{
|
||
ValidationErrors errors = new ValidationErrors();
|
||
|
||
LogHelper.Info("==================开始更新投顾订单数据Start==============");
|
||
|
||
subProductList = wx_SzzySubProduct_BL.GetList().ToList();
|
||
productList = wx_SzzyProduct_BL.GetList().ToList();
|
||
|
||
CACHE_BL cache_BL = new CACHE_BL();
|
||
var str = cache_BL.GetValue_Parameter(Parameter.WeiXIn_SzzyOrderUnPayDayInterval);
|
||
int n = 1;
|
||
int.TryParse(str, out n);
|
||
DateTime dt = DateTime.Now;
|
||
|
||
if (subProductList != null)
|
||
{
|
||
foreach (var model in subProductList)
|
||
{
|
||
var bigProductCode = "";
|
||
var product = productList.Where(m => m.PRODUCTID == model.PRODUCTID).FirstOrDefault();
|
||
if (product != null)
|
||
{
|
||
bigProductCode = product.PRODUCTCODE;
|
||
}
|
||
getOrderByCtimeAndHandle(bigProductCode, model.PRODUCTCODE, string.Format("{0:yyyy-MM-dd}", dt.AddDays(-n)), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
getOrderByOtimeAndHandle(bigProductCode, model.PRODUCTCODE, string.Format("{0:yyyy-MM-dd}", dt), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
}
|
||
}
|
||
//getOrderByCtimeAndHandle("OEM_TDTGB", "OEM_TDTGB90", string.Format("{0:yyyy-MM-dd}", dt.AddDays(-n)), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
//getOrderByCtimeAndHandle("OEM_TDZYB", "OEM_TDZYB90", string.Format("{0:yyyy-MM-dd}", dt.AddDays(-n)), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
//getOrderByCtimeAndHandle("OEM_TDSRDZ", "OEM_TDSRDZ", string.Format("{0:yyyy-MM-dd}", dt.AddDays(-n)), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
|
||
|
||
//getOrderByOtimeAndHandle("OEM_TDTGB", "OEM_TDTGB90", string.Format("{0:yyyy-MM-dd}", dt), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
//getOrderByOtimeAndHandle("OEM_TDZYB", "OEM_TDZYB90", string.Format("{0:yyyy-MM-dd}", dt), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
//getOrderByOtimeAndHandle("OEM_TDSRDZ", "OEM_TDSRDZ", string.Format("{0:yyyy-MM-dd}", dt), string.Format("{0:yyyy-MM-dd}", dt.AddDays(1)));
|
||
|
||
//退款订单
|
||
refundListHandler(dt.AddDays(-n), dt.AddDays(1));
|
||
|
||
|
||
if (!string.IsNullOrWhiteSpace(errorOrderId))
|
||
{
|
||
LogHelper.Info("更新WX_SzzyOrder表错误订单号:" + errorOrderId.Trim(','));
|
||
}
|
||
if (!string.IsNullOrWhiteSpace(errorOrderExtId))
|
||
{
|
||
LogHelper.Info("更新WX_OrderExt表错误订单号:" + errorOrderExtId.Trim(','));
|
||
}
|
||
|
||
LogHelper.Info(string.Format("==================结束更新投顾订单数据End。 {0}==============", i > 0 ? "本次更新订单数量:" + i.ToString() : ""));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据下单时间处理,时间周期配置
|
||
/// </summary>
|
||
/// <param name="bigProductCode"></param>
|
||
/// <param name="productCode"></param>
|
||
private void getOrderByCtimeAndHandle(string bigProductCode, string productCode, string stime, string etime)
|
||
{
|
||
int total = 0;
|
||
string msg = "";
|
||
Soft_CRMOrderModel crmmodel = new Soft_CRMOrderModel("", bigProductCode, productCode, "", "", "", stime, etime, "", "", "", 1, pageSize);
|
||
|
||
//获取订单列表
|
||
List<Soft_OrderDetail> orderList = crmmodel.GetOderDetail(out msg, out total);
|
||
foreach (var orderDetail in orderList)
|
||
{
|
||
if (orderDetail.ISPAYED == 0)
|
||
{
|
||
continue;
|
||
}
|
||
i++;
|
||
unifyHandler(orderDetail);
|
||
}
|
||
int pageNum = total / pageSize + 1;
|
||
for (int k = 2; k <= pageNum; k++)
|
||
{
|
||
crmmodel = new Soft_CRMOrderModel("", bigProductCode, productCode, "", "", "", stime, etime, "", "", "", k, pageSize);
|
||
|
||
orderList = crmmodel.GetOderDetail(out msg, out total);
|
||
foreach (var orderDetail in orderList)
|
||
{
|
||
if (orderDetail.ISPAYED == 0)
|
||
{
|
||
continue;
|
||
}
|
||
i++;
|
||
unifyHandler(orderDetail);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据开通时间处理,只处理开通时间为当天的。主要是针对曾经是暂缓开通的订单,当天开通
|
||
/// </summary>
|
||
/// <param name="bigProductCode"></param>
|
||
/// <param name="productCode"></param>
|
||
private void getOrderByOtimeAndHandle(string bigProductCode, string productCode, string openstime, string openetime)
|
||
{
|
||
int total = 0;
|
||
string msg = "";
|
||
Soft_CRMOrderModel crmmodel = new Soft_CRMOrderModel("", bigProductCode, productCode, "", "", "", "", "", openetime, openetime, "", 1, pageSize);
|
||
|
||
//获取订单列表
|
||
List<Soft_OrderDetail> orderList = crmmodel.GetOderDetail(out msg, out total);
|
||
foreach (var orderDetail in orderList)
|
||
{
|
||
if (orderDetail.ISPAYED == 0)
|
||
{
|
||
continue;
|
||
}
|
||
i++;
|
||
unifyHandler(orderDetail);
|
||
}
|
||
int pageNum = total / pageSize + 1;
|
||
for (int k = 2; k <= pageNum; k++)
|
||
{
|
||
crmmodel = new Soft_CRMOrderModel("", bigProductCode, productCode, "", "", "", "", "", openstime, openetime, "", k, pageSize);
|
||
|
||
orderList = crmmodel.GetOderDetail(out msg, out total);
|
||
foreach (var orderDetail in orderList)
|
||
{
|
||
if (orderDetail.ISPAYED == 0)
|
||
{
|
||
continue;
|
||
}
|
||
i++;
|
||
unifyHandler(orderDetail);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void unifyHandler(Soft_OrderDetail orderDetail)
|
||
{
|
||
var model = wx_SzzyOrder_BL.Get(m => m.SZZYORDERID == orderDetail.ORDERID);
|
||
if (model == null)
|
||
{
|
||
decimal orderId = 0;
|
||
var flag = addOrder(orderDetail, out orderId);
|
||
if (!flag)
|
||
{
|
||
errorOrderId += "," + orderDetail.ORDERID;
|
||
}
|
||
WX_ORDEREXT orderExt = wx_OrderExt_BL.Get(o => o.ORDERID == orderId);
|
||
if (orderExt == null)
|
||
{
|
||
flag = addOrderExt(orderDetail, orderId);
|
||
}
|
||
else
|
||
{
|
||
flag = updateOrderExt(orderDetail, orderExt);
|
||
}
|
||
if (!flag)
|
||
{
|
||
errorOrderExtId += "," + orderDetail.ORDERID;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var flag = updateOrder(orderDetail, model);
|
||
if (!flag)
|
||
{
|
||
errorOrderId += "," + orderDetail.ORDERID;
|
||
}
|
||
WX_ORDEREXT orderExt = wx_OrderExt_BL.Get(o => o.ORDERID == model.ORDERID);
|
||
if (orderExt == null)
|
||
{
|
||
flag = addOrderExt(orderDetail, model.ORDERID);
|
||
}
|
||
else
|
||
{
|
||
flag = updateOrderExt(orderDetail, orderExt);
|
||
}
|
||
if (!flag)
|
||
{
|
||
errorOrderExtId += "," + orderDetail.ORDERID;
|
||
}
|
||
}
|
||
}
|
||
|
||
private bool addOrder(Soft_OrderDetail orderDetail, out decimal orderId)
|
||
{
|
||
orderId = new SEQUENCES_BL().Seq_base_get();
|
||
WX_SZZYORDER model = new WX_SZZYORDER();
|
||
model.ORDERID = orderId;
|
||
model.OPERATETIME = orderDetail.CTIME;
|
||
model.RESID = orderDetail.orderExt.FirstOrDefault().MOBILE;
|
||
model.ISFINANCEPAY = 0;
|
||
model.OPENORDER = 0;
|
||
model.ISOPEN = orderDetail.ISPAYED != 0 ? 1 : 0;
|
||
model.ORDERTYPE = 1;
|
||
model.ORDERSTATUS = "1";
|
||
model.ORDERSTATUSNAME = "未开通";
|
||
model.NEEDPAY = orderDetail.TOTALPRICE;
|
||
model.RETURNNEEDPAY = orderDetail.TOTALPRICE;
|
||
model.SOURCE = "3";
|
||
model.PRODUCTID = getProductId(orderDetail.BIGPRODUCTCODE);
|
||
model.SUBPRODUCTID = getSubProductId(orderDetail.PRODUCTCODE);
|
||
model.PRODUCTNAME = wx_SzzyProduct_BL.Get(m => m.PRODUCTID == model.PRODUCTID).PRODUCTNAME;
|
||
model.SUBPRODUCTNAME = wx_SzzySubProduct_BL.Get(m => m.SUBPRODUCTID == model.SUBPRODUCTID).SUBPRODUCTNAME;
|
||
model.CTIME = orderDetail.CTIME;
|
||
model.REQUESTSTATUS = 1;
|
||
model.CUSTOMERUSERNAME = "";
|
||
model.SZZYORDERID = orderDetail.ORDERID;
|
||
model.OPENDAYS = orderDetail.TOTALDAYS;
|
||
|
||
|
||
if (Common.Utility.IsNum(orderDetail.CREATEUSER))
|
||
{
|
||
if (orderDetail.CREATEUSER.Length < 6)
|
||
{
|
||
var uid = InnerUserHelper.Instance.GetUserIdByEid(Convert.ToDecimal(orderDetail.CREATEUSER));
|
||
if (uid > 1)
|
||
{
|
||
model.INNERUSERID = Convert.ToDecimal(orderDetail.CREATEUSER);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
model.INNERUSERID = Convert.ToDecimal(orderDetail.CREATEUSER);
|
||
}
|
||
}
|
||
|
||
if (orderDetail.ISPAYED != 0)
|
||
{
|
||
model.ARRIVALTIME = orderDetail.CTIME;
|
||
model.ORDERSTATUS = "3";
|
||
model.ORDERSTATUSNAME = "已支付";
|
||
|
||
var orderWebPay = orderDetail.orderWebPay.FirstOrDefault();
|
||
if (orderWebPay != null)
|
||
{
|
||
model.ARRIVALPAY = orderWebPay.PAYTOTAL;
|
||
model.FINALPAY = orderWebPay.PAYTOTAL;
|
||
}
|
||
}
|
||
if (orderDetail.ISOPEN != 0)
|
||
{
|
||
model.ORDERSTATUS = "4";
|
||
model.ORDERSTATUSNAME = "已开通";
|
||
model.OTIME = orderDetail.OTIME;
|
||
}
|
||
var orderDetailExt = orderDetail.orderExt.FirstOrDefault();
|
||
if (orderDetailExt != null)
|
||
{
|
||
model.CNAME = orderDetailExt.FULLNAME;
|
||
}
|
||
return wx_SzzyOrder_BL.Add(model) == 1;
|
||
}
|
||
|
||
private bool updateOrder(Soft_OrderDetail orderDetail, WX_SZZYORDER model)
|
||
{
|
||
model.RESID = orderDetail.orderExt.FirstOrDefault().MOBILE;
|
||
model.ISOPEN = orderDetail.ISPAYED != 0 ? 1 : 0;
|
||
model.NEEDPAY = orderDetail.TOTALPRICE;
|
||
model.RETURNNEEDPAY = orderDetail.TOTALPRICE;
|
||
model.PRODUCTID = getProductId(orderDetail.BIGPRODUCTCODE);
|
||
model.SUBPRODUCTID = getSubProductId(orderDetail.PRODUCTCODE);
|
||
model.PRODUCTNAME = wx_SzzyProduct_BL.Get(m => m.PRODUCTID == model.PRODUCTID).PRODUCTNAME;
|
||
model.SUBPRODUCTNAME = wx_SzzySubProduct_BL.Get(m => m.SUBPRODUCTID == model.SUBPRODUCTID).SUBPRODUCTNAME;
|
||
//model.CTIME = orderDetail.CTIME;
|
||
model.OPERATETIME = orderDetail.CTIME;
|
||
model.SZZYORDERID = orderDetail.ORDERID;
|
||
model.OTIME = orderDetail.OTIME;
|
||
model.OPENDAYS = orderDetail.TOTALDAYS;
|
||
|
||
|
||
if (Common.Utility.IsNum(orderDetail.CREATEUSER))
|
||
{
|
||
if (orderDetail.CREATEUSER.Length < 6)
|
||
{
|
||
var uid = InnerUserHelper.Instance.GetUserIdByEid(Convert.ToDecimal(orderDetail.CREATEUSER));
|
||
if (uid > 1)
|
||
{
|
||
model.INNERUSERID = Convert.ToDecimal(orderDetail.CREATEUSER);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
model.INNERUSERID = Convert.ToDecimal(orderDetail.CREATEUSER);
|
||
}
|
||
}
|
||
|
||
if (orderDetail.ISPAYED != 0)
|
||
{
|
||
model.ARRIVALTIME = orderDetail.CTIME;
|
||
model.ORDERSTATUS = "3";
|
||
model.ORDERSTATUSNAME = "已支付";
|
||
|
||
var orderWebPay = orderDetail.orderWebPay.FirstOrDefault();
|
||
if (orderWebPay != null)
|
||
{
|
||
model.ARRIVALPAY = orderWebPay.PAYTOTAL;
|
||
model.FINALPAY = orderWebPay.PAYTOTAL;
|
||
}
|
||
}
|
||
if (orderDetail.ISOPEN != 0)
|
||
{
|
||
model.ORDERSTATUS = "4";
|
||
model.ORDERSTATUSNAME = "已开通";
|
||
}
|
||
var orderDetailExt = orderDetail.orderExt.FirstOrDefault();
|
||
if (orderDetailExt != null && !string.IsNullOrEmpty(orderDetailExt.FULLNAME))
|
||
{
|
||
model.CNAME = orderDetailExt.FULLNAME;
|
||
}
|
||
return wx_SzzyOrder_BL.Update(model);
|
||
}
|
||
|
||
private bool addOrderExt(Soft_OrderDetail orderDetail, decimal orderId)
|
||
{
|
||
WX_ORDEREXT orderExt = new WX_ORDEREXT();
|
||
orderExt.ORDERID = orderId;
|
||
orderExt.SOFTUSERNAME = orderDetail.PcUserName;
|
||
orderExt.APPUSERNAME = orderDetail.USERNAME;
|
||
orderExt.ISPAYED = orderDetail.ISPAYED;
|
||
orderExt.PRODUCTID = orderDetail.PRODUCTID;
|
||
orderExt.PRODUCTCODE = orderDetail.PRODUCTCODE;
|
||
orderExt.BIGPRODUCTCODE = orderDetail.BIGPRODUCTCODE;
|
||
orderExt.CHANNEL = orderDetail.CHANNEL;
|
||
orderExt.BOOKNUM = orderDetail.BOOKNUM;
|
||
orderExt.ORDERSTATUS = orderDetail.ORDERSTATUS;
|
||
orderExt.ORDERSOURCE = orderDetail.ORDERSOURCE;
|
||
orderExt.OPENUSER = orderDetail.OPENUSER;
|
||
orderExt.OPENDAYS = orderDetail.TOTALDAYS;
|
||
var orderWebPay = orderDetail.orderWebPay.FirstOrDefault();
|
||
if (orderWebPay != null)
|
||
{
|
||
orderExt.PAYTYPE = orderWebPay.PAYTYPE;
|
||
orderExt.PAYNO = orderWebPay.WEBPAYID;
|
||
}
|
||
return wx_OrderExt_BL.Add(orderExt) == 1;
|
||
}
|
||
|
||
private bool updateOrderExt(Soft_OrderDetail orderDetail, WX_ORDEREXT orderExt)
|
||
{
|
||
orderExt.SOFTUSERNAME = orderDetail.PcUserName;
|
||
orderExt.APPUSERNAME = orderDetail.USERNAME;
|
||
orderExt.ISPAYED = orderDetail.ISPAYED;
|
||
orderExt.PRODUCTID = orderDetail.PRODUCTID;
|
||
orderExt.PRODUCTCODE = orderDetail.PRODUCTCODE;
|
||
orderExt.BIGPRODUCTCODE = orderDetail.BIGPRODUCTCODE;
|
||
orderExt.CHANNEL = orderDetail.CHANNEL;
|
||
orderExt.BOOKNUM = orderDetail.BOOKNUM;
|
||
orderExt.ORDERSTATUS = orderDetail.ORDERSTATUS;
|
||
orderExt.ORDERSOURCE = orderDetail.ORDERSOURCE;
|
||
orderExt.OPENUSER = orderDetail.OPENUSER;
|
||
orderExt.OPENDAYS = orderDetail.TOTALDAYS;
|
||
var orderWebPay = orderDetail.orderWebPay.FirstOrDefault();
|
||
if (orderWebPay != null)
|
||
{
|
||
orderExt.PAYTYPE = orderWebPay.PAYTYPE;
|
||
orderExt.PAYNO = orderWebPay.WEBPAYID;
|
||
}
|
||
var orderDetailExt = orderDetail.orderExt.FirstOrDefault();
|
||
if (orderDetailExt != null && !string.IsNullOrEmpty(orderDetailExt.FULLNAME))
|
||
{
|
||
orderExt.NAME = orderDetailExt.FULLNAME;
|
||
}
|
||
return wx_OrderExt_BL.Update(orderExt);
|
||
}
|
||
|
||
private void refundListHandler(DateTime ctime, DateTime etime)
|
||
{
|
||
Pager pager = new Pager { page = 1, rows = 1000 };
|
||
var list = refundApplay_q.GetList(ref pager, null, null, null, ctime, etime);
|
||
foreach (var model in list)
|
||
{
|
||
if (model.L2ORDERSTATUS == Convert.ToInt32(WX.CRM.Model.Enum.L2OrderStatus.已停用) || model.L2ORDERSTATUS == Convert.ToInt32(WX.CRM.Model.Enum.L2OrderStatus.已取消))
|
||
{
|
||
var item = wx_SzzyOrder_BL.Get(m => m.SZZYORDERID == model.ORDERID);
|
||
if (item != null)
|
||
{
|
||
if (item.ORDERSTATUS == "3")
|
||
{
|
||
item.ISOPEN = 0;
|
||
}
|
||
if (model.ORDERSTATUS == Convert.ToInt32(WX.CRM.Model.Enum.L2OrderApplayStatus.已退款))
|
||
{
|
||
item.ORDERSTATUS = "7";
|
||
item.ORDERSTATUSNAME = "已退款";
|
||
}
|
||
else
|
||
{
|
||
item.ORDERSTATUS = "8";
|
||
item.ORDERSTATUSNAME = "已取消";
|
||
}
|
||
wx_SzzyOrder_BL.Update(item);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
private decimal? getSubProductId(string productCode)
|
||
{
|
||
//if (productCode == "OEM_TDZYB90")
|
||
//{
|
||
// return 10011;
|
||
//}
|
||
//else if (productCode == "OEM_TDTGB90")
|
||
//{
|
||
// return 10021;
|
||
//}
|
||
//else if (productCode == "OEM_TDSRDZ")
|
||
//{
|
||
// return 10031;
|
||
//}
|
||
//else if (productCode == "OEM_ZGB_LHB")
|
||
//{
|
||
// return 20011;
|
||
//}
|
||
//else if (productCode == "OEM_NGZZD30")
|
||
//{
|
||
// return 20021;
|
||
//}
|
||
//else if (productCode == "OEM_LTMJ30")
|
||
//{
|
||
// return 20031;
|
||
//}
|
||
//else
|
||
//{
|
||
// return 0;
|
||
//}
|
||
|
||
var model = subProductList.Where(m => m.PRODUCTCODE == productCode).FirstOrDefault();
|
||
if (model != null)
|
||
{
|
||
return model.SUBPRODUCTID;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
}
|
||
|
||
private decimal? getProductId(string productCode)
|
||
{
|
||
if (productCode == "OEM_TDTGB")
|
||
{
|
||
return 1002;
|
||
}
|
||
else if (productCode == "OEM_TDZYB")
|
||
{
|
||
return 1001;
|
||
}
|
||
else if (productCode == "OEM_TDSRDZ")
|
||
{
|
||
return 1003;
|
||
}
|
||
else if (productCode == "OEM_LHB")
|
||
{
|
||
return 2001;
|
||
}
|
||
else if (productCode == "OEM_NGZZD")
|
||
{
|
||
return 2002;
|
||
}
|
||
else if (productCode == "OEM_LTMJ")
|
||
{
|
||
return 2003;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
public class TDOrderJob : IJob
|
||
{
|
||
static bool _isNotice = false;
|
||
|
||
public void Execute(JobExecutionContext context)
|
||
{
|
||
if (_isNotice)
|
||
return;
|
||
try
|
||
{
|
||
_isNotice = true;
|
||
new TDOrder().Start();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogHelper.Error("WX.CRM.CRMServices.Level2.TDOrderJob.Execute:" + ex);
|
||
}
|
||
finally
|
||
{
|
||
_isNotice = false;
|
||
}
|
||
throw new NotImplementedException();
|
||
}
|
||
}
|
||
}
|