crm.core/code/Crm.Core.Domain/OrderDomain.cs

515 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Crm.Core.Domain.Dto.Order;
using Microsoft.Extensions.DependencyInjection;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Crm.Core.Domain
{
internal class OrderDomain : IOrderDomain
{
private readonly ICacheDomain _cacheDomain;
private readonly IServiceProvider _serviceProvider;
private readonly IUserInfoDomain _userInfoDomain;
private readonly SystemConfig _systemConfig;
private readonly IConfiguration _configuration;
private readonly IHttpClient _httpClient;
public OrderDomain(ICacheDomain cacheDomain, IConfiguration configuration, IHttpClient httpClient,
IServiceProvider serviceProvider, IUserInfoDomain userInfoDomain)
{
_cacheDomain = cacheDomain;
_serviceProvider = serviceProvider;
_userInfoDomain = userInfoDomain;
_configuration = configuration;
_systemConfig = _configuration.GetSection("SystemConfig").Get<SystemConfig>();
_httpClient = httpClient;
}
public async Task UpdateOrderRealName(UpdateOrderRealNameDto dto)
{
var appid = _cacheDomain.GetApp();
using var scope = _serviceProvider.CreateAsyncScope();
Log.Information($"更新的实名信息appid: {appid}, {dto.ToJson()}");
var repository = scope.ServiceProvider.GetRequiredService<IOracleRepository<CrmDbContext>>();
await _cacheDomain.SetApp(repository, appid);
var orders = await repository.GetRepository<WX_SZZYORDER>().Query()
.Where(x => dto.Orderids.Contains(x.ORDERID)).ToListAsync() ?? throw new ApiException("订单信息不存在!");
orders.ForEach(order =>
{
order.CNAME = dto.RealName;
});
await repository.GetRepository<WX_SZZYORDER>().BatchUpdateAsync(orders, x => new { x.CNAME });
}
#region
/// <summary>
/// 获取创建订单需要的信息
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<CreateOrderInfo> GetCreateOrderSelectItem(GetCreateOrderQueryDto dto)
{
using var scope = _serviceProvider.CreateAsyncScope();
var repository = scope.ServiceProvider.GetRequiredService<IOracleRepository<CrmDbContext>>();
await _cacheDomain.SetApp(repository, dto.deptid.Value);
//获取用户信息
CreateOrderInfo res = new CreateOrderInfo();
var userList = await _userInfoDomain.GetUserInfoByApi(dto.appid, dto.extuserid);
var resids = userList.Where(n => !string.IsNullOrWhiteSpace(n.resid)).Select(n => n.resid).Distinct().ToList();
var customerList = await repository.GetRepository<RES_CUSTOMER>().Query().Where(n => resids.Contains(n.RESID)).ToListAsync();
var customerdetail = await repository.GetRepository<RES_CUSTOMERDETAIL>().Query().Where(n => resids.Contains(n.RESID)).ToListAsync();
var softuserList = await repository.GetRepository<SOFT_USER>().Query().Where(n => resids.Contains(n.RESID)).ToListAsync();
List<RescustomerInfo> customerinfos = new List<RescustomerInfo>();
foreach (var item in softuserList)
{
customerinfos.Add(new RescustomerInfo
{
username = item.USERNAME,
umid = customerList.FirstOrDefault(n => n.RESID == item.RESID)?.UMID,
cname = customerdetail.FirstOrDefault(n => n.RESID == item.RESID)?.CNAME,
});
}
res.userinfos = customerinfos;
//获取所有有渠道的部门
List<DeptList> deptLists = new List<DeptList>();
var deptList = await repository.GetRepository<BAS_SALESDEPARTMENT>().Query().Where(p => p.CHANNELDEF != null && p.CHANNELDEF != 0).ToListAsync();
foreach (var dept in deptList)
{
deptLists.Add(new DeptList { deptname = dept.DEPTNAME, saledeptcode = dept.SALEDEPTCODE });
}
res.deptLists = deptLists;
var minproduct = await repository.GetRepository<WX_SZZYMIDPRODUCT>().Query().ToListAsync();
List<MinProductInfo> minProductInfos = new List<MinProductInfo>();
foreach (var min in minproduct)
{
minProductInfos.Add(new MinProductInfo { minproductid = min.MIDPRODUCTID, minproductname = min.MIDPRODUCTNAME });
}
res.minProductInfos = minProductInfos;
return res;
}
/// <summary>
/// 根据大类获取产品编码
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<List<ProductInfo>> GetProductByMinType(ProductQueryByMinProductId dto)
{
List<ProductInfo> res = new List<ProductInfo>();
using var scope = _serviceProvider.CreateAsyncScope();
var repository = scope.ServiceProvider.GetRequiredService<IOracleRepository<CrmDbContext>>();
await _cacheDomain.SetApp(repository, dto.deptid.Value);
var proList = await repository.GetRepository<WX_SZZYSUBPRODUCT>().Query().Where(n => n.ISVALID == 1 && n.ISSHOW == 1 && n.MIDPRODUCTID == dto.minProductId).ToListAsync();
foreach (var pro in proList)
{
res.Add(new ProductInfo { productCode = pro.PRODUCTCODE, productName = pro.SUBPRODUCTNAME + "(" + pro.RIGHTPERIOD + ")" });
}
return res;
}
/// <summary>
/// 获取产品信息 折扣价等
/// </summary>
/// <param name="productcode"></param>
/// <returns></returns>
public async Task<ProductDetail> GetProductDetail(ProductQueryDto dto)
{
ProductDetail res = new ProductDetail();
using var scope = _serviceProvider.CreateAsyncScope();
var repository = scope.ServiceProvider.GetRequiredService<IOracleRepository<CrmDbContext>>();
await _cacheDomain.SetApp(repository, dto.deptid.Value);
try
{
var subProduct = await repository.GetRepository<WX_SZZYSUBPRODUCT>().Query().FirstOrDefaultAsync(m => m.PRODUCTCODE == dto.productcode);
if (subProduct == null)
{
throw new Exception("找不到对应的产品");
}
res.price = subProduct.PRICE;
res.days = subProduct.RIGHTPERIOD;
List<decimal> custompriceList = new List<decimal>();
//折扣价格
if (!string.IsNullOrEmpty(subProduct.CUSTOMPRICE))
{
var newList = subProduct.CUSTOMPRICE.Split(',').Where(n => !string.IsNullOrWhiteSpace(n)).Select(n => Convert.ToDecimal(n)).ToList();
custompriceList.AddRange(newList);
if (!string.IsNullOrEmpty(subProduct.HID_CUSTOMPRICE))
{
var oldList = subProduct.CUSTOMPRICE.Split(',');
var hideList = subProduct.HID_CUSTOMPRICE.Split(',');
var otherlist = oldList.Where(m => !hideList.Contains(m)).Where(n => !string.IsNullOrWhiteSpace(n)).Select(n => Convert.ToDecimal(n)).ToList();
custompriceList.AddRange(otherlist);
}
}
res.customprisce = custompriceList;
//折扣区间
var pricerange = string.Empty;
if (subProduct.ISDISCOUNTAREA == 1)
{
if (!string.IsNullOrEmpty(subProduct.DISCOUNTAREA))
{
var area = JsonHelper.FromJson<List<DiscountArea>>(subProduct.DISCOUNTAREA);
var range = area.Where(p => p.IsShow == 1).ToList();
res.discountAreas = range;
}
}
var gifts = await repository.GetRepository<WX_SZZYSUBPRODUCT_GIFT>().Query().Where(m => m.SUBPRODUCTID == subProduct.SUBPRODUCTID).ToListAsync();
//赠送天数
if (subProduct.ISGIFT == 1 && gifts.Any())
{
List<decimal> mma = new List<decimal> { 1, 2 };
var orderactiveList = await repository.GetRepository<WX_ORDERACTIVE>().Query().Where(M => M.PRODUCTCODE == subProduct.PRODUCTCODE && M.GIFTYPE.Contains("[Order]") && mma.Contains(M.ISFOLLOWORDER.Value)).ToListAsync();//订单的赠送配置
var entr = orderactiveList.FirstOrDefault(m => m.ISFOLLOWORDER == 1);
var giftData = new object { };
if (entr != null)
{
res.giftInfos = gifts.Where(p => p.TYPE == 1 && p.ISSHOW == 1).OrderBy(p => p.SORT).Select(p => new GiftInfo { giftday = p.GIFTDAYS, giftdayname = p.GIFTDAYSNAME, giftname = p.GIFTNAME }).ToList();
}
var entr2 = orderactiveList.FirstOrDefault(m => m.ISFOLLOWORDER == 2);
var giftData2 = new object { };
if (entr2 != null)
{
res.othergiftInfos = gifts.Where(p => p.TYPE == 2 && p.ISSHOW == 1).OrderBy(p => p.SORT).Select(p => new GiftInfo { giftday = p.GIFTDAYS, giftdayname = p.GIFTDAYSNAME, giftname = p.GIFTNAME }).ToList();
}
}
}
catch (Exception ex)
{
throw new Exception($"获取产品错误{ex.Message}");
}
return res;
}
public async Task<bool> CreateOrder(CreateOrderDto dto)
{
using var scope = _serviceProvider.CreateAsyncScope();
var repository = scope.ServiceProvider.GetRequiredService<IOracleRepository<CrmDbContext>>();
await _cacheDomain.SetApp(repository, dto.deptid);
var softuser = await repository.GetRepository<SOFT_USER>().Query().FirstOrDefaultAsync(n => n.USERNAME == dto.softUsername);
if (softuser == null)
{
throw new Exception("客户信息不正确");
}
var customer = await repository.GetRepository<RES_CUSTOMER>().Query().FirstOrDefaultAsync(n => n.RESID == softuser.RESID);
var customerdetail = await repository.GetRepository<RES_CUSTOMERDETAIL>().Query().FirstOrDefaultAsync(n => n.RESID == softuser.RESID);
var subproduct = await repository.GetRepository<WX_SZZYSUBPRODUCT>().Query().FirstOrDefaultAsync(n => n.PRODUCTCODE == dto.productCode);
var product = await repository.GetRepository<WX_SZZYPRODUCT>().Query().FirstOrDefaultAsync(n => n.PRODUCTID == subproduct.PRODUCTID);
var user = await repository.GetRepository<BAS_INNERUSER>().Query().FirstOrDefaultAsync(n => n.EID == dto.eid);
var saledept = await repository.GetRepository<BAS_SALESDEPARTMENT>().Query().FirstOrDefaultAsync(n => n.SALEDEPTCODE == dto.deptCode);
var linedept = await _cacheDomain.GetDeptments();
var comdept = linedept.FirstOrDefault(n => n.Id == dto.deptid);
if (customer == null || customerdetail == null)
{
throw new Exception("客户信息不正确");
}
var key = _systemConfig.GetAccessKey(_systemConfig.CRMClientKey);
var resourceMobile = await repository.GetRepository<RES_RESOURCEMOBILE>().FirstOrDefaultAsync(x => x.RESID == softuser.RESID);
var mobile = SecurityHelper.DecyptData(resourceMobile.MOBILE, key);
var themodel = new ordermodel
{
umid = customer.UMID,
cname = customerdetail.CNAME,
ordertype = dto.orderType,
productId = subproduct.PRODUCTID.Value,
productname = product.PRODUCTNAME,
remark = dto.remark,
saledeptid = null,
source = dto.source,
softusername = softuser.USERNAME,
bigproductcode = product.PRODUCTCODE,
productcode = subproduct.PRODUCTCODE,
subProductId = subproduct.SUBPRODUCTID.Value,
subproductname = subproduct.SUBPRODUCTNAME,
userid = user.PKID,
count = 1,
productType = Convert.ToInt32(subproduct.PRODUCTTYPE),
companycode = comdept.Code,
upgradeorderids = dto.upgradeorderids,
giftdays = dto.giftdays,
giftdays2 = dto.giftdays2,
customprisce = dto.customprisce,
estimateotime = DateTime.Now,
eid = dto.eid,
deptcode = dto.deptCode,
channel = saledept?.CHANNELMIN,
mobile = mobile,
opendays = subproduct?.RIGHTPERIOD,
discount = dto.pricerange,
needpay = dto.customprisce.HasValue ? dto.customprisce : dto.pricerange.HasValue ? dto.pricerange : subproduct.PRICE
};
if (themodel.source == "1")
{
themodel.corpid = dto.appid.Replace("_1", "");
themodel.jobuserid = dto.appuserid;
themodel.external_userid = dto.extuserid;
}
//调用中心点接口.
var url = await _cacheDomain.GetValueParameter("Core_ZxdService_CreateOrder");
var clientid = "UPWEBSITE";
var clientKey = _systemConfig.GetAccessKey(clientid);
var postJson = SecurityHelper.CreateSignEncodingStr(themodel.ToJson(), clientid, clientKey);
var retmsg = HttpHelper.GetData(url, postJson, Encoding.UTF8);
retmsg = SecurityHelper.DecyptData(retmsg, clientKey);
CreateOrderRsp retmessage = JsonHelper.FromJson<CreateOrderRsp>(retmsg);
if (retmessage.retCode == 10000)//成功
{
//创建订单
WX_SZZYORDER order = new WX_SZZYORDER
{
UPGRADEORDERIDS = dto.upgradeorderids,
OPERATETIME = DateTime.Now,
INNERUSERID = user?.PKID,
EID = user?.EID,
RESID = customer.RESID,
UMID = customer.UMID,
ISFINANCEPAY = 0,
OPENORDER = 0,
ISOPEN = 0,
ORDERTYPE = dto.orderType,
ORDERSTATUS = "180",
ORDERSTATUSNAME = "新订单",
PRODUCTNAME = product.PRODUCTNAME,
NEEDPAY = themodel.needpay,
RETURNNEEDPAY = subproduct.PRICE,
SOURCE = dto.source,
PRODUCTID = product.PRODUCTID,
SUBPRODUCTID = subproduct.SUBPRODUCTID,
CTIME = DateTime.Now,
RET = dto.pricerange,
RETP = dto.customprisce,
SUBPRODUCTNAME = subproduct.SUBPRODUCTNAME,
OPENDAYS = subproduct.RIGHTPERIOD,
CNAME = themodel?.cname,
ESTIMATEOTIME = themodel.estimateotime,
TOTALUPGRADEVALUE = themodel.totalupgradevalue,
REQUESTSTATUS = 1,
GIFTDAYS = themodel.giftdays,
GIFTDAYS2 = themodel.giftdays2,
DEPTCODE = themodel.deptcode,
SZZYORDERID = Convert.ToDecimal(retmessage.orderId),
ORDERID = Convert.ToDecimal(retmessage.selfOirderId),
FCTEXT = $"{dto.eid}:100%"
};
if (dto.source == "1")
{
order.EXTERNAL_USERID = dto.extuserid;
}
await repository.GetRepository<WX_SZZYORDER>().InsertAsync(order);
var payNo = "";
int? paytype = 0;
if (dto.payInfo != null && dto.payInfo.Count > 0)
{
payNo = dto.payInfo[0].payno;
paytype = dto.payInfo[0].paytype;
}
var orderExt = new WX_ORDEREXT
{
ORDERID = order.ORDERID,
PAYNO = payNo,
ISPAYED = 0,
OPENDAYS = order.OPENDAYS,
NAME = order.CNAME,
SOFTUSERNAME = softuser.USERNAME,
PAYTYPE = paytype > 0 ? paytype : null,
BOOKNUM = 1,
CHANNEL = themodel.channel.ToString()
};
await repository.GetRepository<WX_ORDEREXT>().InsertAsync(orderExt);
//设置分成
try
{
var pkid = await _cacheDomain.GetSeq_smallid_get(dto.deptid);
var usergroup = await repository.GetRepository<BAS_INNERUSERGROUP>().FirstOrDefaultAsync(n => n.INNERUSERID == user.PKID);
var wxCommissionRuleModel = new WX_COMMISSIONRULE()
{
PKID = pkid,
ORDERID = order.ORDERID,
SZZYORDERID = order.SZZYORDERID,
SALEUSERID = user.PKID,
EID = order.EID,
COMMISSIONRATIO = 100,
ISMAIN = 1,
CREATEUSERID = user.PKID,
CREATETIME = DateTime.Now,
ENAME = user?.UNAME,
};
if (usergroup != null)
{
var group = await repository.GetRepository<BAS_INNERGROUP>().FirstOrDefaultAsync(n => n.GID == usergroup.GID);
if (group == null)
{
var dept = await repository.GetRepository<BAS_SALESDEPARTMENT>().FirstOrDefaultAsync(n => n.SALEDEPTID == usergroup.DEPTID);
wxCommissionRuleModel.GID = dept?.SALEDEPTID;
wxCommissionRuleModel.GNAME = dept?.DEPTNAME;
}
else
{
wxCommissionRuleModel.GID = group.GID;
wxCommissionRuleModel.GNAME = group.GNAME;
}
}
await repository.GetRepository<WX_COMMISSIONRULE>().InsertAsync(wxCommissionRuleModel);
}
catch (Exception ex)
{
Log.Error($"订单{order.ORDERID}设置分成失败{ex.Message}");
}
//提交支付记录
if (dto.payInfo != null && dto.payInfo.Count > 0)
{
var orderuselist = new List<OrderuseDto>() {
new OrderuseDto() { orderid = Convert.ToInt32(order.ORDERID), needpay = themodel.needpay.Value, arrivalpay = 0 }
};
List<PayInfoDto> paylist = new List<PayInfoDto>();
foreach (var pay in dto.payInfo)
{
var paytypename = "未知";
switch (int.Parse(pay.paytype.ToString()))
{
case 1: paytypename = "支付宝"; break;
case 3: paytypename = "银行转账"; break;
case 5: paytypename = "微信支付"; break;
}
paylist.Add(new PayInfoDto
{
resid = order.RESID,
paytype = pay.paytype,
paytypename = paytypename,
paydate = pay.paydate,
payprice = pay.payprice,
payname = pay.payname,
remark = pay.remark,
payno = pay.payno,
isuse = 0,
companycode = themodel.companycode,
tradeno = null,
creator = Convert.ToInt32(user.EID),
creatorname = user.UNAME
});
}
var paydto = new PayPostZxdDto
{
orderuselist = orderuselist,
resid = order.RESID,
deptcode = themodel.deptcode,
paylist = paylist
};
var payurl = await _cacheDomain.GetValueParameter("Core_PayService_OrderPay");
var paypost = SecurityHelper.CreateSignEncodingStr(paydto.ToJson(), clientid, clientKey);
Log.Information("payurl:" + payurl + "?" + paypost);
var rep = HttpHelper.GetData(payurl, paypost, Encoding.UTF8);
var payretmsg = JsonHelper.FromJson<retMsg<List<DepositInfoDto>>>(rep);
if (payretmsg.result)
{
var paynoFilter = paydto.paylist.Select(n => n.payno).ToList();
var depostList = await repository.GetRepository<WX_SZZYORDERDEPOSIT>().Query().Where(p => paynoFilter.Contains(p.PAYNO) && p.AUDITSTATUS == 1 && p.PAYNO != null).ToListAsync();
List<WX_SZZYORDERDEPOSIT> adddepostList = new List<WX_SZZYORDERDEPOSIT>();
foreach (var payinfo in paydto.paylist)
{
decimal usepriceall = 0;
decimal lastpriceall = 0;
//查看是否已经有确认到账记录
var depost = depostList.FirstOrDefault(n => n.PAYNO == payinfo.payno);
var depositId = 0;
if (depost == null)
{
var depositinfiList = payretmsg.retmsg;
depositId = depositinfiList.Find(p => p.payno == payinfo.payno).id;
lastpriceall = payinfo.payprice;
}
else
{
depositId = Convert.ToInt32(depost.ID);
//如果已经存在说明已经使用过了,那要重新计算使用金额跟剩余金额
usepriceall = depost.USEPRICE ?? 0;
lastpriceall = depost.LASTPRICE ?? 0;
}
foreach (var item in paydto.orderuselist)
{
if (lastpriceall <= 0)
{
//如果剩余金额小于等于0说明已经没钱支付了不执行下面的操作
continue;
}
order = await repository.GetRepository<WX_SZZYORDER>().FirstOrDefaultAsync(n => n.ORDERID == order.ORDERID);
if (order == null)
throw new Exception("参数错误,未能找到订单!");
else
{
//如果已经支付过,赋值到当前临时记录的到账金额
if (order.ARRIVALPAY.HasValue)
item.arrivalpay = order.ARRIVALPAY.Value;
if (order.ORDERSTATUS == "180" || order.ORDERSTATUS == "190" || order.ORDERSTATUS == "195")
{
order.ORDERSTATUS = "190";
order.ORDERSTATUSNAME = "已提交支付";
await repository.GetRepository<WX_SZZYORDER>().UpdateAsync(order);
}
else
{
//已经是支付状态,说明已经给够钱了,不需要再支付了
Log.Information(order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!");
continue;
//return new retMsg { result = false, retcode = 100, retmsg = order.ORDERID.ToString() + "支付金额已经够了,不需要再支付了!" };
}
}
}
if (depost == null)
{
depost = new WX_SZZYORDERDEPOSIT
{
ID = depositId,
RESID = payinfo.resid,
PAYTYPE = payinfo.paytype,
PAYTYPENAME = payinfo.paytypename,
PAYDATE = payinfo.paydate,
PAYPRICE = payinfo.payprice,
PAYNAME = payinfo.payname,
REMARK = payinfo.remark,
PAYNO = payinfo.payno,
ISUSE = payinfo.isuse,
COMPANYCODE = payinfo.companycode,
TRADENO = payinfo.tradeno,
CREATOR = payinfo.creator,
CREATORNAME = payinfo.creatorname,
USEPRICE = usepriceall,
LASTPRICE = lastpriceall,
DEPTCODE = paydto.deptcode,
CTIME = DateTime.Now
};
adddepostList.Add(depost);
}
else
{
depost.USEPRICE = usepriceall;
depost.LASTPRICE = lastpriceall;
}
}
if (adddepostList.Count > 0)
{
await repository.GetRepository<WX_SZZYORDERDEPOSIT>().BatchInsertAsync(adddepostList);
}
if (depostList.Count > 0)
{
await repository.GetRepository<WX_SZZYORDERDEPOSIT>().BatchUpdateAsync(depostList);
}
}
}
}
return true;
}
#endregion
}
}