コード例 #1
0
        /// <summary>
        /// 将Grid中选中的数据赋值给【详情】Tab内的对应控件
        /// </summary>
        private void SetGridDataToCardCtrls()
        {
            //判断是否允许将【列表】Grid数据设置到【详情】Tab内的对应控件
            if (!IsAllowSetGridDataToCard())
            {
                return;
            }

            SetCardCtrlsToDetailDS();
            base.NewUIModel = DetailDS;

            var activeRowIndex = gdGrid.ActiveRow.Index;

            //判断Grid内[唯一标识]是否为空
            if (gdGrid.Rows[activeRowIndex].Cells["RowID"].Value == null ||
                string.IsNullOrEmpty(gdGrid.Rows[activeRowIndex].Cells["RowID"].Value.ToString()))
            {
                return;
            }
            //将选中的Grid行对应数据Model赋值给[DetailDS]
            //********************************************************************************
            //**********************************【重要说明】**********************************
            //*****此处和上面的条件判断必须用GridDS内能唯一标识一条记录的字段作为过滤条件*****
            //********************************************************************************
            DetailDS = _detailGridDS.FirstOrDefault(x => x.RowID == gdGrid.Rows[activeRowIndex].Cells["RowID"].Value);
            if (DetailDS == null || string.IsNullOrEmpty(DetailDS.RowID))
            {
                return;
            }
            if (txtSI_ID.Text != DetailDS.SI_ID ||
                (txtSI_ID.Text == DetailDS.SI_ID && txtSI_VersionNo.Text != DetailDS.SI_VersionNo?.ToString()))
            {
                if (txtSI_ID.Text == DetailDS.SI_ID && txtSI_VersionNo.Text != DetailDS.SI_VersionNo?.ToString())
                {
                    //数据版本已过期,将加载最新详情。
                    MessageBoxs.Show(Trans.IS, ToString(), MsgHelp.GetMsg(MsgCode.I_0000, new object[] { MsgParam.DataHasOverdue }), MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                }
                else if (ViewHasChanged(_skipPropertyList) ||
                         _detailGridDS.InsertList.Count > 0 ||
                         _detailGridDS.UpdateList.Count > 0 ||
                         _detailGridDS.DeleteList.Count > 0)
                {
                    //将放弃之前的修改,是否继续?
                    DialogResult dialogResult = MessageBoxs.Show(Trans.IS, ToString(), MsgHelp.GetMsg(MsgCode.I_0000, new object[] { MsgParam.ConfirmGiveUpEdit }), MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (dialogResult != DialogResult.OK)
                    {
                        //选中【详情】Tab
                        tabControlFull.Tabs[SysConst.EN_DETAIL].Selected = true;
                        return;
                    }
                }
                //将DetailDS数据赋值给【详情】Tab内的对应控件
                SetDetailDSToCardCtrls();
            }

            //选中【详情】Tab
            tabControlFull.Tabs[SysConst.EN_DETAIL].Selected = true;

            //将最新的值Copy到初始UIModel
            this.AcceptUIModelChanges();
        }
コード例 #2
0
        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="paramHead">待保存的车辆信息</param>
        /// <param name="paramVehicleOemPartsList">待保存的原厂件信息列表</param>
        /// <param name="paramVehicleBrandPartsList">待保存的品牌件信息列表</param>
        /// <param name="paramIsJoinVinInfo">是否合并当前车架号的信息</param>
        /// <returns></returns>
        public bool SaveDetailDS(VehicleModelMatchAutoPartsManagerUIModel paramHead, SkyCarBindingList <VehicleOemPartsInfoUIModel, MDLBS_VehicleOemPartsInfo> paramVehicleOemPartsList, SkyCarBindingList <VehicleThirdPartsInfoUIModel, MDLBS_VehicleThirdPartsInfo> paramVehicleBrandPartsList, bool paramIsJoinVinInfo)
        {
            var funcName = "SaveDetailDS";

            LogHelper.WriteBussLogStart(BussID, LoginInfoDAX.UserName, funcName, "", "", null);

            #region 准备数据

            //待同步的[车辆信息列表]
            List <VehicleModelMatchAutoPartsManagerUIModel> syncVehicleInfoList = new List <VehicleModelMatchAutoPartsManagerUIModel>();
            //待同步的[车辆原厂件信息列表]
            List <VehicleOemPartsInfoUIModel> syncVehicleOemPartsInfoList = new List <VehicleOemPartsInfoUIModel>();
            //待同步的[车辆品牌件信息列表]
            List <VehicleThirdPartsInfoUIModel> syncVehicleBrandPartsInfoList = new List <VehicleThirdPartsInfoUIModel>();

            #region 车辆信息

            //待保存的[车辆信息]
            MDLBS_VehicleInfo saveVehicleInfo = new MDLBS_VehicleInfo();

            if (paramIsJoinVinInfo)
            {
                #region 合并当前车架号对应信息的场合

                //查询当前车架号对应的车辆信息
                _bll.QueryForObject <MDLBS_VehicleInfo, MDLBS_VehicleInfo>(new MDLBS_VehicleInfo
                {
                    WHERE_VC_VIN     = paramHead.VC_VIN,
                    WHERE_VC_IsValid = true,
                }, saveVehicleInfo);
                saveVehicleInfo.VC_UpdatedBy       = LoginInfoDAX.UserName;
                saveVehicleInfo.VC_UpdatedTime     = BLLCom.GetCurStdDatetime();
                saveVehicleInfo.WHERE_VC_ID        = saveVehicleInfo.VC_ID;
                saveVehicleInfo.WHERE_VC_VersionNo = saveVehicleInfo.VC_VersionNo;

                //查询当前车架号对应的所有[原厂件信息]
                List <MDLBS_VehicleOemPartsInfo> resultVehicleOemPartsInfoList = new List <MDLBS_VehicleOemPartsInfo>();
                _bll.QueryForList <MDLBS_VehicleOemPartsInfo, MDLBS_VehicleOemPartsInfo>(new MDLBS_VehicleOemPartsInfo
                {
                    WHERE_VOPI_VC_VIN  = saveVehicleInfo.VC_VIN,
                    WHERE_VOPI_IsValid = true,
                }, resultVehicleOemPartsInfoList);

                //查询当前车架号对应的所有[品牌件信息]
                List <MDLBS_VehicleThirdPartsInfo> resultVehicleBrandPartsInfoList = new List <MDLBS_VehicleThirdPartsInfo>();
                _bll.QueryForList <MDLBS_VehicleThirdPartsInfo, MDLBS_VehicleThirdPartsInfo>(new MDLBS_VehicleThirdPartsInfo
                {
                    WHERE_VTPI_VC_VIN  = saveVehicleInfo.VC_VIN,
                    WHERE_VTPI_IsValid = true,
                }, resultVehicleBrandPartsInfoList);

                //移除重复的[原厂件信息]
                foreach (var loopOemParts in resultVehicleOemPartsInfoList)
                {
                    var curOemParts = paramVehicleOemPartsList.FirstOrDefault(
                        x => x.VOPI_VC_VIN == loopOemParts.VOPI_VC_VIN && x.VOPI_OEMNo == loopOemParts.VOPI_OEMNo);
                    if (curOemParts != null)
                    {
                        paramVehicleOemPartsList.Remove(curOemParts);
                    }
                }

                //移除重复的[品牌件信息]
                foreach (var loopBrandParts in resultVehicleBrandPartsInfoList)
                {
                    var curBrandParts = paramVehicleBrandPartsList.FirstOrDefault(x =>
                                                                                  x.VTPI_VC_VIN == loopBrandParts.VTPI_VC_VIN &&
                                                                                  x.VTPI_ThirdNo == loopBrandParts.VTPI_ThirdNo);
                    if (curBrandParts != null)
                    {
                        paramVehicleBrandPartsList.Remove(curBrandParts);
                    }
                }
                #endregion
            }
            else
            {
                #region  合并当前车架号对应信息的场合

                //将UIModel转为TBModel
                saveVehicleInfo = paramHead.ToTBModelForSaveAndDelete <MDLBS_VehicleInfo>();
                //判断主键是否被赋值
                if (string.IsNullOrEmpty(paramHead.VC_ID))
                {
                    saveVehicleInfo.VC_ID          = Guid.NewGuid().ToString();
                    saveVehicleInfo.VC_CreatedBy   = LoginInfoDAX.UserName;
                    saveVehicleInfo.VC_CreatedTime = BLLCom.GetCurStdDatetime();
                }
                saveVehicleInfo.VC_UpdatedBy   = LoginInfoDAX.UserName;
                saveVehicleInfo.VC_UpdatedTime = BLLCom.GetCurStdDatetime();
                #endregion
            }

            VehicleModelMatchAutoPartsManagerUIModel syncehicleInfo = new VehicleModelMatchAutoPartsManagerUIModel();
            _bll.CopyModel(saveVehicleInfo, syncehicleInfo);
            syncehicleInfo.VC_OperateType = "Save";
            syncVehicleInfoList.Add(syncehicleInfo);

            #endregion

            #region 原厂件信息

            //添加的明细
            foreach (var loopDetailItem in paramVehicleOemPartsList.InsertList)
            {
                loopDetailItem.VOPI_VC_VIN      = saveVehicleInfo.VC_VIN;
                loopDetailItem.VOPI_CreatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VOPI_CreatedTime = BLLCom.GetCurStdDatetime();
                loopDetailItem.VOPI_UpdatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VOPI_UpdatedTime = BLLCom.GetCurStdDatetime();

                loopDetailItem.VOPI_OperateType = "Save";
            }

            //更新的明细
            foreach (var loopDetailItem in paramVehicleOemPartsList.UpdateList)
            {
                loopDetailItem.VOPI_VC_VIN      = saveVehicleInfo.VC_VIN;
                loopDetailItem.VOPI_UpdatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VOPI_UpdatedTime = BLLCom.GetCurStdDatetime();

                loopDetailItem.VOPI_OperateType = "Save";
            }

            //删除的明细
            foreach (var loopDetailItem in paramVehicleOemPartsList.DeleteList)
            {
                loopDetailItem.VOPI_OperateType = "Delete";
            }
            syncVehicleOemPartsInfoList.AddRange(paramVehicleOemPartsList.InsertList);
            syncVehicleOemPartsInfoList.AddRange(paramVehicleOemPartsList.UpdateList);
            syncVehicleOemPartsInfoList.AddRange(paramVehicleOemPartsList.DeleteList);
            #endregion

            #region 品牌件信息

            //添加的明细
            foreach (var loopDetailItem in paramVehicleBrandPartsList.InsertList)
            {
                loopDetailItem.VTPI_VC_VIN      = saveVehicleInfo.VC_VIN;
                loopDetailItem.VTPI_CreatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VTPI_CreatedTime = BLLCom.GetCurStdDatetime();
                loopDetailItem.VTPI_UpdatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VTPI_UpdatedTime = BLLCom.GetCurStdDatetime();

                loopDetailItem.VTPI_OperateType = "Save";
            }

            //更新的明细
            foreach (var loopDetailItem in paramVehicleBrandPartsList.UpdateList)
            {
                loopDetailItem.VTPI_VC_VIN      = saveVehicleInfo.VC_VIN;
                loopDetailItem.VTPI_UpdatedBy   = LoginInfoDAX.UserName;
                loopDetailItem.VTPI_UpdatedTime = BLLCom.GetCurStdDatetime();

                loopDetailItem.VTPI_OperateType = "Save";
            }

            //删除的明细
            foreach (var loopDetailItem in paramVehicleBrandPartsList.DeleteList)
            {
                loopDetailItem.VTPI_OperateType = "Delete";
            }
            syncVehicleBrandPartsInfoList.AddRange(paramVehicleBrandPartsList.InsertList);
            syncVehicleBrandPartsInfoList.AddRange(paramVehicleBrandPartsList.UpdateList);
            syncVehicleBrandPartsInfoList.AddRange(paramVehicleBrandPartsList.DeleteList);
            #endregion

            #endregion

            #region  步到平台

            if (!SynchronizeVehicleRelateInfo(syncVehicleInfoList, syncVehicleOemPartsInfoList, syncVehicleBrandPartsInfoList))
            {
                //同步到平台失败
                ResultMsg = MsgHelp.GetMsg(MsgCode.E_0018, new object[] { SystemActionEnum.Name.SAVE, "同步平台失败" });
                return(false);
            }
            #endregion

            #region 带事务的保存

            try
            {
                DBManager.BeginTransaction(DBCONFIG.Coeus);

                #region 保存[车辆信息]

                var saveVehicleInfoResult = _bll.Save(saveVehicleInfo, saveVehicleInfo.VC_ID);
                if (!saveVehicleInfoResult)
                {
                    DBManager.RollBackTransaction(DBCONFIG.Coeus);

                    //保存本地失败的场合,还原平台上保存的信息
                    RestoreSavePlatformInfo(saveVehicleInfo, paramVehicleOemPartsList, paramVehicleBrandPartsList);

                    ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.SAVE + SystemTableEnums.Name.BS_VehicleInfo });
                    LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                    return(false);
                }

                #endregion

                #region 保存[车辆原厂件信息]

                var saveOemPartsResult = _bll.UnitySave(paramVehicleOemPartsList);
                if (!saveOemPartsResult)
                {
                    DBManager.RollBackTransaction(DBCONFIG.Coeus);

                    //保存本地失败的场合,还原平台上保存的信息
                    RestoreSavePlatformInfo(saveVehicleInfo, paramVehicleOemPartsList, paramVehicleBrandPartsList);

                    ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.SAVE + SystemTableEnums.Name.BS_VehicleOemPartsInfo });
                    LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                    return(false);
                }

                #endregion

                #region 保存[车辆品牌件信息]

                var saveBrandPartsResult = _bll.UnitySave(paramVehicleBrandPartsList);
                if (!saveBrandPartsResult)
                {
                    DBManager.RollBackTransaction(DBCONFIG.Coeus);

                    //保存本地失败的场合,还原平台上保存的信息
                    RestoreSavePlatformInfo(saveVehicleInfo, paramVehicleOemPartsList, paramVehicleBrandPartsList);

                    ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.SAVE + SystemTableEnums.Name.BS_VehicleBrandPartsInfo });
                    LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                    return(false);
                }

                #endregion

                DBManager.CommitTransaction(DBCONFIG.Coeus);
            }
            catch (Exception ex)
            {
                DBManager.RollBackTransaction(DBCONFIG.Coeus);

                //保存本地失败的场合,还原平台上保存的信息
                RestoreSavePlatformInfo(saveVehicleInfo, paramVehicleOemPartsList, paramVehicleBrandPartsList);

                ResultMsg = MsgHelp.GetMsg(MsgCode.E_0018, new object[] { SystemActionEnum.Name.SAVE, ex.Message });
                LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ex.Message, "", null);
                return(false);
            }

            #endregion

            //将最新数据回写给DetailDS
            CopyModel(saveVehicleInfo, paramHead);

            #region 更新[车辆原厂件信息]版本号
            foreach (var loopInsertDetail in paramVehicleOemPartsList.InsertList)
            {
                //新增时版本号为1
                loopInsertDetail.VOPI_VersionNo = 1;
            }
            foreach (var loopUpdateDetail in paramVehicleOemPartsList.UpdateList)
            {
                //更新时版本号加1
                loopUpdateDetail.VOPI_VersionNo = loopUpdateDetail.VOPI_VersionNo + 1;
            }
            #endregion

            #region 更新[车辆品牌件信息]版本号
            foreach (var loopInsertDetail in paramVehicleBrandPartsList.InsertList)
            {
                //新增时版本号为1
                loopInsertDetail.VTPI_VersionNo = 1;
            }
            foreach (var loopUpdateDetail in paramVehicleBrandPartsList.UpdateList)
            {
                //更新时版本号加1
                loopUpdateDetail.VTPI_VersionNo = loopUpdateDetail.VTPI_VersionNo + 1;
            }
            #endregion

            return(true);
        }
コード例 #3
0
        /// <summary>
        /// 审核
        /// </summary>
        /// <param name="paramHead">销售订单</param>
        /// <param name="paramDetailList">销售订单明细列表</param>
        /// <param name="paramStockOutDetailList">出库明细列表</param>
        /// <param name="paramReturnStockInDetailList">退货入库明细列表</param>
        /// <param name="paramIsHasInventory">是否启用进销存模块</param>
        /// <returns></returns>
        public bool ApproveDetailDS(SalesReturnOrderManagerUIModel paramHead, SkyCarBindingList <SalesOrderDetailUIModel, MDLSD_SalesOrderDetail> paramDetailList, List <SalesStockOutDetailUIModel> paramStockOutDetailList, List <ReturnStockInDetailUIModel> paramReturnStockInDetailList, bool paramIsHasInventory)
        {
            var funcName = "ApproveDetailDS";

            LogHelper.WriteBussLogStart(BussID, LoginInfoDAX.UserName, funcName, "", "", null);

            #region 验证
            if (paramHead == null ||
                string.IsNullOrEmpty(paramHead.SO_ID) ||
                string.IsNullOrEmpty(paramHead.SO_No))
            {
                //没有获取到销售订单,审核失败
                ResultMsg = MsgHelp.GetMsg(MsgCode.W_0024, new object[] { SystemTableEnums.Name.SD_SalesOrder, SystemActionEnum.Name.APPROVE });
                LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                return(false);
            }
            #endregion

            #region 准备数据

            #region 变量定义

            //待更新的[销售订单]
            MDLSD_SalesOrder updateSalesOrder = paramHead.ToTBModelForSaveAndDelete <MDLSD_SalesOrder>();

            //待新增的退货时的[应收单]
            MDLFM_AccountReceivableBill newRejectAccountReceivableBill = new MDLFM_AccountReceivableBill();
            //待新增的退货时的[应收单明细]列表
            List <MDLFM_AccountReceivableBillDetail> newRejectReceivableBillDetailList = new List <MDLFM_AccountReceivableBillDetail>();
            //待新增的退货入库[入库单]
            MDLPIS_StockInBill newReturnStockInBill = new MDLPIS_StockInBill();
            //待新增的退货入库[入库单明细]列表
            List <MDLPIS_StockInDetail> newReturnStockInDetailList = new List <MDLPIS_StockInDetail>();
            //待更新的[库存]列表
            List <MDLPIS_Inventory> updateStockInInventoryList = new List <MDLPIS_Inventory>();
            //待新增的[库存异动日志]列表
            List <MDLPIS_InventoryTransLog> newStockInInventoryTransLogList = new List <MDLPIS_InventoryTransLog>();

            #endregion

            #region 更新销售订单

            //更新[销售订单]审核状态为[已审核],单据状态根据[来源类型]决定
            updateSalesOrder.SO_VersionNo++;
            updateSalesOrder.SO_ApprovalStatusCode = ApprovalStatusEnum.Code.YSH;
            updateSalesOrder.SO_ApprovalStatusName = ApprovalStatusEnum.Name.YSH;
            updateSalesOrder.SO_UpdatedBy          = LoginInfoDAX.UserName;
            updateSalesOrder.SO_UpdatedTime        = BLLCom.GetCurStdDatetime();

            #endregion

            #region [销售订单].[来源类型]为{手工创建退货}、{在线销售退货}、{主动销售退货}的场合

            //销售退货的场合,更新[销售订单].[单据状态]为[交易成功]
            updateSalesOrder.SO_StatusCode = SalesOrderStatusEnum.Code.JYCG;
            updateSalesOrder.SO_StatusName = SalesOrderStatusEnum.Name.JYCG;

            #region 创建退货入库的[入库单]

            //新增[来源类型]为[销售退货],[业务状态]为{已完成},[审核状态]为{已审核}的[入库单]
            newReturnStockInBill.SIB_ID                 = Guid.NewGuid().ToString();
            newReturnStockInBill.SIB_No                 = BLLCom.GetCoeusDocumentNo(DocumentTypeEnums.Code.SIB);
            newReturnStockInBill.SIB_SourceTypeCode     = StockInBillSourceTypeEnum.Code.SSTH;
            newReturnStockInBill.SIB_SourceTypeName     = StockInBillSourceTypeEnum.Name.SSTH;
            newReturnStockInBill.SIB_SourceNo           = updateSalesOrder.SO_No;
            newReturnStockInBill.SIB_Org_ID             = updateSalesOrder.SO_Org_ID;
            newReturnStockInBill.SIB_StatusName         = StockInBillStatusEnum.Name.YWC;
            newReturnStockInBill.SIB_StatusCode         = StockInBillStatusEnum.Code.YWC;
            newReturnStockInBill.SIB_ApprovalStatusCode = ApprovalStatusEnum.Code.YSH;
            newReturnStockInBill.SIB_ApprovalStatusName = ApprovalStatusEnum.Name.YSH;
            newReturnStockInBill.SIB_IsValid            = true;
            newReturnStockInBill.SIB_CreatedBy          = LoginInfoDAX.UserName;
            newReturnStockInBill.SIB_CreatedTime        = BLLCom.GetCurStdDatetime();
            newReturnStockInBill.SIB_UpdatedBy          = LoginInfoDAX.UserName;
            newReturnStockInBill.SIB_UpdatedTime        = BLLCom.GetCurStdDatetime();
            #endregion

            #region 创建负向的[应收单]

            //新增[来源类型]为[销售应收],[单据方向]为[负向],金额为负,[业务状态]为{执行中},[审核状态]为{已审核}的[应收单]
            newRejectAccountReceivableBill.ARB_ID             = Guid.NewGuid().ToString();
            newRejectAccountReceivableBill.ARB_No             = BLLCom.GetCoeusDocumentNo(DocumentTypeEnums.Code.ARB);
            newRejectAccountReceivableBill.ARB_BillDirectCode = BillDirectionEnum.Code.MINUS;
            newRejectAccountReceivableBill.ARB_BillDirectName = BillDirectionEnum.Name.MINUS;
            newRejectAccountReceivableBill.ARB_SourceTypeCode = AccountReceivableBillSourceTypeEnum.Code.XSYS;
            newRejectAccountReceivableBill.ARB_SourceTypeName = AccountReceivableBillSourceTypeEnum.Name.XSYS;
            newRejectAccountReceivableBill.ARB_SrcBillNo      = updateSalesOrder.SO_No;
            newRejectAccountReceivableBill.ARB_Org_ID         = LoginInfoDAX.OrgID;
            newRejectAccountReceivableBill.ARB_Org_Name       = LoginInfoDAX.OrgShortName;
            if (paramHead.SO_CustomerTypeName == CustomerTypeEnum.Name.PTNQXSH)
            {
                newRejectAccountReceivableBill.ARB_PayObjectTypeName = AmountTransObjectTypeEnum.Name.PLATFORMAUTOFACTORY;
                newRejectAccountReceivableBill.ARB_PayObjectTypeCode = AmountTransObjectTypeEnum.Code.PLATFORMAUTOFACTORY;
            }
            else if (paramHead.SO_CustomerTypeName == CustomerTypeEnum.Name.YBQXSH)
            {
                newRejectAccountReceivableBill.ARB_PayObjectTypeName = AmountTransObjectTypeEnum.Name.GENERALAUTOFACTORY;
                newRejectAccountReceivableBill.ARB_PayObjectTypeCode = AmountTransObjectTypeEnum.Code.GENERALAUTOFACTORY;
            }
            else
            {
                newRejectAccountReceivableBill.ARB_PayObjectTypeName = AmountTransObjectTypeEnum.Name.REGULARCUSTOMER;
                newRejectAccountReceivableBill.ARB_PayObjectTypeCode = AmountTransObjectTypeEnum.Code.REGULARCUSTOMER;
            }
            newRejectAccountReceivableBill.ARB_PayObjectName      = paramHead.SO_CustomerName;
            newRejectAccountReceivableBill.ARB_PayObjectID        = paramHead.SO_CustomerID;
            newRejectAccountReceivableBill.ARB_BusinessStatusCode = AccountReceivableBillStatusEnum.Code.ZXZ;
            newRejectAccountReceivableBill.ARB_BusinessStatusName = AccountReceivableBillStatusEnum.Name.ZXZ;
            newRejectAccountReceivableBill.ARB_ApprovalStatusCode = ApprovalStatusEnum.Code.YSH;
            newRejectAccountReceivableBill.ARB_ApprovalStatusName = ApprovalStatusEnum.Name.YSH;
            newRejectAccountReceivableBill.ARB_IsValid            = true;
            newRejectAccountReceivableBill.ARB_CreatedBy          = LoginInfoDAX.UserName;
            newRejectAccountReceivableBill.ARB_CreatedTime        = BLLCom.GetCurStdDatetime();
            newRejectAccountReceivableBill.ARB_UpdatedBy          = LoginInfoDAX.UserName;
            newRejectAccountReceivableBill.ARB_UpdatedTime        = BLLCom.GetCurStdDatetime();
            #endregion

            //退货产生的应收单.[应收金额]
            decimal returnReceivableAmount = 0;

            foreach (var loopSalesOrderReturnDetail in paramDetailList)
            {
                #region 退货的[销售订单明细]

                //[销售订单明细]审核状态 和 单据状态与单头一致
                loopSalesOrderReturnDetail.WHERE_SOD_ID        = loopSalesOrderReturnDetail.SOD_ID;
                loopSalesOrderReturnDetail.WHERE_SOD_VersionNo = loopSalesOrderReturnDetail.SOD_VersionNo;
                loopSalesOrderReturnDetail.SOD_VersionNo++;
                loopSalesOrderReturnDetail.SOD_ApprovalStatusCode = updateSalesOrder.SO_ApprovalStatusCode;
                loopSalesOrderReturnDetail.SOD_ApprovalStatusName = updateSalesOrder.SO_ApprovalStatusName;
                loopSalesOrderReturnDetail.SOD_StatusCode         = updateSalesOrder.SO_StatusCode;
                loopSalesOrderReturnDetail.SOD_StatusName         = updateSalesOrder.SO_StatusName;
                loopSalesOrderReturnDetail.SOD_UpdatedBy          = LoginInfoDAX.UserName;
                loopSalesOrderReturnDetail.SOD_UpdatedTime        = BLLCom.GetCurStdDatetime();
                #endregion

                #region 退货的[应收单明细]
                //新增[来源类型]为[销售应收],[是否负向明细]为[true],金额为负的[应收单明细]
                MDLFM_AccountReceivableBillDetail newAccountReceivableBillDetail = new MDLFM_AccountReceivableBillDetail
                {
                    ARBD_ID              = Guid.NewGuid().ToString(),
                    ARBD_ARB_ID          = newRejectAccountReceivableBill.ARB_ID,
                    ARBD_IsMinusDetail   = true,
                    ARBD_SrcBillNo       = updateSalesOrder.SO_No,
                    ARBD_SrcBillDetailID = loopSalesOrderReturnDetail.SOD_ID,
                    ARBD_Org_ID          = newRejectAccountReceivableBill.ARB_Org_ID,
                    ARBD_Org_Name        = newRejectAccountReceivableBill.ARB_Org_Name,
                    //应收金额 = 销售数量(退货数量) * 单价
                    ARBD_AccountReceivableAmount = -Math.Round((loopSalesOrderReturnDetail.SOD_Qty ?? 0) * (loopSalesOrderReturnDetail.SOD_UnitPrice ?? 0), 2),
                    ARBD_ReceivedAmount          = 0,
                    ARBD_UnReceiveAmount         = -Math.Round((loopSalesOrderReturnDetail.SOD_Qty ?? 0) * (loopSalesOrderReturnDetail.SOD_UnitPrice ?? 0), 2),
                    ARBD_BusinessStatusCode      = newRejectAccountReceivableBill.ARB_BusinessStatusCode,
                    ARBD_BusinessStatusName      = newRejectAccountReceivableBill.ARB_BusinessStatusName,
                    ARBD_ApprovalStatusCode      = newRejectAccountReceivableBill.ARB_ApprovalStatusCode,
                    ARBD_ApprovalStatusName      = newRejectAccountReceivableBill.ARB_ApprovalStatusName,
                    ARBD_IsValid     = true,
                    ARBD_CreatedBy   = LoginInfoDAX.UserName,
                    ARBD_CreatedTime = BLLCom.GetCurStdDatetime(),
                    ARBD_UpdatedBy   = LoginInfoDAX.UserName,
                    ARBD_UpdatedTime = BLLCom.GetCurStdDatetime()
                };
                returnReceivableAmount += (newAccountReceivableBillDetail.ARBD_AccountReceivableAmount ?? 0);
                newRejectReceivableBillDetailList.Add(newAccountReceivableBillDetail);

                #endregion
            }
            //[应收单].[应收金额]
            newRejectAccountReceivableBill.ARB_AccountReceivableAmount = returnReceivableAmount;
            newRejectAccountReceivableBill.ARB_ReceivedAmount          = 0;
            newRejectAccountReceivableBill.ARB_UnReceiveAmount         = returnReceivableAmount;
            //[销售单].[总金额]
            updateSalesOrder.SO_TotalAmount = returnReceivableAmount;

            foreach (var loopReturnStockInDetail in paramReturnStockInDetailList)
            {
                #region 退货入库的[入库单明细]

                MDLPIS_StockInDetail newStockInDetail = new MDLPIS_StockInDetail();
                _bll.CopyModel(loopReturnStockInDetail, newStockInDetail);

                newStockInDetail.SID_ID          = Guid.NewGuid().ToString();
                newStockInDetail.SID_SIB_ID      = newReturnStockInBill.SIB_ID;
                newStockInDetail.SID_SIB_No      = newReturnStockInBill.SIB_No;
                newStockInDetail.SID_IsValid     = true;
                newStockInDetail.SID_CreatedBy   = LoginInfoDAX.UserName;
                newStockInDetail.SID_CreatedTime = BLLCom.GetCurStdDatetime();
                newStockInDetail.SID_UpdatedBy   = LoginInfoDAX.UserName;
                newStockInDetail.SID_UpdatedTime = BLLCom.GetCurStdDatetime();

                var curInDetailOfSalesDetail =
                    paramDetailList.FirstOrDefault(x => x.SOD_Barcode == newStockInDetail.SID_Barcode);
                if (curInDetailOfSalesDetail != null)
                {
                    //[入库单明细].[来源单据明细ID] 为 [销售退货单明细].[ID]
                    newStockInDetail.SID_SourceDetailID = curInDetailOfSalesDetail.SOD_ID;
                }

                newReturnStockInDetailList.Add(newStockInDetail);
                #endregion

                if (paramIsHasInventory)
                {
                    #region  进销存 并且 审核销售退货订单的场合,创建相关单据为已审核的场合,更新[库存],创建[库存异动日志]

                    //在[入库单明细]列表中第一次出现的配件[库存]信息
                    MDLPIS_Inventory inventoryExists = null;

                    foreach (var loopInventory in updateStockInInventoryList)
                    {
                        if (loopInventory.INV_Barcode == loopReturnStockInDetail.SID_Barcode &&
                            loopInventory.INV_BatchNo == loopReturnStockInDetail.SID_BatchNo)
                        {
                            inventoryExists = loopInventory;
                            break;
                        }
                    }
                    if (inventoryExists != null)
                    {
                        //[入库单明细]列表中已遍历过该配件,累加数量
                        inventoryExists.INV_Qty        += loopReturnStockInDetail.SID_Qty;
                        inventoryExists.INV_UpdatedBy   = LoginInfoDAX.UserName;
                        inventoryExists.INV_UpdatedTime = BLLCom.GetCurStdDatetime();
                        //生成[库存异动日志]
                        newStockInInventoryTransLogList.Add(GenerateStockInInventoryTransLog(newReturnStockInBill, loopReturnStockInDetail, inventoryExists, paramHead));
                    }
                    else
                    {
                        //[入库单明细]列表中第一次出现该配件
                        //查询该配件是否在[库存]中存在
                        MDLPIS_Inventory resultInventory = new MDLPIS_Inventory();
                        _bll.QueryForObject <MDLPIS_Inventory, MDLPIS_Inventory>(new MDLPIS_Inventory
                        {
                            WHERE_INV_Org_ID  = newReturnStockInBill.SIB_Org_ID,
                            WHERE_INV_Barcode = loopReturnStockInDetail.SID_Barcode,
                            WHERE_INV_BatchNo = loopReturnStockInDetail.SID_BatchNo,
                            WHERE_INV_WH_ID   = loopReturnStockInDetail.SID_WH_ID,
                            WHERE_INV_IsValid = true
                        }, resultInventory);

                        //[库存]中不存在该配件
                        if (string.IsNullOrEmpty(resultInventory.INV_ID))
                        {
                            //新增一个该配件的库存信息
                            MDLPIS_Inventory inventoryToInsert = new MDLPIS_Inventory
                            {
                                INV_Org_ID            = newReturnStockInBill.SIB_Org_ID,
                                INV_SUPP_ID           = loopReturnStockInDetail.SID_SUPP_ID,
                                INV_WH_ID             = loopReturnStockInDetail.SID_WH_ID,
                                INV_WHB_ID            = loopReturnStockInDetail.SID_WHB_ID,
                                INV_ThirdNo           = loopReturnStockInDetail.SID_ThirdNo,
                                INV_OEMNo             = loopReturnStockInDetail.SID_OEMNo,
                                INV_Barcode           = loopReturnStockInDetail.SID_Barcode,
                                INV_BatchNo           = loopReturnStockInDetail.SID_BatchNo,
                                INV_Name              = loopReturnStockInDetail.SID_Name,
                                INV_Specification     = loopReturnStockInDetail.SID_Specification,
                                INV_Qty               = loopReturnStockInDetail.SID_Qty,
                                INV_PurchaseUnitPrice = loopReturnStockInDetail.SID_UnitCostPrice,
                                INV_IsValid           = true,
                                INV_CreatedBy         = LoginInfoDAX.UserName,
                                INV_CreatedTime       = BLLCom.GetCurStdDatetime(),
                                INV_UpdatedBy         = LoginInfoDAX.UserName,
                                INV_UpdatedTime       = BLLCom.GetCurStdDatetime()
                            };
                            updateStockInInventoryList.Add(inventoryToInsert);

                            //生成[库存异动日志]
                            newStockInInventoryTransLogList.Add(GenerateStockInInventoryTransLog(newReturnStockInBill, loopReturnStockInDetail, inventoryToInsert, paramHead));
                        }
                        //[库存]中存在该配件
                        else
                        {
                            //更新[库存]中该配件的数量
                            resultInventory.INV_Qty            += loopReturnStockInDetail.SID_Qty;
                            resultInventory.INV_UpdatedBy       = LoginInfoDAX.UserName;
                            resultInventory.INV_UpdatedTime     = BLLCom.GetCurStdDatetime();
                            resultInventory.WHERE_INV_ID        = resultInventory.INV_ID;
                            resultInventory.WHERE_INV_VersionNo = resultInventory.INV_VersionNo;
                            updateStockInInventoryList.Add(resultInventory);

                            //生成[库存异动日志]
                            newStockInInventoryTransLogList.Add(GenerateStockInInventoryTransLog(newReturnStockInBill, loopReturnStockInDetail, resultInventory, paramHead));
                        }
                    }

                    #endregion
                }
            }
            #endregion

            #endregion

            #region 带事务的新增和更新

            try
            {
                DBManager.BeginTransaction(DBCONFIG.Coeus);

                #region 更新[销售订单]

                bool saveSalesOrder = _bll.Save(updateSalesOrder);
                if (!saveSalesOrder)
                {
                    DBManager.RollBackTransaction(DBCONFIG.Coeus);
                    ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { MsgParam.UPDATE + SystemTableEnums.Name.SD_SalesOrder });
                    LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                    return(false);
                }
                #endregion

                #region 保存[销售订单明细]

                bool saveSalesOrderDetailResult = _bll.UnitySave(paramDetailList);
                if (!saveSalesOrderDetailResult)
                {
                    DBManager.RollBackTransaction(DBCONFIG.Coeus);
                    ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.SAVE + SystemTableEnums.Name.SD_SalesOrderDetail });
                    LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                    return(false);
                }
                #endregion

                #region 新增[应收单]
                if (!string.IsNullOrEmpty(newRejectAccountReceivableBill.ARB_ID))
                {
                    //销售退货时产生的负向的[销售应收]
                    bool insertAccountReceivableBillResult = _bll.Insert(newRejectAccountReceivableBill);
                    if (!insertAccountReceivableBillResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.NEW + SystemTableEnums.Name.FM_AccountReceivableBill });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                #region 新增[应收单明细]

                //销售退货时产生的负向的[销售应收]
                if (newRejectReceivableBillDetailList.Count > 0)
                {
                    bool insertAccountReceivableBillDetailResult = _bll.InsertByList <MDLFM_AccountReceivableBillDetail, MDLFM_AccountReceivableBillDetail>(newRejectReceivableBillDetailList);
                    if (!insertAccountReceivableBillDetailResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.NEW + SystemTableEnums.Name.FM_AccountReceivableBillDetail });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                #region 保存[库存]
                foreach (var loopInventory in updateStockInInventoryList)
                {
                    bool saveInventoryResult = _bll.Save(loopInventory);
                    if (!saveInventoryResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.SAVE + SystemTableEnums.Name.PIS_Inventory });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                #region 新增[库存异动日志]
                if (newStockInInventoryTransLogList.Count > 0)
                {
                    bool insertInventoryTransLogResult = _bll.InsertByList <MDLPIS_InventoryTransLog, MDLPIS_InventoryTransLog>(newStockInInventoryTransLogList);
                    if (!insertInventoryTransLogResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.NEW + SystemTableEnums.Name.PIS_InventoryTransLog });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                #region 销售退货入库时生成[入库单]

                if (!string.IsNullOrEmpty(newReturnStockInBill.SIB_ID))
                {
                    bool insertStockInBillResult = _bll.Insert(newReturnStockInBill);
                    if (!insertStockInBillResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.NEW + SystemTableEnums.Name.PIS_StockInBill });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                #region 销售退货入库时生成[入库单明细]

                if (newReturnStockInDetailList.Count > 0)
                {
                    bool insertStockInDetailResult = _bll.InsertByList <MDLPIS_StockInDetail, MDLPIS_StockInDetail>(newReturnStockInDetailList);
                    if (!insertStockInDetailResult)
                    {
                        DBManager.RollBackTransaction(DBCONFIG.Coeus);
                        ResultMsg = MsgHelp.GetMsg(MsgCode.E_0010, new object[] { SystemActionEnum.Name.NEW + SystemTableEnums.Name.PIS_StockInDetail });
                        LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                        return(false);
                    }
                }
                #endregion

                DBManager.CommitTransaction(DBCONFIG.Coeus);
            }
            catch (Exception ex)
            {
                DBManager.RollBackTransaction(DBCONFIG.Coeus);
                ResultMsg = MsgHelp.GetMsg(MsgCode.E_0018, new object[] { SystemActionEnum.Name.APPROVE, ex.Message });
                LogHelper.WriteBussLogEndNG(BussID, LoginInfoDAX.UserName, funcName, ResultMsg, "", null);
                return(false);
            }
            #endregion

            //将最新数据回写给DetailDS
            _bll.CopyModel(updateSalesOrder, paramHead);

            return(true);
        }