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(); _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>(); await _cacheDomain.SetApp(repository, appid); var orders = await repository.GetRepository().Query() .Where(x => dto.Orderids.Contains(x.ORDERID)).ToListAsync() ?? throw new ApiException("订单信息不存在!"); orders.ForEach(order => { order.CNAME = dto.RealName; }); await repository.GetRepository().BatchUpdateAsync(orders, x => new { x.CNAME }); } #region 企微侧边栏 创建订单 /// /// 获取创建订单需要的信息 /// /// /// public async Task GetCreateOrderSelectItem(GetCreateOrderQueryDto dto) { using var scope = _serviceProvider.CreateAsyncScope(); var repository = scope.ServiceProvider.GetRequiredService>(); 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().Query().Where(n => resids.Contains(n.RESID)).ToListAsync(); var customerdetail = await repository.GetRepository().Query().Where(n => resids.Contains(n.RESID)).ToListAsync(); var softuserList = await repository.GetRepository().Query().Where(n => resids.Contains(n.RESID)).ToListAsync(); List customerinfos = new List(); 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 deptLists = new List(); var deptList = await repository.GetRepository().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().Query().ToListAsync(); List minProductInfos = new List(); foreach (var min in minproduct) { minProductInfos.Add(new MinProductInfo { minproductid = min.MIDPRODUCTID, minproductname = min.MIDPRODUCTNAME }); } res.minProductInfos = minProductInfos; return res; } /// /// 根据大类获取产品编码 /// /// /// public async Task> GetProductByMinType(ProductQueryByMinProductId dto) { List res = new List(); using var scope = _serviceProvider.CreateAsyncScope(); var repository = scope.ServiceProvider.GetRequiredService>(); await _cacheDomain.SetApp(repository, dto.deptid.Value); var proList = await repository.GetRepository().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; } /// /// 获取产品信息 折扣价等 /// /// /// public async Task GetProductDetail(ProductQueryDto dto) { ProductDetail res = new ProductDetail(); using var scope = _serviceProvider.CreateAsyncScope(); var repository = scope.ServiceProvider.GetRequiredService>(); await _cacheDomain.SetApp(repository, dto.deptid.Value); try { var subProduct = await repository.GetRepository().Query().FirstOrDefaultAsync(m => m.PRODUCTCODE == dto.productcode); if (subProduct == null) { throw new Exception("找不到对应的产品"); } res.price = subProduct.PRICE; res.days = subProduct.RIGHTPERIOD; List custompriceList = new List(); //折扣价格 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>(subProduct.DISCOUNTAREA); var range = area.Where(p => p.IsShow == 1).ToList(); res.discountAreas = range; } } var gifts = await repository.GetRepository().Query().Where(m => m.SUBPRODUCTID == subProduct.SUBPRODUCTID).ToListAsync(); //赠送天数 if (subProduct.ISGIFT == 1 && gifts.Any()) { List mma = new List { 1, 2 }; var orderactiveList = await repository.GetRepository().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 CreateOrder(CreateOrderDto dto) { using var scope = _serviceProvider.CreateAsyncScope(); var repository = scope.ServiceProvider.GetRequiredService>(); await _cacheDomain.SetApp(repository, dto.deptid); var softuser = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.USERNAME == dto.softUsername); if (softuser == null) { throw new Exception("客户信息不正确"); } var customer = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.RESID == softuser.RESID); var customerdetail = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.RESID == softuser.RESID); var subproduct = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PRODUCTCODE == dto.productCode); var product = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PRODUCTID == subproduct.PRODUCTID); var user = await repository.GetRepository().Query().FirstOrDefaultAsync(n => n.EID == dto.eid); var saledept = await repository.GetRepository().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().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(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().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().InsertAsync(orderExt); //设置分成 try { var pkid = await _cacheDomain.GetSeq_smallid_get(dto.deptid); var usergroup = await repository.GetRepository().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().FirstOrDefaultAsync(n => n.GID == usergroup.GID); if (group == null) { var dept = await repository.GetRepository().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().InsertAsync(wxCommissionRuleModel); } catch (Exception ex) { Log.Error($"订单{order.ORDERID}设置分成失败{ex.Message}"); } //提交支付记录 if (dto.payInfo != null && dto.payInfo.Count > 0) { var orderuselist = new List() { new OrderuseDto() { orderid = Convert.ToInt32(order.ORDERID), needpay = themodel.needpay.Value, arrivalpay = 0 } }; List paylist = new List(); 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>>(rep); if (payretmsg.result) { var paynoFilter = paydto.paylist.Select(n => n.payno).ToList(); var depostList = await repository.GetRepository().Query().Where(p => paynoFilter.Contains(p.PAYNO) && p.AUDITSTATUS == 1 && p.PAYNO != null).ToListAsync(); List adddepostList = new List(); 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().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().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().BatchInsertAsync(adddepostList); } if (depostList.Count > 0) { await repository.GetRepository().BatchUpdateAsync(depostList); } } } } return true; } #endregion 企微侧边栏 创建订单 } }