using CRM.Core.BLL.Base; using CRM.Core.BLL.EventBus.Events; using CRM.Core.BLL.Util; using CRM.Core.BLL.Wx; using CRM.Core.Common.WebHelper; using CRM.Core.DTO; using CRM.Core.DTO.Ord; using CRM.Core.Model.Entity; using CRM.Core.Model.Enum; using System; using System.Collections.Generic; using System.Linq; using System.Text; using WX.CRM.Common; namespace CRM.Core.BLL.Application.Refund { public class RefundServices { private readonly BAS_PARAMETER_BL paramter_bl = new BAS_PARAMETER_BL(); private readonly WX_SzzyOrderRefund_BL _orderRefund = new WX_SzzyOrderRefund_BL(); private readonly WX_SzzyOrderDeposit_BL _orderDeposit = new WX_SzzyOrderDeposit_BL(); private readonly WX_SZZYORDER_BL _order = new WX_SZZYORDER_BL(); private readonly Wx_SzzyOrderRefundContract_BL _orderRefundContract = new Wx_SzzyOrderRefundContract_BL(); private readonly WX_PRODUCT_BL _subProduct = new WX_PRODUCT_BL(); private readonly Wx_SzzyOrder_HandGift_BL _SzzyOrder_HandGift_BL = new Wx_SzzyOrder_HandGift_BL(); private readonly SecurityHelper sHelper = new SecurityHelper(); public retMsg Audit(WX_SzzyOrderRefund orderRefundDto, int status, int userId, string userName) { var curMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var url = paramter_bl.GetValue_Parameter(Parameter.UserCenter_RiaService_refund);//封装出来的接口 var url2 = paramter_bl.GetValue_Parameter(Parameter.UserCenter_RiaService_closeFreeOrder); var orderRefund = _orderRefund.Get(p => p.id == orderRefundDto.id); orderRefund.att2 = orderRefundDto.att2; var deposit = _orderDeposit.Get(p => p.id == orderRefund.orderid); if (deposit != null) { //订金退款 orderRefund.auditstatus = 1; orderRefund.auditor = userId; orderRefund.auditorname = userName; orderRefund.audittime = DateTime.Now; var audret = _orderRefund.Audit(orderRefund, null); if (audret.result) { Common.EventBus.EventBus.Instance.Publish(new DepositRefundOrderEvent(deposit.id, (int)orderRefund.id, orderRefund.auditstatus, orderRefund.auditor.Value, orderRefund.auditorname, orderRefund.audittime.Value, deposit.isuse, deposit.companycode)); } return audret; } else { var order = _order.GetModel(orderRefund.orderid); if (status == 220) { //只退款,不修改订单状态,不关闭权限 orderRefund.auditstatus = 1; orderRefund.auditor = userId; orderRefund.auditorname = userName; orderRefund.audittime = DateTime.Now; orderRefund.att2 = orderRefundDto.att2; var audret = _orderRefund.Audit(orderRefund, order); if (audret.result) { //推送订单状态 Common.EventBus.EventBus.Instance.Publish(new RefundOrderEvent(Convert.ToInt32(order.ORDERID), order.ORDERSTATUS, order.ORDERSTATUSNAME, order.companycode, (int)orderRefund.id, orderRefund.auditstatus, orderRefund.auditor.Value, orderRefund.auditorname, orderRefund.audittime.Value, Convert.ToInt32(order.ISOPEN.Value), orderRefund.channel)); } return audret; } else { var subProductList = _subProduct.GetSubProductListByProductId(0, 0, null); var subProduct = subProductList.FirstOrDefault(p => p.SUBPRODUCTID == order.SUBPRODUCTID); //正常订单退款 var contract = _orderRefundContract.Get(p => p.OrderId == orderRefund.orderid); if (orderRefund.isacturalrefund == 1 && (contract == null || contract.ContractStatus != 2) && order.ISOPEN == 1 && subProduct.IsCompliance == 1) { return new retMsg { result = false, retmsg = "该退款方式需要签退款协议,请确认!" }; } var activeProductExtcount = 0; var i = 0; if (!string.IsNullOrEmpty(order.activeproductext)) { #region 随单 赠送订单退款 var activeProductExt = Utility.JSONToObject>(order.activeproductext); activeProductExt.Reverse(); i = 0; activeProductExtcount = activeProductExt.Count(); foreach (var item in activeProductExt) { var refundReq = new freeOrderClose { userName = order.SOFTUSERNAME, orderId = item.SzzyOrderId.ToString(), flag = "0" }; var param = JsonHelper.ObjDivertToJson(sHelper.createAjaxSignEncodingStr(JsonHelper.ObjDivertToJson(refundReq), SecurityHelper.OrderClientIdKey)); var refundRet = Utility.PostAjaxData(url2, param, Encoding.UTF8); var refundRetMsg = JsonHelper.JsonDivertToObj(refundRet); Core.Common.LogHelper.Trace("赠送退款接口返回结果:" + refundRetMsg.ToJson()); if (refundRetMsg.iRet == 0) { i++; } else { LogHelper.Error("执行退款--赠送订单关闭失败:参数:" + refundRet + "--执行结果:+" + refundRet); } } #endregion } //手工赠送订单退款 var handgiftOrder = _SzzyOrder_HandGift_BL.GetList(order.ORDERID); var handgiftOrdercount = 0; foreach (var item in handgiftOrder) { //审核通过后才有权限id if (item.orderstatus == 1 && item.szzyorderid.HasValue) { handgiftOrdercount++; item.orderstatus = 3; item.closememo = "退款关闭"; item.closetime = DateTime.Now; item.closeuser = string.Format("{0}-{1}", userId, userName); var refundReq = new freeOrderClose { userName = order.SOFTUSERNAME, orderId = item.szzyorderid.ToString(), flag = "0" }; var param = JsonHelper.ObjDivertToJson(sHelper.createAjaxSignEncodingStr(JsonHelper.ObjDivertToJson(refundReq), SecurityHelper.OrderClientIdKey)); var refundRet = Utility.PostAjaxData(url2, param, Encoding.UTF8); var refundRetMsg = JsonHelper.JsonDivertToObj(refundRet); Common.LogHelper.Trace($"{order.ORDERID}赠送退款接口返回结果:{refundRetMsg.ToJson()}"); if (refundRetMsg.iRet == 0) { i++; _SzzyOrder_HandGift_BL.CheckGift(item); Common.EventBus.EventBus.Instance.Publish(new HandGiftEvent(item, item.companycode));//推送数据到坐席端 } else { LogHelper.Error("执行退款--手工赠送订单关闭失败:参数:" + refundRet + "--执行结果:+" + refundRet); } } } var giftCount = activeProductExtcount + handgiftOrdercount; if (i == giftCount) { return RefundNode(order, orderRefund, status, userId, userName); } else { LogHelper.Error($"退款失败giftCount:{giftCount},activeProductExtcount:{activeProductExtcount},handgiftOrdercount:{handgiftOrdercount}"); return new retMsg { result = false, retmsg = "付费订单退款成功,但赠送订单退款失败,请重试!" }; } } } } private retMsg RefundNode(WX_SZZYORDER order, WX_SzzyOrderRefund orderRefund, int status, int userId, string userName) { var curMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var url = paramter_bl.GetValue_Parameter(Parameter.UserCenter_RiaService_refund);//封装出来的接口 #region =================调用NodeJs退款订单======================== LogHelper.Info("====调用NodeJs创建订单==="); RefundOrderReq suorder = new RefundOrderReq { orderId = order.SZZYORDERID.ToString(), refundStatus = 200,//退款状态 cancelAmount = Convert.ToInt32(orderRefund.refundprice * 100)//退款金额 }; string json = JsonHelper.ObjDivertToJson(suorder); LogHelper.Info("Node.JS接口参数json=>:" + json); json = JsonHelper.ObjDivertToJson(sHelper.createAjaxSignEncodingStr(json, SecurityHelper.OrderClientIdKey)); string retmsg = Utility.PostAjaxData(url, json, Encoding.UTF8);//返回信息 RefundOrderRsp retmessage = JsonHelper.JsonDivertToObj(retmsg); LogHelper.Info("Node.JS接口返回数据json=>:" + retmsg); #endregion #region =================调用NodeJs修改订单状态======================== if (retmessage.retCode == (int)NodeJsOrderEnum.调用成功 || retmessage.retCode == (int)NodeJsOrderEnum.已经开通) { LogHelper.Info("====调用NodeJs创建订单==="); suorder.refundStatus = 220;//退款状态 json = JsonHelper.ObjDivertToJson(suorder); LogHelper.Info("Node.JS接口参数json=>:" + json); json = JsonHelper.ObjDivertToJson(sHelper.createAjaxSignEncodingStr(json, SecurityHelper.OrderClientIdKey)); retmsg = Utility.PostAjaxData(url, json, Encoding.UTF8);//返回信息 LogHelper.Info("Node.JS接口返回数据json=>:" + retmsg); //retmsg = sHelper.decyptData(SecurityHelper.OrderClientIdKey, retmsg); retmessage = JsonHelper.JsonDivertToObj(retmsg); orderRefund.auditstatus = 1; orderRefund.auditor = userId; orderRefund.auditorname = userName; orderRefund.audittime = DateTime.Now; // orderRefund.att2 = orderRefundDto.att2; orderRefund.refunddate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")); if (retmessage.retCode == (int)NodeJsOrderEnum.调用成功)//开通成功 { if (status == 70) { order.ORDERSTATUS = "70"; order.ORDERSTATUSNAME = "已取消"; } else { order.ORDERSTATUS = "90"; order.ORDERSTATUSNAME = "已退款"; } var audret = _orderRefund.Audit(orderRefund, order); if (audret.result) { //推送订单状态 Common.EventBus.EventBus.Instance.Publish(new RefundOrderEvent(Convert.ToInt32(order.ORDERID), order.ORDERSTATUS, order.ORDERSTATUSNAME, order.companycode, (int)orderRefund.id, orderRefund.auditstatus, orderRefund.auditor.Value, orderRefund.auditorname, orderRefund.audittime.Value, Convert.ToInt32(order.ISOPEN.Value), orderRefund.channel)); } return audret; } else if (retmessage.retCode == (int)NodeJsOrderEnum.已经开通)//已经退款过 { if (status == 70) { order.ORDERSTATUS = "70"; order.ORDERSTATUSNAME = "已取消"; } else { order.ORDERSTATUS = "90"; order.ORDERSTATUSNAME = "已退款"; } var audret = _orderRefund.Audit(orderRefund, order); if (audret.result) { //推送订单状态 Common.EventBus.EventBus.Instance.Publish(new RefundOrderEvent(Convert.ToInt32(order.ORDERID), order.ORDERSTATUS, order.ORDERSTATUSNAME, order.companycode, (int)orderRefund.id, orderRefund.auditstatus, orderRefund.auditor.Value, orderRefund.auditorname, orderRefund.audittime.Value, Convert.ToInt32(order.ISOPEN.Value), orderRefund.channel)); } return audret; } else { return new retMsg { result = false, retmsg = string.IsNullOrEmpty(retmessage.retMsg) ? Utility.GetCheckEnumNameByValue(retmessage.retCode) : retmessage.retMsg }; } } else { return new retMsg { result = false, retmsg = string.IsNullOrEmpty(retmessage.retMsg) ? Utility.GetCheckEnumNameByValue(retmessage.retCode) : retmessage.retMsg }; } #endregion } } }