|
|
@ -18,8 +18,8 @@ namespace CK.SCP.Controller |
|
|
|
|
|
|
|
|
|
|
|
public class SCP_CONTRACT_CONTROLLER |
|
|
|
{ |
|
|
|
public static void Get_TB_CONTRACT_List(TB_CONTRACT p_entity, Action<ResultObject<IQueryable<TB_CONTRACT>>> p_action) |
|
|
|
{ |
|
|
|
public static void Get_TB_CONTRACT_List(TB_CONTRACT p_entity, Action<ResultObject<IQueryable<TB_CONTRACT>>> p_action) |
|
|
|
{ |
|
|
|
ResultObject<IQueryable<TB_CONTRACT>> _ret = new ResultObject<IQueryable<TB_CONTRACT>>(); |
|
|
|
try |
|
|
@ -63,11 +63,11 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
q = q.Where(p => p.BillNo.Contains(p_entity.BillNo)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Succeed; |
|
|
|
_ret.Result = q; |
|
|
|
p_action(_ret); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)//捕获实体验证异常
|
|
|
@ -87,7 +87,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (OptimisticConcurrencyException ex)//并发冲突异常
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "Get_TB_CONTRACT_List", ex.ToString()); |
|
|
@ -95,7 +95,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (ScpException ex) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
@ -103,7 +103,7 @@ namespace CK.SCP.Controller |
|
|
|
if (ex.InnerException != null && ex.InnerException.GetType() == typeof(UpdateException)) |
|
|
|
{ |
|
|
|
var inner = (UpdateException)ex.InnerException; |
|
|
|
|
|
|
|
|
|
|
|
throw new ScpException(ResultCode.Exception, "0000", ex.ToString()); |
|
|
|
} |
|
|
|
else |
|
|
@ -118,7 +118,7 @@ namespace CK.SCP.Controller |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "Get_TB_CONTRACT_List", e.Message); |
|
|
|
throw e; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
public static ResultObject<List<TB_CONTRACT_DETAIL>> Get_TB_CONTRACT_DETAIL_List(TB_CONTRACT_DETAIL p_entity) |
|
|
|
{ |
|
|
@ -164,10 +164,10 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
q = q.Where(p => p.UpdateInfo.Contains(p_entity.UpdateInfo)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
q = q.Where(p => p.IsDeleted == p_entity.IsDeleted); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Succeed; |
|
|
|
_ret.Result = q.ToList(); |
|
|
|
} |
|
|
@ -191,7 +191,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (OptimisticConcurrencyException ex)//并发冲突异常
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "Get_TB_CONTRACT_DETAIL_List", ex.ToString()); |
|
|
@ -199,7 +199,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (ScpException ex) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
@ -209,7 +209,7 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
var inner = (UpdateException)ex.InnerException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
throw new ScpException(ResultCode.Exception, "0000", ex.ToString()); |
|
|
|
} |
|
|
|
else |
|
|
@ -230,13 +230,13 @@ namespace CK.SCP.Controller |
|
|
|
public static List<string> NOTIFY_COMPARE_PRICE(List<TB_CONTRACT_DETAIL_PRICE> p_priceList, List<V_TB_PO_DETAIL> p_polist) |
|
|
|
{ |
|
|
|
List<string> msgList = new List<string>(); |
|
|
|
var ret= from po in p_polist |
|
|
|
join price in p_priceList on po.PartCode equals price.PartCode |
|
|
|
select new { VAL1 = po, VAL2 = price }; |
|
|
|
var list = ret.Where(p=> p.VAL1.BeginTime>=p.VAL2.BeginTime && p.VAL1.BeginTime<=p.VAL2.EndTime && p.VAL1.PlanQty>=p.VAL2.QtyBegin && p.VAL1.PlanQty < p.VAL2.QtyEnd && (p.VAL1.Price> p.VAL2.Price || p.VAL1.Price==0)); |
|
|
|
foreach(var itm in list) |
|
|
|
var ret = from po in p_polist |
|
|
|
join price in p_priceList on po.PartCode equals price.PartCode |
|
|
|
select new { VAL1 = po, VAL2 = price }; |
|
|
|
var list = ret.Where(p => p.VAL1.BeginTime >= p.VAL2.BeginTime && p.VAL1.BeginTime <= p.VAL2.EndTime && p.VAL1.PlanQty >= p.VAL2.QtyBegin && p.VAL1.PlanQty < p.VAL2.QtyEnd && (p.VAL1.Price > p.VAL2.Price || p.VAL1.Price == 0)); |
|
|
|
foreach (var itm in list) |
|
|
|
{ |
|
|
|
msgList.Add(string.Format("物料编码{0}价格{1}与合同价格{2}不一致",itm.VAL1.PartCode, itm.VAL1.Price, itm.VAL2.Price)); |
|
|
|
msgList.Add(string.Format("物料编码{0}价格{1}与合同价格{2}不一致", itm.VAL1.PartCode, itm.VAL1.Price, itm.VAL2.Price)); |
|
|
|
} |
|
|
|
return msgList; |
|
|
|
|
|
|
@ -250,7 +250,7 @@ namespace CK.SCP.Controller |
|
|
|
// {
|
|
|
|
// using (ScpEntities db = EntitiesFactory.CreateScpInstance())
|
|
|
|
// {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
// }
|
|
|
@ -264,14 +264,14 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
if (p_list.Count > 0) |
|
|
|
{ |
|
|
|
var ret= Get_TB_CONTRACT_DETAIL_PRICE_List(new TB_CONTRACT_DETAIL_PRICE() { VendId = p_list[0].VendId }); |
|
|
|
var ret = Get_TB_CONTRACT_DETAIL_PRICE_List(new TB_CONTRACT_DETAIL_PRICE() { VendId = p_list[0].VendId }); |
|
|
|
if (ret.State == ReturnStatus.Succeed) |
|
|
|
{ |
|
|
|
var p_priceList = ret.Result; |
|
|
|
List<string> msgList = new List<string>(); |
|
|
|
var ls = from po in p_list |
|
|
|
join price in p_priceList on po.PartCode equals price.PartCode |
|
|
|
select new { VAL1 = po, VAL2 = price }; |
|
|
|
join price in p_priceList on po.PartCode equals price.PartCode |
|
|
|
select new { VAL1 = po, VAL2 = price }; |
|
|
|
var list = ls.Where(p => p.VAL1.BeginTime >= p.VAL2.BeginTime && p.VAL1.BeginTime <= p.VAL2.EndTime && p.VAL1.Qty >= p.VAL2.QtyBegin && p.VAL1.Qty < p.VAL2.QtyEnd); |
|
|
|
p_list.ForEach(p => |
|
|
|
{ |
|
|
@ -361,7 +361,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
return p_list; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static List<V_TB_ASK_DETAIL> GET_CONTRACT_PRICE_LIST(List<V_TB_ASK_DETAIL> p_list) |
|
|
|
{ |
|
|
@ -397,7 +397,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static ResultObject<List<TB_CONTRACT_DETAIL_PRICE>> Get_TB_CONTRACT_DETAIL_PRICE_List(TB_CONTRACT_DETAIL_PRICE p_entity,int p_qty=0) |
|
|
|
public static ResultObject<List<TB_CONTRACT_DETAIL_PRICE>> Get_TB_CONTRACT_DETAIL_PRICE_List(TB_CONTRACT_DETAIL_PRICE p_entity, int p_qty = 0) |
|
|
|
{ |
|
|
|
ResultObject<List<TB_CONTRACT_DETAIL_PRICE>> _ret = new ResultObject<List<TB_CONTRACT_DETAIL_PRICE>>(); |
|
|
|
try |
|
|
@ -405,7 +405,7 @@ namespace CK.SCP.Controller |
|
|
|
using (ScpEntities db = EntitiesFactory.CreateScpInstance()) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IQueryable<TB_CONTRACT_DETAIL_PRICE> q = db.TB_CONTRACT_DETAIL_PRICE; |
|
|
|
if (p_entity.UID != 0) |
|
|
|
{ |
|
|
@ -439,10 +439,10 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
q = q.Where(p => p.VendId.Contains(p_entity.VendId)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
q = q.Where(p => p.IsDeleted == p_entity.IsDeleted); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Succeed; |
|
|
|
_ret.Result = q.ToList(); |
|
|
|
} |
|
|
@ -466,7 +466,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (OptimisticConcurrencyException ex)//并发冲突异常
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "Get_TB_CONTRACT_DETAIL_PRICE_List", ex.ToString()); |
|
|
@ -474,7 +474,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (ScpException ex) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
@ -484,7 +484,7 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
var inner = (UpdateException)ex.InnerException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
throw new ScpException(ResultCode.Exception, "0000", ex.ToString()); |
|
|
|
} |
|
|
|
else |
|
|
@ -615,11 +615,11 @@ namespace CK.SCP.Controller |
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(itm.合同编号)) |
|
|
|
{ |
|
|
|
_buffer.AppendFormat(string.Format("导入错误合同编号未填写!")); |
|
|
|
_buffer.AppendFormat(string.Format("导入错误合同编号未填写!")); |
|
|
|
} |
|
|
|
if (string.IsNullOrEmpty(itm.供应商代码) || string.IsNullOrEmpty(itm.供应商名称)) |
|
|
|
{ |
|
|
|
_buffer.AppendFormat(string.Format("导入错误供应商编号或供应商名称未填写!")); |
|
|
|
_buffer.AppendFormat(string.Format("导入错误供应商编号或供应商名称未填写!")); |
|
|
|
} |
|
|
|
if (string.IsNullOrEmpty(itm.供应商物料号) || string.IsNullOrEmpty(itm.物料描述)) |
|
|
|
{ |
|
|
@ -705,7 +705,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
if (_buffer.Length > 0) |
|
|
|
{ |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "IMPORT_CONTRACT_CHECK",_buffer.ToString()); |
|
|
|
LogHelper.Writlog(LogHelper.LogType.Error, typeof(SCP_CONTRACT_CONTROLLER), "IMPORT_CONTRACT_CHECK", _buffer.ToString()); |
|
|
|
return _buffer.ToString(); |
|
|
|
} |
|
|
|
return string.Empty; |
|
|
@ -714,7 +714,7 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
ResultObject<bool> _ret = new ResultObject<bool>(); |
|
|
|
int line = 1; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var itm in p_contract_list) |
|
|
|
{ |
|
|
|
if (!string.IsNullOrEmpty(IMPORT_CONTRACT_CHECK(itm))) |
|
|
@ -731,15 +731,15 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
var _contract = p_contract_list.FirstOrDefault(); |
|
|
|
#region 删除老合同
|
|
|
|
var contract=db.TB_CONTRACT.Where(p => p.VendId == _contract.供应商代码 && p.ContractNo == _contract.合同编号); |
|
|
|
var contract = db.TB_CONTRACT.Where(p => p.VendId == _contract.供应商代码 && p.ContractNo == _contract.合同编号); |
|
|
|
if (contract.Count() > 0) |
|
|
|
{ |
|
|
|
var c = contract.FirstOrDefault(); |
|
|
|
if (!string.IsNullOrEmpty(c.BillNo)) |
|
|
|
{ |
|
|
|
var detailPrice = db.TB_CONTRACT_DETAIL_PRICE.Where(p => p.BillNo ==c.BillNo); |
|
|
|
var detailPrice = db.TB_CONTRACT_DETAIL_PRICE.Where(p => p.BillNo == c.BillNo); |
|
|
|
db.TB_CONTRACT_DETAIL_PRICE.RemoveRange(detailPrice); |
|
|
|
var detail=db.TB_CONTRACT_DETAIL.Where(p => p.BillNo ==c.BillNo); |
|
|
|
var detail = db.TB_CONTRACT_DETAIL.Where(p => p.BillNo == c.BillNo); |
|
|
|
db.TB_CONTRACT_DETAIL.RemoveRange(detail); |
|
|
|
db.TB_CONTRACT.Remove(c); |
|
|
|
} |
|
|
@ -752,11 +752,11 @@ namespace CK.SCP.Controller |
|
|
|
_tbContract.CreateUser = p_creator; |
|
|
|
_tbContract.ContractNo = _contract.合同编号; |
|
|
|
_tbContract.IsDeleted = false; |
|
|
|
|
|
|
|
|
|
|
|
db.TB_CONTRACT.Add(_tbContract); |
|
|
|
|
|
|
|
|
|
|
|
var list = p_contract_list.Distinct(new SCP_CONTRACT_EXCEL_COMPARE()).ToList(); |
|
|
|
var list = p_contract_list.Distinct(new SCP_CONTRACT_EXCEL_COMPARE()).ToList(); |
|
|
|
foreach (var itm in list) |
|
|
|
{ |
|
|
|
var _tbContract_detail = new TB_CONTRACT_DETAIL(); |
|
|
@ -780,7 +780,7 @@ namespace CK.SCP.Controller |
|
|
|
_detail_price.EndTime = ConvertHelper.To<DateTime>(itm.结束日期); |
|
|
|
_detail_price.ContractNo = _tbContract.ContractNo; |
|
|
|
_detail_price.QtyBegin = int.Parse(itm.最小起订量1); |
|
|
|
_detail_price.QtyEnd = !string.IsNullOrEmpty(itm.最小起订量2)? int.Parse(itm.最小起订量2):999999999; |
|
|
|
_detail_price.QtyEnd = !string.IsNullOrEmpty(itm.最小起订量2) ? int.Parse(itm.最小起订量2) : 999999999; |
|
|
|
_detail_price.BillNo = _tbContract.BillNo; |
|
|
|
_detail_price.IsDeleted = false; |
|
|
|
_detail_price.PartCode = itm.供应商物料号; |
|
|
@ -863,7 +863,7 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.Result = false; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
@ -887,7 +887,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (OptimisticConcurrencyException ex)//并发冲突异常
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.Result = false; |
|
|
|
_ret.ErrorList.Add(ex); |
|
|
@ -896,7 +896,7 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
catch (ScpException ex) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ret.State = ReturnStatus.Failed; |
|
|
|
_ret.Result = false; |
|
|
@ -907,7 +907,7 @@ namespace CK.SCP.Controller |
|
|
|
{ |
|
|
|
var inner = (UpdateException)ex.InnerException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
throw new ScpException(ResultCode.Exception, "0000", ex.ToString()); |
|
|
|
} |
|
|
|
else |
|
|
@ -928,5 +928,77 @@ namespace CK.SCP.Controller |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static List<V_TB_ASK_DETAIL> GET_CONTRACT_PRICE_LIST_BJ(List<V_TB_ASK_DETAIL> p_list) |
|
|
|
{ |
|
|
|
|
|
|
|
if (p_list.Count > 0) |
|
|
|
{ |
|
|
|
//var ret = Get_TB_CONTRACT_DETAIL_PRICE_List(new TB_CONTRACT_DETAIL_PRICE() { VendId = p_list[0].VendId });
|
|
|
|
//if (ret.State == ReturnStatus.Succeed)
|
|
|
|
//{
|
|
|
|
ScpEntities db = EntitiesFactory.CreateScpInstance(); |
|
|
|
string vendid = p_list[0].VendId; |
|
|
|
List<TB_CONTRACT_DETAIL_PRICE> res = db.TB_CONTRACT_DETAIL_PRICE.Where(q => q.VendId == vendid && q.IsDeleted == false).ToList(); |
|
|
|
var p_priceList = res; |
|
|
|
|
|
|
|
List<string> msgList = new List<string>(); |
|
|
|
var ls = from ask in p_list |
|
|
|
join price in p_priceList on ask.PartCode equals price.PartCode |
|
|
|
select new { VAL1 = ask, VAL2 = price }; |
|
|
|
var list = ls.Where(p => p.VAL1.BeginTime >= p.VAL2.BeginTime && p.VAL1.BeginTime <= p.VAL2.EndTime && p.VAL1.AskQty >= p.VAL2.QtyBegin && p.VAL1.AskQty < p.VAL2.QtyEnd); |
|
|
|
var asklist = p_list.Select(q => q.AskBillNum).ToList(); |
|
|
|
var asndetaillist = db.V_TB_ASN_DETAIL.Where(pl => pl.IsDeleted == false && asklist.Contains(pl.AskBillNum)).ToList(); |
|
|
|
var arrlist = db.TB_ARRIVE_DETAIL.Where(pl => asklist.Contains(pl.Remark) && pl.IsDeleted == false && pl.State == (int)ArriveState.OK && pl.Qty < 0 && pl.BillType == 3).ToList(); |
|
|
|
p_list.ForEach(p => |
|
|
|
{ |
|
|
|
var _entity = list.ToList().Where(itm => itm.VAL1.PartCode == p.PartCode).FirstOrDefault(); |
|
|
|
if (_entity != null) |
|
|
|
{ |
|
|
|
p.ContractPrice = _entity.VAL2.Price; |
|
|
|
p.BlancePrice = p.ContractPrice - p.Price; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
p.ContractPrice = p.Price; |
|
|
|
p.BlancePrice = 0; |
|
|
|
} |
|
|
|
|
|
|
|
//var list11 = db.V_TB_ASN_DETAIL.Where(pl => pl.IsDeleted == false && p.AskBillNum == pl.AskBillNum).ToList();
|
|
|
|
var list_back = arrlist.Where(q => q.Remark == p.AskBillNum).GroupBy(pl => new { pl.Remark, pl.PoLine, pl.PartCode, pl.PoBillNum }).Select(pl => new { BackSum = pl.Sum(itm => itm.Qty), PoLine = pl.Key.PoLine, Remark = pl.Key.Remark, PartCode = pl.Key.PartCode, PoBillNum = pl.Key.PoBillNum }).ToList(); |
|
|
|
var groupList = asndetaillist.Where(q => q.AskBillNum == p.AskBillNum).GroupBy(pl => new { pl.PoBillNum, pl.PoLine, pl.PartCode, pl.AskBillNum }).Select( |
|
|
|
pl => new |
|
|
|
{ |
|
|
|
ShipSum = pl.Sum(itm => itm.Qty), |
|
|
|
PoLine = pl.Key.PoLine, |
|
|
|
PoBillNum = pl.Key.PoBillNum, |
|
|
|
PartCode = pl.Key.PartCode, |
|
|
|
AskBillNum = pl.Key.AskBillNum |
|
|
|
}).ToList(); |
|
|
|
groupList.ForEach(pa => |
|
|
|
{ |
|
|
|
if (pa.PoBillNum == p.PoBillNum && pa.PoLine == p.PoLine && pa.PartCode == p.PartCode && pa.AskBillNum == p.AskBillNum) |
|
|
|
{ |
|
|
|
p.ShippedQty = pa.ShipSum; |
|
|
|
} |
|
|
|
}); |
|
|
|
list_back.ForEach(pl => |
|
|
|
{ |
|
|
|
if (pl.PoBillNum == p.PoBillNum && pl.PoLine == p.PoLine && pl.PartCode == p.PartCode) |
|
|
|
{ |
|
|
|
p.RejectQty = Math.Abs(pl.BackSum);//寄售退货数
|
|
|
|
} |
|
|
|
}); |
|
|
|
decimal a = p.AskQty - (p.ShippedQty == null ? 0 : (decimal)p.ShippedQty) + p.RejectQty - (p.ReduceQty == null ? 0 : (decimal)p.ReduceQty); |
|
|
|
p.CanQty = a; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}); |
|
|
|
//}
|
|
|
|
} |
|
|
|
return p_list; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|