//私有方法 private OptResult CloseDownSingle(SingleProcessParam param) { OptResult rst = null; var operation = CardOperation.CloseDwn; var optDesc = operation.GetDescription() + "(单账户)"; if (param.card == null) { rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——一卡通账户不存在!", optDesc)); return(rst); } if (param.card.State != CardState.Normal)//暂定只有正常状态的账户才能注销 { rst = OptResult.Build(ResultCode.Fail, string.Format("{0}——身份证号为{1}的账户状态为{2},不能注销!", optDesc, param.card.card_idcard, param.card.State.GetDescription())); return(rst); } //2、数据库处理 /* * 流程: * 1)更新card_info * 2)新增操作记录,type:注销 * 3)新增一卡通流水 */ var rec_id = GuidExtension.GetOne(); var optTime = DateTime.Now; var cardRecord = new CardRecord { rec_id = rec_id, rec_number = param.card.card_number, rec_username = param.card.card_username, rec_idcard = param.card.card_idcard, rec_type = operation.ToString(), rec_time = optTime, rec_operator = param.opt, rec_remark = string.Format("{0}——本次变动额:{1}", optDesc, param.card.card_govmoney + param.card.card_mymoney) }; var cardBill = new CardBill { bill_id = Guid.NewGuid().ToString("N"), bill_number = param.card.card_number, bill_idcard = param.card.card_idcard, bill_agoall = param.card.card_govmoney + param.card.card_mymoney, bill_agogov = param.card.card_govmoney, bill_agomy = param.card.card_mymoney, bill_changegov = -param.card.card_govmoney, bill_changemy = -param.card.card_mymoney, bill_nowall = 0, bill_nowgov = 0, bill_nowmy = 0, bill_type = operation.ToString(), bill_time = optTime, bill_record = rec_id, bill_remark = optDesc }; var innerTran = param.tran; if (innerTran == null) { innerTran = _cardInfoRep.Begin(); } try { //1 var count = _cardInfoRep.UpdateBySqlName(SqlName_Update, new { card_govmoney = 0, card_mymoney = 0, card_idcard = param.card.card_idcard, card_state = CardState.Off.ToString(), card_modifier = param.opt, card_modifytime = optTime }, new string[] { "card_govmoney", "card_mymoney", "card_state", "card_modifier", "card_modifytime" }, innerTran); if (count < 1) { if (param.tran == null) { //外部事务为null,说明是本方法内部事务,这里自行回滚 innerTran.Rollback(); } rst = OptResult.Build(ResultCode.Fail, string.Format("{0}——idcard={1}", optDesc, param.card.card_idcard)); return(rst); } //2 _cardRecordRep.Insert(cardRecord, innerTran); //3 _cardBillRep.Insert(cardBill, innerTran); if (param.tran == null) { //外部事务为null,说明是本方法内部事务,这里自行提交 innerTran.Commit(); } rst = OptResult.Build(ResultCode.Success, string.Format("{0}——idcard={1}", optDesc, param.card.card_idcard)); } catch (Exception ex) { LogHelper.LogError(optDesc, ex); rst = OptResult.Build(ResultCode.DbError, optDesc); return(rst); } return(rst); }
//私有方法 /// <summary> /// 设置单个一卡通账户的金额 /// 关于事务: /// * 1、如果从外部传递事务,则事务操作也由调用方处理 /// * 2、如果外部没有传入事务,则内部起一个事务,并自行负责事务操作 /// </summary> /// <param name="card"></param> /// </param> /// <returns></returns> private OptResult SetMoneySingle(SetMoneySingleProcessParam param) { OptResult rst = null; if (param == null) { rst = OptResult.Build(ResultCode.ParamError, "补贴/充值——参数错误!"); return(rst); } var operation = param.moneyType == MoneyEnum.gov ? CardOperation.SetGov : CardOperation.SetMy; var optDesc = operation.GetDescription() + "(单账户)"; if (param.card == null) { rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}[{1}]——一卡通账户不存在!", optDesc, param.moneyType.GetDescription())); return(rst); } //2、数据库处理 /* * 流程: * 1)更新card_info * 2)新增操作记录,type:补贴、充值 * 3)新增一卡通流水 */ var rec_id = GuidExtension.GetOne(); var optTime = DateTime.Now; var cardRecord = new CardRecord { rec_id = rec_id, rec_number = param.card.card_number, rec_username = param.card.card_username, rec_idcard = param.card.card_idcard, rec_type = operation.ToString(), rec_time = optTime, rec_operator = param.opt, rec_remark = string.Format("{0},本次变动额:{1}", optDesc, param.money) }; //政府补贴金时,不保留政府补贴现有余额,直接更新成新的金额 var cardBill = new CardBill { bill_id = Guid.NewGuid().ToString("N"), bill_number = param.card.card_number, bill_idcard = param.card.card_idcard, bill_agoall = param.card.card_govmoney + param.card.card_mymoney, bill_agogov = param.card.card_govmoney, bill_agomy = param.card.card_mymoney, bill_changegov = param.moneyType == MoneyEnum.gov ? (param.money - param.card.card_govmoney) : 0, bill_changemy = param.moneyType == MoneyEnum.my ? param.money : 0, bill_nowall = param.moneyType == MoneyEnum.gov ? (param.money + param.card.card_mymoney) : (param.card.card_govmoney + param.card.card_mymoney + param.money), bill_nowgov = param.moneyType == MoneyEnum.gov ? param.money : param.card.card_govmoney, bill_nowmy = param.moneyType == MoneyEnum.my ? (param.card.card_mymoney + param.money) : param.card.card_mymoney, bill_type = operation.ToString(), bill_time = optTime, bill_record = rec_id, bill_remark = optDesc }; var innerTran = param.tran; if (innerTran == null) { innerTran = _cardInfoRep.Begin(); } try { var count = 0; //1 if (param.moneyType == MoneyEnum.gov) { count = _cardInfoRep.UpdateBySqlName(SqlName_Update, new { card_govmoney = param.money, card_idcard = param.card.card_idcard, card_modifier = param.opt, card_modifytime = optTime }, new string[] { "card_govmoney", "card_modifier", "card_modifytime" }, innerTran); } else { count = _cardInfoRep.UpdateBySqlName(SqlName_Update, new { card_mymoney = param.card.card_mymoney + param.money, card_idcard = param.card.card_idcard, card_modifier = param.opt, card_modifytime = optTime }, new string[] { "card_mymoney", "card_modifier", "card_modifytime" }, innerTran); } if (count < 1) { if (param.tran == null) { //外部事务为null,说明是本方法内部事务,这里自行回滚 innerTran.Rollback(); } rst = OptResult.Build(ResultCode.Fail, string.Format("{0}——idcard={1}", optDesc, param.card.card_idcard)); return(rst); } //2 _cardRecordRep.Insert(cardRecord, innerTran); //3 _cardBillRep.Insert(cardBill, innerTran); if (param.tran == null) { //外部事务为null,说明是本方法内部事务,这里自行提交 innerTran.Commit(); } rst = OptResult.Build(ResultCode.Success, string.Format("{0}——idcard={1}", optDesc, param.card.card_idcard)); } catch (Exception ex) { LogHelper.LogError(optDesc, ex); rst = OptResult.Build(ResultCode.DbError, optDesc); return(rst); } return(rst); }
/// <summary> /// 付款 /// </summary> /// <param name="pay"></param> /// <returns></returns> public OptResult Pay(PayEntity pay) { OptResult rst = null; var operation = CardOperation.Pay; var optDesc = operation.GetDescription(); if (pay == null) { rst = OptResult.Build(ResultCode.ParamError, optDesc + "——参数不能为空!"); return(rst); } string msg = string.Empty; if (!pay.Check(out msg)) { rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——{1}!", optDesc, msg)); return(rst); } //1、账户是否存在 var card = GetByIdcard(pay.idcard); if (card == null) { rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——指定身份证号{1}的账户不存在!", optDesc, pay.idcard)); return(rst); } //2、如果一卡通号存在,看是否和身份证号对应 if (!string.IsNullOrEmpty(pay.number) && !string.Equals(card.card_number, pay.number)) { rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——身份证号{1}与一卡通号{2}不匹配!", optDesc, pay.idcard, pay.number)); return(rst); } //3、一卡通状态是否正常 if (card.State != CardState.Normal) { rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——一卡通状态异常[{1}]!", optDesc, card.State.GetDescription())); return(rst); } //4、余额是否充足 if (pay.amount > card.card_govmoney + card.card_mymoney) { rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——余额不足!", optDesc)); return(rst); } //5、是否已经支付过(该一卡通和订单号下,存在"支付"流水或"退款"流水) var pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List <IPredicate>() }; pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_idcard, Operator.Eq, card.card_idcard)); pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_order, Operator.Eq, pay.order)); pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_type, Operator.Eq, new string[] { CardOperation.Pay.ToString(), CardOperation.Refund.ToString() })); var count = _cardBillRep.Count(pg); if (count > 0) { //已付款或退款 rst = OptResult.Build(ResultCode.OptRepeat, optDesc + "——已付款或退款,不能再次支付!"); return(rst); } //6、支付 /* * 消费扣费逻辑: * 优先扣除gov:if pay > govnow,govchanged=govnow,govnew=0;mychanged=pay-govnow,mynew=mynow-mychanged; * else govchanged=pay,govnew=govnow-govchanged;mychanged=0,mynew=mynow; * 优先扣除my: if pay > mynow, mychanged=mynow,mynew=0;govchanged=pay-mynow,govnew=govnow-govchanged; * else mychanged=pay,mynew=mynow-mychanged;govchanged=0,govnew=govnow; * 1)更新card_info, * 2)新增操作记录,type:付款 * 3)新增一卡通流水,type:付款 * 注:扣费时,变动额为负数 */ decimal govnew, govchanged, mynew, mychanged; if (pay.priority == MoneyEnum.gov) { if (pay.amount > card.card_govmoney) { govchanged = -card.card_govmoney; govnew = 0; mychanged = -(pay.amount - card.card_govmoney); mynew = card.card_mymoney + mychanged;//因为mychanged是负数 } else { govchanged = -pay.amount; govnew = card.card_govmoney - pay.amount; mychanged = 0; mynew = card.card_mymoney; } } else { if (pay.amount > card.card_mymoney) { mychanged = -card.card_mymoney; mynew = 0; govchanged = -(pay.amount - card.card_mymoney); govnew = card.card_govmoney + govchanged;//因为govchanged是负数 } else { mychanged = -pay.amount; mynew = card.card_mymoney - pay.amount; govchanged = 0; govnew = card.card_govmoney; } } // var rec_id = GuidExtension.GetOne();//操作记录id DateTime optTime = DateTime.Now; var cardRecord = new CardRecord { rec_id = rec_id, rec_number = card.card_number, rec_idcard = card.card_idcard, rec_type = operation.ToString(), rec_time = optTime, rec_username = card.card_username, rec_remark = string.Format("付款金额:{0}", pay.amount), rec_operator = pay.opt }; var cardBill = new CardBill { bill_id = GuidExtension.GetOne(), bill_number = card.card_number, bill_idcard = card.card_idcard, bill_agoall = card.card_govmoney + card.card_mymoney, bill_agogov = card.card_govmoney, bill_agomy = card.card_mymoney, bill_changegov = govchanged, bill_changemy = mychanged, bill_nowall = mynew + govnew, bill_nowgov = govnew, bill_nowmy = mynew, bill_type = operation.ToString(), bill_time = optTime, bill_order = pay.order, bill_src = pay.src, bill_record = rec_id, bill_remark = pay.remark }; var tran = base.Begin(); try { // count = _cardInfoRep.UpdateBySqlName(SqlName_Update, new { card_govmoney = govnew, card_mymoney = mynew, card_modifier = pay.opt, card_modifytime = optTime, card_idcard = pay.idcard }, new string[] { "card_govmoney", "card_mymoney", "card_modifier", "card_modifytime" }, tran); if (count < 1) { tran.Rollback(); rst = OptResult.Build(ResultCode.Fail, optDesc + "——未知错误!"); return(rst); } // _cardRecordRep.Insert(cardRecord); // _cardBillRep.Insert(cardBill); tran.Commit(); rst = OptResult.Build(ResultCode.Success, optDesc + "——idcard:" + pay.idcard); } catch (Exception ex) { LogHelper.LogError(optDesc, ex); rst = OptResult.Build(ResultCode.DbError, optDesc); } return(rst); }
/// <summary> /// 退款 /// </summary> /// <param name="refund"></param> /// <returns></returns> public OptResult Refound(RefundEntity refund) { OptResult rst = null; var operation = CardOperation.Refund; var optDesc = operation.GetDescription(); if (refund == null) { rst = OptResult.Build(ResultCode.ParamError, optDesc + "——参数不能为空!"); return(rst); } string msg = string.Empty; if (!refund.Check(out msg)) { rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——{1}!", optDesc, msg)); return(rst); } //1、账户是否存在(获取账户信息) var card = GetByIdcard(refund.idcard); if (card == null) { rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——指定身份证号{1}的账户不存在!", optDesc, refund.idcard)); return(rst); } //2、账户状态 if (card.State != CardState.Normal) { rst = OptResult.Build(ResultCode.Fail, string.Format("{0}——一卡通状态异常[{1}]!", optDesc, card.State.GetDescription())); return(rst); } //3、指定订单是否已付款并且未退款(获取付款流水信息) PredicateGroup pg = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List <IPredicate>() }; pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_idcard, Operator.Eq, card.card_idcard)); pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_order, Operator.Eq, refund.order)); var payTypeWhere = Predicates.Field <CardBill>(b => b.bill_type, Operator.Eq, CardOperation.Pay.ToString()); pg.Predicates.Add(payTypeWhere); var payBill = _cardBillRep.GetList(pg).FirstOrDefault(); if (payBill == null) { rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——指定身份证号{1}的订单{2}尚未支付!", optDesc, card.card_idcard, refund.order)); return(rst); } pg.Predicates.Remove(payTypeWhere); pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_type, Operator.Eq, "退款")); var count = _cardBillRep.Count(pg); if (count > 0) { rst = OptResult.Build(ResultCode.OptRepeat, string.Format("{0}——指定身份证号{1}的订单{2}已退款!", optDesc, card.card_idcard, refund.order)); return(rst); } //4、数据库操作 /* * 退款流程 * 1)更新一卡通基本信息 * gov_new=gov_now+bill.gov_change,my_new=my_now+bill.my_change * 2)新增操作记录,type:退款 * 3)新增流水记录,type:退款 */ decimal govchanged = -payBill.bill_changegov; //求反 decimal mychanged = -payBill.bill_changemy; //求反 decimal govnew = card.card_govmoney + govchanged; decimal mynew = card.card_mymoney + mychanged; var rec_id = GuidExtension.GetOne(); var optTime = DateTime.Now; var cardRecord = new CardRecord { rec_id = rec_id, rec_number = card.card_number, rec_idcard = card.card_idcard, rec_type = operation.ToString(), rec_time = optTime, rec_username = card.card_username, rec_remark = string.Format("退款金额:{0}", govchanged + mychanged), rec_operator = refund.opt }; var cardBill = new CardBill { bill_id = GuidExtension.GetOne(), bill_number = card.card_number, bill_idcard = card.card_idcard, bill_agoall = card.card_govmoney + card.card_mymoney, bill_agogov = card.card_govmoney, bill_agomy = card.card_mymoney, bill_changegov = govchanged, bill_changemy = mychanged, bill_nowall = govnew + mynew, bill_nowgov = govnew, bill_nowmy = mynew, bill_type = operation.ToString(), bill_time = optTime, bill_order = refund.order, bill_src = refund.src, bill_record = rec_id, bill_remark = refund.remark }; // var tran = base.Begin(); try { // count = _cardInfoRep.UpdateBySqlName(SqlName_Update, new { card_govmoney = govnew, card_mymoney = mynew, card_modifier = refund.opt, card_modifytime = optTime, card_idcard = refund.idcard }, new string[] { "card_govmoney", "card_mymoney", "card_modifier", "card_modifytime" }, tran); if (count < 1) { tran.Rollback(); rst = OptResult.Build(ResultCode.Fail, optDesc + "——未知错误!"); return(rst); } // _cardRecordRep.Insert(cardRecord); // _cardBillRep.Insert(cardBill); tran.Commit(); rst = OptResult.Build(ResultCode.Success, string.Format("{0}——身份证号{1},订单号{2}", optDesc, refund.idcard, refund.order)); } catch (Exception ex) { LogHelper.LogError(optDesc, ex); rst = OptResult.Build(ResultCode.DbError, optDesc); } return(rst); }