示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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;
        }
示例#4
0
        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;
        }
示例#5
0
        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;
        }
示例#6
0
        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;
        }