Пример #1
0
        /// <summary>
        /// 用窗体的内容初始化实体对象
        /// </summary>
        POBodyEntity ReadyEntityToSave()
        {
            POBodyEntity po = new POBodyEntity();

            po.Details = bindingSource1.DataSource as List <PODetailEntity>;

            //组织表头,不要填写BillID,业务员直接保存名称
            po.BillID       = txtBillID.Text;
            po.OrgCode      = GlobeSettings.LoginedUser.OrgCode;
            po.SourceBillID = txtSourceBillID.Text.Trim();
            po.Sales        = listSales.Text;
            po.Supplier     = ConvertUtil.ToString(listSupplier.EditValue);
            po.BillType     = ConvertUtil.ToString(listBillType.EditValue);
            po.ContractNO   = txtContractNO.Text.Trim();
            po.Remark       = txtRemark.Text.Trim();
            po.Creator      = GlobeSettings.LoginedUser.UserName;

            //下面是可扩展的字段
            //po.PO_STR1 = ...
            //...
            //
            //po.PO_DATE2 = ...

            return(po);
        }
Пример #2
0
        // 从采购单创建收货单,一个采购单可以创建多个收货单,正常说应该以实收数量来限制收货单入库总量不能大于采购订单量
        private void OnChoosePOButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
            {
                using (FrmPoQuery frmQuery = new FrmPoQuery())
                {
                    //如果只启用一审,则传参一审
                    string billState = string.Concat(BillStateConst.PO_STATE_CODE_SECOND_APPROVED, ",", BillStateConst.PO_STATE_CODE_RECEIVING);
                    if (CustomFields.ApproveType.ItemValue == "1")
                    {
                        billState = string.Concat(BillStateConst.PO_STATE_CODE_FIRST_APPROVED, ",", BillStateConst.PO_STATE_CODE_RECEIVING);
                    }

                    frmQuery.LockThisState(billState);

                    if (frmQuery.ShowDialog() == DialogResult.OK)
                    {
                        POBodyEntity header = frmQuery.FocusedHeader;
                        txtPO.Text               = header.BillID;
                        listBillType.EditValue   = header.BillType;
                        listRespPerson.EditValue = header.Sales;
                        listSupplier.EditValue   = header.Supplier;
                        txtContractNO.Text       = header.ContractNO;

                        bindingSource1.DataSource = header.Details;
                    }
                }
            }
            else
            {
                ClearHeader();
            }
        }
Пример #3
0
        public FrmPoEditRemark(POBodyEntity poHeader)
        {
            InitializeComponent();

            this.PoHeader = poHeader;
            this.Text     = string.Format("编辑备注(单号:{0})", poHeader.BillID);
        }
Пример #4
0
        private void DoEditOne()
        {
            if (ucPoBody1.FocusedRowCount == 0)
            {
                MsgBox.Warn("请选中要编辑的行。");
                return;
            }

            if (ucPoBody1.FocusedRowCount > 1)
            {
                MsgBox.Warn("不支持多行操作,请选择其中一行。");
                return;
            }

            POBodyEntity focusedHeader = ucPoBody1.FocusedHeader;

            if (focusedHeader.BillState != BillStateConst.PO_STATE_CODE_DRAFT)
            {
                MsgBox.Warn(string.Format("单据“{0}”的状态不是草稿,不允许编辑。", focusedHeader.BillID));
                return;
            }

            FrmPoEdit frmEditBill = new FrmPoEdit(focusedHeader.BillID, false);

            frmEditBill.MdiParent = this.MdiParent;
            frmEditBill.Show();
        }
Пример #5
0
        /// <summary>
        /// 取消二审
        /// </summary>
        /// <param name="focusedHeaders"></param>
        public void CancelSecondApproveBills(List <POBodyEntity> focusedHeaders)
        {
            if (GetFocusedRowCount(focusedHeaders) == 0)
            {
                MsgBox.Warn("请选中要反审批的行。");
                return;
            }

            //先从界面上判断一下,减少网络交互和数据库负载
            foreach (POBodyEntity header in focusedHeaders)
            {
                if (header.BillState != BillStateConst.PO_STATE_CODE_SECOND_APPROVED)
                {
                    MsgBox.Warn(string.Format("单据“{0}”的状态不允许反审,必须是已经完成二审并且没有开始收货的单据。", header.BillID));
                    return;
                }
            }

            if (MsgBox.AskOK(string.Format("您选择了“{0}”张单据“{1}”,确认要做反审操作吗?",
                                           GetFocusedRowCount(focusedHeaders), GetFocusedBillIDs(focusedHeaders))) != DialogResult.OK)
            {
                return;
            }

            try
            {
                POBodyEntity errHeader = null;
                string       result    = poDal.CancelSecondApprove(focusedHeaders, GlobeSettings.LoginedUser.UserName, GlobeSettings.LoginedUser.UserCode, out errHeader);
                switch (result)
                {
                case "1":
                    //成功,刷新界面即可,不再提示
                    ReloadStateDesc(focusedHeaders);
                    break;

                case "-1":
                    MsgBox.Warn(string.Format("单据“{0}”操作失败,单据不存在。", errHeader.BillID));
                    break;

                case "-2":
                    MsgBox.Warn(string.Format("单据“{0}”反审失败,必须是已通过二审的单据才允许反审。", errHeader.BillID));
                    break;

                case "-3":
                    MsgBox.Warn(string.Format("单据“{0}”反审失败,审批人不是您本人,无法反审。", errHeader.BillID));
                    break;

                case "-4":
                    MsgBox.Warn(string.Format("更新单据“{0}”状态时失败,请稍后重试。", errHeader.BillID));
                    break;
                }
            }
            catch (Exception ex)
            {
                MsgBox.Err(ex.Message);
            }
        }
Пример #6
0
        private void OnHeaderRowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
        {
            POBodyEntity header = gvHeader.GetRow(e.RowHandle) as POBodyEntity;

            if (header != null && header.RowForeColor != null)
            {
                e.Appearance.ForeColor = Color.FromArgb(header.RowForeColor.Value);
            }
        }
Пример #7
0
        /// <summary>
        /// 删除选中的单据
        /// </summary>
        /// <param name="selectedHeader"></param>
        public void DeleteSelectedBill(List <POBodyEntity> focusedHeaders)
        {
            if (GetFocusedRowCount(focusedHeaders) == 0)
            {
                MsgBox.Warn("请选中要删除的行。");
                return;
            }

            //先从界面上判断一下,减少网络交互和数据库负载
            foreach (POBodyEntity header in focusedHeaders)
            {
                if (header.BillState != BillStateConst.PO_STATE_CODE_DRAFT)
                {
                    MsgBox.Warn(string.Format("单据“{0}”状态不是草稿,无法删除。", header.BillID));
                    return;
                }
            }

            if (MsgBox.AskOK(string.Format("您选择了“{0}”张单据“{1}”,确认要删除吗?",
                                           GetFocusedRowCount(focusedHeaders), GetFocusedBillIDs(focusedHeaders))) != DialogResult.OK)
            {
                return;
            }

            try
            {
                POBodyEntity errHeader = null;
                string       result    = poDal.Delete(focusedHeaders, GlobeSettings.LoginedUser.UserName, out errHeader);
                switch (result)
                {
                case "1":
                    //成功,刷新界面即可,不再提示
                    ipo.ReloadPO();
                    break;

                case "-1":
                    MsgBox.Warn(string.Format("删除失败,单据“{0}”不存在。", errHeader.BillID));
                    break;

                case "-2":
                    MsgBox.Warn(string.Format("单据“{0}”的状态不是草稿,无法删除。", errHeader.BillID));
                    break;

                case "-3":
                    MsgBox.Warn(string.Format("删除单据“{0}”的明细失败,请稍后重试。", errHeader.BillID));
                    break;

                case "-4":
                    MsgBox.Warn(string.Format("删除单据“{0}”的表头失败,请稍后重试。", errHeader.BillID));
                    break;
                }
            }
            catch (Exception ex)
            {
                MsgBox.Err(ex.Message);
            }
        }
Пример #8
0
        void ShowFocusedDetail()
        {
            POBodyEntity po = FocusedHeader;

            if (po != null && po.Details == null)
            {
                po.Details = poQueryDal.GetDetailByBillID(po.BillID);
                gvHeader.RefreshData();
            }
        }
Пример #9
0
        /// <summary>
        /// 二审
        /// </summary>
        /// <param name="focusedHeaders"></param>
        public void SecondApproveBills(List <POBodyEntity> focusedHeaders)
        {
            if (GetFocusedRowCount(focusedHeaders) == 0)
            {
                MsgBox.Warn("请选中要审批的行。");
                return;
            }

            //先从界面上判断一下,减少网络交互和数据库负载
            foreach (POBodyEntity header in focusedHeaders)
            {
                if (header.BillState != BillStateConst.PO_STATE_CODE_FIRST_APPROVED)
                {
                    MsgBox.Warn(string.Format("单据“{0}”的状态不允许审批,必须是已通过一审并且没有二审的单据。", header.BillID));
                    return;
                }
            }

            if (MsgBox.AskOK(string.Format("您选择了“{0}”张单据“{1}”,确认要审核通过吗?",
                                           GetFocusedRowCount(focusedHeaders), GetFocusedBillIDs(focusedHeaders))) != DialogResult.OK)
            {
                return;
            }

            try
            {
                POBodyEntity errHeader = null;
                string       result    = poDal.SecondApprove(focusedHeaders, GlobeSettings.LoginedUser.UserName, GlobeSettings.LoginedUser.UserCode, out errHeader);
                switch (result)
                {
                case "1":
                    //状态更新成功后,刷新界面即可,不再提示
                    ReloadStateDesc(focusedHeaders);
                    break;

                case "-1":
                    MsgBox.Warn(string.Format("单据“{0}”操作失败,单据不存在。", errHeader.BillID));
                    break;

                case "-2":
                    MsgBox.Warn(string.Format("单据“{0}”操作失败,单据状态必须是一审通过,请刷新后重试。", errHeader.BillID));
                    break;

                case "-3":
                    MsgBox.Warn(string.Format("更新单据“{0}”状态时失败,失败原因未知,请稍后重试。", errHeader.BillID));
                    break;
                }
            }
            catch (Exception ex)
            {
                MsgBox.Err(ex.Message);
            }
        }
Пример #10
0
        /// <summary>
        /// 提交选中单据
        /// </summary>
        /// <param name="selectedHeader"></param>
        public void CommitBill(List <POBodyEntity> focusedHeaders)
        {
            if (GetFocusedRowCount(focusedHeaders) == 0)
            {
                MsgBox.Warn("请选中要提交的行。");
                return;
            }

            //先从界面上判断一下,减少网络交互和数据库负载
            foreach (POBodyEntity header in focusedHeaders)
            {
                if (header.BillState != BillStateConst.PO_STATE_CODE_DRAFT)
                {
                    MsgBox.Warn(string.Format("单据“{0}”已经提交,不允许多次提交。", header.BillID));
                    return;
                }
            }

            if (MsgBox.AskOK(string.Format("您选择了“{0}”张单据“{1}”,提交后不再允许编辑,确认要提交吗?",
                                           GetFocusedRowCount(focusedHeaders), GetFocusedBillIDs(focusedHeaders))) != DialogResult.OK)
            {
                return;
            }

            try
            {
                POBodyEntity errHeader = null;
                string       result    = poDal.Commit(focusedHeaders, GlobeSettings.LoginedUser.UserName, out errHeader);
                switch (result)
                {
                case "1":
                    //成功,刷新界面即可,不再提示
                    ReloadStateDesc(focusedHeaders);
                    break;

                case "-1":
                    MsgBox.Warn(string.Format("提交失败,单据“{0}”不存在。", errHeader.BillID));
                    break;

                case "-2":
                    MsgBox.Warn(string.Format("单据“{0}”已经提交,不允许多次提交。", errHeader.BillID));
                    break;

                case "-3":
                    MsgBox.Warn(string.Format("更新单据“{0}”的状态时失败,请稍后重试或联系管理员解决此问题。", errHeader.BillID));
                    break;
                }
            }
            catch (Exception ex)
            {
                MsgBox.Err(ex.Message);
            }
        }
Пример #11
0
        private void OnOKClick(object sender, EventArgs e)
        {
            POBodyEntity po = FocusedHeader;

            if (po == null)
            {
                MsgBox.Warn("未选中任何订单行。");
            }
            else
            {
                this.DialogResult = DialogResult.OK;
            }
        }
Пример #12
0
        void ShowPODetail(POBodyEntity po)
        {
            txtBillID.Text       = po.BillID;
            txtSourceBillID.Text = po.SourceBillID;
            listSales.Text       = po.Sales;
            listSales.ClosePopup();
            listSupplier.EditValue = po.Supplier;
            listBillType.EditValue = po.BillType;
            txtContractNO.Text     = po.ContractNO;
            txtRemark.Text         = po.Remark;
            txtBillState.Text      = po.BillStateDesc;

            bindingSource1.DataSource = po.Details;
        }
Пример #13
0
        private void ReloadStateDesc(List <POBodyEntity> headers)
        {
            //从集合中取出一个单据的状态,更新集合中的其他单据的状态
            if (headers != null && headers.Count > 0)
            {
                POBodyEntity poState = poQueryDal.GetBillState(headers[0].BillID);
                headers.ForEach(h =>
                {
                    h.BillState     = poState.BillState;
                    h.BillStateDesc = poState.BillStateDesc;
                });

                //刷新界面
                ipo.RefreshState();
            }
        }
Пример #14
0
        /// <summary>
        /// 删除选中的单据,状态必须为草稿
        /// </summary>
        /// <param name="focusedHeaders"></param>
        /// <param name="userName"></param>
        /// <param name="errHeader"></param>
        /// <returns>1:成功;0:未知;-1:单据未找到;-2:不是草稿;-3:删除明细时,一行都没受影响;-4:删除主表时,一行都没受影响</returns>
        public string Delete(List <POBodyEntity> focusedHeaders, string userName, out POBodyEntity errHeader)
        {
            errHeader = null;

            DynamicParameters parms = new DynamicParameters();

            parms.Add("P_BILL_ID");
            parms.Add("P_USER_NAME", userName);
            parms.AddOut("P_RET_VAL", DbType.String, 2);

            IMapper        map  = DatabaseInstance.Instance();
            IDbTransaction tran = map.BeginTransaction();

            try
            {
                string result = string.Empty;
                foreach (POBodyEntity header in focusedHeaders)
                {
                    parms.Set("P_BILL_ID", header.BillID);
                    map.Execute("P_PO_DEL_BILL", parms, tran, CommandType.StoredProcedure);

                    result = parms.Get <string>("P_RET_VAL");
                    if (result != "1")
                    {
                        errHeader = header;
                        break;
                    }
                }

                if (result == "1")
                {
                    tran.Commit();
                }
                else
                {
                    tran.Rollback();
                }

                return(result);
            }
            catch (Exception ex)
            {
                tran.Rollback();
                throw ex;
            }
        }
Пример #15
0
        void ShowPODetail()
        {
            if (!string.IsNullOrEmpty(this.BillID))
            {
                POBodyEntity header = poQueryDal.GetBillHeader(this.BillID);
                if (header != null)
                {
                    header.Details = poQueryDal.GetDetailByBillID(this.BillID);
                    ShowPODetail(header);

                    //复制并创建新单据
                    if (this.IsCopyNew)
                    {
                        ClearBillID();
                    }
                }
            }
        }
Пример #16
0
        /// <summary>
        /// 处理写入数据库
        /// </summary>
        void SaveToDatabase(bool commitNow)
        {
            try
            {
                //提交,通过BillID可以得知是否新建
                POBodyEntity po     = ReadyEntityToSave();
                string       errMsg = string.Empty;
                string       result = poDal.SaveBill(po, commitNow, GlobeSettings.LoginedUser.UserName, out errMsg);
                switch (result)
                {
                case "1":
                    txtBillID.Text    = po.BillID;
                    txtBillState.Text = po.BillStateDesc;
                    MsgBox.OK("保存成功。");
                    break;

                case "2":
                case "4":
                    MsgBox.Warn("更新单据信息失败,可能该单据已经被其他人删除。");
                    break;

                case "3":
                    MsgBox.Warn("该单据当前状态不允许编辑。");
                    break;

                case "11":
                    MsgBox.Warn(string.Format("保存失败,物料‘{0}’不存在。", errMsg));
                    break;

                case "12":
                    MsgBox.Warn(string.Format("保存失败,计量单位‘{0}’不存在。", errMsg));
                    break;

                default:
                    MsgBox.Err("保存失败,错误信息未知,请记下操作轨迹,联系管理员协助解决。");
                    break;
                }
            }
            catch (Exception ex)
            {
                MsgBox.Err(ex.Message);
            }
        }
Пример #17
0
        public void ViewLog(POBodyEntity focusedHeader)
        {
            if (focusedHeader == null)
            {
                MsgBox.Warn("请选中要查看的行。");
                return;
            }

            if (GetFocusedRowCount(ipo.GetFocusedHeaders()) > 1)
            {
                MsgBox.Warn("不支持多行操作,请选择其中一行。");
                return;
            }

            using (FrmViewBillLog frmLog = new FrmViewBillLog(focusedHeader.BillID, BaseCodeConstant.PO_STATE))
            {
                frmLog.ShowDialog();
            }
        }
Пример #18
0
        public void BindingDetail()
        {
            POBodyEntity header = FocusedHeader;

            if (header == null)
            {
                gdDetails.DataSource  = null;
                gvDetails.ViewCaption = "未选择单据";
            }
            else
            {
                if (header.Details == null)
                {
                    header.Details = poQueryDal.GetDetailByBillID(header.BillID);
                }

                gdDetails.DataSource  = header.Details;
                gvDetails.ViewCaption = string.Format("明细-{0}", header.BillID);
            }
        }
Пример #19
0
        public void EditRemark(POBodyEntity focusedHeader)
        {
            if (focusedHeader == null)
            {
                MsgBox.Warn("请选中要编写备注的行。");
                return;
            }

            if (GetFocusedRowCount(ipo.GetFocusedHeaders()) > 1)
            {
                MsgBox.Warn("不支持多行操作,请选择其中一行。");
                return;
            }

            using (FrmPoEditRemark frmEditRemark = new FrmPoEditRemark(focusedHeader))
            {
                if (frmEditRemark.ShowDialog() == DialogResult.OK)
                {
                    ipo.RefreshState();
                }
            }
        }
Пример #20
0
        /// <summary>
        /// 保存编辑的采购单
        /// </summary>
        /// <param name="bill"></param>
        /// <param name="commitNow">false:存为草稿;true:直接提交</param>
        /// <param name="creator">创建者姓名</param>
        /// <returns>-1:单据状态不允许编辑;0:更新表头时失败;1:成功</returns>
        public string SaveBill(POBodyEntity bill, bool commitNow, string creator, out string errMsg)
        {
            //记录详细的错误,例如具体是哪个物料不存在了等等
            errMsg = string.Empty;

            IMapper        map   = DatabaseInstance.Instance();
            IDbTransaction trans = map.BeginTransaction();

            try
            {
                DynamicParameters parms = new DynamicParameters();
                parms.Add("P_BILL_ID", bill.BillID);
                parms.Add("P_ORG_CODE", bill.OrgCode);

                //直接提交还是另存为草稿
                if (commitNow)
                {
                    parms.Add("P_BILL_STATE", BillStateConst.PO_STATE_CODE_COMMITED);
                }
                else
                {
                    parms.Add("P_BILL_STATE", BillStateConst.PO_STATE_CODE_DRAFT);
                }

                parms.Add("P_SOURCE_BILL_ID", bill.SourceBillID);
                parms.Add("P_SALES", bill.Sales);
                parms.Add("P_SUPPLIER", bill.Supplier);
                parms.Add("P_BILL_TYPE", bill.BillType);
                parms.Add("P_CONTRACT_NO", bill.ContractNO);
                parms.Add("P_REMARK", bill.Remark);
                parms.Add("P_PO_STR1", bill.PO_STR1);
                parms.Add("P_PO_STR2", bill.PO_STR2);
                parms.Add("P_PO_STR3", bill.PO_STR3);
                parms.Add("P_PO_STR4", bill.PO_STR4);
                parms.Add("P_PO_NUM1", bill.PO_NUM1);
                parms.Add("P_PO_NUM2", bill.PO_NUM2);
                parms.Add("P_PO_DATE1", bill.PO_DATE1);
                parms.Add("P_PO_DATE2", bill.PO_DATE2);
                parms.Add("P_CREATOR", creator);
                parms.AddOut("P_NEW_BILL_ID", DbType.String, 50);
                parms.AddOut("P_RET_VAL", DbType.String, 2);

                //先写入主表
                map.Execute("P_PO_SAVE_HEADER", parms, trans, CommandType.StoredProcedure);

                //获取返回值,只有1表示成功
                string retVal = parms.Get <string>("P_RET_VAL");
                if (retVal != "1")
                {
                    trans.Rollback();
                    return(retVal);
                }

                //保存明细
                string newBillID = parms.Get <string>("P_NEW_BILL_ID");

                parms = new DynamicParameters();
                parms.Add("P_BILL_ID", newBillID);
                parms.Add("P_MTL_CODE");
                parms.Add("P_QTY");
                parms.Add("P_PRICE");
                parms.Add("P_REMARK");
                parms.AddOut("P_RET_VAL", DbType.String, 2);

                //再写明细
                foreach (PODetailEntity line in bill.Details)
                {
                    parms.Set("P_MTL_CODE", line.MaterialCode);
                    parms.Set("P_QTY", line.PlanQty);
                    parms.Set("P_PRICE", line.Price);
                    parms.Set("P_REMARK", line.Remark);

                    map.Execute("P_PO_SAVE_DETAIL", parms, trans, CommandType.StoredProcedure);
                    retVal = parms.Get <string>("P_RET_VAL");
                    if (retVal != "1")
                    {
                        if (retVal == "11")
                        {
                            errMsg = line.MaterialCode;
                        }

                        trans.Rollback();
                        break;
                    }
                }

                if (retVal == "1")
                {
                    trans.Commit();

                    if (commitNow)
                    {
                        bill.BillState     = BillStateConst.PO_STATE_CODE_COMMITED;
                        bill.BillStateDesc = BillStateConst.PO_STATE_DESC_COMMITED;
                    }
                    else
                    {
                        bill.BillState     = BillStateConst.PO_STATE_CODE_DRAFT;
                        bill.BillStateDesc = BillStateConst.PO_STATE_DESC_DRAFT;
                    }

                    bill.BillID = newBillID;
                }

                return(retVal);
            }
            catch (Exception ex) //只能是insert语句产生了异常,先回滚再抛出异常信息
            {
                trans.Rollback();
                throw ex;
            }
        }