using CRM.Core.BLL.Base; using CRM.Core.BLL.EventBus.Events; using CRM.Core.BLL.Util; using CRM.Core.Common.Layui; using CRM.Core.DAL; using CRM.Core.DTO; using CRM.Core.DTO.Ord; using CRM.Core.Model; using CRM.Core.Model.Entity; using CRM.Core.Model.Map; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Linq.Expressions; using WX.CRM.Common; namespace CRM.Core.BLL.Wx { public class WX_SzzyOrderPay_BL : DbContextRepository { /// /// 订单状态:180新订单 195驳回 190已提交支付 200已支付 202待开通 205已升级 220已开通 /// /// /// /// /// public void Audit(WX_SzzyOrderPay orderPay, WX_SZZYORDER order, int userId, string userName) { using (var db = new zxdContext()) { orderPay.auditstatus = 1; orderPay.auditor = userId; orderPay.auditorname = userName; if (!orderPay.audittime.HasValue) { orderPay.audittime = DateTime.Now; } Update(orderPay); var arrivalPayList = db.WX_SzzyOrderPay.Where(p => p.orderid == orderPay.orderid && p.auditstatus == 1); var arrivalPay = arrivalPayList.Sum(p => p.payprice); var payDate = arrivalPayList.OrderByDescending(p => p.paydate).First().paydate; if (arrivalPay >= order.NEEDPAY) { order.ORDERSTATUS = "200"; order.ORDERSTATUSNAME = "已支付"; order.ISPAYED = 1; } else { order.ORDERSTATUS = "190"; order.ORDERSTATUSNAME = "已提交支付"; } order.ARRIVALPAY = arrivalPay; order.ARRIVALTIME = payDate; var entry = db.Entry(order); db.Set().Attach(order); entry.State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); Common.EventBus.EventBus.Instance.Publish(new PayOrderEvent(Convert.ToInt32(order.ORDERID), order.ORDERSTATUS, order.ORDERSTATUSNAME, order.ARRIVALPAY.Value, order.ARRIVALTIME.Value, order.companycode, orderPay.id, orderPay.auditor.Value, orderPay.auditorname, orderPay.audittime.Value, orderPay.payno, orderPay.paydate)); } } /// /// 支付记录驳回 /// /// /// /// /// /// /// public retMsg Reject(int id, int status, string rejectremark, int userId, string userName) { using (var db = new zxdContext()) { var orderPay = Get(p => p.id == id); if (orderPay != null) { if (orderPay.auditstatus == -1) { return new retMsg() { result = false, retcode = 300, retmsg = "exists" }; } if (orderPay.auditstatus == 1) { return new retMsg() { result = false, retcode = 400, retmsg = "isaudit" }; } orderPay.auditstatus = status; orderPay.auditor = userId; orderPay.auditorname = userName; orderPay.audittime = DateTime.Now; orderPay.rejectremark = rejectremark; var order = db.WX_SZZYORDER.FirstOrDefault(p => p.ORDERID == orderPay.orderid); if (order != null) { //新订单状态,已提交支付状态,驳回状态才可以修改订单状态为驳回 if (order.ORDERSTATUS == "180" || order.ORDERSTATUS == "190" || order.ORDERSTATUS == "195") { order.ORDERSTATUS = "195"; order.ORDERSTATUSNAME = "支付驳回"; } } var entry = db.Entry(orderPay); db.Set().Attach(orderPay); entry.State = System.Data.Entity.EntityState.Modified; var result = db.SaveChanges(); if (result > 0) { //推送到坐席 Common.EventBus.EventBus.Instance.Publish(new PayRejectEvent(orderPay.id, status, rejectremark, userId, userName, order.CHANNEL)); } return new retMsg() { result = result > 0, retcode = result > 0 ? 200 : 500, retmsg = result > 0 ? "success" : "error" }; } return new retMsg() { result = false, retcode = 100, retmsg = "para" }; } } public List GetOrderPayList(DateTime startTime, DateTime? endTime = null) { using (var db = new zxdContext()) { var query = from f in db.WX_SzzyOrderPay join o in db.WX_SZZYORDER on f.orderid equals o.ORDERID where f.auditstatus == 1 && f.paydate >= startTime select new PayDto() { PayDate = f.paydate.Value , PayPrice = f.payprice , Channel = f.channel.Value , ProductId = o.PRODUCTID.Value //, ProductId = o.SettleType.Value , OrderId = f.orderid }; if (endTime.HasValue) query = query.Where(p => p.PayDate <= endTime); return query.ToList(); } } public List GetOrderPayList2(DateTime startTime, DateTime? endTime = null) { using (var db = new zxdContext()) { var query = from f in db.WX_SzzyOrderPay where f.auditstatus == 1 && f.paydate >= startTime select new PayDto() { PayDate = f.paydate.Value, PayPrice = f.payprice, Channel = f.channel.Value, OrderId = f.orderid }; if (endTime.HasValue) query = query.Where(p => p.PayDate <= endTime); return query.ToList(); } } public List GetList(string[] payNos) { using (var db = new zxdContext()) { return db.WX_SzzyOrderPay.Where(p => payNos.Contains(p.payno)).ToList(); } } public List GetUnAuditOrderPay(string[] payNos) { using (var db = new zxdContext()) { return db.WX_SzzyOrderPay.Where(p => payNos.Contains(p.payno) && p.auditstatus == 0).ToList(); } } public List GetListByOrderId(int orderId) { using (var db = new zxdContext()) { return db.WX_SzzyOrderPay.Where(m => m.orderid == orderId && m.auditstatus == 1).OrderByDescending(m => m.audittime).ToList(); } } public List GetListByOrderIds(List orderIds) { using (var db = new zxdContext()) { return db.WX_SzzyOrderPay.Where(m => orderIds.Contains(m.orderid) && m.auditstatus == 1).ToList(); } } /// /// 通过订金ID获取涉及到的订单好 /// /// /// public int[] GetOrderIdsByDepositIds(int[] depositIds) { using (var db = new zxdContext()) { return db.WX_SzzyOrderPay.Where(m => depositIds.Contains(m.depositid.Value) && m.auditstatus == 1).GroupBy(m => m.orderid).Select(m => m.Key).ToArray(); } } public List GetPayInfo(int year, int month, string companyCode, string channel) { var startTime = new DateTime(year, month, 1); var endTime = startTime.AddMonths(1); var where = PredicateExtensionses.True(); where = where.And(p => p.paydate >= startTime); where = where.And(p => p.paydate < endTime); where = where.And(m => m.auditstatus == 1); if (!string.IsNullOrEmpty(channel)) { var arr0 = channel.Split('|'); if (arr0.Length > 1) { var whereOr = PredicateExtensionses.False(); foreach (var item in arr0) { var a = item.Split(','); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); whereOr = whereOr.Or(m => m.channel >= min && m.channel <= max); } where = where.And(whereOr); //where = where.Where(m => m.channel >= 1100 && m.channel <= 1100 || m.channel >= 26600 && m.channel <= 26699); } else { var arr = channel.Split(','); var min = Convert.ToInt32(arr[0]); var max = Convert.ToInt32(arr[1]); where = where.And(m => m.channel >= min && m.channel <= max); } } using (var db = new zxdContext()) { var query = from p in db.WX_SzzyOrderPay join o in db.WX_SZZYORDER on p.orderid equals o.ORDERID into poTmp from po in poTmp.DefaultIfEmpty() select new OrderPayView() { id = p.id, orderid = p.orderid, wxshoporderno = po.wXShopOrderNo, payno = p.payno, needpay = p.needpay, paytypename = p.paytypename, paydate = p.paydate.Value, payprice = p.payprice, payname = p.payname, remark = p.remark, auditstatus = p.auditstatus, channel = p.channel, rejectremark = p.rejectremark }; query = query.Where(where); return query.ToList(); } } public List GetDepositInfo(int year, int month, string companyCode, string channel) { var startTime = new DateTime(year, month, 1); var endTime = startTime.AddMonths(1); var where = PredicateExtensionses.True(); where = where.And(p => p.paydate >= startTime); where = where.And(p => p.paydate < endTime); where = where.And(m => m.auditstatus == 1); if (!string.IsNullOrEmpty(channel)) { var arr0 = channel.Split('|'); if (arr0.Length > 1) { var whereOr = PredicateExtensionses.False(); foreach (var item in arr0) { var a = item.Split(','); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); whereOr = whereOr.Or(m => m.channel >= min && m.channel <= max); } where = where.And(whereOr); //where = where.Where(m => m.channel >= 1100 && m.channel <= 1100 || m.channel >= 26600 && m.channel <= 26699); } else { var arr = channel.Split(','); var min = Convert.ToInt32(arr[0]); var max = Convert.ToInt32(arr[1]); where = where.And(m => m.channel >= min && m.channel <= max); } } using (var db = new zxdContext()) { var query = from p in db.WX_SzzyOrderDeposit select new OrderPayView() { id = p.id, orderid = p.id, wxshoporderno = string.Empty, payno = p.payno, needpay = p.payprice.Value, paytypename = p.paytypename, paydate = p.paydate.Value, payprice = p.payprice.Value, payname = p.payname, remark = p.remark, auditstatus = p.auditstatus, channel = p.channel, rejectremark = p.rejectremark }; query = query.Where(where); return query.ToList(); } } public List GetPayList(DateTime ptime) { var sql = @" select CONVERT(DATE_FORMAT(p.paydate,'%Y%m'),SIGNED INTEGER) pmonth, sum(p.payprice) payprice from wx_szzyorderpay p where p.auditstatus = 1 and p.paydate < @arg_ptime group by DATE_FORMAT(p.paydate,'%Y%m')"; var param = new List { new MySqlParameter { ParameterName = "arg_ptime", DbType = DbType.DateTime, Value = ptime } }; var ds = MySqlDbHelper.DataQueray(ConStringHelper.ZxdCRMConn, System.Data.CommandType.Text, sql, param.ToArray()); var list = new List(); foreach (DataRow row in ds.Tables[0].Rows) { list.Add(new PayDto2() { pMonth = Convert.ToInt32(row[0]), payPrice = Convert.ToDecimal(row[1]) }); } decimal tmpSum = 0; foreach (var item in list.OrderBy(p => p.pMonth)) { tmpSum += item.payPrice; item.payPriceSum = tmpSum; } return list; } public List OrderPayUseListGet(OrderPayUseListReqDto dto, ref OrderPayUseListSumRspInfo info) { using (var db = new zxdContext()) { var paylist = db.WX_SzzyOrderPay.AsQueryable(); paylist = paylist.Where(m => (m.isdelete == 0 || m.isdelete == null));// 查询需要查出除了删除的所有状态数据 if (dto.orderid.HasValue) { paylist = paylist.Where(m => m.orderid == dto.orderid.Value); } if (dto.auditstatus.HasValue) { paylist = paylist.Where(m => m.auditstatus == dto.auditstatus.Value); } if (dto.audittimeStime.HasValue) { paylist = paylist.Where(m => m.audittime >= dto.audittimeStime.Value); } if (dto.audittimeEtime.HasValue) { dto.audittimeEtime = dto.audittimeEtime.Value.AddDays(1); paylist = paylist.Where(m => m.audittime <= dto.audittimeEtime.Value); } if (dto.paydateStime.HasValue) { paylist = paylist.Where(m => m.paydate >= dto.paydateStime.Value); } if (dto.paydateEtime.HasValue) { dto.paydateEtime = dto.paydateEtime.Value.AddDays(1); paylist = paylist.Where(m => m.paydate <= dto.paydateEtime.Value); } if (!string.IsNullOrEmpty(dto.payno)) { dto.payno = dto.payno.Trim(); paylist = paylist.Where(m => m.payno == dto.payno); } if (dto.paytype.HasValue) { paylist = paylist.Where(m => m.paytype == dto.paytype.Value); } //if (!string.IsNullOrEmpty(dto.resid)) //{ // dto.resid = dto.resid.Trim(); // where = where.Where(m => m.re == dto.resid); //} //CompanyVirlual channelInfo = new Bas_CompanyVirtual_BL().GetChannel(dto.channel); List channelInfoList = new Bas_CompanyVirtual_BL().GetChannelList(dto.channel); 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()); //Laypage laypage = new Laypage() //{ // count = dto.laypage.count, // limit = dto.laypage.limit, // order = dto.laypage.order, // page = dto.laypage.page, // sort = dto.laypage.sort //}; //info = new OrderPayUseListSumRspInfo() { usePriceSum = paylist.Sum(m => m.payprice) }; var xxs = from a in paylist join b in db.WX_SzzyOrderDeposit on a.depositid equals b.id into tempB from m in tempB.DefaultIfEmpty() select new OrderPayUseListRspDto() { auditor = a.auditor, payprice = a.payprice, auditorname = a.auditorname, auditstatus = a.auditstatus, audittime = a.audittime, channel = a.channel, checkpaytime = a.checkpaytime, checkreslut = a.checkreslut, companycode = a.companycode, creator = a.creator, creatorname = a.creatorname, ctime = a.ctime, depositid = a.depositid, id = a.id, isdelete = a.isdelete, needpay = a.needpay, orderid = a.orderid, paydate = a.paydate, payname = a.payname, depositPrice = m.payprice, payno = a.payno, paytype = a.paytype, paytypename = a.paytypename, rejectremark = a.rejectremark, remark = a.remark, tradeno = a.tradeno }; xxs = xxs.OrderByDescending(m => m.ctime); Laypage pager = new Laypage() { count = dto.laypage.count, limit = dto.laypage.limit, order = dto.laypage.order, page = dto.laypage.page, sort = dto.laypage.sort }; PagerUtil.SetPager(ref xxs, ref pager); dto.laypage.count = pager.count; var nlist = xxs.ToList(); return nlist; } } } public class PayDto { public DateTime PayDate { get; set; } public decimal PayPrice { get; set; } public int Channel { get; set; } public int ProductId { get; set; } public int OrderId { get; set; } } public class OrderPayView { public int id { get; set; } public int orderid { get; set; } public string wxshoporderno { get; set; } public string payno { get; set; } public decimal needpay { get; set; } public string paytypename { get; set; } public DateTime? paydate { get; set; } public decimal payprice { get; set; } public string payname { get; set; } public string remark { get; set; } public int auditstatus { get; set; } public int? channel { get; set; } public string rejectremark { get; set; } } public class PayDto2 { public int pMonth { get; set; } public decimal payPrice { get; set; } public decimal payPriceSum { get; set; } } }