531 lines
22 KiB
C#
531 lines
22 KiB
C#
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<WX_SzzyOrderPay>
|
||
{
|
||
/// <summary>
|
||
/// 订单状态:180新订单 195驳回 190已提交支付 200已支付 202待开通 205已升级 220已开通
|
||
/// </summary>
|
||
/// <param name="orderPay"></param>
|
||
/// <param name="order"></param>
|
||
/// <param name="userId"></param>
|
||
/// <param name="userName"></param>
|
||
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<WX_SZZYORDER>().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));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 支付记录驳回
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <param name="status"></param>
|
||
/// <param name="rejectremark"></param>
|
||
/// <param name="userId"></param>
|
||
/// <param name="userName"></param>
|
||
/// <returns></returns>
|
||
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<WX_SzzyOrderPay>().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<PayDto> 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<PayDto> 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<WX_SzzyOrderPay> GetList(string[] payNos)
|
||
{
|
||
using (var db = new zxdContext())
|
||
{
|
||
return db.WX_SzzyOrderPay.Where(p => payNos.Contains(p.payno)).ToList();
|
||
}
|
||
}
|
||
|
||
public List<WX_SzzyOrderPay> GetUnAuditOrderPay(string[] payNos)
|
||
{
|
||
using (var db = new zxdContext())
|
||
{
|
||
return db.WX_SzzyOrderPay.Where(p => payNos.Contains(p.payno) && p.auditstatus == 0).ToList();
|
||
}
|
||
}
|
||
|
||
public List<WX_SzzyOrderPay> 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<WX_SzzyOrderPay> GetListByOrderIds(List<int> orderIds)
|
||
{
|
||
using (var db = new zxdContext())
|
||
{
|
||
return db.WX_SzzyOrderPay.Where(m => orderIds.Contains(m.orderid) && m.auditstatus == 1).ToList();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 通过订金ID获取涉及到的订单好
|
||
/// </summary>
|
||
/// <param name="depositIds"></param>
|
||
/// <returns></returns>
|
||
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<OrderPayView> 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<OrderPayView>();
|
||
|
||
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<OrderPayView>();
|
||
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<OrderPayView> 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<OrderPayView>();
|
||
|
||
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<OrderPayView>();
|
||
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<PayDto2> 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<MySqlParameter> {
|
||
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<PayDto2>();
|
||
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<OrderPayUseListRspDto> 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<CompanyVirlual> channelInfoList = new Bas_CompanyVirtual_BL().GetChannelList(dto.channel);
|
||
var predicates = new List<Expression<Func<WX_SzzyOrderPay, bool>>>();
|
||
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; }
|
||
}
|
||
}
|