如何利用极致业务基础平台做一个通用企业ERP之十销售报价单一览表

1我们前面做了销售报价单后,我们需要做一个销售报价单的查询界面,也就是一览表界面如下:

我们要做如下功能:

1.不同业务员进来只能看他自己的报价单。业务经理进来可以看到他自己和他下属业务员的报价单。总经理进来可以看到所有。类似前面的构建where部分即可。

2.报价单上有的功能,一览表上同样要有,比如更新价格,下推订单,在单据下推的时候,我们是利用sql语句判断是否还有未下推完的数据,而在一览表则利用服务端计算公式算出下推的数量汇总,直接显示到grid上。此外一览表上因为有可能跨不同客户报价单,所以条件更严谨些。

3设置固定列,表头过滤,这些可以直接设置grid的相关属性即可。

4如何在一览表上设置查询条件,查询出还有哪些没有下推完。利用过滤引擎支持变量的作法,设置如下界面即可:

注意已订单数量是直接利用sql语句结合表单的服务端计算公式即可,他不需要banding实体列。比较方用@在其Grid标题名即可。还可以设置预警。

其他代码实现。

客户端代码如下:

/// <summary>
    /// 报价单一览表
    /// </summary>
    class SaleBaojiaList : Jeez.Runtime.Base.General.frmList
    {
        public override void RefreshList()
        {
            //设置一览表的数据源
            base.ReportListData = new SaleBaojiaListData();
            base.ReportListData.objContext = this.objContext;
            base.ReportListData.FormPropertyPage = this.FormPropertyPage;
            base.RefreshFilterGridData();
        }

        /// <summary>
        /// 指定服务端调用的类
        /// </summary>
        /// <param name="ServerDllName"></param>
        /// <param name="ServerClassName"></param>
        protected override void SetInvokeBusiLogicName(out string ServerDllName, out string ServerClassName)
        {
            ServerDllName = "FolyerERPServer.dll";
            ServerClassName = "FolyerERPServer.FolyerERPServer_SCM.SaleBaojiaServer";
        }


        public override void ResponseMenuToolClickEvent(object sender, Infragistics.Win.UltraWinToolbars.ToolClickEventArgs e, object Tool)
        {
            Jeez.FormProperty.JeezTool tool = Tool as Jeez.FormProperty.JeezTool;
            if (tool == null) return;
            switch (tool.Name)
            {
                case "toolNext":
                    toPO();
                    break;
                case "toolUpdate":
                    UpdatePrice();
                    break;
                default:
                    base.ResponseMenuToolClickEvent(sender, e, Tool);
                    break;
            }

        }
        /// <summary>
        /// 更新物料销售价格表
        /// </summary>
        void UpdatePrice()
        {
            if (CurrentGrid.Selected.Rows.Count == 0)
                return;
            //获取选中行的实体对象
            ArrayList childID = new ArrayList();
            foreach (Infragistics.Win.UltraWinGrid.UltraGridRow row in CurrentGrid.Selected.Rows)
            {

                childID.Add(row.Cells["DetailID"].Value);

            }
            Hashtable ht = new Hashtable();
            ht["childID"] = childID;
            //像批量更改价格的我们最好在服务器端去处理
            RemoteObjectProxy proxy = this.objContext.GetRemoteObjectProxy("FolyerERPServer.dll", "FolyerERPServer.FolyerERPServer_SCM.SaleBaojiaServer");
            string Message = (string)proxy.Invoke("UpadatePrice", ht);
            if (Message != null)
            {
                Jeez.Common.UI.MsgBox.Show(Message);
            }

        }
        
        /// <summary>
        /// 销售报价单下推销售订单
        /// </summary>
        protected void toPO()
        {
            if (CurrentGrid.Selected.Rows.Count == 0)
                return;
            EntityObject eoOrg = null;
            EntityObject eoSupier = null;
            EntityObject eoBibie = null;
            ArrayList arr = new ArrayList();
            foreach (Infragistics.Win.UltraWinGrid.UltraGridRow row in CurrentGrid.Selected.Rows)
            {
                if (!(bool)BaseFunc.IsNull(row.Cells["IsCheck"].Value, false))
                {
                    Jeez.Common.UI.MsgBox.Inform(string.Format("第{0}行没有审核", row.ListIndex + 1));
                    return;
                }
                if (Convert.ToDecimal(BaseFunc.IsNull(row.Cells["Many"].Value, 0m)) -
                    Convert.ToDecimal(BaseFunc.IsNull(row.Cells["POMany"].Value, 0m)) <= 0m)
                {
                    Jeez.Common.UI.MsgBox.Inform(string.Format("第{0}行已经完成订单", row.ListIndex + 1));
                    return;
                }

                EntityObject eob = base.GetBillEntityObject(base.GetBillIDByRow(row.ListIndex));
                if (eob != null)
                {
                    if (eoOrg != null && eoOrg.PrimaryKeyValue.ToString() != eob.GetProperty("OrganizationID").ToString())
                    {
                        Jeez.Common.UI.MsgBox.Inform(string.Format("选择的组织机构不一致"));
                        return;
                    }
                    eoOrg = eob.GetRelatedObject("OrganizationID");

                    if (eoSupier != null && eoSupier.PrimaryKeyValue.ToString() != eob.GetProperty("RefUnitID").ToString())
                    {
                        Jeez.Common.UI.MsgBox.Inform(string.Format("选择的客户不一致"));
                        return;
                    }
                    eoSupier = eob.GetRelatedObject("RefUnitID");

                    if (eoBibie != null && eoBibie.PrimaryKeyValue.ToString() != eob.GetProperty("CurrencyID").ToString())
                    {
                        Jeez.Common.UI.MsgBox.Inform(string.Format("选择的币别不一致"));
                        return;
                    }
                    eoBibie = eob.GetRelatedObject("CurrencyID");
                }

                Hashtable htv = new Hashtable();
                htv["DetailID"] = row.Cells["DetailID"].Value;
                htv["Many"] = Convert.ToDecimal(BaseFunc.IsNull(row.Cells["Many"].Value, 0m)) -
                    Convert.ToDecimal(BaseFunc.IsNull(row.Cells["POMany"].Value, 0m));
                arr.Add(htv);
            }
            Hashtable ht = new Hashtable();
            ht["DetailList"] = arr;
            SaleOrder f = base.ShowForm(EntityFormIDEnum.销售订单管理2, ht) as SaleOrder;

        }



    }
    /// <summary>
    /// 构建一览表的数据源
    /// </summary>
    public class SaleBaojiaListData : Jeez.Runtime.Data.ReportList
    {
        public SaleBaojiaListData()
            : base()
        {

        }
        //获取SQL on部分
        protected override void AddFromSqlBeforeONPart(StringBuilder sb, System.Collections.ArrayList aryTable, string tableName, string tableNameAs)
        {
            //获取已经下推的订单数量
            if (tableName.ToLower() == "jzsalebaojiadetail")
            {
                sb.Append("(");


                sb.Append(@"select a.*,IsNull(b.PoQty,0) as PoMany
                            from [jzsalebaojiadetail] a 
                            left join (select salebaojiadetailID,jiliangdanweiID,isnull(Sum(Many),0) as PoQty from jzSaleOrderDetail where salebaojiadetailID>0 group by salebaojiadetailID,jiliangdanweiID ) b
                               on a.id=b.salebaojiadetailID 
                                  ");

                sb.Append(")");
                sb.Append(" AS ");
                sb.Append("[");
                sb.Append(tableNameAs);//别名
                sb.Append("]");
                aryTable.Add(tableName);
                if (tableName != tableNameAs)
                {
                    aryTable.Add(tableNameAs);
                }
            }
            else
            {
                base.AddFromSqlBeforeONPart(sb, aryTable, tableName, tableNameAs);
            }
        }
        //获取SQL where部分
        public override string GetRptListSQLWhere()
        {
            string strwhere = base.GetRptListSQLWhere();//获取框架点击过滤的时候设置的过滤条件

            //我们可以利用构建数据源的where部分来实现打开往来单位一览表的数据源的数据隔离
            string filter = BaseFunc.GetEmpFilter(objContext);//获取当前用户的自己职员ID,以及他下属的职员ID,职员表我们有个上级主管字段来决定员工上下级关系
            if (strwhere == "")
            {
                  //如果没有看所有往来单位的权限的话,就只能查看业务员自己以及业务员下属录入进来的销售报价单数据
                    strwhere += string.Format("  where jzSaleBaojia.EmployeeID in {0}", filter);
                    
 
            }
            else
            {
                strwhere += string.Format(" and jzSaleBaojia.EmployeeID in {0}", filter);
                  
            }


            return strwhere;
        }
        //获取SQL order by部分
        public override string GetRptListSqlOrderBy(ref string strSQLGroupBy)
        {
            return base.GetRptListSqlOrderBy(ref strSQLGroupBy);
        }
    }
View Code

服务端代码如下:

 /// <summary>
    /// 销售报价单服务端类
    /// </summary>
    class SaleBaojiaServer:SCMBaseServer
    {
        protected override bool CheckValidate(EntityObject eo, bool IsCheck, ref string strMessage)
        {
            return base.CheckValidate(eo, IsCheck, ref strMessage);
        }
        /// <summary>
        /// 更新价格,从单据上来的
        /// </summary>
        public  object UpadatePrice(int entiyID)
        {
            try
            {
                //先获取当前传过来的id
                EntityObjectFactory eofBaojia = EntityObjectFactory.GetInstance(this.Context, EntityIDEnum.SaleBaojia);
                EntityObject eoBaojia = eofBaojia.FindObject(entiyID);

                //获取报价单子表集合
                EntityObjectList eolChildBaojiaoDetail = eoBaojia.GetChildEntityObjects(EntityIDEnum.SaleBaojiaDetail);
                //获取销售价格表
                EntityObjectFactory eofSalePrice = EntityObjectFactory.GetInstance(this.Context, EntityIDEnum.MatSalePrice);
                int WLDWID = (int)eoBaojia.GetRelatedObject("RefUnitID").PrimaryKeyValue;
                int BIBIEID = (int)eoBaojia.GetRelatedObject("CurrencyID").PrimaryKeyValue;
                foreach (EntityObject eoChild in eolChildBaojiaoDetail)
                {
                    int UnitID = (int)eoChild.GetRelatedObject("JiliangdanweiID").PrimaryKeyValue;
                    int MatID = (int)eoChild.GetRelatedObject("MatID").PrimaryKeyValue;

                    EntityObject eoSalePrice = eofSalePrice.FindFirst("RefUnitID={0} and CurrencyID={1} and JiliangdanweiID={2} and MatID={3}", WLDWID, BIBIEID, UnitID, MatID);

                    if (eoSalePrice== null)
                    {
                        //如果没有价格记录
                        //添加本次价格记录
                        eoSalePrice = eofSalePrice.CreateObject();
                        eoSalePrice.SetProperty("MatID", MatID);
                        eoSalePrice.SetProperty("RefUnitID", WLDWID);
                        eoSalePrice.SetProperty("jiliangdanweiID", UnitID);
                        eoSalePrice.SetProperty("CurrencyID", BIBIEID);
                        eoSalePrice.SetProperty("MinQty", 1.0m);
                        eoSalePrice.SetProperty("Date", eoBaojia.GetProperty("Date"));
                        eoSalePrice.SetProperty("Danjia", eoChild.GetProperty("Danjia"));
                        eoSalePrice.SetProperty("Description", string.Format("销售报价单{0}更新而产生",eoBaojia.GetProperty("BillNo")));

                    }
                }

                Context.SaveChanges();
            }
            catch (Exception  ex)
            {
                return ex.Message;
            }
            return null;
 
        }

        /// <summary>
        /// 更新价格,从报价单一览表上过来的
        /// </summary>
        public object UpadatePrice(Hashtable ht)
        {
            try
            {
                ArrayList arr = (ArrayList)ht["childID"];
                int i = arr.Count; ;
                for (int j = 0; j < i; j++)
                {
                    //先获取当前传过来的id
                    int childID =Convert.ToInt32(arr[j].ToString());

                    EntityObject eoBaojiaoDetail = EntityObjectFactory.GetInstance(Context, EntityIDEnum.SaleBaojiaDetail).FindObject(childID);

                    //获取销售价格表
                    EntityObjectFactory eofSalePrice = EntityObjectFactory.GetInstance(this.Context, EntityIDEnum.MatSalePrice);
                    int WLDWID = (int)eoBaojiaoDetail.GetRelatedObject("SaleBaojiaID").GetRelatedObject("RefUnitID").PrimaryKeyValue;
                    int BIBIEID = (int)eoBaojiaoDetail.GetRelatedObject("SaleBaojiaID").GetRelatedObject("CurrencyID").PrimaryKeyValue;

                    int UnitID = (int)eoBaojiaoDetail.GetRelatedObject("JiliangdanweiID").PrimaryKeyValue;
                    int MatID = (int)eoBaojiaoDetail.GetRelatedObject("MatID").PrimaryKeyValue;

                    EntityObject eoSalePrice = eofSalePrice.FindFirst("RefUnitID={0} and CurrencyID={1} and JiliangdanweiID={2} and MatID={3}", WLDWID, BIBIEID, UnitID, MatID);

                    if (eoSalePrice == null)
                    {
                        //如果没有价格记录
                        //添加本次价格记录
                        eoSalePrice = eofSalePrice.CreateObject();
                        eoSalePrice.SetProperty("MatID", MatID);
                        eoSalePrice.SetProperty("RefUnitID", WLDWID);
                        eoSalePrice.SetProperty("jiliangdanweiID", UnitID);
                        eoSalePrice.SetProperty("CurrencyID", BIBIEID);
                        eoSalePrice.SetProperty("MinQty", 1.0m);
                        eoSalePrice.SetProperty("Date", eoBaojiaoDetail.GetRelatedObject("SaleBaojiaID").GetProperty("Date"));
                        eoSalePrice.SetProperty("Danjia", eoBaojiaoDetail.GetProperty("Danjia"));
                        eoSalePrice.SetProperty("Description", string.Format("销售报价单{0}更新而产生", eoBaojiaoDetail.GetRelatedObject("SaleBaojiaID").GetProperty("BillNo")));

                    }
                   

                }
                Context.SaveChanges();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            return null;

        }
    }

服务端基类代码和销售订单销售出库单一起共用的一个基类:

 /// <summary>
    /// 业务对象服务端基类,包含组织机构,日期
    /// </summary>
    class SCMBaseServer : Jeez.Runtime.BusiLogic.RuntimeBusiLogic
    {
        /// <summary>
        /// 服务端保存前检查事件
        /// </summary>
        /// <param name="eo"></param>
        /// <param name="strMessage"></param>
        /// <returns></returns>
        public override bool SaveValidate(EntityObject eo, ref string strMessage)
        {
            bool b = base.SaveValidate(eo, ref strMessage);
            if (b)
            {
                DateTime dt = Jeez.Core.Toolkit.GetServerTime(Context);
                int year = dt.Year;
                int month = dt.Month;
                DateTime dtBill=(DateTime)eo.GetProperty("Date");//确保你的业务单据父表都有Date字段
                if (year > 2015||dtBill.Year>2015)
                {
                    strMessage = "免费试用已经过期";
                    return false;
                }
                //判断是否会录入已经结账的期间往前的数据
                if (!CheckDate(eo, ref strMessage))
                    return false;
            }
            return b;
        }
        /// <summary>
        /// 服务端删除前检查事件
        /// </summary>
        /// <param name="eo"></param>
        /// <param name="strMessage"></param>
        /// <returns></returns>
        protected override bool DeleteValidate(EntityObject eo, ref string strMessage)
        {
            bool b = base.DeleteValidate(eo, ref strMessage);
            if(b)
            {
               
                //判断是否会录入已经结账的期间往前的数据
                if (!CheckDate(eo, ref strMessage))
                    return false;
            }
            return b;
        }
        /// <summary>
        /// 检查录入的业务数据是否为以前期间的数据
        /// </summary>
        /// <param name="eo"></param>
        /// <param name="strMessage"></param>
        /// <returns></returns>
        protected bool CheckDate(EntityObject eo, ref string strMessage)
        {
            DateTime dt = DateTime.Now;
            int OrgID = 0;

            OrgID = (int)eo.GetProperty("OrganizationID");
            dt = Convert.ToDateTime(BaseFunc.IsNull(eo.GetProperty("Date"), Jeez.Core.Toolkit.GetDateTimeDefaultValue()));

            DateTime dtCur = BaseFunc.GetCurPeriod(Context, OrgID, false, "通用企业ERP"); 
            if (dtCur.Year == 1799)
            {
                strMessage = string.Format("单据所属的组织机构没有启用仓库");
                return false;
            }

            if (dt.Year * 100 + dt.Month < dtCur.Year * 100 + dtCur.Month)
            {
                strMessage = string.Format("单据日期在以前期间");
                return false;
            }

            return true;

        }
        /// <summary>
        /// 审核前检查事件
        /// </summary>
        /// <param name="eo"></param>
        /// <param name="IsCheck"></param>
        /// <param name="strMessage"></param>
        /// <returns></returns>
        protected override bool CheckValidate(EntityObject eo, bool IsCheck, ref string strMessage)
        {
            bool b = base.CheckValidate(eo, IsCheck, ref strMessage);
            if (b)
            {
                if (!CheckDate(eo, ref strMessage))
                    return false;
            }
            return b;
        }
    }
View Code

极致平台开发十大特点:

1. 一个数据库下可以同时进行N套业务系统开发,开发出来的产品可以根据您客户的需要按模块界面组发布,客户想要啥模块就可以给啥模块。而且一个数据库下开发所有功能,当客户需要从你的人力资源增加客户关系管理模块的时候,你只要做个升级包就可以了。解决企业多个业务系统信息孤岛问题。
2. 智能升级功能,当客户从A模块增加B模块的时候,您只需要做一个升级包即可,给客户升级后,客户原来录入的数据不会有影响,而且所有客户端都是智能感应智能升级,大大节省您的部署成本。
3. 工作流套打报表均可以运行时候自定义,比如费用报销单,您100家客户就有一百种费用报销的流程,套打的格式,用我们平台您只需要设计好这个费用报销单,至于哪个客户走什么流程,完全可以让客户自己去定义,而不需要像传统开发那样,提前在开发中设置好,100个客户就维护100套代码。套打也是如此。
4. 支持数据授权,当您开发多组织架构的系统的时候,我们只要业务单据引用组织机构即可,然后组织机构支持数据授权,这样就可以不需要编写任何一行代码就可以做到,组织与组织之间数据彼此隔离,我想给哪个用户看哪个组织的数据只要给这个用户这个组织的数据权限即可。
5. 支持字段授权,对于一些表的核心字段对用户进行屏蔽直接利用我们平台的字段授权功能即可,比如职员薪酬字段进行字段授权,让有的用户在看职员信息的时候,自动隐藏薪酬的数据。这也是无需编写任何一行代码。
6. 单据界面自动生成,我们开发的时候只要设计好实体,也就是传统开发所说的表结构即可,还可以设置哪些字段是必录,可见,不允许重复,在界面生成的时候,会自动生成一个界面,而且这个界面的增删改查是无需写一行代码的,您只要对您特有业务逻辑编码即可,相对传统开发,你代码量可以节省2/3,开发周期缩短2/3
7.一次开发同时具有单机局域互联网三个版本,客户想要单机就给单机想要互联网版就给互联网版。 

8.强大的公式引擎,让您可以灵活设计计算类的项目,比如工资,预算。

9.包含强大的各种控件,比如文本控件支持F8调用,编码名称自动带出。Grid控件支持表头过滤,单元格融合,固定列,表格列,表格行各种公式汇总,复合表头,表格宽度可以自己随意调整,而且关闭后会自动记录之前的宽度。还支持表格列随意调整顺序。

10.平台内置很多基础功能,比如权限管理,用户角色管理,还有实施的一些导入导出工具都能帮助客户大大提高一个项目验收进度。

 

官网:www.jeez.com.cn
平台介绍:www.jeez.com.cn/jbf  
平台下载地址:http://www.jeez.com.cn/upfiles/jbfsetuppro.rar

(下载即可有3个月免费试用)
联系电话:13826519021 18988763421 QQ:180315586  420977542 (加我注明极致软件即可)

平台销售经理:李先生 

将互联网时代的管理软件做到极致!
==================================================================

原文地址:https://www.cnblogs.com/Jeez_JBF/p/ERP11.html