Files
zszq-trs/YLErpDAL/Modules/SalesModule/SalesCommissionDataService.cs
T
2024-05-09 14:06:26 +08:00

655 lines
26 KiB
C#

using BaseOUDAL;
using YLErp.Model;
using YLErp.Model.Enum;
using YLErp.Models;
namespace YLErp.Modules.SalesModule
{
/// <summary>
/// 销售提成数据服务
/// </summary>
public class SalesCommissionDataService : YLBaseService
{
public SalesCommissionDataService(OptUserInfo userInfo) : base(userInfo)
{
}
public SalesCommissionDataService(YLBaseService baseService) : base(baseService)
{
}
public SearchListResult<CommissionsGroupByClient> CommissionQueryByClient(BaseSearchReq req, List<int> salesmen, List<string> departments, List<int> clients)
{
var query = from s in DbContext.SalesCommissionInfo
where s.SaleMode == (int)PS.Config.ErpElement.SaleMode && s.IsValid
group s by s.ClientID into g
select new
{
Key=g.Key,
List=g.ToList()
};
var commissionGroups = new List<CommissionsGroupByClient>();
//根据客户查询
if (clients != null && clients.Count > 0)
{
query = query.Where(o => clients.Contains(o.Key));
}
var temp = query.ToList();
foreach (var item in temp)
{
var commissionGroup = new CommissionsGroupByClient
{
id = item.Key
};
item.List?.OrderBy(o => o.TradeID);
var oldTrdeId = 0;
foreach (var c in item.List)
{
if (oldTrdeId != c.TradeID)
{
double tempCommission;
if (!c.CommissionFixed)
{
var tradePrice = from t in DbContext.trade
where t.id == c.TradeID
select t.TradePrice;
if (tradePrice != null)
{
tempCommission = (tradePrice.FirstOrDefault() ?? 0) * c.Commission;
}
else
{
tempCommission = 0;
}
}
else
{
tempCommission = c.Commission;
}
commissionGroup.commissionCount++;
commissionGroup.commissionAmount += tempCommission;
oldTrdeId = c.TradeID;
}
}
var tempSalesmen = new List<int>();
foreach (var com in item.List)
{
tempSalesmen.Add(com.SalesmanID);
}
//根据销售员查询
if (salesmen != null && salesmen.Count > 0)
{
if (tempSalesmen.Except(salesmen).Count() == tempSalesmen.Distinct().Count())
{
continue;
}
}
if (PS.Config.ErpElement.SaleMode == YLErp.Configuration.Enums.SaleMode.SaleMen)
{
var men = new SalesmenDataService(OptUser).GetSalesmen(tempSalesmen);
//根据部门查询
if (departments != null && departments.Count > 0)
{
var departmentGroup = men.GroupBy(o => o.Department).Select(o => o.Key);
if (departmentGroup.Except(departments).Count() == (departmentGroup).Distinct().Count())
{
continue;
}
}
foreach (var man in men)
{
commissionGroup.salesman += man.Name + "、";
if (commissionGroup.department == null || !commissionGroup.department.Contains(man.Department))
{
commissionGroup.department += man.Department + "、";
}
}
}
else
{
using (var db = DbContextFactory.GetErpBaseContext())
{
var sys = db.SystemUsers.Where(n => tempSalesmen.Contains(n.Id) && n.State == 0 && (n.AccountPost & (int)AccountPostEnum.客户经理) > 0);
foreach (var man in sys)
{
commissionGroup.salesman += man.Name + "、";
}
}
}
commissionGroup.salesman = commissionGroup.salesman?.TrimEnd('、');
commissionGroup.department = commissionGroup.department?.TrimEnd('、');
commissionGroup.clientname = DataCacheProvider.GetClientDataSource().GetData(commissionGroup.id)?.Name;
commissionGroups.Add(commissionGroup);
}
var ret = commissionGroups.AsQueryable().ToSearchList(req);
ret.Sum = new
{
AmountSum = ret.rows.Sum(o => o.commissionAmount),
CountSum = ret.rows.Sum(o => o.commissionCount)
};
return ret;
}
public SearchListResult<CommissionByTrade> CommissionQuery(SalesCommissionReq req)
{
var salesDic = new Lazy<Dictionary<int, string>>(() =>
{
if (PS.Config.ErpElement.SaleMode == YLErp.Configuration.Enums.SaleMode.SaleMen)
{
return DbContext.salesmen.Select(n => new { n.id, n.Name }).ToDictionary(n => n.id, m => m.Name);
}
else
{
return DbContextFactory.GetErpBaseContext().SystemUsers.Where(n => n.State == 0 && (n.AccountPost & (int)AccountPostEnum.客户经理) > 0).Select(n => new { n.Id, n.Name }).ToDictionary(n => n.Id, m => m.Name);
}
});
var fliterSalesNames = new List<string>();
var query = from s in DbContext.SalesCommissionInfo
where s.SaleMode == (int)PS.Config.ErpElement.SaleMode && s.IsValid
join t in DbContext.trade
on s.TradeID equals t.id
select new CommissionByTrade
{
id = s.id,
tradeid = t.id,
tradeNumber = t.TradeNumber,
tradeStatus = t.TradeStatus,
salesmanName = s.SalesmanID.ToString(),
traderName = t.TraderName,
clientName = t.ClientName,
clientId = t.ClientId.ToString(),
buySell = t.BuySell,
tradeDate = t.TradeDate,
tradeType = t.TradeType,
structureType = t.StructureType,
StockEqvNotional = t.OriginalStockEqvNotional,
TradeSinglePrice = t.TradeType == "现金流交易" ? (t.TradePrice ?? 0) : (t.TradeSinglePrice ?? 0),
commissionAmout = s.CommissionFixed ? s.Commission : (s.Commission * t.TradePrice ?? 0)
};
if (!string.IsNullOrWhiteSpace(req.salesmanIds))
{
var ids = req.salesmanIds.Split(',').ToList();
foreach (var item in ids)
{
if (int.TryParse(item, out var id) && id > 0
&& salesDic.Value.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name))
{
fliterSalesNames.Add(name);
}
}
}
if (!string.IsNullOrWhiteSpace(req.clientIds))
{
var clients = req.clientIds.Split(',').ToList();
query = query.Where(o => clients.Contains(o.clientId));
}
if (!string.IsNullOrWhiteSpace(req.TradeNumber))
{
query = query.Where(o => o.tradeNumber.Contains(req.TradeNumber));
}
if (req.tradeDateStart != null)
{
query = query.Where(o => o.tradeDate >= req.tradeDateStart);
}
if (req.tradeDateEnd != null)
{
query = query.Where(o => o.tradeDate <= req.tradeDateEnd);
}
var temp = query.ToList().OrderBy(o => o.tradeid);
if (temp.Count() == 0)
{
return null;
}
var line = new CommissionByTrade();
var result = new List<CommissionByTrade>();
foreach (var item in temp)
{
if (line == null || line.tradeid != item.tradeid)
{
if (line != null && line.tradeid > 0)
{
line.salesmanName = line.salesmanName?.TrimEnd('、');
if (JudgeSalesmanName(line, fliterSalesNames))
{
result.Add(line);
}
}
line = new CommissionByTrade()
{
id = item.id,
tradeid = item.tradeid,
buySell = item.buySell,
clientId = item.clientId,
clientName = item.clientName,
commissionAmout = item.commissionAmout,
StockEqvNotional = item.StockEqvNotional,
TradeSinglePrice = item.TradeSinglePrice,
structureType = item.structureType,
tradeDate = item.tradeDate,
tradeNumber = item.tradeNumber,
traderName = item.traderName,
tradeStatus = item.tradeStatus,
tradeType = item.tradeType
};
}
if (int.TryParse(item.salesmanName, out var id) && id > 0
&& salesDic.Value.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name))
{
line.salesmanName += name + "、";
}
}
if (line != null && !string.IsNullOrWhiteSpace(line.salesmanName))
{
line.salesmanName = line.salesmanName.TrimEnd('、');
}
if (JudgeSalesmanName(line, fliterSalesNames))
{
result.Add(line);
}
var ret = result.AsQueryable().ToSearchList(req);
return ret;
}
private bool JudgeSalesmanName(CommissionByTrade line, List<string> fliterNames)
{
if (fliterNames == null || !fliterNames.Any())
{
return true;
}
if (!string.IsNullOrEmpty(line.salesmanName) && line.salesmanName.Split('、').Any(o => fliterNames.Contains(o)))
{
return true;
}
return false;
}
/// <summary>
/// 保存交易提成明细
/// </summary>
public int SaveCommission(IEnumerable<SalesCommissionInfo> commissions, int tradeId)
{
if (commissions is null || !commissions.Any())
{
return 0;
}
//删除原来的数据
var oldCommissions = DbContext.SalesCommissionInfo.Where(o => o.TradeID == tradeId);
DbContext.SalesCommissionInfo.RemoveRange(oldCommissions);
foreach (var commission in commissions)
{
if (commission.ClientID <= 0)
{
continue;
}
if (commission.SalesmanID <= 0)
{
continue;
}
if (commission.Commission < 0)
{
throw new ServiceException("提成金额不应为负");
}
if (tradeId <= 0)
{
continue;
}
commission.OptDate = DateTime.Now;
commission.TradeID = tradeId;
DbContext.SalesCommissionInfo.Add(commission);
}
try
{
return DbContext.SaveChanges();
}
catch (Exception ex)
{
LogFactory.GetLogger("CommissionDataService").Error(ex);
throw new ServiceException("销售提成保存失败", ex);
}
}
/// <summary>
/// 保存交易提成明细
/// </summary>
public int SaveTradeCommission(int tradeId, TradeSalesCommissionInfo salesCommission, bool isValid)
{
if (tradeId < 0)
{
throw new ServiceException("参数错误:" + nameof(tradeId));
}
if (salesCommission != null)
{
if (salesCommission.ClientId < 1)
{
throw new ServiceException("参数错误:" + nameof(salesCommission.ClientId));
}
if (salesCommission.Commission < 0)
{
throw new ServiceException("提成金额 必须大于等于0");
}
}
//删除原来的数据
var oldCommissions = DbContext.SalesCommissionInfo.Where(o => o.TradeID == tradeId);
DbContext.SalesCommissionInfo.RemoveRange(oldCommissions);
//如果销售员,销售提成没了,那也没必要新增了
if (salesCommission?.SalesIds is null || !salesCommission.SalesIds.Any())
{
DbContext.SaveChanges();
return 0;
}
if (!salesCommission.Commission.HasValue || salesCommission.Commission == 0)
{
DbContext.SaveChanges();
return 0;
}
var commissions = salesCommission.SalesIds.Select(n => new SalesCommissionInfo
{
ClientID = salesCommission.ClientId,
Commission = salesCommission.Commission.Value,
CommissionFixed = salesCommission.CommissionFixed,
OptDate = OptDate,
SalesmanID = n,
SaleMode = (int)PS.Config.ErpElement.SaleMode,
TradeID = tradeId,
IsValid = salesCommission.IsValid ?? isValid
}).ToArray();
DbContext.SalesCommissionInfo.AddRange(commissions);
return DbContext.SaveChanges();
}
public void SetCommissionVaild(int tradeId)
{
if (tradeId > 0)
{
var commissions = DbContext.SalesCommissionInfo.Where(o => o.TradeID == tradeId);
if (commissions != null)
{
foreach (var item in commissions)
{
item.IsValid = true;
item.OptDate = DateTime.Now;
}
DbContext.SaveChanges();
}
}
}
public void SetCommissionInVaild(int tradeId)
{
if (tradeId > 0)
{
var commissions = DbContext.SalesCommissionInfo.Where(o => o.TradeID == tradeId);
foreach (var item in commissions)
{
item.IsValid = false;
item.OptDate = DateTime.Now;
}
DbContext.SaveChanges();
}
}
/// <summary>
/// 获取交易关联的销售提成信息
/// </summary>
public IEnumerable<SalesCommissionInfo> GetSalesCommissionInfo(int tradeId)
{
return DbContext.SalesCommissionInfo.AsNoTracking().Where(n => n.TradeID == tradeId).ToArray();
}
/// <summary>
/// 获取交易关联的销售提成信息
/// </summary>
public TradeSalesCommissionInfo GetTradeCommissionInfo(int tradeId)
{
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1")
{
var tradeCashId = DbContext.SalesCommissionDetail
.Where(O => O.TradeID == tradeId && O.IsValid)
.OrderByDescending(O => O.OptDate)
.Select(O => O.TradeCashID).FirstOrDefault();
var infos = DbContext.SalesCommissionDetail.AsNoTracking().Where(n => n.TradeID == tradeId && n.TradeCashID == tradeCashId).ToArray();
return new TradeSalesCommissionInfo(infos);
}
else
{
var infos = DbContext.SalesCommissionInfo.AsNoTracking().Where(n => n.TradeID == tradeId).ToArray();
var tradeSalesModel = new TradeSalesCommissionInfo(infos);
if (tradeSalesModel.SaleMode == (int)Configuration.Enums.SaleMode.SaleMen)
{
if (tradeSalesModel.SalesIds != null)
{
tradeSalesModel.SalesNames = DbContext.salesmen.Where(l => tradeSalesModel.SalesIds.Contains(l.id)).Select(l => l.Name).ToList();
tradeSalesModel.SalesNameStr = string.Join(",", tradeSalesModel.SalesNames);
}
}
else if (tradeSalesModel.SaleMode == (int)Configuration.Enums.SaleMode.CustomerManager)
{
using (var db = DbContextFactory.GetErpBaseContext())
{
if (tradeSalesModel.SalesIds != null)
{
tradeSalesModel.SalesNames = db.SystemUsers.Where(l => tradeSalesModel.SalesIds.Contains(l.Id)).Select(l => l.Name).ToList();
tradeSalesModel.SalesNameStr = string.Join(",", tradeSalesModel.SalesNames);
}
}
}
return tradeSalesModel;
}
}
/// <summary>
/// 批量 获取交易关联的销售提成信息
/// </summary>
/// <param name="tradeIds"></param>
/// <returns></returns>
public Dictionary<int, TradeSalesCommissionInfo> GetTradeCommissionInfoByTradeIds(List<int> tradeIds)
{
var res = new Dictionary<int, TradeSalesCommissionInfo>();
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1")
{
var tradeCashList = DbContext.SalesCommissionDetail.AsNoTracking().Where(p => tradeIds.Contains(p.TradeID) && p.IsValid).ToList();
if (tradeCashList == null || tradeCashList.Count == 0)
{
return res;
}
tradeIds.ForEach(tradeId =>
{
var lastTradeCash = tradeCashList.Where(p => p.TradeID == tradeId).OrderByDescending(p => p.OptDate).FirstOrDefault();
if (lastTradeCash != null)
{
var infos = tradeCashList.Where(p => p.TradeID == tradeId && p.TradeCashID == lastTradeCash.TradeCashID).ToArray();
res.Add(tradeId, new TradeSalesCommissionInfo(infos));
}
});
}
else
{
var salesCommssionList = DbContext.SalesCommissionInfo.AsNoTracking().Where(p => tradeIds.Contains(p.TradeID)).ToList();
if (salesCommssionList == null || salesCommssionList.Count == 0)
{
return res;
}
List<Salesman> saleMenList = null;
var salesMenIds = salesCommssionList.Where(p => p.SaleMode == (int)Configuration.Enums.SaleMode.SaleMen).Select(p => p.SalesmanID).Distinct().ToList();
if (salesMenIds != null && salesMenIds.Any())
{
saleMenList = DbContext.salesmen.Where(p => salesMenIds.Contains(p.id)).ToList();
}
if (saleMenList == null)
{
saleMenList = new List<Salesman>();
}
List<SystemUser> sysUsers = null;
var sysUserIds = salesCommssionList.Where(p => p.SaleMode == (int)Configuration.Enums.SaleMode.CustomerManager).Select(p => p.SalesmanID).Distinct().ToList();
if (sysUserIds != null && sysUserIds.Any())
{
using (var db = DbContextFactory.GetErpBaseContext())
{
sysUsers = db.SystemUsers.Where(l => sysUserIds.Contains(l.Id)).ToList();
}
}
if (sysUsers == null)
{
sysUsers = new List<SystemUser>();
}
tradeIds.ForEach(tradeId =>
{
var salesCListByTradeId = salesCommssionList.Where(p => p.TradeID == tradeId).ToList();
if (salesCListByTradeId != null && salesCListByTradeId.Any())
{
var info = new TradeSalesCommissionInfo(salesCListByTradeId);
if (info.SaleMode == (int)Configuration.Enums.SaleMode.SaleMen)
{
info.SalesNames = saleMenList.Where(d => info.SalesIds.Contains(d.id)).Select(d => d.Name).ToList();
info.SalesNameStr = string.Join(",", info.SalesNames);
}
else if (info.SaleMode == (int)Configuration.Enums.SaleMode.CustomerManager)
{
info.SalesNames = sysUsers.Where(d => info.SalesIds.Contains(d.Id)).Select(d => d.Name).ToList();
info.SalesNameStr = string.Join(",", info.SalesNames);
}
res.Add(tradeId, info);
}
});
}
return res;
}
/// <summary>
/// 获取交易关联的销售提成信息
/// </summary>
public IEnumerable<SalesCommissionInfoDto> GetSalesCommissionInfoDtos(int tradeId)
{
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1")
{
var tradeCashId = DbContext.SalesCommissionDetail
.Where(O => O.TradeID == tradeId && O.IsValid)
.OrderByDescending(O => O.OptDate)
.Select(O => O.TradeCashID).FirstOrDefault();
var query = from a in DbContext.SalesCommissionDetail
where a.TradeID == tradeId && a.TradeCashID == tradeCashId //&& a.IsValid
select a;
var data = query.ToArray();
var ids = data.Select(O => O.SalesmanID).ToList();
Dictionary<int, string> salemanDict = null;
using (var db = DbContextFactory.GetErpBaseContext())
{
if (PS.Config.ErpElement.SaleMode == Configuration.Enums.SaleMode.CustomerManager)
{
salemanDict = db.SystemUsers.Where(l => ids.Contains(l.Id)).ToDictionary(K => K.Id, V => V.Name);
}
else if (PS.Config.ErpElement.SaleMode == Configuration.Enums.SaleMode.SaleMen)
{
salemanDict = DbContext.salesmen.Where(l => ids.Contains(l.id)).ToDictionary(K => K.id, V => V.Name);
}
}
return data.Select(n =>
{
var dto = new SalesCommissionInfoDto();
dto.TradeID = n.TradeID;
dto.ClientID = n.ClientID;
dto.ClientName = n.ClientID;
dto.Commission = n.Commission;
dto.CommissionFixed = n.CommissionFixed;
dto.SalesmanID = n.SalesmanID;
dto.SalesmanName = salemanDict.ContainsKey(n.SalesmanID) ? salemanDict[n.SalesmanID] : "";
dto.IsValid = n.IsValid;
return dto;
}).ToArray();
}
else
{
var infos = DbContext.SalesCommissionInfo.AsNoTracking().Where(n => n.TradeID == tradeId).ToList();
using (var db = DbContextFactory.GetErpBaseContext())
{
return infos.Select(n =>
{
var dto = YLAutoMapper.Map<SalesCommissionInfoDto>(n);
if (n.SaleMode == (int)Configuration.Enums.SaleMode.CustomerManager)
{
dto.SalesmanName = db.SystemUsers.Where(l => n.SalesmanID == l.Id).Select(l => l.Name).FirstOrDefault();
}
else if (n.SaleMode == (int)Configuration.Enums.SaleMode.SaleMen)
{
dto.SalesmanName = DbContext.salesmen.Where(l => n.SalesmanID == l.id).Select(l => l.Name).FirstOrDefault();
}
return dto;
}).ToArray();
}
}
}
}
/// <summary>
///
/// </summary>
public class SalesCommissionReq : BaseSearchReq
{
/// <summary>
/// 销售员ID
/// </summary>
public string salesmanIds { get; set; }
/// <summary>
/// 客户ID
/// </summary>
public string clientIds { get; set; }
/// <summary>
/// 交易编号
/// </summary>
public string TradeNumber { get; set; }
/// <summary>
/// 交易日期始
/// </summary>
public DateTime? tradeDateStart { get; set; }
/// <summary>
/// 交易日期末
/// </summary>
public DateTime? tradeDateEnd { get; set; }
}
}