using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web; using Microsoft.AspNetCore.Mvc.RazorPages; using Newtonsoft.Json; using Zxd.Core.Domain.Dto.Contract; using Zxd.Core.Domain.Dto.Crm; using Zxd.Entity.Crm; using Zxd.Entity.Dncms; using Zxd.Entity.Zxd; using Zxd.Entity.Zxd.Order; namespace Zxd.Domain { public class ProductDomain : IProdcutDomain { private readonly IBaseRepository _crmRepository; private readonly IBaseRepository _zxdRepository; private readonly IBaseRepository _repository; private readonly IRedisManager _redisManager; private readonly IDeptmentDomain _deptmentDomain; private readonly IMapper _mapper; private readonly IHttpClient _httpClient; private readonly SystemConfig _systemConfig; private readonly IConfiguration _configuration; public ProductDomain(IBaseRepository crmRepository, IBaseRepository zxdRepository, IBaseRepository repository, IRedisManager redisManager, IDeptmentDomain deptmentDomain, IConfiguration configuration, IHttpClient httpClient, IMapper mapper) { _crmRepository = crmRepository; _zxdRepository = zxdRepository; _redisManager = redisManager; _deptmentDomain = deptmentDomain; _httpClient = httpClient; _repository = repository; _configuration = configuration; _mapper = mapper; _systemConfig = _configuration.GetSection("SystemConfig").Get(); } #region 下拉列表 public async Task> GetProductGroupSelect() { var data = new List(); /* var key = CacheKeys.ProductGroupList; if (!await _redisManager.ExistsAsync(key)) { var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id, item.Name ?? "")); } await _redisManager.SetAsync(key, data, TimeSpan.FromHours(1)); } else { data = await _redisManager.GetListAsync(key); }*/ var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id, item.Name ?? "")); } return data; } public async Task> GetModuleSelect() { var data = new List(); var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id ?? "", $"{item.Name}/{item.Id}")); } return data; /* var key = CacheKeys.ProductModuleList; if (!await _redisManager.ExistsAsync(key)) { var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id ?? "", $"{item.Name}/{item.Id}")); } await _redisManager.SetAsync(key, data, TimeSpan.FromHours(1)); } else { data = await _redisManager.GetListAsync(key); } return data;*/ } public async Task> GetProductTeacherSelect() { var data = new List(); /*var key = CacheKeys.ProductTeacherList; if (!await _redisManager.ExistsAsync(key)) { var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Code ?? "", $"{item.Name}({item.Code})")); } await _redisManager.SetAsync(key, data, TimeSpan.FromHours(1)); } else { data = await _redisManager.GetListAsync(key); }*/ var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Code ?? "", $"{item.Name}({item.Code})")); } return data; } public async Task> GetProductSelect() { var data = new List(); /* var key = CacheKeys.ProductList; if (!await _redisManager.ExistsAsync(key)) { var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id ?? "", $"{item.Name}/{item.Moduleid}/{item.Day}/{item.Price}")); } await _redisManager.SetAsync(key, data, TimeSpan.FromHours(1)); } else { data = await _redisManager.GetListAsync(key); }*/ var list = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in list) { data.Add(new SelectItem(item.Id ?? "", $"{item.Name}/{item.Moduleid}/{item.Day}/{item.Price}")); } return data; } public async Task> GetStandardTypeSelect() { var key = CacheKeys.StandardType; var data = new List(); if (!await _redisManager.ExistsAsync(key)) { foreach (StandardType item in Enum.GetValues(typeof(StandardType))) { data.Add(new SelectItem(item, item.GetDescription())); } await _redisManager.SetAsync(key, data, TimeSpan.FromDays(1)); } else { data = await _redisManager.GetListAsync(key); } return data; } #endregion 下拉列表 #region 基础产品 public async Task> ProductPage(SearchProductDto dto) { var query = _crmRepository.GetRepository().Query() .If(!string.IsNullOrEmpty(dto.ProductCode), x => x.Where(y => y.Id == dto.ProductCode)) .If(!string.IsNullOrEmpty(dto.ProductName), x => x.Where(y => y.Name.Contains(dto.ProductName))) .If(!string.IsNullOrEmpty(dto.ProductModule), x => x.Where(y => y.Moduleid == dto.ProductModule)) .If(dto.Active.HasValue, x => x.Where(y => y.Active == dto.Active)) .Include(x => x.ProductGroup) .Include(x => x.Module); var total = await query.CountAsync(); var data = await query .OrderByDescending(x => x.Id) .Select(x => new ProductDto { Id = x.Pk, ProdcutCode = x.Id, Price = $"{x.Price:0.00}元", ProdcutName = x.Name, ProdcutType = x.ProductGroup.Name, ProductModule = $"{x.Module.Name}【{x.Moduleid}】【{x.Day}】", Day = $"{x.Day}天", Status = x.Active == 1 ? "已上线" : x.Active == 2 ? "已下架" : "未上线", Ctime = x.Ctime.ToString("yyyy-MM-dd HH:mm:ss"), EffectiveImmediately = x.EffectiveImmediately.Value ? "是" : "否" }) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); return new PageResult(dto.PageIndex, dto.PageSize, total, data); } /// /// 基础产品编辑 /// /// /// /// public async Task ProductEdit(ChangeProductStatusDto dto) { ProductEdit res = new ProductEdit(); //枚举值 //产品下拉框 处理 res.Group = await GetProductGroupSelect(); res.Module = await GetModuleSelect(); res.Teacher = await GetProductTeacherSelect(); res.Dept = await _deptmentDomain.GetDeptments(); if (string.IsNullOrWhiteSpace(dto.ProductCode)) { return res; } var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == dto.ProductCode); if (product == null) { throw new ApiException("产品不存在或已删除!"); } res.ProductModule = product.Moduleid; res.ProductCode = product.Id; res.ProductName = product.Name; res.Free = product.Id.IndexOf("_MFTY") > 0 ? true : false; res.Price = product.Price; res.EffectiveImmediately = product.EffectiveImmediately; res.ProductType = product.Groupid; res.Day = product.Day; res.Status = product.Active; var teacherList = await _crmRepository.GetRepository().Query() .Include(x => x.Teacher) .Where(n => n.ProductId == product.Id).ToListAsync(); var deptGroup = teacherList.Select(n => n.Deptid).Distinct().ToList(); var deptments = await _repository.GetRepository().Query().Where(n => deptGroup.Contains(n.Id)).ToListAsync(); List proTeacherInfos = new List(); foreach (var deptid in deptGroup) { var teachers = teacherList.Where(n => n.Deptid == deptid).ToList(); ProTeacherInfo teaInfo = new ProTeacherInfo { dept_val = deptid, dept_txt = deptments.FirstOrDefault(n => n.Id == deptid)?.Title }; List tealist = new List(); foreach (var tea in teachers) { tealist.Add(new teacherInfo { code = tea.Teacher.Code, name = tea.Teacher.Name }); } teaInfo.teacherInfos = tealist; proTeacherInfos.Add(teaInfo); } res.ProTeacherInfo = proTeacherInfos; return res; } public async Task InactiveProduct(string code) { var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == code); if (product != null) { product.Active = 0; await _crmRepository.GetRepository().UpdateAsync(product); return; } throw new ApiException("产品不存在或已删除!"); } public async Task ActiveProduct(string code) { var product = await _crmRepository.GetRepository().Query() .Include(x => x.Module) .FirstOrDefaultAsync(x => x.Id == code); if (product == null) { throw new ApiException("产品不存在或已删除!"); } var url = $"{_systemConfig.GetActiveProduct()}?flag=mod&online=up&active=1&productpk={product.Pk}&productid={product.Id}&productname={product.Name}&modulename={product.Module?.Name}&moduleid={product.Moduleid}&price={product.Price}&day={product.Day}"; var result = await _httpClient.GetAsync(url); if (result != null && result.result) { return; } throw new Exception("请求优品接口出错"); } public async Task DownProduct(string code) { var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == code); if (product != null) { product.Active = 2; await _crmRepository.GetRepository().UpdateAsync(product); return; } throw new ApiException("产品不存在或已删除!"); } public async Task CreateProduct(CreateProductDto dto) { var time = DateTime.Now.ToString("yyyyMMddhhmm"); var count = 0; string key = "UPCFJC_" + time; if (!await _redisManager.ExistsAsync(key))//不存在 { count++; await _redisManager.SetAsync(key, count, TimeSpan.FromMinutes(5)); } else { count = await _redisManager.GetAsync(key); count++; await _redisManager.SetAsync(key, count, TimeSpan.FromMinutes(5)); } var code = $"UPCFJC_{time}{(count < 10 ? ("0" + count) : count.ToString())}" + (dto.Free ? "_MFTY" : ""); //if (!string.IsNullOrWhiteSpace(dto.ProductCode)) //{ // List orderStatus = new List // { // "220","205","80","90" // }; // var existModel = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PRODUCTCODE == dto.ProductCode && orderStatus.Contains(n.ORDERSTATUS)); // if (existModel != null) // { // throw new ApiException("已开通订单的产品不让编辑!"); // } //} var oldCode = dto.ProductCode; var productCode = string.Empty; if (!string.IsNullOrWhiteSpace(dto.ProductCode) && (!dto.Free && dto.ProductCode.Contains("_MFTY") || dto.Free && !dto.ProductCode.Contains("_MFTY"))) { dto.ProductCode = ""; } if (string.IsNullOrWhiteSpace(dto.ProductCode)) { productCode = code; var product = new Product { Id = code, Name = dto.ProductName, Moduleid = dto.ProductModule.ToString(), Price = dto.Price, Groupid = dto.ProductType, Ctime = DateTime.Now, UpdateTime = DateTime.Now, EffectiveImmediately = dto.AutoOpen, BusinessType = 1, Day = dto.Day, Active = 2, Old = false, Compliance = true }; var baseProduct = new BaseProduct { Code = code, Name = dto.ProductName, Moduleid = dto.ProductModule.ToString(), Price = dto.Price, Groupid = dto.ProductType, Ctime = DateTime.Now, UpdateTime = DateTime.Now, EffectiveImmediately = dto.AutoOpen, Day = dto.Day, Active = 2, }; // 新增优品信息 using var transaction = await _crmRepository.BeginTransactionAsync(); try { //删除产品后再新加 if (!string.IsNullOrEmpty(oldCode)) { var oldproduct = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == oldCode); await _crmRepository.GetRepository().DeleteAsync(oldproduct); var oldTeacher = await _crmRepository.GetRepository().Query().Where(n => n.ProductId == oldproduct.Id).ToListAsync(); await _crmRepository.GetRepository().BatchDeleteAsync(oldTeacher); var oldbaseProduct = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Code == oldproduct.Id); // 删除千托信息 await _zxdRepository.GetRepository().DeleteAsync(oldbaseProduct); } if (dto.Teachers != null && dto.Teachers.Any()) { foreach (var productTeacher in dto.Teachers) { if (productTeacher.TeacherCodes == null) continue; foreach (var teacher in productTeacher.TeacherCodes) { await _crmRepository.GetRepository().InsertAsync(new ProductTeacher { Deptid = productTeacher.Deptid, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, IsPacks = false, ProductId = code, TeacherCode = teacher }); } } } await _crmRepository.GetRepository().InsertAsync(product); await transaction.CommitAsync(); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); Log.Error(ex, "添加基础产品错误!"); throw; } // 新增千托信息 await _zxdRepository.GetRepository().InsertAsync(baseProduct); } else { productCode = dto.ProductCode; //更新优品信息 using var transaction = await _crmRepository.BeginTransactionAsync(); var product = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == dto.ProductCode); if (product == null) { throw new ApiException("产品不存在或已删除!"); } product.Name = dto.ProductName; product.Moduleid = dto.ProductModule.ToString(); product.Price = dto.Price; product.Groupid = dto.ProductType; product.Ctime = DateTime.Now; product.UpdateTime = DateTime.Now; product.EffectiveImmediately = dto.AutoOpen; product.Day = dto.Day; code = product.Id; product.Active = 2; try { //老师处理 var oldTeacher = await _crmRepository.GetRepository().Query().Where(n => n.ProductId == product.Id).ToListAsync(); if (dto.Teachers != null && dto.Teachers.Any()) { foreach (var productTeacher in dto.Teachers) { if (productTeacher.TeacherCodes == null) continue; foreach (var teacher in productTeacher.TeacherCodes) { await _crmRepository.GetRepository().InsertAsync(new ProductTeacher { Deptid = productTeacher.Deptid, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, IsPacks = false, ProductId = code, TeacherCode = teacher }); } } } await _crmRepository.GetRepository().BatchDeleteAsync(oldTeacher); await _crmRepository.GetRepository().UpdateAsync(product); await transaction.CommitAsync(); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); Log.Error(ex, "修改基础产品错误!"); throw; } //更新千托信息 var baseProduct = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Code == dto.ProductCode); if (baseProduct != null) { baseProduct.Code = code; baseProduct.Name = dto.ProductName; baseProduct.Moduleid = dto.ProductModule.ToString(); baseProduct.Price = dto.Price; baseProduct.Groupid = dto.ProductType; baseProduct.UpdateTime = DateTime.Now; baseProduct.EffectiveImmediately = dto.AutoOpen; baseProduct.Day = dto.Day; baseProduct.Active = 2; // 新增千托信息 await _zxdRepository.GetRepository().UpdateAsync(baseProduct); } } return productCode; } /// /// 批量导入产品 /// /// /// public async Task> ImportPreview(List dto) { List res = new List(); //权限 var moduleList = await _crmRepository.GetRepository().Query().Where(n => dto.Select(x => x.ProductModule).Contains(n.Id)).ToListAsync(); //类型 var productGroupList = await _crmRepository.GetRepository().Query().Where(n => dto.Select(x => x.ProductType).Contains(n.Name)).ToListAsync(); var deptList = await _deptmentDomain.GetDeptments(); var teacherList = await _crmRepository.GetRepository().QueryListAsync(); foreach (var item in dto) { ImportBasicsProductViewModel newModel = new ImportBasicsProductViewModel { ProductName = item.ProductName, Free = item.Free == "否" ? false : true, }; res.Add(newModel); if (string.IsNullOrWhiteSpace(item.ProductName)) { newModel.Msg = "产品名称不能为空"; continue; } if (string.IsNullOrWhiteSpace(item.Price)) { newModel.Msg = "价格不能为空"; continue; } if (string.IsNullOrWhiteSpace(item.Day)) { newModel.Msg = "时长不能为空"; continue; } try { //校验 var productType = productGroupList.FirstOrDefault(n => n.Name == item.ProductType); if (productType == null) { newModel.Msg = "找不到对应的产品类型"; continue; } newModel.ProductType = productType.Id; newModel.ProductTypeName = productType.Name; var module = moduleList.FirstOrDefault(n => n.Id == item.ProductModule); if (module == null) { newModel.Msg = "找不到对应的权限Id"; continue; } newModel.ProductModule = module.Id; newModel.ProductModuleName = module.Name; newModel.Price = Convert.ToDouble(item.Price); newModel.Day = Convert.ToInt32(item.Day); newModel.AutoOpen = false; if (!string.IsNullOrWhiteSpace(item.Teachers)) { List teaList = new List(); var deptSpilt = item.Teachers.Split(";"); foreach (var deptstr in deptSpilt) { ImportProductTeacherDto teacherDto = new ImportProductTeacherDto(); Regex reg1 = new Regex(".*?(?=\\()"); var deptId = reg1.Match(deptstr); if (deptId != null) { var deptItem = deptList.FirstOrDefault(n => n.Title == deptId.Value); if (deptItem == null) { newModel.Msg = $"找不到对应的事业部"; continue; } else { teacherDto.Deptid = deptItem.Id; teacherDto.DeptName = deptItem?.Title; } } Regex reg2 = new Regex("(?<=\\()(\\S+)(?=\\))"); var teacherStr = reg2.Match(deptstr); if (teacherStr != null) { var teacherItem = teacherStr.Value.Split(",").ToList(); foreach (var tea in teacherItem) { var teacher = teacherList.FirstOrDefault(n => n.Code == tea || tea == n.Name); if (teacher != null) { TeacherInfo teacherInfo = new TeacherInfo() { Code = teacher.Code, Name = teacher.Name }; teacherDto.TeacherCodes.Add(teacherInfo); } else { newModel.Msg = $"找不到对应的老师{tea}"; } } teaList.Add(teacherDto); } } newModel.Teachers = teaList; } } catch (Exception ex) { newModel.Msg = $"数据不合法{ex.Message}"; } } return res; } /// /// 导入 /// /// /// public async Task ImportProduct(List dto) { foreach (var item in dto) { await CreateProduct(item); Thread.Sleep(1000); } } public async Task> ImportCombinationProductPreview(List dto) { List res = new List(); //类型 var productGroupList = await _crmRepository.GetRepository().Query().Where(n => dto.Select(x => x.ProductType).Contains(n.Name)).ToListAsync(); var deptList = await _deptmentDomain.GetDeptments(); var teacherList = await _crmRepository.GetRepository().QueryListAsync(); List productCodeList = new List(); foreach (var item in dto) { productCodeList.AddRange(item.ProductCodes.Split(",").Where(n => !string.IsNullOrWhiteSpace(n)).ToList()); } var productList = await _crmRepository.GetRepository().Query().Where(n => productCodeList.Contains(n.Id)).ToListAsync(); foreach (var item in dto) { ImportCombinationViewModel newModel = new ImportCombinationViewModel { ProductName = item.ProductName, Free = item.Free == "否" ? false : true, }; res.Add(newModel); if (string.IsNullOrWhiteSpace(item.ProductName)) { newModel.Msg = "产品名称不能为空"; continue; } if (string.IsNullOrWhiteSpace(item.Price)) { newModel.Msg = "价格不能为空"; continue; } if (string.IsNullOrWhiteSpace(item.ProductCodes)) { newModel.Msg = "子产品不能为空"; continue; } try { //校验 var productType = productGroupList.FirstOrDefault(n => n.Name == item.ProductType); if (productType == null) { newModel.Msg = "找不到对应的产品类型"; continue; } newModel.ProductType = productType.Id; newModel.ProductTypeName = productType.Name; var proCodes = item.ProductCodes.Split(",").ToList(); List productInfos = new List(); foreach (var code in proCodes) { var pro = productList.FirstOrDefault(n => n.Id == code); if (pro == null) { newModel.Msg = $"找不到对应的子产品【{code}】"; } else { if (item.Free.ToLower() == "是" && pro.Price > 0) { newModel.Msg = "组合产品生产免费产品时,子产品必须都是免费产品!"; } productInfos.Add(new ProductInfo { Code = code, Name = pro.Name, Price = pro.Price }); } } newModel.ProductCodes = productInfos; newModel.Price = Convert.ToDouble(item.Price); newModel.AutoOpen = false; if (!string.IsNullOrWhiteSpace(item.Teachers)) { List teaList = new List(); var deptSpilt = item.Teachers.Split(";"); foreach (var deptstr in deptSpilt) { ImportProductTeacherDto teacherDto = new ImportProductTeacherDto(); Regex reg1 = new Regex(".*?(?=\\()"); var deptId = reg1.Match(deptstr); if (deptId != null) { var deptItem = deptList.FirstOrDefault(n => n.Title == deptId.Value); if (deptItem == null) { newModel.Msg = $"找不到对应的事业部"; continue; } else { teacherDto.Deptid = deptItem.Id; teacherDto.DeptName = deptItem?.Title; } } Regex reg2 = new Regex("(?<=\\()(\\S+)(?=\\))"); var teacherStr = reg2.Match(deptstr); if (teacherStr != null) { var teacherItem = teacherStr.Value.Split(",").ToList(); foreach (var tea in teacherItem) { var teacher = teacherList.FirstOrDefault(n => n.Code == tea || tea == n.Name); if (teacher != null) { TeacherInfo teacherInfo = new TeacherInfo() { Code = teacher.Code, Name = teacher.Name }; teacherDto.TeacherCodes.Add(teacherInfo); } else { newModel.Msg = $"找不到对应的老师{tea}"; } } teaList.Add(teacherDto); } } newModel.Teachers = teaList; } } catch (Exception ex) { newModel.Msg = $"数据不合法{ex.Message}"; } } return res; } public async Task SyncProduct() { var productList = await _crmRepository.GetRepository().QueryListAsync(); var baseProductList = await _zxdRepository.GetRepository().QueryListAsync(); foreach (var product in productList) { var baseProduct = baseProductList.FirstOrDefault(x => x.Code == product.Id); if (baseProduct == null) { baseProduct = new BaseProduct { Code = product.Id, Name = product.Name, Price = product.Price, Groupid = product.Groupid, Ctime = product.Ctime, EffectiveImmediately = product.EffectiveImmediately, Moduleid = product.Moduleid, AppImgUrl = product.AppImgUrl, Day = product.Day, Appextinfo = product.Appextinfo, Appext = product.Appext, Active = product.Active, Compliance = product.Compliance, Ext = product.Ext, Extinfo = product.Extinfo, Old = product.Old, Remark = product.Remark, UpdateTime = product.UpdateTime, WebImgUrl = product.WebImgUrl }; await _zxdRepository.GetRepository().InsertAsync(baseProduct); continue; } if (baseProduct.Name != product.Name || baseProduct.Price != product.Price || baseProduct.Groupid != product.Groupid || baseProduct.Ctime != product.Ctime || baseProduct.EffectiveImmediately != product.EffectiveImmediately || baseProduct.Active != product.Active || baseProduct.Remark != product.Remark || baseProduct.Appext != product.Appext || baseProduct.Appextinfo != product.Appextinfo || baseProduct.AppImgUrl != product.AppImgUrl || baseProduct.Extinfo != product.Extinfo || baseProduct.Old != product.Old || baseProduct.WebImgUrl != product.WebImgUrl || baseProduct.UpdateTime != product.UpdateTime) { baseProduct.Name = product.Name; baseProduct.Price = product.Price; baseProduct.Groupid = product.Groupid; baseProduct.Ctime = product.Ctime; baseProduct.EffectiveImmediately = product.EffectiveImmediately; baseProduct.Active = product.Active; baseProduct.Remark = product.Remark; baseProduct.Appext = product.Appext; baseProduct.Appextinfo = product.Appextinfo; baseProduct.AppImgUrl = product.AppImgUrl; baseProduct.Extinfo = product.Extinfo; baseProduct.Old = product.Old; baseProduct.WebImgUrl = product.WebImgUrl; baseProduct.UpdateTime = product.UpdateTime; await _zxdRepository.GetRepository().UpdateAsync(baseProduct); } } } #endregion 基础产品 #region 组合产品 public async Task> ProductPackagePage(SearchProductDto dto) { var productCodes = new List(); if (!string.IsNullOrEmpty(dto.ProductModule)) { productCodes = await _zxdRepository.GetRepository().Query() .Where(x => x.Moduleid == dto.ProductModule) .Select(x => x.PackageCode ?? "") .Distinct() .ToListAsync(); } var query = _crmRepository.GetRepository().Query() .If(!string.IsNullOrEmpty(dto.ProductCode), x => x.Where(x => x.Id == dto.ProductCode)) .If(!string.IsNullOrEmpty(dto.ProductName), x => x.Where(x => x.Name.Contains(dto.ProductName))) .If(dto.Active.HasValue, x => x.Where(y => y.Active == dto.Active)) .If(productCodes != null && productCodes.Any(), x => x.Where(x => productCodes.Contains(x.Id))) .Include(x => x.ProductGroup); var total = await query.CountAsync(); var data = await query .OrderByDescending(x => x.Id) .Select(x => new ProductPackageDto { Id = x.Pk, ProdcutCode = x.Id, Price = $"{x.Price:0.00}元", ProdcutName = x.Name, ProdcutType = x.ProductGroup.Name, Status = x.Active == 1 ? "已上线" : x.Active == 2 ? "已下架" : "未上线", Ctime = x.Ctime.ToString("yyyy-MM-dd HH:mm:ss"), EffectiveImmediately = x.EffectiveImmediately.Value ? "是" : "否", SubProductsInfo = x.SubProductsInfo }) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var codes = new List(); data.ForEach(x => codes.AddRange(x.ProductCodes)); codes = codes.Distinct().ToList(); var products = await _crmRepository.GetRepository().Query() .Include(x => x.Module) .Include(x => x.ProductGroup) .Where(x => codes.Contains(x.Id)) .Select(x => new ProductDto { Id = x.Pk, ProdcutCode = x.Id, ProdcutName = x.Name, ProdcutType = x.ProductGroup.Name, ProductModule = $"{x.Module.Name}【{x.Moduleid}】【{x.Day}】" }) .ToListAsync(); data.ForEach(x => { List modules = new List(); foreach (var code in x.ProductCodes) { var pro = products.Where(y => code == y.ProdcutCode).FirstOrDefault(); if (pro != null) { modules.Add(pro.ProductModule); } } x.ProductModule = modules; }); return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task InactiveProductPackage(string code) { var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == code); if (product != null) { product.Active = 0; await _crmRepository.GetRepository().UpdateAsync(product); return; } throw new ApiException("产品不存在或已删除!"); } public async Task DownProductPackage(string code) { var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == code); if (product != null) { product.Active = 2; await _crmRepository.GetRepository().UpdateAsync(product); return; } throw new ApiException("产品不存在或已删除!"); } public async Task ActiveProductPackage(string code) { var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == code); if (product == null) { throw new ApiException("产品不存在或已删除!"); } var basProCodes = product.SubProducts.Split("|").ToList(); var basproducts = await _crmRepository.GetRepository().Query().Where(n => basProCodes.Contains(n.Id)).ToListAsync(); List moduleids = new List(); foreach (var bascode in basProCodes) { var pro = basproducts.FirstOrDefault(n => n.Id == bascode); if (pro != null) { moduleids.Add($"{pro.Moduleid}【{pro.Day}】"); } } var url = $"{_systemConfig.GetActivePackage()}?flag=mod&online=up&active=1&productpk={product.Pk}&productid={product.Id}&productname={product.Name}&moduleids={string.Join(",", moduleids)}&price={product.Price}"; var result = await _httpClient.GetAsync(url); if (result != null && result.result) { return; } if (product != null) { product.Active = 1; await _crmRepository.GetRepository().UpdateAsync(product); return; } } /// /// 查找存在重复的产品 /// /// /// /// /// private string IsHasDayPackge(int days, string[] modules, int price) { var relations = _zxdRepository.GetRepository().Query().Where(m => modules.Contains(m.Moduleid) && m.Day == days).ToList().GroupBy(m => m.PackageCode); foreach (var item in relations) { var packProduct = _zxdRepository.GetRepository().Query().Where(m => m.PackageCode == item.Key).ToList(); if (modules.Where(m => !packProduct.Select(m => m.Moduleid).Contains(m)).Any())//如果不是完全匹配,那么表示产品不存在,可以创建 continue; if (packProduct.Where(m => !modules.Contains(m.Moduleid)).Any())//如果不是完全匹配,那么表示产品不存在,可以创建 continue; var pack = _zxdRepository.GetRepository().Query().FirstOrDefault(m => m.Code == item.Key); if (pack != null && pack.Price == price) { return pack.Code; } } return ""; } /// /// 一键创建组合产品 /// /// /// /// public async Task CreateSuperProductPackage(CreateSuperProductPackageDto dto) { //进行产品重复校验 for (int i = 0; i < dto.prices.Length; i++) { string moduleId = dto.productModule[i]; int day = Convert.ToInt32(dto.days[i]); decimal price = Convert.ToDecimal(dto.prices[i]); if (price == 0 && day > 1) { throw new Exception("金额为零的产品,必须只能是1天"); } var hasCode = IsHasDayPackge(Convert.ToInt32(dto.days[i]), dto.productModule, Convert.ToInt32(dto.prices[i])); if (!string.IsNullOrEmpty(hasCode)) { throw new Exception("已有重复天数:" + dto.days[i] + "、金额:" + dto.prices[i] + ",产品ID:" + hasCode); } } List packList = new List();//需要创建的组合产品 //循环创建基础产品 for (int i = 0; i < dto.prices.Length; i++) { int day = Convert.ToInt32(dto.days[i]); decimal price = Convert.ToDecimal(dto.prices[i]); var pageckDto = new CreateProductPackageDto() { AutoOpen = dto.AutoOpen, Day = day, Free = dto.Free, Price = price, ProductCode = String.Empty, ProductCodes = new List(), ProductName = dto.ProductName, ProductType = dto.ProductType, Teachers = dto.Teachers }; foreach (var moduleId in dto.productModule)//循环创建子产品 { string productCode = string.Empty;// 产品编码 BaseProduct baseProduct = null; if (price > 0) { baseProduct = await _zxdRepository.GetRepository().Query().OrderByDescending(m => m.Active % 2).ThenByDescending(m => m.Id).FirstOrDefaultAsync(n => n.Moduleid == moduleId && n.Day == day && n.Price > 0); } else { baseProduct = await _zxdRepository.GetRepository().Query().OrderByDescending(m => m.Active % 2).ThenByDescending(m => m.Id).FirstOrDefaultAsync(n => n.Moduleid == moduleId && n.Day == day && n.Price == 0); } if (baseProduct == null)//找不到相关产品,那么就进行创建基础产品 { var module = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(m => m.Id == moduleId); if (module == null) throw new Exception(moduleId + "权限ID不存在"); productCode = await CreateProduct(new CreateProductDto { AutoOpen = dto.AutoOpen, Day = day, Free = dto.Free, Price = price, ProductModule = Convert.ToInt32(moduleId), ProductModules = new List() { moduleId }, ProductName = module.Name + day + "天", ProductCode = String.Empty, ProductType = dto.ProductType, Teachers = dto.Teachers }); } else productCode = baseProduct.Code; pageckDto.ProductCodes.Add(new CreateProductCodeDto { Price = baseProduct != null ? baseProduct.Price : price, ProductCode = productCode, }); await ActiveProduct(productCode);//上线产品 } packList.Add(pageckDto); } //循环创建组合产品 foreach (var item in packList) { string packcode = await CreateProductPackage(item); await ActiveProductPackage(packcode);//上线产品 } } public async Task CreateProductPackage(CreateProductPackageDto dto) { var productPackCode = string.Empty; var time = DateTime.Now.ToString("yyyyMMddhhmm"); var count = 0; string key = "UPCFZH_" + time; if (!await _redisManager.ExistsAsync(key))//不存在 { count++; await _redisManager.SetAsync(key, count, TimeSpan.FromMinutes(5)); } else { count = await _redisManager.GetAsync(key); count++; await _redisManager.SetAsync(key, count, TimeSpan.FromMinutes(5)); } var code = $"UPCFZH_{time}{(count < 10 ? ("0" + count) : count.ToString())}" + (dto.Free ? "_MFTY" : ""); //if (!string.IsNullOrWhiteSpace(dto.ProductCode)) //{ // List orderStatus = new List // { // "220","205","80","90" // }; // var existModel = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PRODUCTCODE == dto.ProductCode && orderStatus.Contains(n.ORDERSTATUS)); // if (existModel != null) // { // throw new ApiException("已开通订单的产品不让编辑!"); // } //} if (dto.ProductCodes == null || !dto.ProductCodes.Any()) { throw new ApiException("请选择产品权限!"); } var subProductsInfo = dto.ProductCodes.Select(x => new SubProductJson { SubPrice = $"{x.Price:0.00}", SubProductId = x.ProductCode }).ToList().ToJson(); if (dto.Free) { var productCodes = dto.ProductCodes.Select(x => x.ProductCode).ToList(); if (await _zxdRepository.GetRepository().Query().Where(x => productCodes.Contains(x.Code)).AnyAsync(x => x.Price > 0)) { throw new ApiException("组合产品生产免费产品时,子产品必须都是免费产品!"); } } var oldCode = dto.ProductCode; if (!string.IsNullOrWhiteSpace(dto.ProductCode) && !dto.Free && dto.ProductCode.Contains("_MFTY") || dto.Free && !dto.ProductCode.Contains("_MFTY")) { dto.ProductCode = ""; } if (string.IsNullOrWhiteSpace(dto.ProductCode)) { productPackCode = code; var productPackage = new ProductPackage { Id = code, Name = dto.ProductName, Price = dto.Price, Groupid = dto.ProductType, Ctime = DateTime.Now, UpdateTime = DateTime.Now, EffectiveImmediately = dto.AutoOpen, Old = false, BusinessType = 1, Active = 2, SubProducts = string.Join("|", dto.ProductCodes.Select(x => x.ProductCode).ToList()), SubProductsInfo = subProductsInfo }; var baseProductPackage = new BaseProductPackage { Code = code, Name = dto.ProductName, Price = dto.Price, Groupid = dto.ProductType, Ctime = DateTime.Now, UpdateTime = DateTime.Now, EffectiveImmediately = dto.AutoOpen, Active = 2, }; using var transactionCrm = await _crmRepository.BeginTransactionAsync(); using var transactionZxd = await _zxdRepository.BeginTransactionAsync(); try { if (!string.IsNullOrWhiteSpace(oldCode)) { var oldproductPackage = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == oldCode); await _crmRepository.GetRepository().DeleteAsync(oldproductPackage); var oldTeacher = await _crmRepository.GetRepository().Query().Where(n => n.ProductId == oldCode).ToListAsync(); await _crmRepository.GetRepository().BatchDeleteAsync(oldTeacher); var oldbaseProductPackage = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Code == oldCode); await _zxdRepository.GetRepository().DeleteAsync(oldbaseProductPackage); var oldRelationList = await _zxdRepository.GetRepository().Query().Where(n => n.PackageCode == oldCode).ToListAsync(); await _zxdRepository.GetRepository().BatchDeleteAsync(oldRelationList); } // 新增优品信息 if (dto.Teachers != null && dto.Teachers.Any()) { foreach (var productTeacher in dto.Teachers) { if (productTeacher.TeacherCodes == null || !productTeacher.TeacherCodes.Any()) continue; foreach (var teacher in productTeacher.TeacherCodes) { await _crmRepository.GetRepository().InsertAsync(new ProductTeacher { Deptid = productTeacher.Deptid, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, IsPacks = false, ProductId = code, TeacherCode = teacher }); } } } await _crmRepository.GetRepository().InsertAsync(productPackage); await transactionCrm.CommitAsync(); // 新增千托信息 if (dto.ProductCodes != null && dto.ProductCodes.Any()) { foreach (var productCode in dto.ProductCodes) { var baseproduct = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(m => m.Id == productCode.ProductCode); await _zxdRepository.GetRepository().InsertAsync(new BaseProductPackageRelation { PackageCode = code, ProductCode = productCode.ProductCode, Price = productCode.Price, Day = baseproduct.Day, Moduleid = baseproduct.Moduleid, ProductName = baseproduct.Name }); } } await _zxdRepository.GetRepository().InsertAsync(baseProductPackage); await transactionZxd.CommitAsync(); } catch (Exception ex) { await transactionCrm.RollbackAsync(); await transactionCrm.DisposeAsync(); await transactionZxd.RollbackAsync(); await transactionZxd.DisposeAsync(); Log.Error(ex, "添加组合产品错误!"); throw; } } else { productPackCode = dto.ProductCode; var productPackage = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == dto.ProductCode); code = productPackage.Id; productPackage.Name = dto.ProductName; productPackage.Price = dto.Price; productPackage.Groupid = dto.ProductType; productPackage.UpdateTime = DateTime.Now; productPackage.EffectiveImmediately = dto.AutoOpen; productPackage.Active = 2; productPackage.SubProducts = string.Join("|", dto.ProductCodes.Select(x => x.ProductCode).ToList()); productPackage.SubProductsInfo = subProductsInfo; using var transactionCrm = await _crmRepository.BeginTransactionAsync(); using var transactionZxd = await _zxdRepository.BeginTransactionAsync(); try { var oldTeacher = await _crmRepository.GetRepository().Query().Where(n => n.ProductId == code).ToListAsync(); // 新增优品信息 if (dto.Teachers != null && dto.Teachers.Any()) { foreach (var productTeacher in dto.Teachers) { if (productTeacher.TeacherCodes == null || !productTeacher.TeacherCodes.Any()) continue; foreach (var teacher in productTeacher.TeacherCodes) { await _crmRepository.GetRepository().InsertAsync(new ProductTeacher { Deptid = productTeacher.Deptid, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, IsPacks = false, ProductId = code, TeacherCode = teacher }); } } } await _crmRepository.GetRepository().BatchDeleteAsync(oldTeacher); await _crmRepository.GetRepository().UpdateAsync(productPackage); await transactionCrm.CommitAsync(); // 新增千托信息 var baseProductPackage = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Code == dto.ProductCode); if (baseProductPackage != null) { baseProductPackage.Code = code; baseProductPackage.Name = dto.ProductName; baseProductPackage.Price = dto.Price; baseProductPackage.Groupid = dto.ProductType; baseProductPackage.UpdateTime = DateTime.Now; baseProductPackage.EffectiveImmediately = dto.AutoOpen; baseProductPackage.Active = 2; await _zxdRepository.GetRepository().UpdateAsync(baseProductPackage); } else { baseProductPackage = new BaseProductPackage { Code = code, Name = dto.ProductName, Price = dto.Price, Groupid = dto.ProductType, Ctime = DateTime.Now, UpdateTime = DateTime.Now, EffectiveImmediately = dto.AutoOpen, Active = 2, }; await _zxdRepository.GetRepository().InsertAsync(baseProductPackage); } var oldRelationList = await _zxdRepository.GetRepository().Query().Where(n => n.PackageCode == dto.ProductCode).ToListAsync(); if (dto.ProductCodes != null && dto.ProductCodes.Any()) { foreach (var productCode in dto.ProductCodes) { var baseproduct = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(m => m.Id == productCode.ProductCode); await _zxdRepository.GetRepository().InsertAsync(new BaseProductPackageRelation { PackageCode = code, ProductCode = productCode.ProductCode, Price = productCode.Price, Day = baseproduct.Day, Moduleid = baseproduct.Moduleid, ProductName = baseproduct.Name }); } } await _zxdRepository.GetRepository().BatchDeleteAsync(oldRelationList); await transactionZxd.CommitAsync(); } catch (Exception ex) { await transactionCrm.RollbackAsync(); await transactionCrm.DisposeAsync(); await transactionZxd.RollbackAsync(); await transactionZxd.DisposeAsync(); Log.Error(ex, "更新组合产品错误!"); throw; } } return productPackCode; } /// /// 组合产品编辑 /// /// /// public async Task EditProductPackage(ChangeProductStatusDto dto) { EditProductPackageDto res = new EditProductPackageDto(); //产品下拉框 处理 res.Group = await GetProductGroupSelect(); res.Module = await GetModuleSelect(); res.Teacher = await GetProductTeacherSelect(); res.Dept = await _deptmentDomain.GetDeptments(); res.ProductList = await _crmRepository.GetRepository().Query().OrderByDescending(x => x.Id) .Select(x => new ProductDto { Id = x.Pk, ProdcutCode = x.Id, Price = $"{x.Price:0.00}元", ProdcutName = x.Name, ProdcutType = x.ProductGroup.Name, ProductModule = $"{x.Module.Name}【{x.Moduleid}】【{x.Day}】", Day = $"{x.Day}天", Status = x.Active == 1 ? "已上线" : "未上线", Ctime = x.Ctime.ToString("yyyy-MM-dd HH:mm:ss"), EffectiveImmediately = x.EffectiveImmediately.Value ? "是" : "否" }).ToListAsync(); if (string.IsNullOrWhiteSpace(dto.ProductCode)) { return res; } var product = await _crmRepository.GetRepository().Query() .FirstOrDefaultAsync(x => x.Id == dto.ProductCode); if (product == null) { throw new ApiException("产品不存在或已删除!"); } var subCodes = product.SubProductCodes; var subProductList = await _crmRepository.GetRepository().Query().Where(n => subCodes.Contains(n.Id)).ToListAsync(); List subProCodes = new List(); foreach (var subpro in subProductList) { subProCodes.Add(new CreateProductCodeDto { Price = (decimal)subpro.Price, ProductCode = subpro.Id }); } res.ProductCode = product.Id; res.ProductCodes = subProCodes; res.ProductName = product.Name; res.Free = product.Id.IndexOf("_MFTY") > 0 ? true : false; res.Price = product.Price; res.EffectiveImmediately = product.EffectiveImmediately; res.ProductType = product.Groupid; res.Status = product.Active; var teacherList = await _crmRepository.GetRepository().Query() .Include(x => x.Teacher) .Where(n => n.ProductId == product.Id).ToListAsync(); var deptGroup = teacherList.Select(n => n.Deptid).Distinct().ToList(); var deptments = await _repository.GetRepository().Query().Where(n => deptGroup.Contains(n.Id)).ToListAsync(); List proTeacherInfos = new List(); foreach (var deptid in deptGroup) { var teachers = teacherList.Where(n => n.Deptid == deptid).ToList(); ProTeacherInfo teaInfo = new ProTeacherInfo { dept_val = deptid, dept_txt = deptments.FirstOrDefault(n => n.Id == deptid)?.Title }; List tealist = new List(); foreach (var tea in teachers) { tealist.Add(new teacherInfo { code = tea.Teacher.Code, name = tea.Teacher.Name }); } teaInfo.teacherInfos = tealist; proTeacherInfos.Add(teaInfo); } res.ProTeacherInfo = proTeacherInfos; return res; } public async Task SyncProductPackage() { var productPackageList = await _crmRepository.GetRepository().QueryListAsync(); var baseProductPackageList = await _zxdRepository.GetRepository().QueryListAsync(); foreach (var productPackage in productPackageList) { var baseProductPackage = baseProductPackageList.FirstOrDefault(x => x.Code == productPackage.Id); if (baseProductPackage == null) { baseProductPackage = new BaseProductPackage { Code = productPackage.Id, Name = productPackage.Name, Price = productPackage.Price, Groupid = productPackage.Groupid, Ctime = productPackage.Ctime, EffectiveImmediately = productPackage.EffectiveImmediately, Remark = productPackage.Remark, Appext = productPackage.Appext, Appextinfo = productPackage.Appextinfo, AppImgUrl = productPackage.AppImgUrl, Extinfo = productPackage.Extinfo, Old = productPackage.Old, WebImgUrl = productPackage.WebImgUrl, UpdateTime = productPackage.UpdateTime, Active = productPackage.Active, }; if (productPackage.SubProducts != null && productPackage.SubProductsInfos != null) { var productCodes = productPackage.SubProducts.Split('|'); foreach (var subProduct in productPackage.SubProductsInfos) { var product = await _crmRepository.GetRepository().Query() .Where(x => x.Id == subProduct.SubProductId) .FirstOrDefaultAsync(); await _zxdRepository.GetRepository().InsertAsync(new BaseProductPackageRelation { PackageCode = productPackage.Id, Price = !string.IsNullOrEmpty(subProduct.SubPrice) && decimal.TryParse(subProduct.SubPrice, out decimal price) ? price : 0, ProductCode = subProduct.SubProductId, Moduleid = product?.Moduleid, Day = product?.Day, ProductName = product?.Name }); } } await _zxdRepository.GetRepository().InsertAsync(baseProductPackage); continue; } if (baseProductPackage.Name != productPackage.Name || baseProductPackage.Price != productPackage.Price || baseProductPackage.Groupid != productPackage.Groupid || baseProductPackage.Ctime != productPackage.Ctime || baseProductPackage.EffectiveImmediately != productPackage.EffectiveImmediately || baseProductPackage.Active != productPackage.Active || baseProductPackage.Remark != productPackage.Remark || baseProductPackage.Appext != productPackage.Appext || baseProductPackage.Appextinfo != productPackage.Appextinfo || baseProductPackage.AppImgUrl != productPackage.AppImgUrl || baseProductPackage.Extinfo != productPackage.Extinfo || baseProductPackage.Old != productPackage.Old || baseProductPackage.WebImgUrl != productPackage.WebImgUrl || baseProductPackage.UpdateTime != productPackage.UpdateTime) { baseProductPackage.Name = productPackage.Name; baseProductPackage.Price = productPackage.Price; baseProductPackage.Groupid = productPackage.Groupid; baseProductPackage.Ctime = productPackage.Ctime; baseProductPackage.EffectiveImmediately = productPackage.EffectiveImmediately; baseProductPackage.Active = productPackage.Active; baseProductPackage.Remark = productPackage.Remark; baseProductPackage.Appext = productPackage.Appext; baseProductPackage.Appextinfo = productPackage.Appextinfo; baseProductPackage.AppImgUrl = productPackage.AppImgUrl; baseProductPackage.Extinfo = productPackage.Extinfo; baseProductPackage.Old = productPackage.Old; baseProductPackage.WebImgUrl = productPackage.WebImgUrl; baseProductPackage.UpdateTime = productPackage.UpdateTime; await _zxdRepository.GetRepository().UpdateAsync(baseProductPackage); } } } #endregion 组合产品 #region 基准产品 public async Task GetBaseProduct(string code) { if (string.IsNullOrEmpty(code)) { throw new ApiException("产品编码不能为空!"); } var product = await _crmRepository.GetRepository().Query() .Include(x => x.ProductGroup) .Include(x => x.Module) .FirstOrDefaultAsync(x => x.Id == code); var productPackage = await _crmRepository.GetRepository().Query() .Include(x => x.ProductGroup) .FirstOrDefaultAsync(x => x.Id == code); if (product == null && productPackage == null) { throw new ApiException("产品不存在或已删除!"); } if (product != null) { return new BaseProductInfoDto { Code = product.Id, Day = product.Day ?? 0, Price = (decimal)product.Price, ProductName = product.Name ?? "", ProductProperty = "基础产品", ProductType = product.ProductGroup?.Name ?? "", Status = product.Active == 1 ? "已上线" : "未上线", ProductModules = new List() { product.Moduleid ?? "" } }; } if (productPackage != null) { var productCodes = string.IsNullOrEmpty(productPackage.SubProducts) ? new List() : productPackage.SubProducts.Split('|').ToList(); var data = new BaseProductInfoDto { Code = productPackage.Id, Price = (decimal)productPackage.Price, ProductName = productPackage.Name ?? "", ProductProperty = "组合产品", ProductType = productPackage.ProductGroup?.Name ?? "", Status = productPackage.Active == 1 ? "已上线" : "未上线" }; if (productCodes.Any()) { var productList = await _crmRepository.GetRepository().Query() .Where(x => productCodes.Contains(x.Id)) .ToListAsync(); data.Day = productList.Sum(x => x.Day ?? 0); data.ProductModules = productList.Select(x => x.Moduleid ?? "").ToList(); } return data; } return new BaseProductInfoDto(); } public async Task CreateStandardProduct(CreateStandardProductDto dto) { if (string.IsNullOrEmpty(dto.ProductCode)) { throw new ApiException("产品编码不能为空!"); } var code = dto.ProductCode; var product = await _crmRepository.GetRepository().Query() .Include(x => x.ProductGroup) .Include(x => x.Module) .FirstOrDefaultAsync(x => x.Id == code); var productPackage = await _crmRepository.GetRepository().Query() .Include(x => x.ProductGroup) .FirstOrDefaultAsync(x => x.Id == code); if (product == null && productPackage == null) { throw new ApiException("产品不存在或已删除!"); } var standardProduct = new StandardProduct { ProductCode = product != null ? dto.ProductCode : null, ProductPackageCode = productPackage != null ? dto.ProductCode : null, StandardType = (StandardType)dto.StandardType, Way = dto.StandardWay, CreateTime = DateTime.Now }; await _zxdRepository.GetRepository().InsertAsync(standardProduct); } public async Task> StandardProductPage(SearchStandardProductDto dto) { var productCodes = new List(); var productPackageCodes = new List(); if (!string.IsNullOrEmpty(dto.ProductName)) { productCodes = await _crmRepository.GetRepository().Query() .Where(x => x.Name.Contains(dto.ProductName)) .Select(x => x.Id) .ToListAsync(); productPackageCodes = await _crmRepository.GetRepository().Query() .Where(x => x.Name.Contains(dto.ProductName)) .Select(x => x.Id) .ToListAsync(); } var query = _zxdRepository.GetRepository().Query() .If(dto.Id != null, x => x.Where(x => x.Id == dto.Id)) .If(dto.StandardType != null, x => x.Where(x => x.StandardType == (StandardType)dto.StandardType)) .If(productCodes.Any(), x => x.Where(x => productCodes.Contains(x.ProductCode))) .If(productPackageCodes.Any(), x => x.Where(x => productPackageCodes.Contains(x.ProductPackageCode))) .Include(x => x.FinishedProducts); var total = await query.CountAsync(); var data = await query .Select(x => new StandardProductDto { Id = x.Id, CreateTime = x.CreateTime, StandardProductType = ((StandardType)x.StandardType).GetDescription(), ProductCode = string.IsNullOrEmpty(x.ProductCode) ? x.ProductPackageCode : x.ProductCode, ProductProperty = string.IsNullOrEmpty(x.ProductCode) ? "组合产品" : "基础产品", FinishedProductCount = x.FinishedProducts == null ? 0 : x.FinishedProducts.Count }) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var productList = new List(); var productPackageList = new List(); var productPackageProductList = new List(); if (data.Any()) { productList = await _crmRepository.GetRepository().Query() .Where(x => data.Select(y => y.ProductCode).Contains(x.Id)) .Include(x => x.Module) .Include(x => x.ProductGroup) .ToListAsync(); productPackageList = await _crmRepository.GetRepository().Query() .Where(x => data.Select(y => y.ProductCode).Contains(x.Id)) .Include(x => x.ProductGroup) .ToListAsync(); if (productPackageList.Any()) { var productPackageProductCodes = new List(); productPackageList.ForEach(x => { if (x.SubProductCodes != null && x.SubProductCodes.Any()) { productPackageCodes.AddRange(x.SubProductCodes); } }); productPackageProductList = await _crmRepository.GetRepository().Query() .Where(x => productPackageProductCodes.Contains(x.Id)) .Include(x => x.Module) .Include(x => x.ProductGroup) .ToListAsync(); } } data.ForEach(x => { var product = productList.FirstOrDefault(y => y.Id == x.ProductCode); var productPackage = productPackageList.FirstOrDefault(y => y.Id == x.ProductCode); if (product != null) { x.Day = product.Day.ToString(); x.Price = $"{product.Price:0:00}元"; x.StandardProductName = product.Name; x.Status = product.Active == 1 ? "已上线" : "未上线"; x.StandardProductModule = new List { $"{product.Module.Name}【{product.Moduleid}】【{product.Day}】" }; } if (productPackage != null) { var productPackageProducts = productPackageProductList .Where(y => productPackage.SubProductCodes.Contains(y.Id)).ToList(); x.Day = string.Join("/", productPackageProducts.Select(x => x.Day).ToList()); x.Price = $"{productPackage.Price:0:00}元"; x.StandardProductName = productPackage.Name; x.Status = productPackage.Active == 1 ? "已上线" : "未上线"; x.StandardProductModule = productPackageProducts.Select(y => $"{y.Module.Name}【{y.Moduleid}】【{y.Day}】").ToList(); } }); return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task ImportCombinationProduct(List dto) { foreach (var product in dto) { await CreateProductPackage(product); Thread.Sleep(1000); } } #endregion 基准产品 #region 合同相关 /// /// 获取合同地址 免费活动订单需传自定义的产品名 /// /// /// /// /// public async Task GetContractByFreeOrderId(decimal ordeid) { var orderInfo = await GetContractOrderInfo(ordeid); var product = await GetProductInfo(orderInfo.productcode);// _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.productcode == freeOrder.subproductcode);//合同地址 if (product == null) { throw new Exception("找不到对应的产品"); } var urlKey = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "UserCenter_RiaService_ContractSignThree");//合同地址 var threeUrl = urlKey?.PARAVALUE; var clientidKey = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "Sys_OrderClientIdKey"); var clientid = clientidKey?.PARAVALUE; if (string.IsNullOrWhiteSpace(clientid)) { clientid = "UPWEBSITE"; } var json = new { productName = orderInfo.productname, period = string.Format("{0}天", orderInfo.day), price = string.Format("{0}元", 0.ToString("#0.00")), userId = orderInfo.username, productLevel = product.productlevel, productInvestTime = product.productinvesttime, productInvestType = product.productinvesttype, issupplement = 1, orderId = orderInfo.szzyorderid.ToString(), htid = string.Format("DN{0}", orderInfo.szzyorderid.ToString()) }; var systemConfig = _configuration.GetSection("SystemConfig").Get(); var key = systemConfig.GetAccessKey(clientid); var content = SecurityHelper.EncyptData(json.ToJson(), key); string sign = SecurityHelper.SignData(content, key); var threehtUrl = threeUrl + string.Format("?content={0}&sign={1}&clientId={2}&protocolType=", HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid); return threehtUrl; } /// /// 获取订单所需要的合同信息 免费产品需传坐席的名称 /// /// /// /// /// public async Task GetContractOrderInfo(decimal orderid) { var result = new ContractOrderInfo(); var order = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.ORDERID == orderid); if (order != null) { result.productcode = order.PRODUCTCODE; result.szzyorderid = order.SZZYORDERID.ToString(); result.productname = order.SUBPRODUCTNAME; result.day = order.OPENDAYS; result.username = order.SOFTUSERNAME; result.ContractCode = order.CONTRACTCODE; result.ContractStatus = order.contractstatus; return result; } var freeOrder = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.orderid == orderid); if (freeOrder != null) { result.productcode = freeOrder.productcode; result.szzyorderid = freeOrder.szzyorderid.ToString(); result.productname = freeOrder.subproductname; result.day = freeOrder.giftdays; result.username = freeOrder.softusername; result.ContractCode = freeOrder.CONTRACTCODE; result.ContractStatus = freeOrder.contractstatus; } else { var orderstr = orderid.ToString(); var l2Order = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.WEBORDERID == orderstr); if (l2Order != null) { result.productcode = l2Order.PRODUCTCODE; result.szzyorderid = l2Order.WEBORDERID; result.productname = l2Order.productname; result.day = l2Order.DAYS; result.username = l2Order.USERNAME; result.ContractCode = l2Order.CONTRACTCODE; result.ContractStatus = l2Order.contractstatus; } } if (result == null || result.szzyorderid == null) { throw new Exception("找不到对应的订单"); } return result; } public async Task GetProductInfo(string code) { var basProduct = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == code); if (basProduct == null) { var productPackage = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == code); if (productPackage != null) { var idArr = new List(productPackage.SubProducts.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries)); basProduct = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == idArr[0]); } } if (basProduct == null) { throw new Exception("找不到对应的产品"); } var module = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == basProduct.Moduleid); return new ProductModuleInfo { productinvesttime = module?.InvestTime, productinvesttype = module?.InvestType, productlevel = module?.RiskLevel }; } /// /// 查看投顾协议 风险协议 风测 等数据 /// /// /// public async Task GetContractView(ContractQueryDto dto) { var orderInfo = await GetContractOrderInfo(dto.orderid); if (orderInfo == null) { throw new Exception("找不到对应的订单"); } var res = new ContractResultView() { CONTRACTCODE = orderInfo.ContractCode, CONTRACTSTATUS = orderInfo.ContractStatus }; var productInfo = await GetProductInfo(orderInfo.productcode); if (productInfo == null) { throw new Exception("找不到对应的产品"); } var threeUrl = await GetBasParameterValue("UserCenter_RiaService_ContractSignThree"); var clientidKey = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "Sys_OrderClientIdKey"); var clientid = clientidKey?.PARAVALUE; if (string.IsNullOrWhiteSpace(clientid)) { clientid = "UPWEBSITE"; } var json = new { productName = orderInfo.productname, period = string.Format("{0}天", orderInfo.day), price = string.Format("{0}元", 0.ToString("#0.00")), userId = orderInfo.username, productLevel = productInfo.productlevel, productInvestTime = productInfo.productinvesttime, productInvestType = productInfo.productinvesttype, issupplement = 1, orderId = orderInfo.szzyorderid.ToString(), htid = string.Format("DN{0}", orderInfo.szzyorderid.ToString()) }; var systemConfig = _configuration.GetSection("SystemConfig").Get(); var key = systemConfig.GetAccessKey(clientid); var content = SecurityHelper.EncyptData(json.ToJson(), key); string sign = SecurityHelper.SignData(content, key); var threehtUrl = threeUrl + string.Format("?content={0}&sign={1}&clientId={2}&protocolType=", HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid); res.htUrl = threehtUrl; //===================合同Url测试=============== //合同生成URL测试 var url = await GetBasParameterValue(Parameter.UserCenter_RiaService_SignPdf.ToString()); //风险揭示书 content = SecurityHelper.EncyptData("R_DN" + orderInfo.szzyorderid.ToString(), key); sign = SecurityHelper.SignData(content, key); string fxjssUrl = string.Format("{0}/{4}-风险揭示书.pdf?content={1}&sign={2}&clientId={3}&employeeId={5}&employeeName={6}&viewSource={7}&pageSource={8}" , url, HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid, orderInfo.productname, dto.Eid, dto.UserName, dto.ViewSource, dto.PageSource); res.fxjssUrl = fxjssUrl; //投顾服务协议 content = SecurityHelper.EncyptData("A_DN" + orderInfo.szzyorderid.ToString(), key); sign = SecurityHelper.SignData(content, key); string tgfwxyUrl = string.Format("{0}/{4}-投顾服务协议.pdf?content={1}&sign={2}&clientId={3}&employeeId={5}&employeeName={6}&viewSource={7}&pageSource={8}", url, HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid, orderInfo.productname, dto.Eid, dto.UserName, dto.ViewSource, dto.PageSource); res.tgfwxyUrl = tgfwxyUrl; if (!string.IsNullOrEmpty(orderInfo.ContractCode)) { var riskinfoUrl = await GetBasParameterValue("riskinfo"); var htflagUrl = await GetBasParameterValue("htflag"); if (string.IsNullOrEmpty(riskinfoUrl)) { riskinfoUrl = "https://r2.soft.dn8188.com/contract_sign_crm/get_riskinfo"; } if (string.IsNullOrEmpty(htflagUrl)) { htflagUrl = "https://r2.soft.dn8188.com/contract_sign_crm/get_htflag"; } var bf = "{\"uid\": \"" + orderInfo.username + "\",\"htid\":\"DN" + orderInfo.szzyorderid.ToString() + "\"}"; var hqr = BlowFish.Encode(bf); var para = new { hqr }; var ret1 = await _httpClient.PostAsync(riskinfoUrl, para); //var ret1 = JsonConvert.DeserializeObject(riskData); //LogHelper.Info(ret1.ToJson()); if (ret1.ret == 0) { //风险评测页面 var riskcontent = SecurityHelper.EncyptData(ret1.ToJson(), key); string risksign = SecurityHelper.SignData(riskcontent, key); var hgUrl = await GetBasParameterValue("HgSoftWebUrl"); var a = HttpUtility.UrlEncode(riskcontent); var b = HttpUtility.UrlEncode(risksign); string fxpcUrl = string.Format("{0}/Compliance/NewRisk?content={1}&sign={2}&clientId={3}&decode=false", hgUrl, a, b, clientid); res.fxpcUrl = fxpcUrl; res.businesstype = ret1.businesstype; if (ret1.businesstype != "smallAmount") { var ret = await _httpClient.GetAsync($"{htflagUrl}?htid={orderInfo.ContractCode}"); var retObj = JsonConvert.DeserializeAnonymousType(ret, new { ret = -1, msg = string.Empty }); if (retObj.ret != -1) { if (retObj.ret == 0) { //产品或服务不适当警示确认书 content = SecurityHelper.EncyptData("I_DN" + orderInfo.szzyorderid.ToString(), key); sign = SecurityHelper.SignData(content, key); string cphfwUrl = string.Format("{0}/{4}-产品或服务不适当警示及投资者确认书.pdf ?content={1}&sign={2}&clientId={3}&employeeId={5}&employeeName={6}&viewSource={7}&pageSource={8}", url, HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid, orderInfo.productname, dto.Eid, dto.UserName, dto.ViewSource, dto.PageSource); res.cphfwUrl = cphfwUrl; } else if (retObj.ret == 1) { //适当性评估结果确认书 content = SecurityHelper.EncyptData("S_DN" + orderInfo.szzyorderid.ToString(), key); //sHelper.encyptData(clientid, "S_DN" + order.SZZYORDERID.ToString()); sign = SecurityHelper.SignData(content, key); string sdxpgUrl = string.Format("{0}/{4}-适当性评估结果确认书.pdf ?content={1}&sign={2}&clientId={3}&employeeId={5}&employeeName={6}&viewSource={7}&pageSource={8}", url, HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), clientid, orderInfo.productname, dto.Eid, dto.UserName, dto.ViewSource, dto.PageSource); res.sdxpgUrl = sdxpgUrl; } } } } } return res; } private async Task GetBasParameterValue(string key) { var urlKey = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == key);//合同地址 return urlKey?.PARAVALUE; } #endregion 合同相关 } }