2012 lines
96 KiB
C#
2012 lines
96 KiB
C#
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<CrmDbContext> _crmRepository;
|
||
private readonly IBaseRepository<ZxdDbContext> _zxdRepository;
|
||
private readonly IBaseRepository<DncmsbaseDbContext> _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<CrmDbContext> crmRepository,
|
||
IBaseRepository<ZxdDbContext> zxdRepository,
|
||
IBaseRepository<DncmsbaseDbContext> 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<SystemConfig>();
|
||
}
|
||
|
||
#region 下拉列表
|
||
|
||
public async Task<List<SelectItem>> GetProductGroupSelect()
|
||
{
|
||
var data = new List<SelectItem>();
|
||
/* var key = CacheKeys.ProductGroupList;
|
||
if (!await _redisManager.ExistsAsync(key))
|
||
{
|
||
var list = await _crmRepository.GetRepository<ProductGroup>().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<SelectItem>(key);
|
||
}*/
|
||
var list = await _crmRepository.GetRepository<ProductGroup>().QueryListAsync();
|
||
foreach (var item in list)
|
||
{
|
||
data.Add(new SelectItem(item.Id, item.Name ?? ""));
|
||
}
|
||
return data;
|
||
}
|
||
|
||
public async Task<List<SelectItem>> GetModuleSelect()
|
||
{
|
||
var data = new List<SelectItem>();
|
||
var list = await _crmRepository.GetRepository<Module>().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<Module>().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<SelectItem>(key);
|
||
}
|
||
|
||
return data;*/
|
||
}
|
||
|
||
public async Task<List<SelectItem>> GetProductTeacherSelect()
|
||
{
|
||
var data = new List<SelectItem>();
|
||
/*var key = CacheKeys.ProductTeacherList;
|
||
if (!await _redisManager.ExistsAsync(key))
|
||
{
|
||
var list = await _crmRepository.GetRepository<Teacher>().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<SelectItem>(key);
|
||
}*/
|
||
var list = await _crmRepository.GetRepository<Teacher>().QueryListAsync();
|
||
foreach (var item in list)
|
||
{
|
||
data.Add(new SelectItem(item.Code ?? "", $"{item.Name}({item.Code})"));
|
||
}
|
||
return data;
|
||
}
|
||
|
||
public async Task<List<SelectItem>> GetProductSelect()
|
||
{
|
||
var data = new List<SelectItem>();
|
||
/* var key = CacheKeys.ProductList;
|
||
if (!await _redisManager.ExistsAsync(key))
|
||
{
|
||
var list = await _crmRepository.GetRepository<Product>().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<SelectItem>(key);
|
||
}*/
|
||
var list = await _crmRepository.GetRepository<Product>().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<List<SelectItem>> GetStandardTypeSelect()
|
||
{
|
||
var key = CacheKeys.StandardType;
|
||
var data = new List<SelectItem>();
|
||
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<SelectItem>(key);
|
||
}
|
||
|
||
return data;
|
||
}
|
||
|
||
#endregion 下拉列表
|
||
|
||
#region 基础产品
|
||
|
||
public async Task<PageResult<ProductDto>> ProductPage(SearchProductDto dto)
|
||
{
|
||
var query = _crmRepository.GetRepository<Product>().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<ProductDto>(dto.PageIndex, dto.PageSize, total, data);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 基础产品编辑
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="ApiException"></exception>
|
||
public async Task<ProductEdit> 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<Product>().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<ProductTeacher>().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<Deptment>().Query().Where(n => deptGroup.Contains(n.Id)).ToListAsync();
|
||
List<ProTeacherInfo> proTeacherInfos = new List<ProTeacherInfo>();
|
||
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<teacherInfo> tealist = new List<teacherInfo>();
|
||
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<Product>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
if (product != null)
|
||
{
|
||
product.Active = 0;
|
||
await _crmRepository.GetRepository<Product>().UpdateAsync(product);
|
||
return;
|
||
}
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
|
||
public async Task ActiveProduct(string code)
|
||
{
|
||
var product = await _crmRepository.GetRepository<Product>().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<retMsg>(url);
|
||
if (result != null && result.result)
|
||
{
|
||
return;
|
||
}
|
||
throw new Exception("请求优品接口出错");
|
||
}
|
||
|
||
public async Task DownProduct(string code)
|
||
{
|
||
var product = await _crmRepository.GetRepository<Product>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
if (product != null)
|
||
{
|
||
product.Active = 2;
|
||
await _crmRepository.GetRepository<Product>().UpdateAsync(product);
|
||
return;
|
||
}
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
|
||
public async Task<string> 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<int>(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<string> orderStatus = new List<string>
|
||
// {
|
||
// "220","205","80","90"
|
||
// };
|
||
// var existModel = await _zxdRepository.GetRepository<WX_SZZYORDER>().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<Product>().Query().FirstOrDefaultAsync(n => n.Id == oldCode);
|
||
await _crmRepository.GetRepository<Product>().DeleteAsync(oldproduct);
|
||
var oldTeacher = await _crmRepository.GetRepository<ProductTeacher>().Query().Where(n => n.ProductId == oldproduct.Id).ToListAsync();
|
||
await _crmRepository.GetRepository<ProductTeacher>().BatchDeleteAsync(oldTeacher);
|
||
var oldbaseProduct = await _zxdRepository.GetRepository<BaseProduct>().Query().FirstOrDefaultAsync(n => n.Code == oldproduct.Id);
|
||
// 删除千托信息
|
||
await _zxdRepository.GetRepository<BaseProduct>().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<ProductTeacher>().InsertAsync(new ProductTeacher
|
||
{
|
||
Deptid = productTeacher.Deptid,
|
||
CreateTime = DateTime.Now,
|
||
UpdateTime = DateTime.Now,
|
||
IsPacks = false,
|
||
ProductId = code,
|
||
TeacherCode = teacher
|
||
});
|
||
}
|
||
}
|
||
}
|
||
await _crmRepository.GetRepository<Product>().InsertAsync(product);
|
||
await transaction.CommitAsync();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
await transaction.RollbackAsync();
|
||
await transaction.DisposeAsync();
|
||
Log.Error(ex, "添加基础产品错误!");
|
||
throw;
|
||
}
|
||
// 新增千托信息
|
||
await _zxdRepository.GetRepository<BaseProduct>().InsertAsync(baseProduct);
|
||
}
|
||
else
|
||
{
|
||
productCode = dto.ProductCode;
|
||
//更新优品信息
|
||
using var transaction = await _crmRepository.BeginTransactionAsync();
|
||
var product = await _crmRepository.GetRepository<Product>().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<ProductTeacher>().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<ProductTeacher>().InsertAsync(new ProductTeacher
|
||
{
|
||
Deptid = productTeacher.Deptid,
|
||
CreateTime = DateTime.Now,
|
||
UpdateTime = DateTime.Now,
|
||
IsPacks = false,
|
||
ProductId = code,
|
||
TeacherCode = teacher
|
||
});
|
||
}
|
||
}
|
||
}
|
||
await _crmRepository.GetRepository<ProductTeacher>().BatchDeleteAsync(oldTeacher);
|
||
await _crmRepository.GetRepository<Product>().UpdateAsync(product);
|
||
await transaction.CommitAsync();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
await transaction.RollbackAsync();
|
||
await transaction.DisposeAsync();
|
||
Log.Error(ex, "修改基础产品错误!");
|
||
throw;
|
||
}
|
||
//更新千托信息
|
||
var baseProduct = await _zxdRepository.GetRepository<BaseProduct>().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<BaseProduct>().UpdateAsync(baseProduct);
|
||
}
|
||
}
|
||
return productCode;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量导入产品
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<ImportBasicsProductViewModel>> ImportPreview(List<ImportBasicsProductDto> dto)
|
||
{
|
||
List<ImportBasicsProductViewModel> res = new List<ImportBasicsProductViewModel>();
|
||
//权限
|
||
var moduleList = await _crmRepository.GetRepository<Module>().Query().Where(n => dto.Select(x => x.ProductModule).Contains(n.Id)).ToListAsync();
|
||
//类型
|
||
var productGroupList = await _crmRepository.GetRepository<ProductGroup>().Query().Where(n => dto.Select(x => x.ProductType).Contains(n.Name)).ToListAsync();
|
||
var deptList = await _deptmentDomain.GetDeptments();
|
||
var teacherList = await _crmRepository.GetRepository<Teacher>().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<ImportProductTeacherDto> teaList = new List<ImportProductTeacherDto>();
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导入
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <returns></returns>
|
||
public async Task ImportProduct(List<CreateProductDto> dto)
|
||
{
|
||
foreach (var item in dto)
|
||
{
|
||
await CreateProduct(item);
|
||
Thread.Sleep(1000);
|
||
}
|
||
}
|
||
|
||
public async Task<List<ImportCombinationViewModel>> ImportCombinationProductPreview(List<ImportComProductDto> dto)
|
||
{
|
||
List<ImportCombinationViewModel> res = new List<ImportCombinationViewModel>();
|
||
//类型
|
||
var productGroupList = await _crmRepository.GetRepository<ProductGroup>().Query().Where(n => dto.Select(x => x.ProductType).Contains(n.Name)).ToListAsync();
|
||
var deptList = await _deptmentDomain.GetDeptments();
|
||
var teacherList = await _crmRepository.GetRepository<Teacher>().QueryListAsync();
|
||
List<string> productCodeList = new List<string>();
|
||
foreach (var item in dto)
|
||
{
|
||
productCodeList.AddRange(item.ProductCodes.Split(",").Where(n => !string.IsNullOrWhiteSpace(n)).ToList());
|
||
}
|
||
var productList = await _crmRepository.GetRepository<Product>().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<ProductInfo> productInfos = new List<ProductInfo>();
|
||
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<ImportProductTeacherDto> teaList = new List<ImportProductTeacherDto>();
|
||
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<Product>().QueryListAsync();
|
||
var baseProductList = await _zxdRepository.GetRepository<BaseProduct>().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<BaseProduct>().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<BaseProduct>().UpdateAsync(baseProduct);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion 基础产品
|
||
|
||
#region 组合产品
|
||
|
||
public async Task<PageResult<ProductPackageDto>> ProductPackagePage(SearchProductDto dto)
|
||
{
|
||
var productCodes = new List<string>();
|
||
if (!string.IsNullOrEmpty(dto.ProductModule))
|
||
{
|
||
productCodes = await _zxdRepository.GetRepository<BaseProductPackageRelation>().Query()
|
||
.Where(x => x.Moduleid == dto.ProductModule)
|
||
.Select(x => x.PackageCode ?? "")
|
||
.Distinct()
|
||
.ToListAsync();
|
||
}
|
||
var query = _crmRepository.GetRepository<ProductPackage>().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<string>();
|
||
data.ForEach(x => codes.AddRange(x.ProductCodes));
|
||
codes = codes.Distinct().ToList();
|
||
var products = await _crmRepository.GetRepository<Product>().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<string> modules = new List<string>();
|
||
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<ProductPackageDto>(dto.PageIndex, dto.PageSize, total, data);
|
||
}
|
||
|
||
public async Task InactiveProductPackage(string code)
|
||
{
|
||
var product = await _crmRepository.GetRepository<ProductPackage>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
if (product != null)
|
||
{
|
||
product.Active = 0;
|
||
await _crmRepository.GetRepository<ProductPackage>().UpdateAsync(product);
|
||
return;
|
||
}
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
|
||
public async Task DownProductPackage(string code)
|
||
{
|
||
var product = await _crmRepository.GetRepository<ProductPackage>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
if (product != null)
|
||
{
|
||
product.Active = 2;
|
||
await _crmRepository.GetRepository<ProductPackage>().UpdateAsync(product);
|
||
return;
|
||
}
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
|
||
public async Task ActiveProductPackage(string code)
|
||
{
|
||
var product = await _crmRepository.GetRepository<ProductPackage>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
if (product == null)
|
||
{
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
var basProCodes = product.SubProducts.Split("|").ToList();
|
||
var basproducts = await _crmRepository.GetRepository<Product>().Query().Where(n => basProCodes.Contains(n.Id)).ToListAsync();
|
||
List<string> moduleids = new List<string>();
|
||
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<retMsg>(url);
|
||
if (result != null && result.result)
|
||
{
|
||
return;
|
||
}
|
||
if (product != null)
|
||
{
|
||
product.Active = 1;
|
||
await _crmRepository.GetRepository<ProductPackage>().UpdateAsync(product);
|
||
return;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 查找存在重复的产品
|
||
/// </summary>
|
||
/// <param name="days"></param>
|
||
/// <param name="modules"></param>
|
||
/// <param name="price"></param>
|
||
/// <returns></returns>
|
||
private string IsHasDayPackge(int days, string[] modules, int price)
|
||
{
|
||
var relations = _zxdRepository.GetRepository<BaseProductPackageRelation>().Query().Where(m => modules.Contains(m.Moduleid) && m.Day == days).ToList().GroupBy(m => m.PackageCode);
|
||
foreach (var item in relations)
|
||
{
|
||
var packProduct = _zxdRepository.GetRepository<BaseProductPackageRelation>().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<BaseProductPackage>().Query().FirstOrDefault(m => m.Code == item.Key);
|
||
if (pack != null && pack.Price == price)
|
||
{
|
||
return pack.Code;
|
||
}
|
||
|
||
}
|
||
return "";
|
||
|
||
}
|
||
/// <summary>
|
||
/// 一键创建组合产品
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="ApiException"></exception>
|
||
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<CreateProductPackageDto> packList = new List<CreateProductPackageDto>();//需要创建的组合产品
|
||
//循环创建基础产品
|
||
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<CreateProductCodeDto>(),
|
||
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<BaseProduct>().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<BaseProduct>().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<Module>().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<string>() { 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<string> 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<int>(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<string> orderStatus = new List<string>
|
||
// {
|
||
// "220","205","80","90"
|
||
// };
|
||
// var existModel = await _zxdRepository.GetRepository<WX_SZZYORDER>().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<BaseProduct>().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<ProductPackage>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == oldCode);
|
||
await _crmRepository.GetRepository<ProductPackage>().DeleteAsync(oldproductPackage);
|
||
var oldTeacher = await _crmRepository.GetRepository<ProductTeacher>().Query().Where(n => n.ProductId == oldCode).ToListAsync();
|
||
await _crmRepository.GetRepository<ProductTeacher>().BatchDeleteAsync(oldTeacher);
|
||
var oldbaseProductPackage = await _zxdRepository.GetRepository<BaseProductPackage>().Query().FirstOrDefaultAsync(n => n.Code == oldCode);
|
||
await _zxdRepository.GetRepository<BaseProductPackage>().DeleteAsync(oldbaseProductPackage);
|
||
var oldRelationList = await _zxdRepository.GetRepository<BaseProductPackageRelation>().Query().Where(n => n.PackageCode == oldCode).ToListAsync();
|
||
await _zxdRepository.GetRepository<BaseProductPackageRelation>().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<ProductTeacher>().InsertAsync(new ProductTeacher
|
||
{
|
||
Deptid = productTeacher.Deptid,
|
||
CreateTime = DateTime.Now,
|
||
UpdateTime = DateTime.Now,
|
||
IsPacks = false,
|
||
ProductId = code,
|
||
TeacherCode = teacher
|
||
});
|
||
}
|
||
}
|
||
}
|
||
await _crmRepository.GetRepository<ProductPackage>().InsertAsync(productPackage);
|
||
await transactionCrm.CommitAsync();
|
||
|
||
// 新增千托信息
|
||
if (dto.ProductCodes != null && dto.ProductCodes.Any())
|
||
{
|
||
foreach (var productCode in dto.ProductCodes)
|
||
{
|
||
var baseproduct = await _crmRepository.GetRepository<Product>().Query().FirstOrDefaultAsync(m => m.Id == productCode.ProductCode);
|
||
await _zxdRepository.GetRepository<BaseProductPackageRelation>().InsertAsync(new BaseProductPackageRelation
|
||
{
|
||
PackageCode = code,
|
||
ProductCode = productCode.ProductCode,
|
||
Price = productCode.Price,
|
||
Day = baseproduct.Day,
|
||
Moduleid = baseproduct.Moduleid,
|
||
ProductName = baseproduct.Name
|
||
});
|
||
}
|
||
}
|
||
await _zxdRepository.GetRepository<BaseProductPackage>().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<ProductPackage>().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<ProductTeacher>().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<ProductTeacher>().InsertAsync(new ProductTeacher
|
||
{
|
||
Deptid = productTeacher.Deptid,
|
||
CreateTime = DateTime.Now,
|
||
UpdateTime = DateTime.Now,
|
||
IsPacks = false,
|
||
ProductId = code,
|
||
TeacherCode = teacher
|
||
});
|
||
}
|
||
}
|
||
}
|
||
await _crmRepository.GetRepository<ProductTeacher>().BatchDeleteAsync(oldTeacher);
|
||
await _crmRepository.GetRepository<ProductPackage>().UpdateAsync(productPackage);
|
||
await transactionCrm.CommitAsync();
|
||
|
||
// 新增千托信息
|
||
var baseProductPackage = await _zxdRepository.GetRepository<BaseProductPackage>().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<BaseProductPackage>().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<BaseProductPackage>().InsertAsync(baseProductPackage);
|
||
}
|
||
var oldRelationList = await _zxdRepository.GetRepository<BaseProductPackageRelation>().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<Product>().Query().FirstOrDefaultAsync(m => m.Id == productCode.ProductCode);
|
||
await _zxdRepository.GetRepository<BaseProductPackageRelation>().InsertAsync(new BaseProductPackageRelation
|
||
{
|
||
PackageCode = code,
|
||
ProductCode = productCode.ProductCode,
|
||
Price = productCode.Price,
|
||
Day = baseproduct.Day,
|
||
Moduleid = baseproduct.Moduleid,
|
||
ProductName = baseproduct.Name
|
||
});
|
||
}
|
||
}
|
||
await _zxdRepository.GetRepository<BaseProductPackageRelation>().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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 组合产品编辑
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <returns></returns>
|
||
public async Task<EditProductPackageDto> 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<Product>().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<ProductPackage>().Query()
|
||
.FirstOrDefaultAsync(x => x.Id == dto.ProductCode);
|
||
if (product == null)
|
||
{
|
||
throw new ApiException("产品不存在或已删除!");
|
||
}
|
||
var subCodes = product.SubProductCodes;
|
||
var subProductList = await _crmRepository.GetRepository<Product>().Query().Where(n => subCodes.Contains(n.Id)).ToListAsync();
|
||
List<CreateProductCodeDto> subProCodes = new List<CreateProductCodeDto>();
|
||
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<ProductTeacher>().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<Deptment>().Query().Where(n => deptGroup.Contains(n.Id)).ToListAsync();
|
||
List<ProTeacherInfo> proTeacherInfos = new List<ProTeacherInfo>();
|
||
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<teacherInfo> tealist = new List<teacherInfo>();
|
||
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<ProductPackage>().QueryListAsync();
|
||
var baseProductPackageList = await _zxdRepository.GetRepository<BaseProductPackage>().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<Product>().Query()
|
||
.Where(x => x.Id == subProduct.SubProductId)
|
||
.FirstOrDefaultAsync();
|
||
await _zxdRepository.GetRepository<BaseProductPackageRelation>().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<BaseProductPackage>().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<BaseProductPackage>().UpdateAsync(baseProductPackage);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion 组合产品
|
||
|
||
#region 基准产品
|
||
|
||
public async Task<BaseProductInfoDto> GetBaseProduct(string code)
|
||
{
|
||
if (string.IsNullOrEmpty(code))
|
||
{
|
||
throw new ApiException("产品编码不能为空!");
|
||
}
|
||
|
||
var product = await _crmRepository.GetRepository<Product>().Query()
|
||
.Include(x => x.ProductGroup)
|
||
.Include(x => x.Module)
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
var productPackage = await _crmRepository.GetRepository<ProductPackage>().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<string>() { product.Moduleid ?? "" }
|
||
};
|
||
}
|
||
|
||
if (productPackage != null)
|
||
{
|
||
var productCodes = string.IsNullOrEmpty(productPackage.SubProducts) ? new List<string>()
|
||
: 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<Product>().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<Product>().Query()
|
||
.Include(x => x.ProductGroup)
|
||
.Include(x => x.Module)
|
||
.FirstOrDefaultAsync(x => x.Id == code);
|
||
var productPackage = await _crmRepository.GetRepository<ProductPackage>().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<StandardProduct>().InsertAsync(standardProduct);
|
||
}
|
||
|
||
public async Task<PageResult<StandardProductDto>> StandardProductPage(SearchStandardProductDto dto)
|
||
{
|
||
var productCodes = new List<string>();
|
||
var productPackageCodes = new List<string>();
|
||
if (!string.IsNullOrEmpty(dto.ProductName))
|
||
{
|
||
productCodes = await _crmRepository.GetRepository<Product>().Query()
|
||
.Where(x => x.Name.Contains(dto.ProductName))
|
||
.Select(x => x.Id)
|
||
.ToListAsync();
|
||
|
||
productPackageCodes = await _crmRepository.GetRepository<ProductPackage>().Query()
|
||
.Where(x => x.Name.Contains(dto.ProductName))
|
||
.Select(x => x.Id)
|
||
.ToListAsync();
|
||
}
|
||
var query = _zxdRepository.GetRepository<StandardProduct>().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<Product>();
|
||
var productPackageList = new List<ProductPackage>();
|
||
var productPackageProductList = new List<Product>();
|
||
if (data.Any())
|
||
{
|
||
productList = await _crmRepository.GetRepository<Product>().Query()
|
||
.Where(x => data.Select(y => y.ProductCode).Contains(x.Id))
|
||
.Include(x => x.Module)
|
||
.Include(x => x.ProductGroup)
|
||
.ToListAsync();
|
||
productPackageList = await _crmRepository.GetRepository<ProductPackage>().Query()
|
||
.Where(x => data.Select(y => y.ProductCode).Contains(x.Id))
|
||
.Include(x => x.ProductGroup)
|
||
.ToListAsync();
|
||
if (productPackageList.Any())
|
||
{
|
||
var productPackageProductCodes = new List<string>();
|
||
productPackageList.ForEach(x =>
|
||
{
|
||
if (x.SubProductCodes != null && x.SubProductCodes.Any())
|
||
{
|
||
productPackageCodes.AddRange(x.SubProductCodes);
|
||
}
|
||
});
|
||
productPackageProductList = await _crmRepository.GetRepository<Product>().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<string> { $"{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<StandardProductDto>(dto.PageIndex, dto.PageSize, total, data);
|
||
}
|
||
|
||
public async Task ImportCombinationProduct(List<CreateProductPackageDto> dto)
|
||
{
|
||
foreach (var product in dto)
|
||
{
|
||
await CreateProductPackage(product);
|
||
Thread.Sleep(1000);
|
||
}
|
||
}
|
||
|
||
#endregion 基准产品
|
||
|
||
#region 合同相关
|
||
|
||
/// <summary>
|
||
/// 获取合同地址 免费活动订单需传自定义的产品名
|
||
/// </summary>
|
||
/// <param name="ordeid"></param>
|
||
/// <param name="productName"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="Exception"></exception>
|
||
public async Task<string> GetContractByFreeOrderId(decimal ordeid)
|
||
{
|
||
var orderInfo = await GetContractOrderInfo(ordeid);
|
||
|
||
var product = await GetProductInfo(orderInfo.productcode);// _zxdRepository.GetRepository<WxSzzySubproduct>().FirstOrDefaultAsync(n => n.productcode == freeOrder.subproductcode);//合同地址
|
||
if (product == null)
|
||
{
|
||
throw new Exception("找不到对应的产品");
|
||
}
|
||
var urlKey = await _zxdRepository.GetRepository<BAS_PARAMETER>().FirstOrDefaultAsync(n => n.PARAKEY == "UserCenter_RiaService_ContractSignThree");//合同地址
|
||
var threeUrl = urlKey?.PARAVALUE;
|
||
var clientidKey = await _zxdRepository.GetRepository<BAS_PARAMETER>().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<SystemConfig>();
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取订单所需要的合同信息 免费产品需传坐席的名称
|
||
/// </summary>
|
||
/// <param name="ordeid"></param>
|
||
/// <param name="productname"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="Exception"></exception>
|
||
public async Task<ContractOrderInfo> GetContractOrderInfo(decimal orderid)
|
||
{
|
||
var result = new ContractOrderInfo();
|
||
var order = await _zxdRepository.GetRepository<WX_SZZYORDER>().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<Wx_SzzyOrder_HandGift>().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<L2_SOFT_ORDER>().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<ProductModuleInfo> GetProductInfo(string code)
|
||
{
|
||
var basProduct = await _crmRepository.GetRepository<Product>().Query().FirstOrDefaultAsync(n => n.Id == code);
|
||
if (basProduct == null)
|
||
{
|
||
var productPackage = await _crmRepository.GetRepository<ProductPackage>().Query().FirstOrDefaultAsync(n => n.Id == code);
|
||
if (productPackage != null)
|
||
{
|
||
var idArr = new List<string>(productPackage.SubProducts.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries));
|
||
|
||
basProduct = await _crmRepository.GetRepository<Product>().Query().FirstOrDefaultAsync(n => n.Id == idArr[0]);
|
||
}
|
||
}
|
||
if (basProduct == null)
|
||
{
|
||
throw new Exception("找不到对应的产品");
|
||
}
|
||
var module = await _crmRepository.GetRepository<Module>().Query().FirstOrDefaultAsync(n => n.Id == basProduct.Moduleid);
|
||
return new ProductModuleInfo
|
||
{
|
||
productinvesttime = module?.InvestTime,
|
||
productinvesttype = module?.InvestType,
|
||
productlevel = module?.RiskLevel
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查看投顾协议 风险协议 风测 等数据
|
||
/// </summary>
|
||
/// <param name="orderid"></param>
|
||
/// <returns></returns>
|
||
public async Task<ContractResultView> 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<BAS_PARAMETER>().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<SystemConfig>();
|
||
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<RiskInfoDto>(riskinfoUrl, para);
|
||
//var ret1 = JsonConvert.DeserializeObject<RiskInfoDto>(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<string> GetBasParameterValue(string key)
|
||
{
|
||
var urlKey = await _zxdRepository.GetRepository<BAS_PARAMETER>().FirstOrDefaultAsync(n => n.PARAKEY == key);//合同地址
|
||
return urlKey?.PARAVALUE;
|
||
}
|
||
|
||
#endregion 合同相关
|
||
}
|
||
} |