public ReturnValueInfo BatchSolveUncertainRecord(List<PreConsumeRecord_pcs_Info> listRecords, bool isSettled) { ReturnValueInfo rvInfo = new ReturnValueInfo(); if (listRecords == null || (listRecords != null && listRecords.Count < 1)) { rvInfo.messageText = Common.DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull; return rvInfo; } try { using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); try { List<SystemAccountDetail_sad> listSysAccountDetails = new List<SystemAccountDetail_sad>(); List<CardUserAccountDetail_cuad> listUserAccountDetails = new List<CardUserAccountDetail_cuad>(); foreach (PreConsumeRecord_pcs_Info preCostItem in listRecords) { PreConsumeRecord_pcs preCost = db.PreConsumeRecord_pcs.Where(x => x.pcs_cRecordID == preCostItem.pcs_cRecordID).FirstOrDefault(); if (preCost == null) { throw new Exception("部分记录已被删除 " + preCostItem.pcs_cRecordID.ToString()); } preCost.pcs_lIsSettled = isSettled; preCost.pcs_cConsumeType = preCostItem.pcs_cConsumeType; preCost.pcs_cSourceID = preCostItem.pcs_cSourceID; preCost.pcs_dConsumeDate = DateTime.Now; if (isSettled) { preCost.pcs_dSettleTime = DateTime.Now; CardUserAccountDetail_cuad userDetail = new CardUserAccountDetail_cuad(); userDetail.cuad_cOpt = preCostItem.pcs_cAdd; userDetail.cuad_cConsumeID = preCostItem.pcs_cRecordID; userDetail.cuad_cCUAID = preCostItem.pcs_cAccountID; userDetail.cuad_cFlowType = preCostItem.pcs_cConsumeType; userDetail.cuad_cRecordID = Guid.NewGuid(); userDetail.cuad_dOptTime = DateTime.Now; userDetail.cuad_fFlowMoney = Math.Abs(preCostItem.pcs_fCost); listUserAccountDetails.Add(userDetail); SystemAccountDetail_sad sysDetail = new SystemAccountDetail_sad(); sysDetail.sad_cConsumeID = preCostItem.pcs_cRecordID; sysDetail.sad_cDesc = Common.DefineConstantValue.GetMoneyFlowDesc(preCostItem.pcs_cConsumeType); sysDetail.sad_cFLowMoney = Math.Abs(preCostItem.pcs_fCost); sysDetail.sad_cFlowType = preCostItem.pcs_cConsumeType; sysDetail.sad_cOpt = preCostItem.pcs_cAdd; sysDetail.sad_cRecordID = Guid.NewGuid(); sysDetail.sad_dOptTime = DateTime.Now; listSysAccountDetails.Add(sysDetail); } } if (listUserAccountDetails.Count > 0) { db.CardUserAccountDetail_cuad.InsertAllOnSubmit(listUserAccountDetails); db.SystemAccountDetail_sad.InsertAllOnSubmit(listSysAccountDetails); } db.SubmitChanges(); db.Transaction.Commit(); db.Connection.Close(); rvInfo.boolValue = true; } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }
public ReturnValueInfo AccountCashReFund(IModelObject infoObject, string strReason) { ReturnValueInfo rvInfo = new ReturnValueInfo(); CardUserAccountDetail_cuad_Info userDetailInfo = infoObject as CardUserAccountDetail_cuad_Info; if (userDetailInfo == null) { rvInfo.messageText = "对象类型不符合,参数需要为SystemAccountDetail_sad_Info类"; rvInfo.isError = true; return rvInfo; } try { using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); try { PreConsumeRecord_pcs preCost = new PreConsumeRecord_pcs(); preCost.pcs_cAccountID = userDetailInfo.cuad_cCUAID; preCost.pcs_cAdd = userDetailInfo.cuad_cOpt; preCost.pcs_dAddDate = DateTime.Now; preCost.pcs_cConsumeType = userDetailInfo.cuad_cFlowType; preCost.pcs_cRecordID = Guid.NewGuid(); CardUserAccount_cua userAccount = db.CardUserAccount_cua.Where(x => x.cua_cRecordID == userDetailInfo.cuad_cCUAID).FirstOrDefault(); preCost.pcs_cUserID = userAccount.cua_cCUSID; preCost.pcs_dConsumeDate = DateTime.Now; preCost.pcs_dSettleTime = DateTime.Now; preCost.pcs_fCost = userDetailInfo.cuad_fFlowMoney; preCost.pcs_lIsSettled = true; db.PreConsumeRecord_pcs.InsertOnSubmit(preCost); userAccount.cua_fCurrentBalance -= userDetailInfo.cuad_fFlowMoney; db.SubmitChanges(); CardUserAccountDetail_cuad userDetail = Common.General.CopyObjectValue<CardUserAccountDetail_cuad_Info, CardUserAccountDetail_cuad>(userDetailInfo); userDetail.cuad_cConsumeID = preCost.pcs_cRecordID; db.CardUserAccountDetail_cuad.InsertOnSubmit(userDetail); db.SubmitChanges(); SystemAccountDetail_sad sysDetail = new SystemAccountDetail_sad(); sysDetail.sad_cConsumeID = preCost.pcs_cRecordID; sysDetail.sad_cDesc = strReason; sysDetail.sad_cFLowMoney = userDetailInfo.cuad_fFlowMoney; sysDetail.sad_cFlowType = userDetailInfo.cuad_cFlowType; sysDetail.sad_cOpt = userDetailInfo.cuad_cOpt; sysDetail.sad_cRecordID = Guid.NewGuid(); sysDetail.sad_dOptTime = DateTime.Now; db.SystemAccountDetail_sad.InsertOnSubmit(sysDetail); db.SubmitChanges(); db.Transaction.Commit(); db.Connection.Close(); rvInfo.boolValue = true; } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }
public ReturnValueInfo BatchSyncAccountDetail(List<PreConsumeRecord_pcs_Info> listUpdatePreCost, List<PreConsumeRecord_pcs_Info> listDelPreCost, List<ConsumeRecord_csr_Info> listConsume) { ReturnValueInfo rvInfo = new ReturnValueInfo(); try { using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { //db.Connection.Open(); //db.Transaction = db.Connection.BeginTransaction(); List<CardUserAccountDetail_cuad> listUserAccount = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listSysAccount = new List<SystemAccountDetail_sad>(); List<PreConsumeRecord_pcs> listDelPreCost_DB = new List<PreConsumeRecord_pcs>(); #region 准备需要删除的重复扣费列表 if (listDelPreCost != null && listDelPreCost.Count > 0) { foreach (var item in listDelPreCost) { if (item == null) continue; PreConsumeRecord_pcs preCostDel = db.PreConsumeRecord_pcs.Where(x => x.pcs_cRecordID == item.pcs_cRecordID).FirstOrDefault(); if (preCostDel != null) { listDelPreCost_DB.Add(preCostDel); } } } #endregion #region 归档处理实际卡消费记录 foreach (ConsumeRecord_csr_Info consumeItem in listConsume) { CardUserAccount_cua account = db.CardUserAccount_cua.Where(x => x.cua_cCUSID == consumeItem.csr_cCardUserID).FirstOrDefault(); ConsumeRecord_csr consumeInfo = db.ConsumeRecord_csr.Where(x => x.csr_cRecordID == consumeItem.csr_cRecordID).FirstOrDefault(); consumeInfo.csr_lIsSettled = consumeItem.csr_lIsSettled; consumeInfo.csr_dSettleTime = consumeItem.csr_dSettleTime; string strFlowType = string.Empty;//公用消费类型 CardUserAccountDetail_cuad userAccountDetail = new CardUserAccountDetail_cuad(); userAccountDetail.cuad_cRecordID = Guid.NewGuid(); userAccountDetail.cuad_cConsumeID = consumeInfo.csr_cRecordID; userAccountDetail.cuad_cCUAID = account.cua_cRecordID; userAccountDetail.cuad_fFlowMoney = consumeItem.csr_fConsumeMoney; if (consumeItem.csr_cConsumeType == Common.DefineConstantValue.ConsumeMachineType.StuSetmeal.ToString()) { strFlowType = Common.DefineConstantValue.ConsumeMoneyFlowType.SetMealCost.ToString(); } else { strFlowType = Common.DefineConstantValue.ConsumeMoneyFlowType.FreeMealCost.ToString(); } userAccountDetail.cuad_cFlowType = strFlowType; userAccountDetail.cuad_cOpt = "sys"; userAccountDetail.cuad_dOptTime = DateTime.Now; listUserAccount.Add(userAccountDetail); SystemAccountDetail_sad sysAccountDetail = new SystemAccountDetail_sad(); sysAccountDetail.sad_cRecordID = Guid.NewGuid(); sysAccountDetail.sad_cConsumeID = consumeInfo.csr_cRecordID; sysAccountDetail.sad_cDesc = Common.DefineConstantValue.GetMoneyFlowDesc(strFlowType); sysAccountDetail.sad_cFLowMoney = consumeItem.csr_fConsumeMoney; sysAccountDetail.sad_cFlowType = strFlowType; sysAccountDetail.sad_cOpt = "sys"; sysAccountDetail.sad_dOptTime = DateTime.Now; listSysAccount.Add(sysAccountDetail); } #endregion #region 处理预扣费记录,更新已结算部分数据与未结算部分数据,未结算部分等待下次充值时补扣 foreach (PreConsumeRecord_pcs_Info preCostItem in listUpdatePreCost) { PreConsumeRecord_pcs preCostInfo = db.PreConsumeRecord_pcs.Where(x => x.pcs_cRecordID == preCostItem.pcs_cRecordID).FirstOrDefault(); if (preCostInfo != null) { preCostInfo.pcs_cSourceID = preCostItem.pcs_cSourceID; preCostInfo.pcs_cConsumeType = preCostItem.pcs_cConsumeType; preCostInfo.pcs_lIsSettled = preCostItem.pcs_lIsSettled; preCostInfo.pcs_dSettleTime = preCostItem.pcs_dSettleTime; preCostInfo.pcs_fCost = Math.Abs(preCostItem.pcs_fCost); preCostInfo.pcs_cAdd = preCostItem.pcs_cAdd; preCostInfo.pcs_dAddDate = preCostItem.pcs_dAddDate; } else { throw new Exception("预付款记录丢失。" + preCostItem.pcs_cRecordID.ToString()); } } #endregion #region 更新用户账户的余额以及同步时间【停用,改用SQL处理】 /*1、取出用户最新的卡消费记录 * 2、取出用户最新的转账或充值记录 * 3、对比两者时间,取较新时间的记录去到用户的余额 */ //var groupConsumeRecord = db.ConsumeRecord_csr.GroupBy(x => x.csr_cCardUserID); //foreach (var itemUserConsumeGroup in groupConsumeRecord) //{ // Guid userID = itemUserConsumeGroup.Key; // List<ConsumeRecord_csr> listUserRecord = itemUserConsumeGroup.OrderByDescending(x => x.csr_dConsumeDate).ToList(); // if (listUserRecord != null && listUserRecord.Count > 0) // { // ConsumeRecord_csr record = listUserRecord.FirstOrDefault();//最新的消费记录 // if (record != null) // { // decimal fCardCostCurrentBalance = record.csr_fCardBalance; // decimal fAdvanceRecharge = decimal.Zero;//透支额度 // RechargeRecord_rcr advanceRecharge = db.RechargeRecord_rcr.Where(x => // x.rcr_cUserID == record.csr_cCardUserID // && x.rcr_cRechargeType == Common.DefineConstantValue.ConsumeMoneyFlowType.Recharge_AdvanceMoney.ToString() // ).OrderByDescending(x => x.rcr_dRechargeTime).FirstOrDefault(); // if (advanceRecharge != null) // { // fAdvanceRecharge = advanceRecharge.rcr_fRechargeMoney; // } // //找出最后消费记录后,有充值情况出现的,需使用此充值后结果 // List<RechargeRecord_rcr> listCardRecharge = db.RechargeRecord_rcr.Where(x => // x.rcr_cUserID == record.csr_cCardUserID // && x.rcr_dRechargeTime >= record.csr_dConsumeDate // ).OrderByDescending(x => x.rcr_dRechargeTime).ToList();//以充值时间倒序,取出最新的充值列表 // listCardRecharge = listCardRecharge.Where(x => // x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.AdvanceMealCost.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.FreeMealCost.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.HedgeFund.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.IndeterminateCost.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.NewCardCost.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.Recharge_AdvanceMoney.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.ReplaceCardCost.ToString() // && x.rcr_cRechargeType != Common.DefineConstantValue.ConsumeMoneyFlowType.SetMealCost.ToString()).ToList(); // RechargeRecord_rcr cardRecharge = listCardRecharge.FirstOrDefault(); // if (cardRecharge != null) // { // if (record.csr_dConsumeDate < cardRecharge.rcr_dRechargeTime) // { // //如果充值记录存在,且充值时间比消费时间新,则以充值后余额为最后余额值 // fCardCostCurrentBalance = cardRecharge.rcr_fBalance; // } // } // CardUserAccount_cua userAccount = db.CardUserAccount_cua.Where(x => x.cua_cCUSID == record.csr_cCardUserID).FirstOrDefault(); // if (userAccount != null) // { // decimal fCurrentBalance = fCardCostCurrentBalance - fAdvanceRecharge; // userAccount.cua_fCurrentBalance = fCurrentBalance; // userAccount.cua_dLastSyncTime = DateTime.Now; // } // } // } // else // { // continue; // } //} #endregion db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); try { if (listConsume.Count > 0) { if (listUserAccount.Count > 0) { db.CardUserAccountDetail_cuad.InsertAllOnSubmit(listUserAccount); db.SystemAccountDetail_sad.InsertAllOnSubmit(listSysAccount); } } if (listDelPreCost_DB.Count > 0) { db.PreConsumeRecord_pcs.DeleteAllOnSubmit(listDelPreCost_DB); } db.SubmitChanges(); #region 同步学生账户金额信息 string strStuSycnAccount = @"declare @tb_CardConsumeDetail table (UserID uniqueidentifier,ConsumeDate datetime,CardBalance decimal(18,2)) declare @tb_CardRechargeDetail table (UserID uniqueidentifier,RechargeDate datetime,CardBalance decimal(18,2)) insert into @tb_CardConsumeDetail select distinct csr_cCardUserID,csr_dConsumeDate,csr_fCardBalance from ConsumeRecord_csr with(nolock) join( select UserID=csr_cCardUserID,MaxDate=MAX(csr_dConsumeDate) from ConsumeRecord_csr with(nolock) join vie_AllStudentCardUserInfos on csr_cCardUserID=cus_cRecordID group by csr_cCardUserID)A on csr_cCardUserID=UserID and csr_dConsumeDate=MaxDate insert into @tb_CardRechargeDetail select distinct rcr_cUserID,rcr_dRechargeTime,rcr_fBalance from RechargeRecord_rcr with(nolock) join( select UserID=rcr_cUserID,MaxDate=MAX(rcr_dRechargeTime) from RechargeRecord_rcr with(nolock) join vie_AllStudentCardUserInfos on rcr_cUserID=cus_cRecordID and rcr_dRechargeTime is not null and rcr_cRechargeType<>'Recharge_AdvanceMoney' group by rcr_cUserID)A on rcr_cUserID=UserID and rcr_dRechargeTime=MaxDate update CardUserAccount_cua set cua_fCurrentBalance=StuBalance,cua_dLastSyncTime=GETDATE() from CardUserAccount_cua Acc with(nolock) join( select cua_cRecordID,StuBalance=(case when (A.UserID is not null and B.UserID is not null) then (case when ConsumeDate>=RechargeDate then A.CardBalance else B.CardBalance end) when (A.UserID is not null and B.UserID is null) then A.CardBalance when (A.UserID is null and B.UserID is not null) then B.CardBalance else 0 end)-cua_fSysAdvance from vie_AllStudentCardUserInfos left join @tb_CardConsumeDetail A on A.UserID=cus_cRecordID left join @tb_CardRechargeDetail B on B.UserID=cus_cRecordID )TT on Acc.cua_cRecordID=TT.cua_cRecordID select * from vie_AllStudentCardUserInfos"; db.ExecuteCommand(strStuSycnAccount, new object[] { }); #endregion #region 同步教师账户金额信息 string strStaffSycnAccount = @"declare @tb_CardConsumeDetail table (UserID uniqueidentifier,ConsumeDate datetime,CardBalance decimal(18,2)) declare @tb_CardRechargeDetail table (UserID uniqueidentifier,RechargeDate datetime,CardBalance decimal(18,2)) insert into @tb_CardConsumeDetail select distinct csr_cCardUserID,csr_dConsumeDate,csr_fCardBalance from ConsumeRecord_csr with(nolock) join( select UserID=csr_cCardUserID,MaxDate=MAX(csr_dConsumeDate) from ConsumeRecord_csr with(nolock) join CardUserMaster_cus on csr_cCardUserID=cus_cRecordID and cus_cIdentityNum='STAFF' group by csr_cCardUserID)A on csr_cCardUserID=UserID and csr_dConsumeDate=MaxDate insert into @tb_CardRechargeDetail select distinct rcr_cUserID,rcr_dRechargeTime,rcr_fBalance from RechargeRecord_rcr with(nolock) join( select UserID=rcr_cUserID,MaxDate=MAX(rcr_dRechargeTime) from RechargeRecord_rcr with(nolock) join CardUserMaster_cus on rcr_cUserID=cus_cRecordID and cus_cIdentityNum='STAFF' and rcr_dRechargeTime is not null and rcr_cRechargeType<>'Recharge_AdvanceMoney' group by rcr_cUserID)A on rcr_cUserID=UserID and rcr_dRechargeTime=MaxDate update CardUserAccount_cua set cua_fCurrentBalance=StuBalance,cua_dLastSyncTime=GETDATE() from CardUserAccount_cua Acc with(nolock) join( select cua_cRecordID,StuBalance=(case when (A.UserID is not null and B.UserID is not null) then (case when ConsumeDate>=RechargeDate then A.CardBalance else B.CardBalance end) when (A.UserID is not null and B.UserID is null) then A.CardBalance when (A.UserID is null and B.UserID is not null) then B.CardBalance else 0 end)-cua_fSysAdvance--,ConsumeDate,A.CardBalance,RechargeDate,B.CardBalance from CardUserMaster_cus with(nolock) join CardUserAccount_cua with(nolock) on cua_cCUSID=cus_cRecordID left join @tb_CardConsumeDetail A on A.UserID=cus_cRecordID left join @tb_CardRechargeDetail B on B.UserID=cus_cRecordID where cus_cIdentityNum='STAFF' )Temp on Acc.cua_cRecordID=Temp.cua_cRecordID select * from CardUserAccount_cua join CardUserMaster_cus on cus_cRecordID=cua_cCUSID and cus_cIdentityNum='STAFF'"; db.ExecuteCommand(strStaffSycnAccount, new object[] { }); #endregion #region 临时清除午餐误扣费 string strChkLunch = @"update PreConsumeRecord_pcs set pcs_lIsSettled=1,pcs_dSettleTime=GETDATE() where pcs_cRecordID in ( select pcs_cRecordID from PreConsumeRecord_pcs where pcs_lIsSettled = 0 and pcs_cConsumeType = '" + Common.DefineConstantValue.ConsumeMoneyFlowType.SetMealCost.ToString() + "'" + Environment.NewLine; strChkLunch += "and pcs_dConsumeDate between '" + DateTime.Now.ToString("yyyy-MM-dd 09:00") + "' and '" + DateTime.Now.ToString("yyyy-MM-dd 13:00") + "'" + Environment.NewLine; strChkLunch += @"and pcs_fCost > 2 and pcs_cUserID in ( select csr_cCardUserID from ConsumeRecord_csr where csr_dConsumeDate between '" + DateTime.Now.ToString("yyyy-MM-dd 09:00") + "' and '" + DateTime.Now.ToString("yyyy-MM-dd 13:59") + "'" + Environment.NewLine; strChkLunch += "and csr_cConsumeType = '" + Common.DefineConstantValue.ConsumeMachineType.StuSetmeal.ToString() + "' and csr_cMealType = '" + Common.DefineConstantValue.MealType.Lunch.ToString() + "'))" + Environment.NewLine; db.ExecuteCommand(strChkLunch, new object[] { }); #endregion #region 临时清除晚餐误扣费 string strChkDinner = @"update PreConsumeRecord_pcs set pcs_lIsSettled=1,pcs_dSettleTime=GETDATE() where pcs_cRecordID in ( select pcs_cRecordID from PreConsumeRecord_pcs where pcs_lIsSettled = 0 and pcs_cConsumeType = '" + Common.DefineConstantValue.ConsumeMoneyFlowType.SetMealCost.ToString() + "'" + Environment.NewLine; strChkDinner += "and pcs_dConsumeDate between '" + DateTime.Now.ToString("yyyy-MM-dd 13:30") + "' and '" + DateTime.Now.ToString("yyyy-MM-dd 23:59") + "'" + Environment.NewLine; strChkDinner += @"and pcs_fCost > 2 and pcs_cUserID in ( select csr_cCardUserID from ConsumeRecord_csr where csr_dConsumeDate between '" + DateTime.Now.ToString("yyyy-MM-dd 15:00") + "' and '" + DateTime.Now.ToString("yyyy-MM-dd 23:59") + "'" + Environment.NewLine; strChkDinner += "and csr_cConsumeType = '" + Common.DefineConstantValue.ConsumeMachineType.StuSetmeal.ToString() + "' and csr_cMealType = '" + Common.DefineConstantValue.MealType.Supper.ToString() + "'))" + Environment.NewLine; db.ExecuteCommand(strChkDinner, new object[] { }); #endregion if (listConsume.Count < 1 && listUpdatePreCost.Count < 1) { rvInfo.boolValue = false; rvInfo.messageText = "没有可用的数据。"; } else { rvInfo.boolValue = true; } } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } db.Transaction.Commit(); db.Connection.Close(); } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }
public ReturnValueInfo InsertRechargeRecord(IModelObject itemEntity) { ReturnValueInfo rvInfo = new ReturnValueInfo(); try { RechargeRecord_rcr_Info sourceInfo = itemEntity as RechargeRecord_rcr_Info; if (sourceInfo == null) { rvInfo.messageText = DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull; rvInfo.isError = true; return rvInfo; } //判断是否为需要录入用户账户中的记录 bool isUserDetail = IsUserAccountRecord(sourceInfo); // 判断是否为需要录入到系统账户中的记录 bool isSysDetail = IsSysAccountRecord(sourceInfo); //使用服务器时间更新记录时间 sourceInfo.rcr_dRechargeTime = DateTime.Now; sourceInfo.rcr_dLastDate = sourceInfo.rcr_dRechargeTime; RechargeRecord_rcr rechargeRecord = Common.General.CopyObjectValue<RechargeRecord_rcr_Info, RechargeRecord_rcr>(sourceInfo); if (rechargeRecord == null) { rvInfo.isError = true; rvInfo.messageText = DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull; return rvInfo; } using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { //用于批量统一插数 List<PreConsumeRecord_pcs> listToInsertPreCost = new List<PreConsumeRecord_pcs>(); List<CardUserAccountDetail_cuad> listToInsertAccountDetail = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listToInsertSysDetail = new List<SystemAccountDetail_sad>(); //获取账户信息 CardUserAccount_cua account = db.CardUserAccount_cua.Where(x => x.cua_cCUSID == sourceInfo.rcr_cUserID).FirstOrDefault(); #region 账户信息丢失时,自动创建账户信息 if (account == null) { account = new CardUserAccount_cua(); account.cua_cRecordID = Guid.NewGuid(); account.cua_cCUSID = sourceInfo.rcr_cUserID; account.cua_cAdd = sourceInfo.rcr_cLast; account.cua_dAddDate = DateTime.Now; account.cua_dLastSyncTime = DateTime.Now; account.cua_lIsActive = true; account.cua_fCurrentBalance = decimal.Zero; account.cua_fOriginalBalance = decimal.Zero; db.CardUserAccount_cua.InsertOnSubmit(account); db.SubmitChanges(); } #endregion if (isUserDetail) { //同步插入一条用户资金流动记录 #region 同步用户资金流动记录 CardUserAccountDetail_cuad accountDetail = new CardUserAccountDetail_cuad(); accountDetail.cuad_cRecordID = Guid.NewGuid(); accountDetail.cuad_cConsumeID = sourceInfo.rcr_cRecordID;//消费源ID accountDetail.cuad_cCUAID = account.cua_cRecordID;//账户ID accountDetail.cuad_fFlowMoney = sourceInfo.rcr_fRechargeMoney + Math.Abs(sourceInfo.PreCostMoney);//账户当次充值金额=卡实际充值金额+应付欠款 accountDetail.cuad_cFlowType = sourceInfo.rcr_cRechargeType; accountDetail.cuad_cOpt = sourceInfo.rcr_cAdd; accountDetail.cuad_dOptTime = sourceInfo.rcr_dRechargeTime; listToInsertAccountDetail.Add(accountDetail); #endregion } if (isSysDetail) { //同步插入一条系统资金现金流 #region 同步系统资金流动记录 SystemAccountDetail_sad sysAccountInfo = new SystemAccountDetail_sad(); sysAccountInfo.sad_cRecordID = Guid.NewGuid(); sysAccountInfo.sad_cConsumeID = sourceInfo.rcr_cRecordID;//消费源ID sysAccountInfo.sad_cDesc = sourceInfo.rcr_cDesc;//充值或退款描述 sysAccountInfo.sad_cFLowMoney = sourceInfo.rcr_fRechargeMoney + Math.Abs(sourceInfo.PreCostMoney); sysAccountInfo.sad_cFlowType = sourceInfo.rcr_cRechargeType; sysAccountInfo.sad_cOpt = sourceInfo.rcr_cAdd; sysAccountInfo.sad_dOptTime = sourceInfo.rcr_dRechargeTime; listToInsertSysDetail.Add(sysAccountInfo); #endregion } //找出该用户最后一条透支充值记录 decimal fAdvance = 0; #region 获取用户的预充值金额(透支款) List<RechargeRecord_rcr> listRechargeRecord = db.RechargeRecord_rcr.Where(x => x.rcr_cRechargeType == DefineConstantValue.ConsumeMoneyFlowType.Recharge_AdvanceMoney.ToString() && x.rcr_cUserID == sourceInfo.rcr_cUserID ).ToList(); if (listRechargeRecord != null && listRechargeRecord.Count > 0) { listRechargeRecord = listRechargeRecord.OrderByDescending(x => x.rcr_dRechargeTime).ToList(); fAdvance = listRechargeRecord[0].rcr_fRechargeMoney; } #endregion decimal fCurrentBalance = decimal.Zero; //判断是否需要同步处理欠款结算 if (Math.Abs(sourceInfo.PreCostMoney) > 0 || sourceInfo.IsNeedSyncAccount)//需要欠款金额大于零及标识为需要同步 { //若预付款还款值大于0,则存入充值账户 #region 存入预付款还款 List<PreConsumeRecord_pcs> listPreCost = db.PreConsumeRecord_pcs.Where(x => x.pcs_lIsSettled == false//状态为未结算 && x.pcs_cAccountID == account.cua_cRecordID//配对用户账号ID && x.pcs_cUserID == sourceInfo.rcr_cUserID//配对用户ID && x.pcs_cConsumeType != DefineConstantValue.ConsumeMoneyFlowType.IndeterminateCost.ToString()//非未确定扣费款项 && x.pcs_cConsumeType != DefineConstantValue.ConsumeMoneyFlowType.AdvanceMealCost.ToString()//非待扣费款项 && x.pcs_cConsumeType != DefineConstantValue.ConsumeMoneyFlowType.HedgeFund.ToString()//非对冲款项 ).ToList(); decimal sumPreCost = listPreCost.Sum(x => x.pcs_fCost); if (Math.Abs(sourceInfo.PreCostMoney) < Math.Abs(sumPreCost))//判断该次充值时缴纳的应付款总额是否足以扣除当前全部欠款 { //不足以扣除 db.Transaction.Rollback(); db.Connection.Close(); rvInfo.messageText = "支付额不足以支付待结算的预付款。"; return rvInfo; } //用户需要结算的欠款记录 List<CardUserAccountDetail_cuad> listPreUserCost = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listPreSysIncome = new List<SystemAccountDetail_sad>(); foreach (PreConsumeRecord_pcs preItem in listPreCost) { preItem.pcs_lIsSettled = true; preItem.pcs_dSettleTime = DateTime.Now; //结算的同时插入一条账户支出记录 CardUserAccountDetail_cuad userAccount = new CardUserAccountDetail_cuad(); userAccount.cuad_cRecordID = Guid.NewGuid(); userAccount.cuad_cConsumeID = preItem.pcs_cRecordID; userAccount.cuad_cCUAID = account.cua_cRecordID; userAccount.cuad_cFlowType = preItem.pcs_cConsumeType; userAccount.cuad_cOpt = sourceInfo.rcr_cLast; userAccount.cuad_dOptTime = DateTime.Now; userAccount.cuad_fFlowMoney = preItem.pcs_fCost; listPreUserCost.Add(userAccount); //结算的同时插入一条系统账户收入记录 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_cConsumeID = preItem.pcs_cRecordID; sysAccount.sad_cDesc = DefineConstantValue.GetMoneyFlowDesc(preItem.pcs_cConsumeType); sysAccount.sad_cFLowMoney = preItem.pcs_fCost; sysAccount.sad_cFlowType = preItem.pcs_cConsumeType; sysAccount.sad_cOpt = sourceInfo.rcr_cLast; sysAccount.sad_dOptTime = DateTime.Now; listPreSysIncome.Add(sysAccount); } if (listPreUserCost.Count > 0) { listToInsertAccountDetail.AddRange(listPreUserCost); listToInsertSysDetail.AddRange(listPreSysIncome); } #endregion //更新账户余额 decimal fAccountUpdate = account.cua_fCurrentBalance + sourceInfo.rcr_fRechargeMoney;//充值后账户余额=当前账户余额+实际充值金额 decimal fCardBalance = sourceInfo.rcr_fBalance - fAdvance;//充值后卡余额 = 卡当前余额 - 透支金额 if (fAccountUpdate > fCardBalance)//【系统账户余额】 大于 【卡实际余额】 { #region 进行平数处理 // 新增一条平数的预扣费记录 decimal fUnconfirmCost = fAccountUpdate - fCardBalance;//需要对冲款 = 账户当前余额 - 卡当前余额 PreConsumeRecord_pcs unconfirmRecord = new PreConsumeRecord_pcs(); unconfirmRecord.pcs_cRecordID = Guid.NewGuid(); unconfirmRecord.pcs_cAccountID = account.cua_cRecordID; unconfirmRecord.pcs_cUserID = sourceInfo.rcr_cUserID; unconfirmRecord.pcs_cConsumeType = DefineConstantValue.ConsumeMoneyFlowType.HedgeFund.ToString(); unconfirmRecord.pcs_dConsumeDate = DateTime.Now; unconfirmRecord.pcs_fCost = fUnconfirmCost; unconfirmRecord.pcs_lIsSettled = false;//状态设置为未结算,等待账户同步服务同步时结算清数 unconfirmRecord.pcs_cAdd = sourceInfo.rcr_cLast; unconfirmRecord.pcs_dAddDate = DateTime.Now; listToInsertPreCost.Add(unconfirmRecord); //用户账户 CardUserAccountDetail_cuad userAccount = new CardUserAccountDetail_cuad(); userAccount.cuad_cRecordID = Guid.NewGuid(); userAccount.cuad_cConsumeID = unconfirmRecord.pcs_cRecordID; userAccount.cuad_cCUAID = account.cua_cRecordID; userAccount.cuad_cFlowType = unconfirmRecord.pcs_cConsumeType; userAccount.cuad_cOpt = sourceInfo.rcr_cLast; userAccount.cuad_dOptTime = DateTime.Now; userAccount.cuad_fFlowMoney = fUnconfirmCost; listToInsertAccountDetail.Add(userAccount); //系统账户 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_cConsumeID = unconfirmRecord.pcs_cRecordID; sysAccount.sad_cDesc = DefineConstantValue.GetMoneyFlowDesc(unconfirmRecord.pcs_cConsumeType); sysAccount.sad_cFLowMoney = fUnconfirmCost; sysAccount.sad_cFlowType = unconfirmRecord.pcs_cConsumeType; sysAccount.sad_cOpt = sourceInfo.rcr_cLast; sysAccount.sad_dOptTime = DateTime.Now; listToInsertSysDetail.Add(sysAccount); #endregion } fCurrentBalance = fCardBalance; } else { fCurrentBalance = sourceInfo.rcr_fBalance - fAdvance; } db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); try { db.RechargeRecord_rcr.InsertOnSubmit(rechargeRecord);//插入卡实际金额充值记录 db.PreConsumeRecord_pcs.InsertAllOnSubmit(listToInsertPreCost); db.CardUserAccountDetail_cuad.InsertAllOnSubmit(listToInsertAccountDetail); db.SystemAccountDetail_sad.InsertAllOnSubmit(listToInsertSysDetail); CardUserAccount_cua accountUpdate = db.CardUserAccount_cua.Where(x => x.cua_cRecordID == account.cua_cRecordID).FirstOrDefault(); accountUpdate.cua_fCurrentBalance = fCurrentBalance; accountUpdate.cua_dLastSyncTime = DateTime.Now; db.SubmitChanges(); db.Transaction.Commit(); rvInfo.boolValue = true; rvInfo.ValueObject = DateTime.Now; } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }
public ReturnValueInfo CashRefund(RechargeRecord_rcr_Info refundRecord, decimal fPreCostRecharge) { ReturnValueInfo rvInfo = new ReturnValueInfo(); try { #region 数据检验 if (refundRecord == null) { rvInfo.messageText = Common.DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull; rvInfo.isError = true; return rvInfo; } RechargeRecord_rcr refundInfo = Common.General.CopyObjectValue<RechargeRecord_rcr_Info, RechargeRecord_rcr>(refundRecord); if (refundInfo == null) { rvInfo.messageText = Common.DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull; rvInfo.isError = true; return rvInfo; } #endregion using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { //用于批量统一插数 List<PreConsumeRecord_pcs> listToInsertPreCost = new List<PreConsumeRecord_pcs>(); List<CardUserAccountDetail_cuad> listToInsertAccountDetail = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listToInsertSysDetail = new List<SystemAccountDetail_sad>(); List<RechargeRecord_rcr> listToInsertRecharge = new List<RechargeRecord_rcr>(); //获取账户信息 CardUserAccount_cua account = db.CardUserAccount_cua.Where(x => x.cua_cCUSID == refundRecord.rcr_cUserID).FirstOrDefault(); #region 账户信息丢失时,自动创建账户信息 if (account == null) { account = new CardUserAccount_cua(); account.cua_cRecordID = Guid.NewGuid(); account.cua_cCUSID = refundRecord.rcr_cUserID; account.cua_cAdd = refundRecord.rcr_cLast; account.cua_dAddDate = DateTime.Now; account.cua_dLastSyncTime = DateTime.Now; account.cua_lIsActive = true; account.cua_fCurrentBalance = decimal.Zero; account.cua_fOriginalBalance = decimal.Zero; db.CardUserAccount_cua.InsertOnSubmit(account); db.SubmitChanges(); } #endregion if (account != null) { if (Math.Abs(fPreCostRecharge) > 0) { #region 检查未付款记录,并更新状态 List<PreConsumeRecord_pcs> listPreCosts = db.PreConsumeRecord_pcs.Where(x => x.pcs_cAccountID == account.cua_cRecordID && x.pcs_cUserID == refundInfo.rcr_cUserID && x.pcs_lIsSettled == false ).ToList(); //筛选预付款的消费类型 listPreCosts = filterRecord_CanComputePreCost(listPreCosts); if (listPreCosts != null && listPreCosts.Count > 0) { decimal fSumPreCost = listPreCosts.Sum(x => x.pcs_fCost); fSumPreCost = Math.Abs(fSumPreCost); if (fSumPreCost != Math.Abs(fPreCostRecharge)) { rvInfo.messageText = "未结算款项记录异常。"; db.Transaction.Rollback(); rvInfo.isError = true; return rvInfo; } else { List<CardUserAccountDetail_cuad> listAccountPreCost = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listSysAccountPreCost = new List<SystemAccountDetail_sad>(); foreach (PreConsumeRecord_pcs preCostItem in listPreCosts) { preCostItem.pcs_lIsSettled = true; preCostItem.pcs_dSettleTime = DateTime.Now; #region 插入欠费缴费记录 //插入用户账户记录 CardUserAccountDetail_cuad accountDetailPreCost = new CardUserAccountDetail_cuad(); accountDetailPreCost.cuad_cRecordID = Guid.NewGuid(); accountDetailPreCost.cuad_cConsumeID = refundInfo.rcr_cRecordID; accountDetailPreCost.cuad_cCUAID = account.cua_cRecordID; accountDetailPreCost.cuad_cFlowType = preCostItem.pcs_cConsumeType; accountDetailPreCost.cuad_cOpt = refundInfo.rcr_cLast; accountDetailPreCost.cuad_dOptTime = DateTime.Now; accountDetailPreCost.cuad_fFlowMoney = preCostItem.pcs_fCost; listAccountPreCost.Add(accountDetailPreCost); //插入系统账户记录 SystemAccountDetail_sad sysAccountDetailPreCost = new SystemAccountDetail_sad(); sysAccountDetailPreCost.sad_cRecordID = Guid.NewGuid(); sysAccountDetailPreCost.sad_cConsumeID = refundInfo.rcr_cRecordID; sysAccountDetailPreCost.sad_cDesc = DefineConstantValue.GetMoneyFlowDesc(preCostItem.pcs_cConsumeType); sysAccountDetailPreCost.sad_cFLowMoney = preCostItem.pcs_fCost; sysAccountDetailPreCost.sad_cFlowType = preCostItem.pcs_cConsumeType; sysAccountDetailPreCost.sad_cOpt = refundInfo.rcr_cLast; sysAccountDetailPreCost.sad_dOptTime = DateTime.Now; listSysAccountPreCost.Add(sysAccountDetailPreCost); #endregion } if (listAccountPreCost.Count > 0) { listToInsertAccountDetail.AddRange(listAccountPreCost); listToInsertSysDetail.AddRange(listSysAccountPreCost); } } } else { if (listPreCosts == null) { rvInfo.messageText = "未结算款项记录异常。"; rvInfo.isError = true; return rvInfo; } } #endregion } #region 插入退款记录 //插入用户账户退款记录 CardUserAccountDetail_cuad accountDetail = new CardUserAccountDetail_cuad(); accountDetail.cuad_cRecordID = Guid.NewGuid(); accountDetail.cuad_cConsumeID = refundInfo.rcr_cRecordID; accountDetail.cuad_cCUAID = account.cua_cRecordID; accountDetail.cuad_cFlowType = refundInfo.rcr_cRechargeType; accountDetail.cuad_cOpt = refundInfo.rcr_cLast; accountDetail.cuad_dOptTime = DateTime.Now; accountDetail.cuad_fFlowMoney = refundInfo.rcr_fRechargeMoney; listToInsertAccountDetail.Add(accountDetail); //插入系统账户退款记录 SystemAccountDetail_sad sysAccountDetail = new SystemAccountDetail_sad(); sysAccountDetail.sad_cRecordID = Guid.NewGuid(); sysAccountDetail.sad_cConsumeID = refundInfo.rcr_cRecordID; sysAccountDetail.sad_cDesc = refundInfo.rcr_cDesc; sysAccountDetail.sad_cFLowMoney = refundInfo.rcr_fRechargeMoney; sysAccountDetail.sad_cFlowType = refundInfo.rcr_cRechargeType; sysAccountDetail.sad_cOpt = refundInfo.rcr_cLast; sysAccountDetail.sad_dOptTime = DateTime.Now; listToInsertSysDetail.Add(sysAccountDetail); #endregion decimal fAdvanceCost = decimal.Zero; #region 获取透支金额 List<RechargeRecord_rcr> listAdvanceCost = db.RechargeRecord_rcr.Where(x => x.rcr_cUserID == refundInfo.rcr_cUserID && x.rcr_cRechargeType == Common.DefineConstantValue.ConsumeMoneyFlowType.Recharge_AdvanceMoney.ToString()).ToList(); if (listAdvanceCost != null && listAdvanceCost.Count > 0) { RechargeRecord_rcr advanceCost = listAdvanceCost.OrderByDescending(x => x.rcr_dRechargeTime).FirstOrDefault(); if (advanceCost != null) { fAdvanceCost = advanceCost.rcr_fRechargeMoney; } } #endregion decimal fAccountCurrentBalance = account.cua_fCurrentBalance - fPreCostRecharge - refundInfo.rcr_fRechargeMoney;//退款后的最新账户余额 decimal fCardCurrentBalance = refundInfo.rcr_fBalance - fAdvanceCost;//退款后的卡余额 if (fAccountCurrentBalance > fCardCurrentBalance) { //账户余额比卡余额大,则需要插入补充金额 #region 插入补充消费记录 decimal fInsert = fAccountCurrentBalance - fCardCurrentBalance; //【系统账户余额】 大于 【卡实际余额】 // 新增一条平数的预扣费记录 PreConsumeRecord_pcs unconfirmRecord = new PreConsumeRecord_pcs(); unconfirmRecord.pcs_cAccountID = account.cua_cRecordID; unconfirmRecord.pcs_cRecordID = Guid.NewGuid(); unconfirmRecord.pcs_cConsumeType = DefineConstantValue.ConsumeMoneyFlowType.HedgeFund.ToString(); unconfirmRecord.pcs_cUserID = refundInfo.rcr_cUserID; unconfirmRecord.pcs_cAdd = refundInfo.rcr_cLast; unconfirmRecord.pcs_dAddDate = DateTime.Now; unconfirmRecord.pcs_dConsumeDate = DateTime.Now; unconfirmRecord.pcs_fCost = fInsert; unconfirmRecord.pcs_lIsSettled = false; listToInsertPreCost.Add(unconfirmRecord); //用户账户 CardUserAccountDetail_cuad userAccount = new CardUserAccountDetail_cuad(); userAccount.cuad_cConsumeID = unconfirmRecord.pcs_cRecordID; userAccount.cuad_cCUAID = account.cua_cRecordID; userAccount.cuad_cFlowType = unconfirmRecord.pcs_cConsumeType; userAccount.cuad_cOpt = refundInfo.rcr_cLast; userAccount.cuad_cRecordID = Guid.NewGuid(); userAccount.cuad_dOptTime = DateTime.Now; userAccount.cuad_fFlowMoney = fInsert; listToInsertAccountDetail.Add(userAccount); //系统账户 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_cConsumeID = unconfirmRecord.pcs_cRecordID; sysAccount.sad_cDesc = DefineConstantValue.GetMoneyFlowDesc(unconfirmRecord.pcs_cConsumeType); sysAccount.sad_cFLowMoney = fInsert; sysAccount.sad_cFlowType = unconfirmRecord.pcs_cConsumeType; sysAccount.sad_cOpt = refundInfo.rcr_cLast; sysAccount.sad_dOptTime = DateTime.Now; listToInsertSysDetail.Add(sysAccount); #endregion } try { db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); refundInfo.rcr_dRechargeTime = DateTime.Now; refundInfo.rcr_dLastDate = DateTime.Now; db.RechargeRecord_rcr.InsertOnSubmit(refundInfo); account.cua_fCurrentBalance = fCardCurrentBalance; account.cua_dLastSyncTime = DateTime.Now; if (listToInsertPreCost != null && listToInsertPreCost.Count > 0) db.PreConsumeRecord_pcs.InsertAllOnSubmit(listToInsertPreCost); if (listToInsertAccountDetail != null && listToInsertAccountDetail.Count > 0) db.CardUserAccountDetail_cuad.InsertAllOnSubmit(listToInsertAccountDetail); if (listToInsertSysDetail != null && listToInsertSysDetail.Count > 0) db.SystemAccountDetail_sad.InsertAllOnSubmit(listToInsertSysDetail); if (listToInsertRecharge != null && listToInsertRecharge.Count > 0) db.RechargeRecord_rcr.InsertAllOnSubmit(listToInsertRecharge); db.SubmitChanges(); db.Transaction.Commit(); rvInfo.boolValue = true; } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } } } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }
public ReturnValueInfo UpdateRechargeRecord(List<PreRechargeRecord_prr_Info> listRecord, List<RechargeRecord_rcr_Info> listRecharges, decimal fPreCostRecharge) { ReturnValueInfo rvInfo = new ReturnValueInfo(); #region 检查条件合法性 if (listRecord == null) { rvInfo.isError = true; rvInfo.messageText = Common.DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull + Environment.NewLine + "预充值记录。"; return rvInfo; } if (listRecharges == null) { rvInfo.isError = true; rvInfo.messageText = Common.DefineConstantValue.SystemMessageText.strMessageText_E_ObjectNull + Environment.NewLine + "实际充值记录。"; return rvInfo; } if (listRecharges != null && listRecharges.Count < 1) { rvInfo.isError = true; rvInfo.messageText = "需要录入的充值记录不能为空。"; return rvInfo; } if (listRecord != null && listRecord.Count < 1) { rvInfo.isError = true; rvInfo.messageText = "需要更新的充值记录不能为空。"; return rvInfo; } #endregion try { using (SIOTSDB_HHZXDataContext db = new SIOTSDB_HHZXDataContext()) { //用于批量统一插数 List<PreConsumeRecord_pcs> listToInsertPreCost = new List<PreConsumeRecord_pcs>(); List<CardUserAccountDetail_cuad> listToInsertAccountDetail = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listToInsertSysDetail = new List<SystemAccountDetail_sad>(); List<RechargeRecord_rcr> listToInsertRecharge = new List<RechargeRecord_rcr>(); //获取账户信息 CardUserAccount_cua account = db.CardUserAccount_cua.Where(x => x.cua_cCUSID == listRecharges[0].rcr_cUserID).FirstOrDefault(); #region 账户信息丢失时,自动创建账户信息 if (account == null) { account = new CardUserAccount_cua(); account.cua_cRecordID = Guid.NewGuid(); account.cua_cCUSID = listRecharges[0].rcr_cUserID; account.cua_cAdd = listRecharges[0].rcr_cLast; account.cua_dAddDate = DateTime.Now; account.cua_dLastSyncTime = DateTime.Now; account.cua_lIsActive = true; account.cua_fCurrentBalance = decimal.Zero; account.cua_fOriginalBalance = decimal.Zero; db.CardUserAccount_cua.InsertOnSubmit(account); db.SubmitChanges(); } #endregion //充值总额 decimal fSumRecharge = decimal.Zero; //待添加的实际充值记录 List<RechargeRecord_rcr> listRechargeInserts = new List<RechargeRecord_rcr>(); //待添加的的用户账户数据 List<CardUserAccountDetail_cuad> listUserAccountInfos = new List<CardUserAccountDetail_cuad>(); //待添加的系统账户数据 List<SystemAccountDetail_sad> listSysAccountInfos = new List<SystemAccountDetail_sad>(); //更新已经使用的转账充值记录 #region 更新已被使用的预充值记录状态为已完成,并插入实际充值记录并记录账户收入记录 foreach (PreRechargeRecord_prr_Info preRechargeItem in listRecord) { if (preRechargeItem == null) { continue; } PreRechargeRecord_prr preRecord = db.PreRechargeRecord_prr.Where(x => x.prr_cRecordID == preRechargeItem.prr_cRecordID).FirstOrDefault(); if (preRecord != null) { //添加实际消费记录 RechargeRecord_rcr_Info rechargeInfo = listRecharges.Find(x => x.rcr_cRecordID == preRechargeItem.prr_cRCRID); if (rechargeInfo != null) { RechargeRecord_rcr recharge = Common.General.CopyObjectValue<RechargeRecord_rcr_Info, RechargeRecord_rcr>(rechargeInfo); if (recharge != null) { rechargeInfo.rcr_dRechargeTime = DateTime.Now; rechargeInfo.rcr_dLastDate = DateTime.Now; listRechargeInserts.Add(recharge); } } preRecord.prr_cRCRID = rechargeInfo.rcr_cRecordID; preRecord.prr_cStatus = Common.DefineConstantValue.ConsumeMoneyFlowStatus.Finished.ToString(); preRecord.prr_cLast = preRechargeItem.prr_cLast; preRecord.prr_dLastDate = preRechargeItem.prr_dLastDate; //累积充值记录 fSumRecharge += preRechargeItem.prr_fRechargeMoney; //用户账户 CardUserAccountDetail_cuad userAccountDetail = new CardUserAccountDetail_cuad(); userAccountDetail.cuad_cRecordID = Guid.NewGuid(); userAccountDetail.cuad_cConsumeID = rechargeInfo.rcr_cRecordID; userAccountDetail.cuad_cCUAID = account.cua_cRecordID; userAccountDetail.cuad_cFlowType = rechargeInfo.rcr_cRechargeType; userAccountDetail.cuad_cOpt = rechargeInfo.rcr_cLast; userAccountDetail.cuad_dOptTime = DateTime.Now; userAccountDetail.cuad_fFlowMoney = preRechargeItem.prr_fRechargeMoney;//金额与预充值额全额一致 listUserAccountInfos.Add(userAccountDetail); //系统账户 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_cConsumeID = rechargeInfo.rcr_cRecordID; sysAccount.sad_cDesc = Common.DefineConstantValue.GetMoneyFlowDesc(rechargeInfo.rcr_cRechargeType); sysAccount.sad_cFLowMoney = preRechargeItem.prr_fRechargeMoney;//金额与预充值额全额一致 sysAccount.sad_cFlowType = rechargeInfo.rcr_cRechargeType; sysAccount.sad_cOpt = rechargeInfo.rcr_cLast; sysAccount.sad_dOptTime = DateTime.Now; listSysAccountInfos.Add(sysAccount); } } #endregion if (listUserAccountInfos.Count > 0) { //插入由充值记录产生的账户记录 listToInsertRecharge.AddRange(listRechargeInserts); listToInsertAccountDetail.AddRange(listUserAccountInfos); listToInsertSysDetail.AddRange(listSysAccountInfos); } //查找用户是否含有透支预存款记录 decimal fAdvance = decimal.Zero; #region 获取用户的透支金额 List<RechargeRecord_rcr> listAdvance = db.RechargeRecord_rcr.Where(x => x.rcr_cUserID == listRechargeInserts[0].rcr_cUserID && x.rcr_cRechargeType == Common.DefineConstantValue.ConsumeMoneyFlowType.Recharge_AdvanceMoney.ToString() ).ToList(); if (listAdvance != null && listAdvance.Count > 0) { fAdvance = listAdvance.OrderByDescending(x => x.rcr_dRechargeTime).FirstOrDefault().rcr_fRechargeMoney; } #endregion decimal fCurrentBalance = decimal.Zero; fPreCostRecharge = Math.Abs(fPreCostRecharge); decimal fSumPreCost = decimal.Zero;//记录欠款总额 //获取本次充值的最后余额 //decimal fCardBalance = listRechargeInserts.Max(x => x.rcr_fBalance); decimal fCardBalance = listRechargeInserts.OrderByDescending(x => x.rcr_dRechargeTime).FirstOrDefault().rcr_fBalance; if (fPreCostRecharge >= 0 && listRechargeInserts.Count > 0)//若存在需要支付预付款的金额,则进行平数处理 { //若预付款还款值大于0,则更新被支付的未结算预付款记录 #region 结算预付款项 List<PreConsumeRecord_pcs> listPreCost = db.PreConsumeRecord_pcs.Where(x => x.pcs_lIsSettled == false //需为未支付金额 && x.pcs_cAccountID == account.cua_cRecordID//需要账户对口 && x.pcs_cUserID == listRechargeInserts[0].rcr_cUserID //需要对口人员ID ).ToList(); //筛选预付款的消费类型 listPreCost = filterRecord_CanComputePreCost(listPreCost); fSumPreCost = listPreCost.Sum(x => x.pcs_fCost); if (Math.Abs(fPreCostRecharge) < Math.Abs(fSumPreCost)) { rvInfo.messageText = "支付额不足以支付待结算的预付款。"; return rvInfo; } List<CardUserAccountDetail_cuad> listPreUserCost = new List<CardUserAccountDetail_cuad>(); List<SystemAccountDetail_sad> listPreSysIncome = new List<SystemAccountDetail_sad>(); foreach (PreConsumeRecord_pcs preItem in listPreCost) { preItem.pcs_lIsSettled = true; preItem.pcs_dSettleTime = DateTime.Now; //结算的同时插入一条用户账户支出记录 CardUserAccountDetail_cuad userAccountDetail = new CardUserAccountDetail_cuad(); userAccountDetail.cuad_cConsumeID = preItem.pcs_cRecordID; userAccountDetail.cuad_cCUAID = account.cua_cRecordID; userAccountDetail.cuad_cFlowType = preItem.pcs_cConsumeType; userAccountDetail.cuad_cOpt = listRechargeInserts[0].rcr_cLast; userAccountDetail.cuad_cRecordID = Guid.NewGuid(); userAccountDetail.cuad_dOptTime = DateTime.Now; userAccountDetail.cuad_fFlowMoney = preItem.pcs_fCost; listPreUserCost.Add(userAccountDetail); //结算的同时插入一条系统账户收入记录 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cConsumeID = preItem.pcs_cRecordID; sysAccount.sad_cDesc = Common.DefineConstantValue.GetMoneyFlowDesc(preItem.pcs_cConsumeType); sysAccount.sad_cFLowMoney = preItem.pcs_fCost; sysAccount.sad_cFlowType = preItem.pcs_cConsumeType; sysAccount.sad_cOpt = listRechargeInserts[0].rcr_cLast; sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_dOptTime = DateTime.Now; listPreSysIncome.Add(sysAccount); } if (listPreUserCost.Count > 0) { listToInsertAccountDetail.AddRange(listPreUserCost); listToInsertSysDetail.AddRange(listPreSysIncome); } #endregion //扣减预支款 fCardBalance -= fAdvance; //账户余额 decimal fAccountUpdate = account.cua_fCurrentBalance + fSumRecharge - fSumPreCost; if (fAccountUpdate > fCardBalance) { #region 平数处理 //【系统账户余额】 大于 【卡实际余额】 // 新增一条平数的预扣费记录 decimal fUnconfirmCost = fAccountUpdate - fCardBalance; PreConsumeRecord_pcs unconfirmRecord = new PreConsumeRecord_pcs(); unconfirmRecord.pcs_cRecordID = Guid.NewGuid(); unconfirmRecord.pcs_cAccountID = account.cua_cRecordID; unconfirmRecord.pcs_cAdd = listRechargeInserts[0].rcr_cLast; unconfirmRecord.pcs_cConsumeType = DefineConstantValue.ConsumeMoneyFlowType.HedgeFund.ToString(); unconfirmRecord.pcs_cUserID = listRechargeInserts[0].rcr_cUserID; unconfirmRecord.pcs_dAddDate = DateTime.Now; unconfirmRecord.pcs_dConsumeDate = DateTime.Now; unconfirmRecord.pcs_fCost = fUnconfirmCost; unconfirmRecord.pcs_lIsSettled = false; listToInsertPreCost.Add(unconfirmRecord); //用户账户 CardUserAccountDetail_cuad userAccountDetail = new CardUserAccountDetail_cuad(); userAccountDetail.cuad_cRecordID = Guid.NewGuid(); userAccountDetail.cuad_cConsumeID = unconfirmRecord.pcs_cRecordID; userAccountDetail.cuad_cCUAID = account.cua_cRecordID; userAccountDetail.cuad_cFlowType = unconfirmRecord.pcs_cConsumeType; userAccountDetail.cuad_cOpt = listRechargeInserts[0].rcr_cLast; userAccountDetail.cuad_dOptTime = DateTime.Now; userAccountDetail.cuad_fFlowMoney = fUnconfirmCost; listToInsertAccountDetail.Add(userAccountDetail); //系统账户 SystemAccountDetail_sad sysAccount = new SystemAccountDetail_sad(); sysAccount.sad_cRecordID = Guid.NewGuid(); sysAccount.sad_cConsumeID = unconfirmRecord.pcs_cRecordID; sysAccount.sad_cDesc = DefineConstantValue.GetMoneyFlowDesc(unconfirmRecord.pcs_cConsumeType); sysAccount.sad_cFLowMoney = fUnconfirmCost; sysAccount.sad_cFlowType = unconfirmRecord.pcs_cConsumeType; sysAccount.sad_cOpt = listRechargeInserts[0].rcr_cLast; sysAccount.sad_dOptTime = DateTime.Now; listToInsertSysDetail.Add(sysAccount); #endregion } fCurrentBalance = fCardBalance; } else { fCurrentBalance = fCardBalance - fAdvance; } try { db.Connection.Open(); db.Transaction = db.Connection.BeginTransaction(); if (listToInsertRecharge != null && listToInsertRecharge.Count > 0) db.RechargeRecord_rcr.InsertAllOnSubmit(listToInsertRecharge); if (listToInsertPreCost != null && listToInsertPreCost.Count > 0) db.PreConsumeRecord_pcs.InsertAllOnSubmit(listToInsertPreCost); if (listToInsertAccountDetail != null && listToInsertAccountDetail.Count > 0) db.CardUserAccountDetail_cuad.InsertAllOnSubmit(listToInsertAccountDetail); if (listToInsertSysDetail != null && listToInsertSysDetail.Count > 0) db.SystemAccountDetail_sad.InsertAllOnSubmit(listToInsertSysDetail); account.cua_dLastSyncTime = DateTime.Now; account.cua_fCurrentBalance = fCurrentBalance; db.SubmitChanges(); db.Transaction.Commit(); rvInfo.boolValue = true; rvInfo.ValueObject = DateTime.Now; return rvInfo; } catch (Exception exx) { db.Transaction.Rollback(); db.Connection.Close(); throw exx; } } } catch (Exception ex) { rvInfo.isError = true; rvInfo.messageText = ex.Message; } return rvInfo; }