using BaseOUDAL; using YLErp.Model; using YLErp.Model.Enum; using YLErp.Models; namespace YLErp.Modules.SalesModule { /// /// 销售提成数据服务 /// public class SalesCommissionDataService : YLBaseService { public SalesCommissionDataService(OptUserInfo userInfo) : base(userInfo) { } public SalesCommissionDataService(YLBaseService baseService) : base(baseService) { } public SearchListResult CommissionQueryByClient(BaseSearchReq req, List salesmen, List departments, List 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(); //根据客户查询 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(); 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 CommissionQuery(SalesCommissionReq req) { var salesDic = new Lazy>(() => { 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(); 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(); 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 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; } /// /// 保存交易提成明细 /// public int SaveCommission(IEnumerable 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); } } /// /// 保存交易提成明细 /// 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(); } } /// /// 获取交易关联的销售提成信息 /// public IEnumerable GetSalesCommissionInfo(int tradeId) { return DbContext.SalesCommissionInfo.AsNoTracking().Where(n => n.TradeID == tradeId).ToArray(); } /// /// 获取交易关联的销售提成信息 /// 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; } } /// /// 批量 获取交易关联的销售提成信息 /// /// /// public Dictionary GetTradeCommissionInfoByTradeIds(List tradeIds) { var res = new Dictionary(); 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 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(); } List 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(); } 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; } /// /// 获取交易关联的销售提成信息 /// public IEnumerable 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 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(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(); } } } } /// /// /// public class SalesCommissionReq : BaseSearchReq { /// /// 销售员ID /// public string salesmanIds { get; set; } /// /// 客户ID /// public string clientIds { get; set; } /// /// 交易编号 /// public string TradeNumber { get; set; } /// /// 交易日期始 /// public DateTime? tradeDateStart { get; set; } /// /// 交易日期末 /// public DateTime? tradeDateEnd { get; set; } } }