/// <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(); }
/// <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); }
/// <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); }