266 lines
14 KiB
C#
266 lines
14 KiB
C#
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<List<ActiveProduct>>(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<freeOrderCloseRes>(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<freeOrderCloseRes>(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<RefundOrderRsp>(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<RefundOrderRsp>(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<NodeJsOrderEnum>(retmessage.retCode) : retmessage.retMsg };
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return new retMsg { result = false, retmsg = string.IsNullOrEmpty(retmessage.retMsg) ? Utility.GetCheckEnumNameByValue<NodeJsOrderEnum>(retmessage.retCode) : retmessage.retMsg };
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|