顺推金额操作

记录下思路

/// <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);
            
        }



猜你喜欢

转载自blog.csdn.net/fuweiping/article/details/46632707