You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
8.4 KiB

using BBWYB.Common.Log;
using BBWYB.Common.Models;
using BBWYB.Server.Model.Db;
using FreeSql;
using Yitter.IdGenerator;
namespace BBWYB.Server.Business
{
public class DataRepairBusiness : BaseBusiness, IDenpendency
{
private KuaiDi100Manager kuaiDi100Manager;
public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager) : base(fsql, nLogManager, idGenerator)
{
this.kuaiDi100Manager = kuaiDi100Manager;
}
public void RepairPurchaseExpressOrder()
{
#region 修复快递单
var purchaseExpressOrderList = fsql.Select<PurchaseExpressOrder>().Where(peo => !string.IsNullOrEmpty(peo.PurchaseOrderId)).ToList();
var wayBillNos = purchaseExpressOrderList.Select(peo => peo.WaybillNo).ToList();
var relationList = fsql.Select<ExpressOrderRelationInfo>().Where(eori => wayBillNos.Contains(eori.WayBillNo)).ToList();
List<ExpressOrderRelationInfo> insertExpressOrderRelationInfoList = new List<ExpressOrderRelationInfo>();
foreach (var peo in purchaseExpressOrderList)
{
var relation = relationList.FirstOrDefault(r => r.WayBillNo == peo.WaybillNo && r.PurchaseOrderId == peo.PurchaseOrderId);
if (relation != null)
continue;
insertExpressOrderRelationInfoList.Add(new ExpressOrderRelationInfo()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
OrderId = peo.OrderId,
PurchaseOrderId = peo.PurchaseOrderId,
ShopId = peo.ShopId,
WayBillNo = peo.WaybillNo
});
}
fsql.Transaction(() =>
{
fsql.Insert(insertExpressOrderRelationInfoList).ExecuteAffrows();
});
#endregion
}
/// <summary>
/// 批量清理取消单数据
/// </summary>
public void ClearCancelOrderData()
{
var cancelOrderList = fsql.Select<Order>().Where(o => o.OrderState == Model.Enums.OrderState.).ToList();
var cancelOrderIds = cancelOrderList.Select(o => o.Id);
//var noUsingExpressOrderList = fsql.Select<PurchaseExpressOrder>().Where(peo => !fsql.Select<ExpressOrderRelationInfo>()
// .As("b")
// .ToList(b => b.WayBillNo)
// .Contains(peo.WaybillNo))
// .ToList();
/*
select * from purchaseexpressorder peo where not exists (select r.waybillno from expressorderrelationinfo r where peo.WaybillNo=r.WaybillNo);
*/
fsql.Transaction(() =>
{
fsql.Delete<OrderPurchaseInfo>().Where(opi => cancelOrderIds.Contains(opi.OrderId)).ExecuteAffrows();
fsql.Delete<OrderPurchaseSkuInfo>().Where(posku => cancelOrderIds.Contains(posku.OrderId)).ExecuteAffrows();
fsql.Delete<OrderPurchaseRelationInfo>().Where(opri => cancelOrderIds.Contains(opri.OrderId)).ExecuteAffrows();
fsql.Delete<OrderCost>().Where(oc => cancelOrderIds.Contains(oc.OrderId)).ExecuteAffrows();
fsql.Delete<OrderCostDetail>().Where(ocd => cancelOrderIds.Contains(ocd.OrderId)).ExecuteAffrows();
});
}
public void RepairOrderState(string orderId)
{
List<IUpdate<OrderPurchaseInfo>> updateOrderPurchaseList = new List<IUpdate<OrderPurchaseInfo>>();
IUpdate<Order> updateOrder = null;
var order = fsql.Select<Order>(orderId).ToOne();
#region 查询采购单
var purchaseOrderList = fsql.Select<OrderPurchaseInfo>().Where(ori => ori.IsEnabled == true && ori.OrderId == orderId).ToList();
if (purchaseOrderList.Count() == 0)
throw new Exception("未查询到任何采购单");
var purchaseOrderIds = purchaseOrderList.Select(po => po.PurchaseOrderId).ToList();
#endregion
#region 查询采购SKU
IList<OrderPurchaseSkuInfo> orderPurchaseSkuList = fsql.Select<OrderPurchaseSkuInfo>()
.Where(posku => purchaseOrderIds.Contains(posku.PurchaseOrderId))
.ToList();
#endregion
#region 查询采购sku关联信息
IList<OrderPurchaseRelationInfo> orderPurchaseRelationList = fsql.Select<OrderPurchaseRelationInfo>()
.Where(ops => purchaseOrderIds.Contains(ops.PurchaseOrderId))
.ToList();
#endregion
#region 查询采购单关联的快递单
var purchaseExpressOrderList = fsql.Select<ExpressOrderRelationInfo, PurchaseExpressOrder>()
.InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo)
.Where((eori, peo) => eori.OrderId == orderId).ToList((eori, peo) => new PurchaseExpressOrder
{
CreateTime = peo.CreateTime,
ExpressContent = peo.ExpressContent,
ExpressChangedTime = peo.ExpressChangedTime,
ExpressState = peo.ExpressState,
IsSubscribeKD100 = peo.IsSubscribeKD100,
OrderId = eori.OrderId,
PurchaseOrderId = eori.PurchaseOrderId,
ShopId = eori.ShopId.Value,
SourceExpressId = peo.SourceExpressId,
SourceExpressName = peo.SourceExpressName,
TargetExpressId = peo.TargetExpressId,
TargetExpressName = peo.TargetExpressName,
WaybillNo = peo.WaybillNo
});
#endregion
foreach (var purchaseOrder in purchaseOrderList)
{
var currentPurchaseOrderSkuList = orderPurchaseSkuList.Where(posku => posku.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList();
var currentPurchaseExpressOrderList = purchaseExpressOrderList.Where(peo => peo.PurchaseOrderId == purchaseOrder.PurchaseOrderId).ToList();
var oldPurchaseOrderState = purchaseOrder.OrderState;
purchaseOrder.CalculationOrderState(fsql, currentPurchaseOrderSkuList, currentPurchaseExpressOrderList);
if (purchaseOrder.OrderState != oldPurchaseOrderState)
{
var update = fsql.Update<OrderPurchaseInfo>(purchaseOrder.Id).Set(opi => opi.OrderState, purchaseOrder.OrderState);
updateOrderPurchaseList.Add(update);
}
}
var oldOrderState = order.OrderState;
order.CalculationOrderState(fsql, null, purchaseOrderList);
if (order.OrderState != oldOrderState)
updateOrder = fsql.Update<Order>(order.Id).Set(o => o.OrderState, order.OrderState);
fsql.Transaction(() =>
{
foreach (var update in updateOrderPurchaseList)
update.ExecuteAffrows();
updateOrder?.ExecuteAffrows();
});
}
public void SubscribeKD100(string waybillNo, string targetCompanyCode)
{
kuaiDi100Manager.SubscribeKuaiDi100(waybillNo, targetCompanyCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish");
}
}
}