记录下思路
/// <summary>
/// 审核与弃审时顺推金额
/// </summary>
/// <param name="subDataTable">需要处理的表数据</param>
/// <param name="isApprove">是否审核</param>
/// <param name="billTabelName">单据的表名</param>
/// <param name="orderTabelName">订单的表名</param>
/// <remarks>2015-06-04 add by fuwp </remarks>
private void processBill(LibDataTable subDataTable, bool isApprove)
{
//如果没有表数据则返回空
if (subDataTable == null)
return;
DataRow[] selectRow = null;
存储SQL执行语句集合
//List<string> sqlList = new List<string>();
//发票金额
decimal decBillingMny = decimal.Zero;
//string execsql = string.Empty;
主表
//string masterTableName = getBillType() == BillTypeEnum.SCM0800 ? "T_SCM_SALEOUT" : "T_SCM_PURCHASEIN";
//子表
string subTabelName = getBillType() == BillTypeEnum.SCM0800 ? "T_SCM_SALEOUT_B" : "T_SCM_PURCHASEIN_B";
//订单
string orderTabelName = getBillType() == BillTypeEnum.SCM0800 ? "T_SCM_SALEORDER_B" : "T_SCM_PURCHASEORDER_B";
BillTypeEnum fromtype = BillTypeEnum.SCM0010;
//4张业务单据表体正数合计>表体负数合计
bool isPositive = false;
object result=null;
foreach (DataRow drs in this.Tables[1].Rows)
{
if (drs.RowState == DataRowState.Deleted)
continue;
//开票登记表.发票金额--->业务单据主表的开票金额
decBillingMny = LibSysUtils.ToDecimal(drs["BillingMny"]);
fromtype = (BillTypeEnum)Enum.Parse(typeof(BillTypeEnum), drs["FromBillType"].ToString());
//发票金额还小于0 进货单、销售单的主表金额为负(整个子表的金额合计为负数,则需要先满足所有的正数,在计算负数)
//或者进货退货单、销售退货单的主表金额为正(整个子表的金额合计为正数,则需要先满足所有的负数,在计算正数)
//4张业务单据表体正数合计>表体负数合计.
//找到单据的子表数据
selectRow = subDataTable.Select(string.Format("masterid='{0}'", drs["FromBillID"]));
//退货情况取值0-x
if (fromtype == BillTypeEnum.SCM0030 || fromtype == BillTypeEnum.SCM0150)
//退货情况
decBillingMny = 0 - decBillingMny;
isPositive = LibSysUtils.ToDecimal(decBillingMny) > 0;
result = subDataTable.Compute("count(masterid)", string.Format("masterid='{0}' and {1}", drs["FromBillID"], isPositive ? "totalMny<0" : "totalMny>0"));
if (LibSysUtils.ToInt32(result) > 0)
{
if (!isPositive)
//表头为负、表体存在正负数情况
processBillByNegative(decBillingMny, selectRow, isApprove, subTabelName, orderTabelName);
else
//表头为正、表体存在正负数情况 positive
processBillByPositive(decBillingMny, selectRow, isApprove, subTabelName, orderTabelName);
}
else
{
//表体全为正数或者表体全为负数
processBillBySameBody(decBillingMny, selectRow, isApprove, subTabelName, orderTabelName);
}
}
}
<span style="white-space:pre"> </span>/// <summary>
/// 处理表体正正数据、负负数据
/// </summary>
/// <param name="decBillingMny">开票金额</param>
/// <param name="selectRow">子表数据</param>
public void processBillBySameBody(decimal decBillingMny, DataRow[] selectRow, bool isApprove, string subTabelName, string orderTabelName)
{
if (selectRow == null)
return;
if (selectRow.Length <= 0)
return;
//余额
decimal balanceMny = decimal.Zero;
//存储SQL执行语句集合
List<string> sqlList = new List<string>();
string execsql = string.Empty;
foreach (DataRow dr in selectRow)
{
//如果结算金额=0.则所有表体付收款金额都为0
if (decBillingMny == 0)
dr["BillingMny"] = 0;
if (isApprove)
//开票金额
balanceMny = LibSysUtils.ToDecimal(dr["TotalMny"]) - LibSysUtils.ToDecimal(dr["BillingMny"]);
else
balanceMny = LibSysUtils.ToDecimal(dr["BillingMny"]);//已开票的
if (Math.Abs(decBillingMny) - Math.Abs(balanceMny) >= 0)
{
dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
//分配剩下的金额
decBillingMny = decBillingMny - balanceMny;
}
else
{
dr["BillingMny"] = isApprove ? (decBillingMny) : (0 - decBillingMny);
decBillingMny = 0;
}
//创建销售单、销售退货单、进货单、进货退货单的更新语句-->子表
sqlList.Add(createUpdateSql(subTabelName, "BillingMny", dr["BillingMny"], LibSysUtils.ToString(dr["Id"])));
if (LibSysUtils.ToDecimal(dr["BillingMny"]) != 0)
{
//退货情况取负数
if ((LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0150.ToString()) || LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0030.ToString())))
dr["BillingMny"] = 0 - LibSysUtils.ToDecimal(dr["BillingMny"]);
//更新订单
execsql = createOrderUpdateSql(orderTabelName, "BillingMny", dr["BillingMny"], dr["OrderId"].ToString(), getBillType() == BillTypeEnum.SCM0800 ? "SaleOrderId" : "PurchaseOrderId", dr["OrderRowId"].ToString());
if (!string.IsNullOrEmpty(execsql))
sqlList.Add(execsql);
}
}
if (sqlList.Count > 0)
this.DataAccess.ExecuteNonQuery(sqlList);
}
/// <summary>
/// 处理表体正负数据、表头为负
/// 整个子表的金额合计为负数,则需要先满足所有的正数,在计算负数
/// </summary>
/// <param name="decBillingMny">结算金额</param>
/// <param name="selectRow"></param>
/// <param name="isApprove"></param>
public void processBillByNegative(decimal decBillingMny, DataRow[] selectRow, bool isApprove, string subTabelName, string orderTabelName)
{
if (selectRow == null)
return;
if (selectRow.Length <= 0)
return;
//余额
decimal balanceMny = decimal.Zero;
//标识位:标记是否需要执行扣减后更新
bool isTip = false;
//存储SQL执行语句集合
List<string> sqlList = new List<string>();
string execsql = string.Empty;
decimal orderMny = decimal.Zero;
foreach (DataRow drowItem in selectRow)
{
if (isApprove)
//开票金额
balanceMny = LibSysUtils.ToDecimal(drowItem["TotalMny"]) - LibSysUtils.ToDecimal(drowItem["BillingMny"]);
else
balanceMny = LibSysUtils.ToDecimal(drowItem["BillingMny"]);//已开票的
//表头为负,则先满足所有的正数
if (balanceMny > 0)
{
decBillingMny = decBillingMny - balanceMny;
continue;
}
}
decimal originalBillingMny = decimal.Zero;
foreach (DataRow dr in selectRow)
{
originalBillingMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
//如果结算金额=0.则所有表体付收款金额都为0
if (decBillingMny == 0)
{
if (isApprove)
dr["BillingMny"] = 0;
else
decBillingMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
}
isTip = false;
if (isApprove)
//开票金额
balanceMny = LibSysUtils.ToDecimal(dr["totalMny"]) - LibSysUtils.ToDecimal(dr["BillingMny"]);
else
balanceMny = LibSysUtils.ToDecimal(dr["BillingMny"]);//已开票的
if (balanceMny > 0)
{
dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
orderMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
if (LibSysUtils.ToDecimal(dr["totalMny"]) - originalBillingMny == 0)
orderMny = isApprove ? 0 : 0 - originalBillingMny;
isTip = true;
}
if (!isTip)
{
if (Math.Abs(decBillingMny) - Math.Abs(balanceMny) >= 0)
{
dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
//分配剩下的金额
decBillingMny = decBillingMny - balanceMny;
}
else
{
dr["BillingMny"] = isApprove ? (decBillingMny) : (0 - decBillingMny);
decBillingMny = 0;
}
orderMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
}
//创建销售单、销售退货单、进货单、进货退货单的更新语句-->子表
sqlList.Add(createUpdateSql(subTabelName, "BillingMny", dr["BillingMny"], LibSysUtils.ToString(dr["Id"])));//
if (orderMny != 0)
{
//退货情况取负数
if ((LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0150.ToString()) || LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0030.ToString())))
orderMny = 0 - orderMny;
//更新订单
execsql = createOrderUpdateSql(orderTabelName, "BillingMny", orderMny, dr["OrderId"].ToString(), getBillType() == BillTypeEnum.SCM0800 ? "SaleOrderId" : "PurchaseOrderId", dr["OrderRowId"].ToString());
if (!string.IsNullOrEmpty(execsql))
sqlList.Add(execsql);
}
}
if (sqlList.Count > 0)
this.DataAccess.ExecuteNonQuery(sqlList);
}
/// <summary>
/// 处理表体正负数据、表头为正
/// 整个子表的金额合计为正数,则需要先满足所有的负数,在计算正数
/// </summary>
/// <param name="decBillingMny"></param>
/// <param name="selectRow"></param>
/// <param name="isApprove"></param>
public void processBillByPositive(decimal decBillingMny, DataRow[] selectRow, bool isApprove, string subTabelName, string orderTabelName)
{
if (selectRow == null)
return;
if (selectRow.Length <= 0)
return;
//余额
decimal balanceMny = decimal.Zero;
//标识位:标记是否需要执行扣减后更新
bool isTip = false;
//存储SQL执行语句集合
List<string> sqlList = new List<string>();
string execsql = string.Empty;
decimal orderMny = decimal.Zero;
//bool isPositive = LibSysUtils.ToDecimal(decBillingMny) > 0;
foreach (DataRow drowItem in selectRow)
{
//if (fromtype == BillTypeEnum.SCM0030 || fromtype == BillTypeEnum.SCM0150)
// drowItem["BillingMny"] = 0 - LibSysUtils.ToDecimal(drowItem["BillingMny"]);
if (isApprove)
//开票金额
balanceMny = LibSysUtils.ToDecimal(drowItem["TotalMny"]) - LibSysUtils.ToDecimal(drowItem["BillingMny"]);
else
balanceMny = LibSysUtils.ToDecimal(drowItem["BillingMny"]);//已开票的
//(balanceMny <= 0 && isPositive):先满足负数 累加开票金额与负数合计
//if ((balanceMny <= 0 && isPositive) || (balanceMny >= 0 && !isPositive))
//{
// //2个数值方向相反的情况下重新计算分配的金额。需要优先满足正数或者负数
// decBillingMny = decBillingMny - balanceMny;
// continue;
//}
//表头为正,则先满足所有的负数
if (balanceMny < 0)
{
decBillingMny = decBillingMny - balanceMny;
continue;
}
}
decimal originalBillingMny = decimal.Zero;
foreach (DataRow dr in selectRow)
{
originalBillingMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
//如果结算金额=0.则所有表体付收款金额都为0
if (decBillingMny == 0)
{
if (isApprove)
dr["BillingMny"] = 0;
else
{
//dr["BillingMny"] = 0 - LibSysUtils.ToDecimal(dr["BillingMny"]);
decBillingMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
}
}
isTip = false;
if (isApprove)
//开票金额
balanceMny = LibSysUtils.ToDecimal(dr["TotalMny"]) - LibSysUtils.ToDecimal(dr["BillingMny"]);
else
balanceMny = LibSysUtils.ToDecimal(dr["BillingMny"]);//已开票的
//余额小于0,则付收款金额为负数
//if ((!isApprove && ((balanceMny >= 0 && isPositive) || (balanceMny <= 0 && !isPositive))) || (((balanceMny <= 0 && isPositive) || (balanceMny >= 0 && !isPositive)) && isApprove))
//{
// dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
// isTip = true;
//}
if (balanceMny < 0)
{
dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
orderMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
if (LibSysUtils.ToDecimal(dr["totalMny"]) - originalBillingMny == 0)
orderMny = isApprove ? 0 : 0 - originalBillingMny;
isTip = true;
}
//if (((balanceMny <= 0 && isPositive) || (balanceMny >= 0 && !isPositive)) && isApprove)
//{
// dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
// // dr["BillingMny"] = balanceMny;
// isTip = true;
//}
if (!isTip)
{
if (Math.Abs(decBillingMny) - Math.Abs(balanceMny) >= 0)
{
dr["BillingMny"] = isApprove ? (balanceMny) : (0 - balanceMny);
//分配剩下的金额
decBillingMny = decBillingMny - balanceMny;
}
else
{
dr["BillingMny"] = isApprove ? (decBillingMny) : (0 - decBillingMny);
decBillingMny = 0;
}
orderMny = LibSysUtils.ToDecimal(dr["BillingMny"]);
}
//退货情况取负数
//if ((LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0150.ToString()) || LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0030.ToString())))
// dr["BillingMny"] = 0 - LibSysUtils.ToDecimal(dr["BillingMny"]);
//创建销售单、销售退货单、进货单、进货退货单的更新语句-->子表
sqlList.Add(createUpdateSql(subTabelName, "BillingMny", dr["BillingMny"], LibSysUtils.ToString(dr["Id"])));
if (orderMny != 0)
{
//退货情况取负数
if ((LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0150.ToString()) || LibSysUtils.ToString(dr["billtype"]).Equals(BillTypeEnum.SCM0030.ToString())))
orderMny = 0 - orderMny;
//更新订单
execsql = createOrderUpdateSql(orderTabelName, "BillingMny", orderMny, dr["OrderId"].ToString(), getBillType() == BillTypeEnum.SCM0800 ? "SaleOrderId" : "PurchaseOrderId", dr["OrderRowId"].ToString());
if (!string.IsNullOrEmpty(execsql))
sqlList.Add(execsql);
}
}
if (sqlList.Count > 0)
this.DataAccess.ExecuteNonQuery(sqlList);
}
<span style="white-space:pre"> </span>private void backWriteAmount(bool isApprove)
{
//4张单据主键.来源单据类型
string billKeyPrimary = string.Empty, fromBillType = string.Empty;
//付款金额
decimal BillingMny = decimal.Zero;
//存储单据子表的相关信息
LibDataTable processDataTable = null;
//储存明细的主键列表集合
string subkeyPrimay = string.Empty;
foreach (DataRow drs in this.Tables[1].Rows)
{
if (drs.RowState == DataRowState.Deleted)
continue;
//4张业务单据主键ID
billKeyPrimary = LibSysUtils.ToString(drs["FromBillId"]);
//if (!string.IsNullOrEmpty(billKeyPrimary))
// continue;
//开票金额
BillingMny = LibSysUtils.ToDecimal(drs["BillingMny"]);
//单据类型
//fromBillType = LibSysUtils.ToString(drs["FromBillType"]);
//BillTypeEnum fromType = (BillTypeEnum)Enum.Parse(typeof(BillTypeEnum), fromBillType, true);
//switch (fromType)
//{
// case BillTypeEnum.SCM0020:
// case BillTypeEnum.SCM0030:
// //进货单、进货退货单
// subkeyPrimay += "'" + billKeyPrimary + "',";
// break;
// case BillTypeEnum.SCM0130:
// case BillTypeEnum.SCM0150:
// // keyPrimaysale += "'" + billKeyPrimary + "',";
// break;
//}
//主键集合
subkeyPrimay += "'" + billKeyPrimary + "',";
}
//先将数据回写到销售单、进货单、销售退货单、进货退货单主表,然后依次顺推到子表、在由子表回写到订单主表
//返回销售单、进货单、销售退货单、进货退货单子表数据
processDataTable = getBillBbyMasterKeyprimary(subkeyPrimay);
processBill(processDataTable, isApprove);
}