Skip to content
AjaxInventoryAdjust.ashx 17.3 KiB
Newer Older
Jack Dan's avatar
Jack Dan committed
<%@ WebHandler Language="C#" Class="AjaxInventoryAdjust" %>

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;

public class AjaxInventoryAdjust : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

    Kenanfans.KDO.SqlDataBaseOperator _Sdbo = null;


    public void ProcessRequest(HttpContext context)
    {

        _Sdbo = DataService.Sdbo;

        String act = context.Request["Action"];
        String msg = "";
        JSONObject jo = new JSONObject();
        jo.Add("Action", act);



        if (act == "GetList") //配送点变更
        {
            string sqlString = "";
            string deliveryID = context.Request["DeliveryID"].ToString();
            string pandianDate = context.Request["PandianDate"].ToString();//盘点日期
            if (deliveryID == "")
            {
                //江桥的商品一律排除
                sqlString = @"select B.GoodsName,D.ItemName,C.GroupId,C.GroupName,A.ACount,B.ISZJZC,A.Memo from dbo.StorageInfo A
                             left join Supplier.Goods B on  A.GoodsID=B.GoodsID 
                             inner join Common.DictItem  D on D.ItemID=B.MainUnit
                             inner join Permission.GroupInfo C on B.SupplierID=C.GroupID
                             where B.SupplierID !='00000003-0001-0000-0000-000000000000'  ";

                if (MySession.UserID == GlobalDefine.PD300AdminUserID || MySession.UserGroupID == GlobalDefine.PD300DeliveryID)//如果300号登陆,库存单打印中数据排除掉pd300的直进直出数据记录
                {
                    sqlString += @" and A.GoodsID not in (select GoodsID from PD300GoodsSet) 
                                  
                                 order by C.GroupName";//
                }
                else
                {
                    sqlString += @" and B.ISZJZC='false' order by C.GroupName "; 
                }
            }
            else
            {
                sqlString = @"select B.GoodsName,D.ItemName,C.GroupId,C.GroupName,A.ACount,A.GoodsID,B.ISZJZC,A.Memo
                              from dbo.StorageInfo A left join Supplier.Goods B on A.GoodsID=B.GoodsID 
                              inner join Common.DictItem  D on D.ItemID=B.MainUnit
                              inner join Permission.GroupInfo C on B.SupplierID=C.GroupID 
                              where A.DeliveryID='" + deliveryID + "' and B.SupplierID !='00000003-0001-0000-0000-000000000000'  ";


                if (MySession.UserID == GlobalDefine.PD300AdminUserID || MySession.UserGroupID == GlobalDefine.PD300DeliveryID)//如果300号登陆,库存单打印中数据排除掉pd300的直进直出数据记录
                {
                    sqlString += @" and A.GoodsID not in (select GoodsID from PD300GoodsSet)  
                                  
                                 order by C.GroupName";//
                }
                else
                {
                    sqlString += @"and B.ISZJZC='false' order by C.GroupName ";
                }
            }
            DataTable dt = _Sdbo.ExecuteDataTable(sqlString);
            if (deliveryID == "")
            {
                sqlString = @"select B.GoodsName,D.ItemName,A.ACount,B.ISZJZC,A.Memo from dbo.StorageInfo A
                              left join Supplier.Goods B on  A.GoodsID=B.GoodsID 
                              inner join Common.DictItem  D on D.ItemID=B.MainUnit 
                              where   b.SupplierID='" + GlobalDefine.LingXingCaiGouID + "'";


                if (MySession.UserID == GlobalDefine.PD300AdminUserID || MySession.UserGroupID == GlobalDefine.PD300DeliveryID)//如果300号登陆,库存单打印中数据排除掉pd300的直进直出数据记录
                {
                    sqlString += @" and A.GoodsID not in (select GoodsID from PD300GoodsSet) ";
                }
                else
                {
                    sqlString += "and B.ISZJZC='false'"; 
                }
             
            }
            else
            {
                sqlString = @"select B.GoodsName,D.ItemName,A.ACount,A.GoodsID,B.ISZJZC,A.Memo from dbo.StorageInfo A 
                              left join Supplier.Goods B on  A.GoodsID=B.GoodsID 
                              inner join Common.DictItem  D on D.ItemID=B.MainUnit                               
                              where   A.DeliveryID='" + deliveryID + "'and  b.SupplierID='" + GlobalDefine.LingXingCaiGouID + "'";

                if (MySession.UserID == GlobalDefine.PD300AdminUserID || MySession.UserGroupID == GlobalDefine.PD300DeliveryID)//如果300号登陆,库存单打印中数据排除掉pd300的直进直出数据记录
                {
                    sqlString += @" and A.GoodsID not in (select GoodsID from PD300GoodsSet)";
                }
                else
                {
                    sqlString += " and B.ISZJZC='false'";
                }
            }
            DataTable dt1 = _Sdbo.ExecuteDataTable(sqlString);
          
            

            String outStr = String.Empty;

            if (dt.Rows.Count != 0)
            {


                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string pdcc = GetGoodsKC(dt.Rows[i]["GoodsID"].ToString(), pandianDate, deliveryID);//盘点日库存
                    string pj = GetPanDianRiPrice(dt.Rows[i]["GoodsID"].ToString(), deliveryID, Convert.ToDecimal(dt.Rows[i]["ACount"]), pandianDate);//盘点日金额
                    decimal pdjj = 0;
                    if (pdcc != "0.00")
                    {
                        pdjj = Convert.ToDecimal(pj) / Convert.ToDecimal(pdcc);//盘点日均价
                    }                   
                    string dqje = GetGoodsJE(dt.Rows[i]["GoodsID"].ToString(), deliveryID, Convert.ToDecimal(dt.Rows[i]["ACount"]));//当前金额
                    decimal dqjj = 0;
                    if (dqje != "0.00")
                    {
                        dqjj = Convert.ToDecimal(dqje) / Convert.ToDecimal(dt.Rows[i]["ACount"]);//当前均价
                    }
                    outStr += String.Format("<tr id='lie'>");
                    outStr += String.Format("<td width='220'>{0}</td>", dt.Rows[i]["GoodsName"]);//品名
                    outStr += String.Format("<td width='100'>{0}</td>", dt.Rows[i]["GroupName"]);//供应商
                    outStr += String.Format("<td width='80'>{0}</td>", dt.Rows[i]["ItemName"]);//单位
                    outStr += String.Format("<td width='100' id='td{1}' style='text-align:right'><span >{0}&nbsp;</span></td>", pdcc , dt.Rows[i]["GoodsID"].ToString());//盘点日库存
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", pj, dt.Rows[i]["GoodsID"].ToString());//盘点日总额
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", String.Format("{0:F}", pdjj), dt.Rows[i]["GoodsID"].ToString());//盘点日均价

                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", dt.Rows[i]["ACount"], dt.Rows[i]["GoodsID"].ToString());//当前库存
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", dqje, dt.Rows[i]["GoodsID"].ToString());//当前总额
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", String.Format("{0:F}", dqjj), dt.Rows[i]["GoodsID"].ToString());//当前均价                            
                    outStr += "</tr>";
                 
                }
            }
            if (dt1.Rows.Count != 0)
            {
                for (int i = 0; i < dt1.Rows.Count; i++)
                {
                    string pdcc = GetGoodsKC(dt1.Rows[i]["GoodsID"].ToString(), pandianDate, deliveryID);//盘点日库存
                    string pj = GetPanDianRiPrice(dt1.Rows[i]["GoodsID"].ToString(), deliveryID, Convert.ToDecimal(dt1.Rows[i]["ACount"]), pandianDate);//盘点日金额
                    decimal pdjj = 0;
                    if (pdcc != "0.00")
                    {
                        pdjj = Convert.ToDecimal(pj) / Convert.ToDecimal(pdcc);//盘点日均价
                    }
                   
                    string dqje = GetGoodsJE(dt1.Rows[i]["GoodsID"].ToString(), deliveryID, Convert.ToDecimal(dt1.Rows[i]["ACount"]));//当前金额
                    decimal dqjj = 0;
                    if (dqje != "0.00")
                    {
                        dqjj = Convert.ToDecimal(dqje) / Convert.ToDecimal(dt1.Rows[i]["ACount"]);//当前均价
                    }
                    outStr += String.Format("<tr id='lie'>");
                    outStr += String.Format("<td width='220'>{0}</td>", dt1.Rows[i]["GoodsName"]);//品名
                    outStr += String.Format("<td width='100'>{0}</td>", dt.Rows[i]["GroupName"]);//供应商
                    outStr += String.Format("<td width='80'>{0}</td>", dt1.Rows[i]["ItemName"]);//单位
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", pdcc, dt1.Rows[i]["GoodsID"].ToString());//盘点日库存
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", pj, dt1.Rows[i]["GoodsID"].ToString());//盘点日总额
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", String.Format("{0:F}", pdjj), dt1.Rows[i]["GoodsID"].ToString());//盘点日均价

                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", dt1.Rows[i]["ACount"], dt1.Rows[i]["GoodsID"].ToString());//当前库存
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", dqje, dt1.Rows[i]["GoodsID"].ToString());//当前总额
                    outStr += String.Format("<td width='100' id='td{1}'style='text-align:right'><span >{0}&nbsp;</span></td>", String.Format("{0:F}", dqjj), dt1.Rows[i]["GoodsID"].ToString());//当前均价                            
                    outStr += "</tr>";
                }
            }
            if (dt1.Rows.Count == 0 && dt.Rows.Count == 0)
            {
                outStr += "<tr>";
                outStr += String.Format("<td width='960'>{0}</td>", "无相关数据");
                outStr += "</tr>";
            }
            context.Response.Write(outStr);
        }
        

    }



    /// <summary>
    /// 根据盘点日期计算出商品库存 (盘点日库存)
    /// </summary>
    /// <param name="goodsID">商品ID</param>
    /// <param name="pandianDate">盘点日期</param>
    /// <returns></returns>
    private string GetGoodsKC(string goodsID, string pandianDate, string deliveryID)
    {
        pandianDate = Convert.ToDateTime(pandianDate).ToString("yyyy-MM-dd") + " 23:59:59";
        //***********************入库总量*******************************//
        decimal a = 0;//总数量
        string sql = @"select SUM(Amount) as kcl from Warehouse.InventoryDetail a left join Warehouse.Inventory b on a.InventoryID=b.InventoryID
                        where GoodsID='{0}' and DeliveryID='{1}' and [Type]='入库' and InventoryTime > '{2}'";
        DataRow rukuzongl = _Sdbo.ExecuteDataRow(sql, goodsID, deliveryID, pandianDate);
        if (rukuzongl != null && rukuzongl["kcl"].ToString() != "")
        {
            a = Convert.ToDecimal(rukuzongl["kcl"]);
        }
        //***********************领料总量*******************************//
        decimal b = 0;
        sql = @"select SUM(Amount) as kcl from Warehouse.InventoryDetail a 
                left join Warehouse.Inventory b on a.InventoryID=b.InventoryID
                left join Permission.GroupInfo c on b.DeliveryID=c.GroupID
                where GoodsID='{0}' and ( DeliveryID='{1}' or c.ParentID='{1}') 
                and [Type]='领料' and InventoryTime > '{2}'";
        DataRow lingliaozongl = _Sdbo.ExecuteDataRow(sql, goodsID, deliveryID, pandianDate);
        if (lingliaozongl != null && lingliaozongl["kcl"].ToString() != "")
        {
            b = Convert.ToDecimal(lingliaozongl["kcl"]);
        }
        //***********************库存表总量*******************************//
        decimal c = 0;
        sql = @"select ACount from dbo.StorageInfo where GoodsID='{0}' and DeliveryID='{1}'";
        DataRow kcbzl = _Sdbo.ExecuteDataRow(sql, goodsID, deliveryID);
        if (kcbzl != null && kcbzl["ACount"].ToString() != "")
        {
            c = Convert.ToDecimal(kcbzl["ACount"]);
        }

        //盘点日期当天库存量=总库存量-(盘点日期之后的入库总量-盘点日期之后的领料总量)
        decimal kc = c - (a - b);
        return kc.ToString();

    }

 
    
    /// <summary>
    /// 获得盘点总金额(当前金额)
    /// </summary>
    /// <param name="goodsID"></param>
    /// <param name="pandianDate"></param>
    /// <param name="deliveryID"></param>
    /// <returns></returns>
    private string GetGoodsJE(string goodsID, string deliveryID, decimal totalLast)
    {
        //求出商品余量大于0的总和

        string sql = @"select a.InventoryID,InvertoryLast,InvertoryPrice from Warehouse.InventoryDetail a left join Warehouse.Inventory b on a.InventoryID=b.InventoryID
                        where GoodsID='{0}' and DeliveryID='{1}' and [Type]='入库' and InvertoryLast>0 order by  InventoryTime asc";
        DataTable dt = _Sdbo.ExecuteDataTable(sql, goodsID, deliveryID);
        decimal totalPrice = 0;

        if (dt != null && dt.Rows.Count > 0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (totalLast > Convert.ToDecimal(dt.Rows[i][1]))//如果输入的商品数量大于 该条库存的库存数量,则需往下循环领取
                {
                    totalLast = totalLast - Convert.ToDecimal(dt.Rows[i][1]);
                    totalPrice = totalPrice + Convert.ToDecimal(dt.Rows[i][1]) * Convert.ToDecimal(dt.Rows[i][2]);

                }
                else
                {
                    totalPrice = totalPrice + Convert.ToDecimal(dt.Rows[i][2]) * totalLast;
                    break;
                }
            }
        }
        else
        {
            ///如果总库存大于库存明细 取最新报价
            string sqlprice = @"select  top 1 Price from Supplier.PriceSheet a left join Supplier.PriceSheetDetail b 
                                on a.PriceSheetID=b.PriceSheetID
                                where GoodsID='{0}' order by EndTime desc";
            DataRow dr = _Sdbo.ExecuteDataRow(sqlprice, goodsID);

            if (dr != null)
            {
                totalPrice = totalLast * Convert.ToDecimal(dr["Price"]);
            }
            else
            {
                totalPrice = 0;
            }
        }

        return String.Format("{0:F}", totalPrice);//;
    }

    /// <summary>
    /// 盘点日金额
    /// </summary>

    public string GetPanDianRiPrice(string goodsID, string deliveryID, decimal totalLast, string pandianDate)
    {
        //求出商品余量大于0的总和
        pandianDate = Convert.ToDateTime(pandianDate).ToString("yyyy-MM-dd") + " 23:59:59";
        string sql = @"select a.InventoryID,InvertoryLast,InvertoryPrice from Warehouse.InventoryDetail a left join Warehouse.Inventory b on a.InventoryID=b.InventoryID
                        where GoodsID='{0}' and DeliveryID='{1}' and [Type]='入库' and InvertoryLast>0  and InventoryTime < '{2}' order by  InventoryTime asc ";

        DataTable dt = _Sdbo.ExecuteDataTable(sql, goodsID, deliveryID, pandianDate);
        decimal totalPrice = 0;

        if (dt != null && dt.Rows.Count > 0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (totalLast > Convert.ToDecimal(dt.Rows[i][1]))//如果输入的商品数量大于 该条库存的库存数量,则需往下循环领取
                {
                    totalLast = totalLast - Convert.ToDecimal(dt.Rows[i][1]);
                    totalPrice = totalPrice + Convert.ToDecimal(dt.Rows[i][1]) * Convert.ToDecimal(dt.Rows[i][2]);

                }
                else
                {
                    totalPrice = totalPrice + Convert.ToDecimal(dt.Rows[i][2]) * totalLast;
                    break;
                }
            }
        }
        else
        {
            ///如果总库存大于库存明细 取最新报价
            string sqlprice = @"select  top 1 Price from Supplier.PriceSheet a left join Supplier.PriceSheetDetail b 
                                on a.PriceSheetID=b.PriceSheetID
                                where GoodsID='{0}' order by EndTime desc";
            DataRow dr = _Sdbo.ExecuteDataRow(sqlprice, goodsID);

            if (dr != null)
            {
                totalPrice = totalLast * Convert.ToDecimal(dr["Price"]);
            }
            else
            {
                totalPrice = 0;
            }
        }

        return String.Format("{0:F}", totalPrice); 

    }


    
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}