Example #1
0
 public string yppch; //批次号
 public ZY_SumKcph(ZY_MX_Kcph kcph, int deptid)
 {
     this.cjid   = kcph.cjid;
     this.ypsl   = kcph.cks;
     this.dwbl   = kcph.dwbl;
     this.kcid   = kcph.kcid;
     this.deptid = deptid;
     this.yphh   = kcph.ypph;//货号
     this.yppm   = kcph.zy_ypmx.yppm;
     this.ypspm  = kcph.zy_ypmx.ypspm;
     this.ypgg   = kcph.zy_ypmx.ypgg;
     this.ypdw   = kcph.ypdw;
     this.zxdw   = kcph.zxdw;
     this.sccj   = "";//待赋值
     this.kcl    = 0;
     this.qysl   = 0;
     this.jhj    = kcph.jhj;
     this.lsj    = kcph.zy_ypmx.lsj;                   //零售价
     this.pfj    = kcph.zy_ypmx.pfj;                   //批发价
     this.jhje   = Convert.ToDecimal(kcph.jhj * ypsl);
     this.pfje   = Convert.ToDecimal(this.pfj * ypsl); //批发金额
     this.lsje   = Convert.ToDecimal(this.lsj * ypsl); //零售金额
     this.hwh    = kcph.zy_ypmx.hwmc;                  //货位号
     this.lx     = kcph.zy_ypmx.tllx;
     this.ypph   = kcph.ypph;
     this.ypxq   = kcph.ypxq;
     this.yppch  = kcph.yppch;
 }
Example #2
0
        /// <summary>
        /// 住院统领发药批次分配(统一拉批号库存) 尽量把这个分配操作放到事务外
        /// </summary>
        /// <param name="ZY_SumYpmx"></param>
        /// <param name="mxlx">明细类型 0-统领发药 1-处方发药</param>
        /// <returns></returns>
        public static List <ZY_MX_Kcph> GetZYTLFYLstKcph(List <ZY_Ypmx> _lstYpmx, RelationalDatabase db, int deptid)
        {
            List <ZY_Ypmx>    lstYpmx    = CloneBySerialize <List <ZY_Ypmx> >(_lstYpmx);
            List <ZY_SumYpmx> lstSumYpmx = new List <ZY_SumYpmx>();

            List <ZY_MX_Kcph> lstKcph = new List <ZY_MX_Kcph>();    //明细库存批号集合

            List <ZY_MX_Kcph> lstKcph_kt = new List <ZY_MX_Kcph>(); //可抵销的批号库存

            //先冲正部分,然后发剩下正数部分,然后退部分

            #region 负数明细先跟对应的正数明细进行抵销
            Guid guid_temp = new Guid("99999999-9999-9999-9999-999999999999");
            for (int i = 0; i < lstYpmx.Count; i++)
            {
                ZY_Ypmx ypmx_fs = lstYpmx[i];
                if (ypmx_fs.ypsl < 0)
                {
                    for (int j = lstYpmx.Count - 1; j >= 0; j--)
                    {
                        ZY_Ypmx ypmx_zs = lstYpmx[j];
                        if (ypmx_zs.fymxid == ypmx_fs.tfymxid && ypmx_zs.ypsl > 0)
                        {
                            ZY_MX_Kcph kcph_zs = new ZY_MX_Kcph();
                            ZY_MX_Kcph kcph_fs = new ZY_MX_Kcph();
                            //kcph_zs.zy_ypmx = (ZY_Ypmx)GetDeepCopy(ypmx_zs);
                            //kcph_fs.zy_ypmx = (ZY_Ypmx)GetDeepCopy(ypmx_fs);

                            kcph_zs.zy_ypmx = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(ypmx_zs);
                            kcph_fs.zy_ypmx = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(ypmx_fs);

                            if ((ypmx_zs.ypsl + ypmx_fs.ypsl) >= 0)//如果能够完全抵消
                            {
                                ypmx_zs.ypsl -= ypmx_fs.ypsl;
                                ypmx_fs.ypsl  = 0;
                                kcph_zs.cks   = Convert.ToDecimal(ypmx_fs.ypsl * (-1));
                                kcph_fs.cks   = Convert.ToDecimal(ypmx_fs.ypsl * (-1));
                                kcph_zs.cjid  = ypmx_zs.cjid;
                                kcph_fs.cjid  = ypmx_fs.cjid;
                            }
                            else //不能够完全抵消
                            {
                                ypmx_zs.ypsl  = 0;
                                ypmx_fs.ypsl += ypmx_zs.ypsl;
                                kcph_zs.cks   = Convert.ToDecimal(ypmx_zs.ypsl);
                                kcph_fs.cks   = Convert.ToDecimal(ypmx_zs.ypsl);
                                kcph_zs.cjid  = ypmx_zs.cjid;
                                kcph_fs.cjid  = ypmx_fs.cjid;
                            }
                            if (ypmx_fs.kcid != Guid.Empty)
                            {
                                kcph_zs.kcid = kcph_fs.kcid;
                            }
                            else
                            {
                                //没有批次可分时,先填入一个假的guid
                                kcph_zs.kcid = guid_temp;
                                kcph_fs.kcid = guid_temp;
                            }
                            kcph_zs.ktsl = 0;
                            kcph_fs.ktsl = 0; //可抵销数量置0
                            lstKcph.Add(kcph_fs);
                            lstKcph.Add(kcph_zs);
                        }
                    }
                }
            }


            #endregion

            #region 抵销不掉负数明细(有批次的插入kcph,无批次的去费用表中匹配)
            for (int i = 0; i < lstYpmx.Count; i++)
            {
                #region 处理无批次的负数
                if (lstYpmx[i].ypsl < 0 && lstYpmx[i].kcid == Guid.Empty)
                {
                    ZY_Ypmx ypmx_fs = lstYpmx[i];
                    //ZY_Ypmx ypmx = (ZY_Ypmx)GetDeepCopy(ypmx_fs);
                    ZY_Ypmx    ypmx      = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(ypmx_fs);
                    string     ssql_zyfy = string.Format(" select top 1 a.unitrate,a.kcid,a.jhj,a.pfj,a.retail_price,a.ypph,a.ypxq,a.yppch,b.dwbl from zy_fee_speci a inner join yf_kcph b on a.kcid=b.kcid and a.xmid=b.cjid where a.id='{0}' and FY_BIT = 1", ypmx_fs.tfymxid);
                    DataTable  tb_zyfy   = db.GetDataTable(ssql_zyfy);
                    ZY_MX_Kcph kcph      = new ZY_MX_Kcph();
                    if (tb_zyfy.Rows.Count > 0)
                    {
                        DataRow row_fy = tb_zyfy.Rows[0];
                        int     ydwbl  = Convert.ToInt32(row_fy["unitrate"]); //费用中dwbl
                        int     dwbl   = Convert.ToInt32(row_fy["dwbl"]);     //库存dwbl
                        kcph.cjid    = ypmx.cjid;
                        kcph.kcid    = new Guid(row_fy["kcid"].ToString());
                        kcph.cks     = ypmx.ypsl;
                        kcph.jhj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["jhj"])) * dwbl / ydwbl);          //进价
                        kcph.pfj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["pfj"])) * dwbl / ydwbl);          //批发价
                        kcph.lsj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["RETAIL_PRICE"])) * dwbl / ydwbl); //零售价
                        kcph.ypph    = row_fy["ypph"].ToString();
                        kcph.ypxq    = row_fy["ypxq"].ToString();
                        kcph.yppch   = row_fy["yppch"].ToString();
                        kcph.dwbl    = dwbl;
                        kcph.ypdw    = ypmx.ypdw;
                        kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                        kcph.ktsl    = ypmx.ypsl * (-1);//可抵销数量
                    }
                    else
                    {
                        //没有匹配到,再去费用历史表中查询
                        ssql_zyfy = string.Format(" select top 1 a.unitrate,a.kcid,a.jhj,a.pfj,a.retail_price,a.ypph,a.ypxq,a.yppch,b.dwbl from zy_fee_speci a inner join yf_kcph b on a.kcid=b.kcid and a.xmid=b.cjid where a.id='{0}' and FY_BIT = 1", ypmx_fs.tfymxid);
                        tb_zyfy   = db.GetDataTable(ssql_zyfy);
                        if (tb_zyfy.Rows.Count > 0)
                        {
                            DataRow row_fy = tb_zyfy.Rows[0];
                            int     ydwbl  = Convert.ToInt32(row_fy["unitrate"]); //费用中dwbl
                            int     dwbl   = Convert.ToInt32(row_fy["dwbl"]);     //库存dwbl
                            kcph.cjid    = ypmx.cjid;
                            kcph.kcid    = new Guid(row_fy["kcid"].ToString());
                            kcph.cks     = ypmx.ypsl;
                            kcph.jhj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["jhj"])) * dwbl / ydwbl); //进价
                            kcph.pfj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["pfj"])) * dwbl / ydwbl); //批发价
                            kcph.pfj     = Convert.ToDecimal(Convert.ToDecimal((row_fy["lsj"])) * dwbl / ydwbl); //零售价
                            kcph.ypph    = row_fy["ypph"].ToString();
                            kcph.ypxq    = row_fy["ypxq"].ToString();
                            kcph.yppch   = row_fy["yppch"].ToString();
                            kcph.dwbl    = dwbl;
                            kcph.ypdw    = ypmx.ypdw;
                            kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                            kcph.ktsl    = ypmx.ypsl * (-1);//可抵销数量
                        }
                        else
                        {
                            throw new Exception(string.Format("病人:{0} 退药记录【{1} {2}】找不到对应的发药记录!", ypmx.hzxm, ypmx.yppm, ypmx.ypgg));
                        }
                    }
                    ypmx_fs.ypsl = 0;
                    lstKcph.Add(kcph);
                    ZY_MX_Kcph kcph_kt = CloneBySerialize <ZY_MX_Kcph>(kcph);
                    lstKcph_kt.Add(kcph_kt);//可抵销的kcph集合
                }
                #endregion

                #region 处理有批次的负数
                if (lstYpmx[i].ypsl < 0 && lstYpmx[i].kcid != Guid.Empty)
                {
                    ZY_Ypmx    ypmx_fs = lstYpmx[i];
                    ZY_Ypmx    ypmx    = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(ypmx_fs);
                    ZY_MX_Kcph kcph    = new ZY_MX_Kcph();

                    kcph.kcid    = ypmx.kcid;
                    kcph.cjid    = ypmx.cjid;
                    kcph.cks     = ypmx.ypsl;
                    kcph.jhj     = ypmx.jhj; //进价
                    kcph.pfj     = ypmx.pfj; //批发价
                    kcph.lsj     = ypmx.lsj; //零售价
                    kcph.ypph    = ypmx.ypph;
                    kcph.ypxq    = ypmx.ypxq;
                    kcph.yppch   = ypmx.yppch;
                    kcph.dwbl    = ypmx.dwbl;
                    kcph.ypdw    = ypmx.ypdw;
                    kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                    kcph.ktsl    = ypmx.ypsl * (-1); //可抵销数量

                    ypmx_fs.ypsl = 0;
                    lstKcph.Add(kcph);
                    ZY_MX_Kcph kcph_kt = CloneBySerialize <ZY_MX_Kcph>(kcph);
                    lstKcph_kt.Add(kcph_kt);//可抵销的kcph集合
                }
                #endregion
            }
            #endregion

            #region 移除数量为0的明细记录
            for (int i = lstYpmx.Count - 1; i >= 0; i--)
            {
                if (lstYpmx[i].ypsl == 0)
                {
                    lstYpmx.Remove(lstYpmx[i]);
                }
            }
            #endregion

            #region 处理可抵销的批号库存 这个地方可能要加配置,暂时先放这里,还可以放到分配批号库存那边
            foreach (ZY_MX_Kcph kcph_kt in lstKcph_kt)
            {
                if (kcph_kt.ktsl > 0)//可抵销数量大于0
                {
                    for (int i = lstYpmx.Count - 1; i >= 0; i--)
                    {
                        ZY_Ypmx ypmx = lstYpmx[i];
                        if (ypmx.ypsl > 0 && ypmx.cjid == kcph_kt.cjid && ypmx.kcid == Guid.Empty)
                        {
                            if (kcph_kt.ktsl == 0)
                            {
                                break;
                            }

                            if (kcph_kt.ktsl >= ypmx.ypsl)
                            {
                                ZY_MX_Kcph kcph = new ZY_MX_Kcph();
                                kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                                kcph.kcid    = kcph_kt.kcid;
                                kcph.cjid    = ypmx.cjid;
                                kcph.cks     = ypmx.ypsl;
                                kcph.jhj     = kcph_kt.jhj; //进价
                                kcph.pfj     = kcph_kt.pfj; //批发价
                                kcph.lsj     = kcph_kt.lsj; //零售价
                                kcph.ypph    = kcph_kt.ypph;
                                kcph.ypxq    = kcph_kt.ypxq;
                                kcph.yppch   = kcph_kt.yppch;
                                kcph.dwbl    = kcph_kt.dwbl;
                                kcph.ypdw    = kcph_kt.ypdw;
                                kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                                kcph.ktsl    = 0; //可抵销数量

                                ypmx.ypsl = 0;
                                lstYpmx.Remove(ypmx);
                                lstKcph.Add(kcph);

                                kcph_kt.ktsl -= ypmx.ypsl;//可抵销数量
                            }
                            else
                            {
                                ZY_MX_Kcph kcph = new ZY_MX_Kcph();
                                kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                                kcph.kcid    = kcph_kt.kcid;
                                kcph.cjid    = ypmx.cjid;
                                kcph.cks     = kcph_kt.ktsl;
                                kcph.jhj     = kcph_kt.jhj; //进价
                                kcph.pfj     = kcph_kt.pfj; //批发价
                                kcph.lsj     = kcph_kt.lsj; //零售价
                                kcph.ypph    = kcph_kt.ypph;
                                kcph.ypxq    = kcph_kt.ypxq;
                                kcph.yppch   = kcph_kt.yppch;
                                kcph.dwbl    = kcph_kt.dwbl;
                                kcph.ypdw    = kcph_kt.ypdw;
                                kcph.zy_ypmx = CloneBySerialize <ZY_Ypmx>(ypmx);
                                kcph.ktsl    = 0;

                                ypmx.ypsl -= kcph_kt.ktsl;

                                lstKcph.Add(kcph);

                                kcph_kt.ktsl = 0;//可抵销数量置0
                                break;
                            }
                        }
                    }
                }
            }
            #endregion

            #region 移除数量为0的明细记录
            for (int i = lstYpmx.Count - 1; i >= 0; i--)
            {
                if (lstYpmx[i].ypsl == 0)
                {
                    lstYpmx.Remove(lstYpmx[i]);
                }
            }
            #endregion

            #region 如果明细被全部抵消,别且批号库存都已经被分配批次,返回批号库存列表
            if (lstYpmx.Count <= 0)
            {
                bool temp = false;
                foreach (ZY_MX_Kcph kcph in lstKcph)
                {
                    if (kcph.kcid == guid_temp)
                    {
                        temp = true;
                        break;
                    }
                }
                if (!temp)
                {
                    return(lstKcph);
                }
            }
            #endregion

            lstSumYpmx = CreateLstZY_SumYpmx(lstYpmx);
            DataTable tb_kcph = new DataTable();//批号库存datatable

            #region 取得数据库中数量>0的批号库存并筛选
            //首先直接查询所有库存量>0的批号库存
            string ssql_kcph_all = string.Format(@" select 
                                              a.id,a.jgbm,a.ggid,a.cjid,a.kwid,a.ypph,a.ypxq,a.yppch,a.id kcid,a.cjid,
                                              a.jhj,a.kcl,a.djsj,a.bdelete,a.deptid,a.ykbdelete,a.zxdw,a.kcl ktypsl,a.dwbl,
                                              b.pfj,b.lsj,c.dwmc ypdw 
                                              from yf_kcph a 
                                              inner join yp_ypcjd b on a.cjid=b.cjid 
                                              inner join yp_ypdw c on a.zxdw=c.id 
                                              where  a.deptid={0} and a.bdelete<>1 and a.ykbdelete<>1 and a.kcl>0 ",
                                                 lstSumYpmx[0].deptid);

            DataTable tb_kcph_all = db.GetDataTable(ssql_kcph_all);
            //http://bbs.csdn.net/topics/320209392 datatable.select效率的问题 可以借鉴 暂时没时间去试验 先table.select(in)

            tb_kcph = tb_kcph_all.Clone();

            string filter = "";
            for (int i = 0; i < lstSumYpmx.Count; i++)
            {
                if (i == 0)
                {
                    filter += string.Format(" ({0}", lstSumYpmx[i].cjid);
                }
                else
                {
                    filter += string.Format(",{0}", lstSumYpmx[i].cjid);
                }
                if (i == lstSumYpmx.Count - 1)
                {
                    filter += ") ";
                }
            }
            //进行筛选
            DataRow[] rows_temp = tb_kcph_all.Select(string.Format(" cjid in {0}", filter));
            for (int i = 0; i < rows_temp.Length; i++)
            {
                //tb_kcph.Rows.Add(rows_temp[i].ItemArray);
                tb_kcph.ImportRow(rows_temp[i]);
            }
            #endregion

            #region 取得没有取到批次库存的汇总记录
            for (int i = 0; i < lstSumYpmx.Count; i++)
            {
                for (int j = 0; j < tb_kcph.Rows.Count; j++)
                {
                    if (lstSumYpmx[i].cjid == Convert.ToInt32(tb_kcph.Rows[j]["cjid"]))
                    {
                        lstSumYpmx[i].bkcbz = true;
                    }
                }
            }
            List <int> cjid_dq = new List <int>();//待取批次厂家id
            filter = "";
            foreach (ZY_SumYpmx sumYpmx in lstSumYpmx)
            {
                if (sumYpmx.bkcbz == false)
                {
                    if (filter == "")
                    {
                        filter += string.Format(" ({0}", sumYpmx.cjid);
                        continue;
                    }
                    if (filter != "")
                    {
                        filter += string.Format(",{0}", sumYpmx.cjid);
                    }
                }
            }
            if (filter != "")
            {
                filter += ") ";
            }
            if (filter != "")
            {
                ssql_kcph_all = string.Format(@" select a.id,a.jgbm,a.ggid,a.cjid,a.kwid,a.ypph,a.ypxq,a.yppch,a.id kcid,
                            a.jhj,a.kcl*a.dwbl/{2} kcl,a.djsj,a.bdelete,a.deptid,a.ykbdelete,a.zxdw,a.kcl*a.dwbl/{2} ktypsl,
                            b.pfj,b.lsj,c.dwmc ypdw 
                            from yf_kcph a 
                            inner join yp_ypcjd b on a.cjid=b.cjid 
                            inner join yp_ypdw c on a.zxdw=c.id 
                            where  a.deptid={0} and a.bdelete<>1 and a.ykbdelete<>1 and a.deptid={0}
                            and a.cjid in {1} AND a.djsj =
                            (
	                            SELECT MAX(djsj) djsj  FROM yf_kcph  WHERE cjid IN {1} and deptid={0}
                             ) ", lstSumYpmx[0].deptid, filter, lstSumYpmx[0].dwbl);
                DataTable tb_tt = db.GetDataTable(ssql_kcph_all, 30);
                foreach (DataRow row in tb_tt.Rows)
                {
                    tb_kcph.ImportRow(row);
                }
            }

            #endregion

            DataRow[] rows_kcph = new DataRow[] { };

            #region 给未发药冲正产生的批号明细库存记录填充批次
            for (int i = 0; i < lstKcph.Count; i++)
            {
                ZY_MX_Kcph kcph = lstKcph[i];
                if (kcph.kcid == guid_temp)
                {
                    rows_kcph = tb_kcph.Select(string.Format("cjid={0}", kcph.cjid));//获得库存
                    if (rows_kcph.Length <= 0)
                    {
                        throw new Exception("找不到批次库存记录!");
                    }
                    else
                    {
                        DataRow row = rows_kcph[0];
                        kcph.jhj   = Convert.ToDecimal(row["jhj"]); //进货价
                        kcph.pfj   = Convert.ToDecimal(row["pfj"]); //批发价
                        kcph.kcid  = new Guid(row["kcid"].ToString());
                        kcph.ypph  = row["ypph"].ToString();
                        kcph.ypxq  = row["ypxq"].ToString();
                        kcph.yppch = row["yppch"].ToString();
                    }
                }
            }
            #endregion

            #region 循环剩余明细分配批次
            DataTable tb_kcph_cjid = new DataTable();
            tb_kcph_cjid = tb_kcph_all.Clone();
            foreach (ZY_SumYpmx sum in lstSumYpmx)
            {
                //DataTable tb_kcph_cjid = tb_kcph_all.Clone();
                tb_kcph_cjid.Rows.Clear();
                rows_kcph = tb_kcph_all.Select(string.Format("cjid={0}", sum.cjid));//获得库存
                for (int i = 0; i < rows_kcph.Length; i++)
                {
                    tb_kcph_cjid.ImportRow(rows_kcph[i]);
                }

                if (tb_kcph_cjid.Rows.Count > 0)
                {
                    if (sum.dwbl != Convert.ToInt32(tb_kcph_cjid.Rows[0]["dwbl"]))
                    {
                        throw new Exception("库存单位比例发生变化,请刷新数据后重试!");
                    }
                }

                //循环明细
                for (int i = lstYpmx.Count - 1; i >= 0; i--)
                {
                    ZY_Ypmx ypmx = lstYpmx[i];
                    if (ypmx.cjid == sum.cjid)
                    {
                        decimal temp  = ypmx.ypsl; //当前明细待分配数量
                        int     ydwbl = ypmx.dwbl; //明细单位比例
                        if (temp == 0)
                        {
                            continue;            //待分配数量=0,明细循环进入下一行
                        }
                        if (temp < 0)
                        {
                            throw new Exception("分配批次库存发生错误");
                        }

                        #region  明细中待分配数量>0
                        if (temp > 0)
                        {
                            temp = temp * sum.dwbl / ypmx.dwbl;               //单位比例之间的换算

                            for (int j = 0; j < tb_kcph_cjid.Rows.Count; j++) //对当前药品的批号库存进行迭代
                            {
                                if (temp == 0)
                                {
                                    break;                                           //如果申请明细数量为0,则跳出批号库存迭代
                                }
                                DataRow tempRow = tb_kcph_cjid.Rows[j];              //批号库存行
                                decimal kcl_ph  = Convert.ToDecimal(tempRow["kcl"]); //库存数量

                                //int dwbl_kc = Convert.ToInt32(tempRow["dwbl"]);     //批号库存中单位比例
                                //int zxdw_kc =Convert.ToInt32(tempRow["zxdw"]);  //批号库存中zxdw

                                //if (dwbl_kc != ypmx.dwbl || zxdw_kc != ypmx.zxdw)
                                //{
                                //    throw new Exception("库存单位比例发生变化,请刷新数据后重试!");
                                //}

                                if (kcl_ph == 0)
                                {
                                    continue;
                                }
                                int kcl_dwbl = Convert.ToInt32(tempRow["dwbl"]); //库存单位比例
                                if (temp >= kcl_ph)                              //如果当前批号行库存量小于当前明细要出库的数量,该批号库存全部出库
                                {
                                    #region 填充kcph
                                    string  id_kcph       = tempRow["id"].ToString();
                                    int     jgbm_kcph     = Convert.ToInt32(tempRow["jgbm"]);
                                    int     ggid_kcph     = Convert.ToInt32(tempRow["ggid"]);
                                    int     cjid_kcph     = Convert.ToInt32(tempRow["cjid"]);
                                    int     kwid_kcph     = Convert.ToInt32(tempRow["kwid"]);
                                    string  ypph_kcph     = tempRow["ypph"].ToString();
                                    string  ypxq_kcph     = tempRow["ypxq"].ToString();
                                    string  yppch_kcph    = tempRow["yppch"].ToString(); //批次号
                                    Guid    kcid_kcph     = (tempRow["kcid"] is DBNull) ? Guid.Empty : (new Guid(tempRow["kcid"].ToString()));
                                    decimal jhj_kcph      = Convert.ToDecimal(tempRow["jhj"]);
                                    decimal pfj_kcph      = Convert.ToDecimal(tempRow["pfj"]);
                                    decimal lsj_kcph      = Convert.ToDecimal(tempRow["lsj"]);
                                    decimal kcl_kcph      = Convert.ToDecimal(tempRow["kcl"]);
                                    int     zxdw_kcph     = Convert.ToInt32(tempRow["zxdw"]); //执行单位
                                    string  ypdw_kcph     = tempRow["ypdw"].ToString();       //药品单位
                                    int     dwbl_kcph     = sum.dwbl;
                                    int     bdelete_kcph  = Convert.ToInt32(tempRow["bdelete"]);
                                    int     ykdelete_kcph = Convert.ToInt32(tempRow["ykbdelete"]);
                                    decimal cks_kcph      = kcl_ph;        //出当前批号库存数量
                                    Guid    mxid_kcph     = ypmx.fymxid;   //mxid
                                    Guid    tid_kcph      = ypmx.tid;      //头id
                                    Guid    tyid_kcph     = ypmx.fymxid;   //tyid
                                    temp           = temp - cks_kcph;      //当前申请明细要出库的数量-当前批号库存数量
                                    ypmx.ypsl      = ypmx.ypsl - cks_kcph; //当前申请明细要出库的数量-当前批号库存数量
                                    tempRow["kcl"] = 0;
                                    ZY_MX_Kcph kcph = new ZY_MX_Kcph(id_kcph, jgbm_kcph, ggid_kcph, cjid_kcph, kwid_kcph,
                                                                     ypph_kcph, ypxq_kcph, yppch_kcph, kcid_kcph, jhj_kcph, pfj_kcph, lsj_kcph, kcl_kcph, zxdw_kcph, ypdw_kcph,
                                                                     dwbl_kcph, bdelete_kcph, ykdelete_kcph, cks_kcph, mxid_kcph, tid_kcph, cks_kcph
                                                                     , tyid_kcph);
                                    kcph.zy_ypmx = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(lstYpmx[i]);
                                    lstKcph.Add(kcph);
                                    #endregion

                                    tb_kcph_cjid.Rows[j]["kcl"] = 0; //将当前批号库存行 中kcl更新为 0
                                    if (j == tb_kcph.Rows.Count - 1 && temp > 0)
                                    {
                                        throw new Exception("库存量不足!");
                                    }
                                }
                                else//如果该批号库存量大于要出库的数量,则出要出库的数量
                                {
                                    #region 填充kcph
                                    string  id_kcph       = tempRow["id"].ToString();
                                    int     jgbm_kcph     = Convert.ToInt32(tempRow["jgbm"]);
                                    int     ggid_kcph     = Convert.ToInt32(tempRow["ggid"]);
                                    int     cjid_kcph     = Convert.ToInt32(tempRow["cjid"]);
                                    int     kwid_kcph     = Convert.ToInt32(tempRow["kwid"]);
                                    string  ypph_kcph     = tempRow["ypph"].ToString();
                                    string  ypxq_kcph     = tempRow["ypxq"].ToString();
                                    string  yppch_kcph    = tempRow["yppch"].ToString(); //批次号
                                    Guid    kcid_kcph     = (tempRow["kcid"] is DBNull) ? Guid.Empty : new Guid(tempRow["kcid"].ToString());
                                    decimal jhj_kcph      = Convert.ToDecimal(tempRow["jhj"]);
                                    decimal pfj_kcph      = Convert.ToDecimal(tempRow["pfj"]);
                                    decimal lsj_kcph      = Convert.ToDecimal(tempRow["lsj"]);
                                    decimal kcl_kcph      = Convert.ToDecimal(tempRow["kcl"]);
                                    int     zxdw_kcph     = Convert.ToInt32(tempRow["zxdw"]);
                                    string  ypdw_kcph     = tempRow["ypdw"].ToString();
                                    int     dwbl_kcph     = sum.dwbl;
                                    int     bdelete_kcph  = Convert.ToInt32(tempRow["bdelete"]);
                                    int     ykdelete_kcph = Convert.ToInt32(tempRow["ykbdelete"]);
                                    decimal cks_kcph      = temp;          //ypmx中要出库的数量
                                    Guid    mxid_kcph     = ypmx.fymxid;   //明细id
                                    Guid    tid_kcph      = ypmx.tid;      //头id
                                    Guid    tyid_kcph     = ypmx.tfymxid;  //tyid
                                    ypmx.ypsl      = ypmx.ypsl - cks_kcph; // 0
                                    tempRow["kcl"] = kcl_kcph - temp;
                                    temp           = temp - cks_kcph;      //当前申请明细要出库的数量-当前批号库存数量
                                    ZY_MX_Kcph kcph = new ZY_MX_Kcph(id_kcph, jgbm_kcph, ggid_kcph, cjid_kcph, kwid_kcph,
                                                                     ypph_kcph, ypxq_kcph, yppch_kcph, kcid_kcph, jhj_kcph, pfj_kcph, lsj_kcph, kcl_kcph, zxdw_kcph, ypdw_kcph,
                                                                     dwbl_kcph, bdelete_kcph, ykdelete_kcph, cks_kcph, mxid_kcph, tid_kcph, cks_kcph
                                                                     , tyid_kcph);
                                    kcph.zy_ypmx = (ZY_Ypmx)CloneBySerialize <ZY_Ypmx>(lstYpmx[i]);
                                    lstKcph.Add(kcph);
                                    #endregion

                                    tb_kcph.Rows[j]["kcl"] = kcl_kcph - cks_kcph; //当前批号库存行中的kcl-出库的数量
                                    break;                                        //跳出批号库存迭代
                                }
                            }

                            if (temp > 0)//如果库存不够分配
                            {
                                throw new Exception(ypmx.yppm + ypmx.ypgg + " 库存量不足");
                            }
                        }
                        lstYpmx.Remove(ypmx);
                        #endregion
                    }
                }
                for (int i = 0; i < tb_kcph.Rows.Count; i++)
                {
                    if (Convert.ToInt32(tb_kcph.Rows[i]["cjid"]) == sum.cjid)
                    {
                        tb_kcph.Rows[i].Delete();
                    }
                }
                tb_kcph.AcceptChanges();//提交删除
            }
            #endregion

            //将分配的负数放在前面

            return(lstKcph);
            //return (List<ZY_MX_Kcph>)CloneBySerialize<List<ZY_MX_Kcph>>(lstKcph);
        }
Example #3
0
 public void AddCount(ZY_MX_Kcph kcph)
 {
     this.ypsl += kcph.cks;
     this.pfje += Convert.ToDecimal(kcph.zy_ypmx.pfj * kcph.dwbl / kcph.zy_ypmx.dwbl * kcph.cks);
     this.lsje += Convert.ToDecimal(kcph.zy_ypmx.lsj * kcph.dwbl / kcph.zy_ypmx.dwbl * kcph.cks);
 }