using CRM.Core.BLL.Application.Order; using CRM.Core.BLL.Base; using CRM.Core.BLL.Csvr; using CRM.Core.BLL.EventBus.Events; using CRM.Core.BLL.Util; using CRM.Core.BLL.Wx; using CRM.Core.DAL; using CRM.Core.DTO; using CRM.Core.DTO.Ord; using CRM.Core.Model.Entity; using CRM.Core.Model.Enum; using CRM.Core.Model.Map; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using WX.CRM.Common; using WX.CRM.Common.WxPay; namespace CRM.Core.BLL.Application.Pay { public class PayServices { private readonly WX_SzzyOrderDeposit_BL _orderDeposit = new WX_SzzyOrderDeposit_BL(); private readonly WX_SzzyOrderPay_BL _orderPay = new WX_SzzyOrderPay_BL(); private readonly CACHE_BL cache_BL = new CACHE_BL(); private readonly Bas_CompanyVirtual_BL _company = new Bas_CompanyVirtual_BL(); private readonly Csvr_Message_BL _msg = new Csvr_Message_BL(); private readonly Wx_SzzyOrderPayUseLog_BL _payuselog = new Wx_SzzyOrderPayUseLog_BL(); public retMsg SetPayName(int id, string payName) { try { //var payInfo = _orderPay.Get(p => p.id == id); //if (payInfo == null) //{ // return new retMsg { result = false, retcode = -1 }; //} //payInfo.payname = payName; //_orderPay.Update(payInfo); var orderDeposit = _orderDeposit.Get(p => p.id == id); if (orderDeposit == null) { return new retMsg { result = false, retcode = -1 }; } orderDeposit.payname = payName; _orderDeposit.Update(orderDeposit); Common.EventBus.EventBus.Instance.Publish(new SetPayNameEvent(orderDeposit.id, orderDeposit.payno, payName, orderDeposit.channel.Value)); } catch (Exception e) { LogHelper.Error(e); return new retMsg { result = false }; } return new retMsg { result = true }; } //public retMsg Add(CRM.Core.DTO.Ord.PayDto dto) //{ // var payTypeName = cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == dto.paytype.ToString()).PARANAME; // int? channel = 0; // decimal usepriceall = 0; // decimal lastpriceall = 0; // var msg1 = new retMsg(); // //retMsg msg2 = null; // if (dto.depprice.HasValue && dto.depprice.Value > 0) // { // //如果有使用已经确认的金额,直接使用 // msg1 = Use(new DTO.Ord.PayUseDto() { resid = dto.resid, depprice = dto.depprice.Value, orderuselist = dto.orderuselist }, 0); // } // if (!string.IsNullOrEmpty(dto.payno)) // { // //使用了流水号的场景 // using (var db = new zxdContext()) // { // using (var trans = db.Database.BeginTransaction()) // { // try // { // //查看是否已经有确认到账记录 // var depost = db.WX_SzzyOrderDeposit.FirstOrDefault(p => p.payno == dto.payno && p.auditstatus == 1); // var depositId = 0; // if (depost == null) // { // depositId = new SEQUENCES_BL().Seq_OrderDeposit(); // lastpriceall = dto.payprice; // } // else // { // depositId = depost.id; // //如果已经存在说明已经使用过了,那要重新计算使用金额跟剩余金额 // usepriceall = depost.useprice ?? 0; // lastpriceall = depost.lastprice ?? 0; // } // foreach (var item in dto.orderuselist) // { // if (lastpriceall <= 0) // { // //如果剩余金额小于等于0,说明已经没钱支付了,不执行下面的操作 // continue; // } // var order = db.WX_SZZYORDER.FirstOrDefault(p => p.ORDERID == item.orderid); // if (order == null) // throw new Exception("参数错误,未能找到订单!"); // else // { // //如果已经支付过,赋值到当前临时记录的到账金额 // if (order.ARRIVALPAY.HasValue) // item.arrivalpay = order.ARRIVALPAY.Value; // if (order.ORDERSTATUS == "180" || order.ORDERSTATUS == "190" || order.ORDERSTATUS == "195") // { // order.ORDERSTATUS = "190"; // order.ORDERSTATUSNAME = "已提交支付"; // channel = order.CHANNEL; // } // else // { // //已经是支付状态,说明已经给够钱了,不需要再支付了 // LogHelper.Info(order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!"); // continue; // //return new retMsg { result = false, retcode = 100, retmsg = order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!" }; // } // } // //如果订单金额跟到账金额相等,说明这个订单已经付够钱了 // if (item.arrivalpay == item.needpay) // { // continue; // } // //订单剩余使用金额=订单金额-已支付金额 // //如果第一笔支付,那已支付金额为0 // //当前需要付款的金额 // var curPay = order.NEEDPAY.Value - (order.ARRIVALPAY ?? 0); // decimal usePrice = 0; // if (lastpriceall >= curPay) // { // //剩余金额大于等于当前需要付款的金额,剩余金额足够支付 // usePrice = curPay; // } // else // { // //剩余金额不够支付,剩余金额全部支付 // usePrice = lastpriceall; // } // //使用金额加上当前支付的金额 // usepriceall += usePrice; // //剩余金额降掉当前支付的金额 // lastpriceall -= usePrice; // var pay = new WX_SzzyOrderPay(item.orderid, item.needpay, dto.paytype, payTypeName, dto.paydate, usePrice, dto.payname, dto.remark, dto.payno, dto.companycode, channel, dto.tradeno); // if (dto.creator.HasValue) // { // pay.creator = dto.creator.Value; // } // if (!string.IsNullOrEmpty(dto.creatorname)) // { // pay.creatorname = dto.creatorname; // } // pay.depositid = depositId; // db.WX_SzzyOrderPay.Add(pay); // item.arrivalpay += usePrice; // } // if (depost == null) // { // depost = new WX_SzzyOrderDeposit(dto.resid, dto.paytype, payTypeName, dto.paydate, dto.payprice, dto.payname, dto.remark, dto.payno, dto.isuse, dto.companycode, channel, dto.tradeno) // { // id = depositId // }; // if (dto.creator.HasValue) // { // depost.creator = dto.creator.Value; // } // if (!string.IsNullOrEmpty(dto.creatorname)) // { // depost.creatorname = dto.creatorname; // } // depost.useprice = usepriceall; // depost.lastprice = lastpriceall; // db.WX_SzzyOrderDeposit.Add(depost); // } // else // { // depost.useprice = usepriceall; // depost.lastprice = lastpriceall; // } // db.SaveChanges(); // trans.Commit(); // #region 发送通知 // try // { // var comcode = _company.GetInfoByChannel(channel.Value); // _msg.PushNewsMsg("DJTZ", $"到款【{depositId}】已经【提交】,请您审核!", comcode == null ? "事业部" : comcode.CompanyName, depositId.ToString(), comcode == null ? depost.companycode : comcode.CompanyCode); // } // catch (Exception e) // { // LogHelper.Error("发送通知出错:" + e.ToString()); // } // #endregion // if (dto.depprice.HasValue && dto.depprice.Value > 0) // { // if (msg1.result) // { // return new retMsg { result = true, retcode = 200, retmsg = depositId.ToString() }; // } // else if (!msg1.result) // { // return new retMsg { result = false, retcode = 300, retmsg = depositId.ToString() }; // } // } // return new retMsg { result = true, retcode = 200, retmsg = depositId.ToString() }; // } // catch (Exception ex) // { // LogHelper.Error(ex); // trans.Rollback(); // if (dto.depprice.HasValue && dto.depprice.Value > 0 && msg1.result) // { // return new retMsg { result = false, retcode = 400 }; // } // return new retMsg { result = false, retcode = 500 }; // } // } // } // } // else // { // return msg1; // } //} /// /// /// /// /// 1:普通订金 2:自动确认的订金 /// public retMsg> Add(CRM.Core.DTO.Ord.PayDto2 dto, int type = 1) { List needCheckDeposit = new List();//需要进行自动对账的程序 var depositInfoList = new List(); using (var client = RedisManager.GetClient()) { using (var datalock = client.AcquireLock("DataLock:" + dto.resid, TimeSpan.FromSeconds(10))) { int? channel = 0; if (dto.channel.HasValue) { channel = dto.channel;//渠道 } //var msg1 = new retMsg>(); //if (dto.depprice.HasValue && dto.depprice.Value > 0) //{ // //如果有使用已经确认的金额,直接使用 // msg1 = Use(new DTO.Ord.PayUseDto() { resid = dto.resid, depprice = dto.depprice.Value, orderuselist = dto.orderuselist }, 0); //} LogHelper.Info("PayService.Add:" + dto.ToJson()); if (dto.paylist.Any()) { using (var db = new zxdContext()) { using (var trans = db.Database.BeginTransaction()) { OrderAndPayInfoEvent eventInfo = new OrderAndPayInfoEvent(); try { foreach (var payinfo in dto.paylist)//循环提交上来的支付流水 { if (!string.IsNullOrEmpty(payinfo.payno)) { payinfo.payno = payinfo.payno.Trim();//数据payno } var payTypeName = cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == payinfo.paytype.ToString()).PARANAME; decimal usepriceall = 0; decimal lastpriceall = 0; //查看是否已经有确认到账记录 //var depost = db.WX_SzzyOrderDeposit.FirstOrDefault(p => p.payno == payinfo.payno && p.auditstatus == 1); //var depositId = 0; //if (depost == null) //{ var depositId = new SEQUENCES_BL().Seq_OrderDeposit();//订金ID lastpriceall = payinfo.payprice; //} //else //{ //depositId = depost.id; ////如果已经存在说明已经使用过了,那要重新计算使用金额跟剩余金额 //usepriceall = depost.useprice ?? 0; //lastpriceall = depost.lastprice ?? 0; //var model = new WX_SzzyOrderDeposit(dto.resid, payinfo.paytype, payTypeName, payinfo.paydate, payinfo.payprice, payinfo.payname, payinfo.remark, payinfo.payno, 0, payinfo.companycode, channel, payinfo.tradeno) //{ // id = new SEQUENCES_BL().Seq_OrderDeposit(), // checkreslut = "该笔流水号已被确认过,不可重复提交", // checkpaytime = payinfo.paydate, // auditstatus = -1, // auditor = -1, // auditorname = "系统", // audittime = DateTime.Now, // rejectremark = "该笔流水号已被确认过,不可重复提交" //}; //db.WX_SzzyOrderDeposit.Add(model);//订金添加数据 //WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, model, null, null);//将pay信息formrt //continue; //} foreach (var item in dto.orderuselist) { if (lastpriceall <= 0) { //如果剩余金额小于等于0,说明已经没钱支付了,不执行下面的操作 continue; } var order = db.WX_SZZYORDER.FirstOrDefault(p => p.ORDERID == item.orderid); if (order == null) throw new Exception("参数错误,未能找到订单!"); else { //如果已经支付过,赋值到当前临时记录的到账金额 if (order.ARRIVALPAY.HasValue) item.arrivalpay = order.ARRIVALPAY.Value; if (order.ORDERSTATUS == "180" || order.ORDERSTATUS == "190" || order.ORDERSTATUS == "195") { order.ORDERSTATUS = "190"; order.ORDERSTATUSNAME = "已提交支付"; channel = order.CHANNEL; } else { //已经是支付状态,说明已经给够钱了,不需要再支付了 LogHelper.Info(order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!"); continue; //return new retMsg { result = false, retcode = 100, retmsg = order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!" }; } WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, order, null);//将pay信息formrt } //如果订单金额跟到账金额相等,说明这个订单已经付够钱了 if (item.arrivalpay == item.needpay) { continue; } //订单剩余使用金额=订单金额-已支付金额 //如果第一笔支付,那已支付金额为0 //当前需要付款的金额 var curPay = order.NEEDPAY.Value - (order.ARRIVALPAY ?? 0); decimal usePrice = 0; if (lastpriceall >= curPay) { //剩余金额大于等于当前需要付款的金额,剩余金额足够支付 usePrice = curPay; } else { //剩余金额不够支付,剩余金额全部支付 usePrice = lastpriceall; } //if (depost != null) //{ // //使用金额加上当前支付的金额 // usepriceall += usePrice; // //剩余金额降掉当前支付的金额 // lastpriceall -= usePrice; //} var pay = new WX_SzzyOrderPay(item.orderid, item.needpay, payinfo.paytype, payTypeName, payinfo.paydate, usePrice, payinfo.payname, payinfo.remark, payinfo.payno, payinfo.companycode, channel, payinfo.tradeno); if (payinfo.creator.HasValue) { pay.creator = payinfo.creator; } if (!string.IsNullOrEmpty(payinfo.creatorname)) { pay.creatorname = payinfo.creatorname; } pay.deptcode = dto.deptcode; pay.depositid = depositId; db.WX_SzzyOrderPay.Add(pay); WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, null, pay);//将pay信息formrt item.arrivalpay += usePrice; } //if (depost == null) //{ var depost = new WX_SzzyOrderDeposit(payinfo.resid, payinfo.paytype, payTypeName, payinfo.paydate, payinfo.payprice, payinfo.payname, payinfo.remark, payinfo.payno, payinfo.isuse, payinfo.companycode, channel, payinfo.tradeno) { id = depositId }; if (payinfo.creator.HasValue) { depost.creator = payinfo.creator; } if (!string.IsNullOrEmpty(payinfo.creatorname)) { depost.creatorname = payinfo.creatorname; } depost.deptcode = dto.deptcode; depost.useprice = usepriceall; depost.lastprice = lastpriceall; depost.isdelete = 0; if (type == 1) { depost.checkpaytime = depost.paydate;//默认时间一样 } else if (type == 2) { depost.checkpaytime = payinfo.checkpaytime; } db.WX_SzzyOrderDeposit.Add(depost); WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, depost, null, null);//将pay信息formrt needCheckDeposit.Add(depost);//新增的流水需要进行自动审核这一关 //} //else //{ // depost.useprice = usepriceall; // depost.lastprice = lastpriceall; //} depositInfoList.Add(new DepositInfoDto() { id = depost.id, payno = depost.payno, companycode = depost.companycode }); } db.SaveChanges(); trans.Commit(); if (eventInfo.channel == 0) { eventInfo.channel = channel.Value; } Common.EventBus.EventBus.Instance.Publish(eventInfo); #region 发送通知 try { var comcode = _company.GetInfoByChannel(channel.Value); foreach (var item in depositInfoList) { _msg.PushNewsMsg("DJTZ", $"到款【{item.id.ToString()}】已经【提交】,请您审核!", comcode == null ? "事业部" : comcode.CompanyName, item.id.ToString(), comcode == null ? item.companycode : comcode.CompanyCode); } } catch (Exception e) { LogHelper.Error("发送通知出错:" + e.ToString()); } #endregion //if (dto.depprice.HasValue && dto.depprice.Value > 0) //{ // if (msg1.result) // { // return new retMsg> { result = true, retcode = 200, retmsg = depositInfoList }; // } // else if (!msg1.result) // { // return new retMsg> { result = false, retcode = 300, retmsg = depositInfoList }; // } //} } catch (Exception ex) { LogHelper.Error(ex); trans.Rollback(); //if (dto.depprice.HasValue && dto.depprice.Value > 0 && msg1.result) //{ // return new retMsg> { result = false, retcode = 400, retmsg = null }; //} return new retMsg> { result = false, retcode = 500, retmsg = null }; } } } } else { return new retMsg> { result = false, retcode = 100, retmsg = null }; } } } if (type == 1)//手工提交的订金,需要去自动审核 { foreach (var item in needCheckDeposit) { if (!(item.paytype == 1 || item.paytype == 5) || string.IsNullOrEmpty(item.payno))//非微信和支付和空的流水不需要去自动验证到账 { continue; } DateTime? PayTime = item.paydate; bool CheckStatus = false;//对账状态 string CheckMsg = string.Empty;//对账结果描述 bool isReject = false;//是否需要驳回 var orderPayNo = _orderPay.Get(p => p.payno == item.payno && p.auditstatus == 1); var orderd = _orderDeposit.Get(p => p.payno == item.payno && p.auditstatus == 1); if (orderPayNo != null || orderd != null)//只要从一个地方找到了流水,就直接驳回了 { CheckStatus = false; CheckMsg = "该笔流水号已被确认过,不可重复提交"; } else { CheckPayApi api = new CheckPayApi( Utility.GetSettingByKey("checkPayApiKey"), Utility.GetSettingByKey("checkPayApiSecret"), Utility.GetSettingByKey("checkPayApiIdentityKey")); Dictionary param = new Dictionary(); param.Add("channel", item.channel); //param.Add("outTradeNo", ); //请求 ApiResult resapi = new ApiResult(); if (item.paytype == 1) { param.Add("tradeNo", item.payno); resapi = api.AliPayStatus(param); } else { param.Add("transactionId", item.payno); resapi = api.WechatPayStatus(param); } if (resapi.code == "200") { if (resapi.data.totalAmount != (item.payprice * 100)) { CheckStatus = false; CheckMsg = "提交的支付金额错误"; isReject = true; } else if (resapi.data.tradeStatus == 1)//验证通过 { CheckStatus = true; CheckMsg = "通过"; item.paydate = resapi.data.payTime.Value.Date;//更新支付时间 item.checkpaytime = resapi.data.payTime.Value;//更新支付时间 } else { CheckStatus = false; CheckMsg = "支付流水号正确,但状态异常"; isReject = true; } } else { //验证失败 CheckStatus = false; CheckMsg = "支付流水未查到或错误"; } } item.checkreslut = CheckMsg; _orderDeposit.Update(item); if (CheckStatus)//如果是对账成功,自动进行审核 { //自动审核 var res = _orderDeposit.Audit(item, 0, "系统"); } if (isReject) { //订金驳回审核 _orderDeposit.Reject(item.id, -1, CheckMsg, 0, "系统"); } } } return new retMsg> { result = true, retcode = 200, retmsg = depositInfoList }; } public retMsg> Use(CRM.Core.DTO.Ord.PayUseDto dto, int usetype = 2) { int? channel = 0; //decimal usepriceall = 0; //decimal lastpriceall = 0; using (var client = RedisManager.GetClient()) { using (var datalock = client.AcquireLock("DataLock:" + dto.resid, TimeSpan.FromSeconds(10))) { //CompanyVirlual channelInfo = _company.GetChannel(dto.channel); List channelInfoList = _company.GetChannelList(dto.channel); using (var db = new zxdContext()) { using (var trans = db.Database.BeginTransaction()) { try { OrderAndPayInfoEvent eventInfo = new OrderAndPayInfoEvent(); //找到客户可用的流水列表 var predicates = new List>>(); foreach (var channelInfo in channelInfoList)//获取数据列表 { foreach (var item in channelInfo.channels) { predicates.Add(m => m.channel >= item.minChannel && m.channel <= item.maxChannel); } } //paylist = paylist.WhereOR(predicates.ToArray()); var deposits = db.WX_SzzyOrderDeposit.Where(p => p.auditstatus == 1 && p.resid == dto.resid && p.lastprice > 0).WhereOR(predicates.ToArray()).ToList();//加了渠道过滤 if (!deposits.Any()) throw new Exception("找不到可用的流水!"); var ddeppriceLJ = dto.depprice;//需要使用的金额 foreach (var item in dto.orderuselist) { var order = db.WX_SZZYORDER.FirstOrDefault(p => p.ORDERID == item.orderid); if (order == null) throw new Exception("参数错误,未能找到订单!"); else { if (order.ORDERSTATUS == "180" || order.ORDERSTATUS == "190" || order.ORDERSTATUS == "195") { //订单剩余使用金额=订单金额-已支付金额 //如果第一笔支付,那已支付金额为0 //当前需要付款的金额 var curPay = order.NEEDPAY.Value - (order.ARRIVALPAY ?? 0); if (ddeppriceLJ >= curPay) { order.ORDERSTATUS = "200"; order.ORDERSTATUSNAME = "已支付"; } else { curPay = ddeppriceLJ.Value;//剩余的使用金额还没有需要支付的多,那么需要取使用的钱来计算 order.ORDERSTATUS = "190"; order.ORDERSTATUSNAME = "已提交支付"; } channel = order.CHANNEL; var xdDeposits = deposits.Where(p => p.lastprice == curPay); if (xdDeposits.Any()) { //找到刚好支付的金额,就使用该流水号,多个取第一个 var xx = xdDeposits.OrderBy(p => p.ctime).First(); var xdDeposit = db.WX_SzzyOrderDeposit.FirstOrDefault(m => m.id == xx.id); var pay = new WX_SzzyOrderPay(item.orderid, item.needpay, xdDeposit.paytype, xdDeposit.paytypename, xdDeposit.paydate, curPay, xdDeposit.payname, xdDeposit.remark, xdDeposit.payno, xdDeposit.companycode, channel, xdDeposit.tradeno) { creator = xdDeposit.creator, creatorname = xdDeposit.creatorname, depositid = xdDeposit.id }; //已经是确认过的到账,使用直接就是通过状态 pay.auditstatus = 1; pay.auditor = xdDeposit.auditor; pay.auditorname = xdDeposit.auditorname; pay.audittime = DateTime.Now; pay.deptcode = xdDeposit.deptcode; //_orderPay.Add(pay); db.WX_SzzyOrderPay.Add(pay); if (xdDeposit.useprice.HasValue) xdDeposit.useprice += curPay; else xdDeposit.useprice = curPay; xdDeposit.lastprice -= curPay; if (order.ARRIVALPAY.HasValue) { order.ARRIVALPAY += curPay; } else { order.ARRIVALPAY = curPay; } order.FINALPAY = order.ARRIVALPAY; order.ARRIVALTIME = xdDeposit.paydate; db.SaveChanges(); var sumLastPrice = db.WX_SzzyOrderDeposit.Where(m => m.resid == dto.resid && m.isdelete == 0 && m.auditstatus == 1).Sum(m => m.lastprice); var log = new Wx_SzzyOrderPayUseLog(xdDeposit.resid, item.orderid, pay.depositid ?? 0, pay.paytype, pay.paytypename, pay.payno, -pay.payprice, pay.audittime ?? DateTime.Now, pay.channel.Value, usetype, sumLastPrice, "金额使用"); //_payuselog.Add(log); db.Wx_SzzyOrderPayUseLog.Add(log); db.SaveChanges(); WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, null, pay);//将pay信息formrt WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, xdDeposit, null, null);//将pay信息formrt ddeppriceLJ -= curPay; } else { //没找到刚好够支付的金额,并且剩余金额大于需要付款金额,使用第一个能用的流水号 var dyDeposits = deposits.Where(p => p.lastprice > curPay); if (dyDeposits.Any()) { var xx = dyDeposits.OrderBy(p => p.ctime).First(); var dyDeposit = db.WX_SzzyOrderDeposit.FirstOrDefault(m => m.id == xx.id); var pay = new WX_SzzyOrderPay(item.orderid, item.needpay, dyDeposit.paytype, dyDeposit.paytypename, dyDeposit.paydate, curPay, dyDeposit.payname, dyDeposit.remark, dyDeposit.payno, dyDeposit.companycode, channel, dyDeposit.tradeno) { creator = dyDeposit.creator, creatorname = dyDeposit.creatorname, depositid = dyDeposit.id }; //已经是确认过的到账,使用直接就是通过状态 pay.auditstatus = 1; pay.auditor = dyDeposit.auditor; pay.auditorname = dyDeposit.auditorname; pay.audittime = DateTime.Now; pay.deptcode = dyDeposit.deptcode; //_orderPay.Add(pay); db.WX_SzzyOrderPay.Add(pay); if (dyDeposit.useprice.HasValue) dyDeposit.useprice += curPay; else dyDeposit.useprice = curPay; dyDeposit.lastprice -= curPay; if (order.ARRIVALPAY.HasValue) { order.ARRIVALPAY += curPay; } else { order.ARRIVALPAY = curPay; } order.ARRIVALTIME = dyDeposit.paydate; order.FINALPAY = order.ARRIVALPAY; db.SaveChanges(); var sumLastPrice = db.WX_SzzyOrderDeposit.Where(m => m.resid == dto.resid && m.isdelete == 0 && m.auditstatus == 1).Sum(m => m.lastprice); var log = new Wx_SzzyOrderPayUseLog(dyDeposit.resid, item.orderid, pay.depositid ?? 0, pay.paytype, pay.paytypename, pay.payno, -curPay, pay.audittime ?? DateTime.Now, pay.channel.Value, usetype, sumLastPrice, "金额使用"); //_payuselog.Add(log); db.Wx_SzzyOrderPayUseLog.Add(log); db.SaveChanges(); WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, null, pay);//将pay信息formrt WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, dyDeposit, null, null);//将pay信息formrt ddeppriceLJ -= curPay; } else { //var sPirce = price; //没收到能一笔支付的,那就按提交时间使用流水号 foreach (var xx in deposits.OrderBy(p => p.ctime)) { curPay = order.NEEDPAY.Value - (order.ARRIVALPAY ?? 0); var dep = db.WX_SzzyOrderDeposit.FirstOrDefault(m => m.id == xx.id); if (dep.lastprice <= 0) { continue; } if (order.ARRIVALPAY == order.NEEDPAY) { break; } decimal usePrice = 0; if (curPay >= dep.lastprice.Value) { //使用金额大于等于当前需要付款的金额,使用金额足够支付 if (ddeppriceLJ < dep.lastprice.Value) { usePrice = ddeppriceLJ.Value; } else { usePrice = dep.lastprice.Value; } } else { //使用金额不够支付,使用金额全部支付 usePrice = curPay; } if (usePrice <= 0) { continue;//没有可用金额,不需要进行下一步 } var pay = new WX_SzzyOrderPay(item.orderid, item.needpay, dep.paytype, dep.paytypename, dep.paydate, usePrice, dep.payname, dep.remark, dep.payno, dep.companycode, channel, dep.tradeno) { creator = dep.creator, creatorname = dep.creatorname, depositid = dep.id }; //已经是确认过的到账,使用直接就是通过状态 pay.auditstatus = 1; pay.auditor = dep.auditor; pay.auditorname = dep.auditorname; pay.audittime = DateTime.Now; pay.deptcode = dep.deptcode; //_orderPay.Add(pay); db.WX_SzzyOrderPay.Add(pay); if (dep.useprice.HasValue) dep.useprice += usePrice; else dep.useprice = usePrice; dep.lastprice -= usePrice; //dto.depprice -= usePrice;//要使用掉的金额-已使用金额 if (order.ARRIVALPAY.HasValue) { order.ARRIVALPAY += usePrice; } else { order.ARRIVALPAY = usePrice; } order.ARRIVALTIME = dep.paydate; order.FINALPAY = order.ARRIVALPAY; db.SaveChanges(); var sumLastPrice = db.WX_SzzyOrderDeposit.Where(m => m.resid == dto.resid && m.isdelete == 0 && m.auditstatus == 1).Sum(m => m.lastprice); var log = new Wx_SzzyOrderPayUseLog(dep.resid, item.orderid, pay.depositid ?? 0, pay.paytype, pay.paytypename, pay.payno, -pay.payprice, pay.audittime ?? DateTime.Now, pay.channel.Value, usetype, sumLastPrice, "金额使用"); db.Wx_SzzyOrderPayUseLog.Add(log); db.SaveChanges(); WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, null, pay);//将pay信息formrt WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, dep, null, null);//将pay信息formrt ddeppriceLJ -= usePrice; } } } } else { //已经是支付状态,说明已经给够钱了,不需要再支付了 LogHelper.Info(order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!"); continue; //return new retMsg { result = false, retcode = 100, retmsg = order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!" }; } } WX_SzzyOrderDeposit_BL.SendInfoFormat(eventInfo, null, order, null);//将pay信息formrt db.SaveChanges(); } db.SaveChanges(); trans.Commit(); Common.EventBus.EventBus.Instance.Publish(eventInfo); #region 调用自动判断是否开通程序,异步操作 Task.Run(() => { new OrderService().CanIOpenByDepositAuditOrUse(deposits.Select(m => m.id).ToArray(), 0, "系统"); }); #endregion return new retMsg> { result = true, retcode = 200, retmsg = null }; } catch (Exception ex) { LogHelper.Error(ex); trans.Rollback(); return new retMsg> { result = false, retcode = 500, retmsg = null }; } } } //return new retMsg> { result = false, retcode = 500, retmsg = null }; } } } /// /// 验证金额必须正确 /// /// public bool CheckPriceIsRight(zxdContext db) { bool result = true; return result; } } }