1
This commit is contained in:
@@ -450,6 +450,53 @@ func filterOrderInfo(order *model.GoodsOrder) {
|
||||
order.ConsigneeAddress = strings.ReplaceAll(order.ConsigneeAddress, "·", "")
|
||||
}
|
||||
|
||||
// FinisOrderWaybillFee 订单完成时,计算结算信息
|
||||
func FinisOrderWaybillFee(db *dao.DaoDB, order *model.GoodsOrder, bill *model.Waybill) (err error) {
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
if bill.WaybillVendorID != model.VendorIDMTPS && bill.WaybillVendorID != model.VendorIDDada && bill.WaybillVendorID != model.VendorIDFengNiao && bill.WaybillVendorID != model.VendorIDUUPT {
|
||||
return nil
|
||||
}
|
||||
// 查询所有运单
|
||||
bills, err := dao.GetWaybills(db, order.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
store, _ := dao.GetStoreDetail(db, order.JxStoreID, order.VendorID, order.VendorOrgCode)
|
||||
// 正常来说只会出现一个完成运单,之前有bug会出现多个完成订单,这不做考虑.默认一个运单完成,其他运单取消状态
|
||||
// 1.完成当前运单的金额核算,正常完成的订单金额不需要核算
|
||||
// 2.取消运单的金额核算
|
||||
cancelWaybill := make(map[string]*model.Waybill, 0)
|
||||
for _, v := range bills {
|
||||
if v.Status != model.WaybillStatusCanceled {
|
||||
continue
|
||||
}
|
||||
if v.VendorWaybillID == bill.VendorWaybillID {
|
||||
continue
|
||||
}
|
||||
cancelWaybill[v.VendorWaybillID] = v
|
||||
}
|
||||
// 已经全部运单取消,退款结算
|
||||
for _, v := range bills {
|
||||
if v.VendorWaybillID == bill.VendorWaybillID {
|
||||
continue
|
||||
}
|
||||
// 已经取消订单的违约金计算
|
||||
if err = countWaybillSettleInfo(db, order, v, store); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 3.总的收支核算
|
||||
if err = orderFeeSettle(db, order, bill, bills, store); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ResetCreateWaybillFee 取消所有运单时计算结算信息
|
||||
func ResetCreateWaybillFee(db *dao.DaoDB, order *model.GoodsOrder, bill *model.Waybill) (err error) {
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
@@ -459,12 +506,56 @@ func ResetCreateWaybillFee(db *dao.DaoDB, order *model.GoodsOrder, bill *model.W
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取订单运单详情列表
|
||||
store, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, order.VendorOrgCode)
|
||||
|
||||
// 订单被取消了,所有运单应该也被取消了,检查是否退还配送费
|
||||
// 1.查询订单创建的所有运单,三方配送运单(达达,蜂鸟,uu,美团配送),平台自配送订单不参与
|
||||
if err := countWaybillSettleInfo(db, order, bill, store); err != nil {
|
||||
return err
|
||||
}
|
||||
// 所有运单停止调度之后才开始退还余额
|
||||
bills, err := dao.GetWaybills(db, order.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 所有取消的运单
|
||||
cancelWaybill := make(map[string]*model.Waybill, 0)
|
||||
for _, v := range bills {
|
||||
if v.Status == model.WaybillStatusCanceled && v.VendorWaybillID != bill.VendorWaybillID {
|
||||
cancelWaybill[v.VendorWaybillID] = v
|
||||
}
|
||||
}
|
||||
cancelWaybill[bill.VendorWaybillID] = bill
|
||||
// 已经全部运单取消,退款结算
|
||||
if len(bills) == len(cancelWaybill) {
|
||||
for _, v := range bills {
|
||||
if v.VendorWaybillID == bill.VendorWaybillID {
|
||||
continue
|
||||
}
|
||||
// 已经取消订单的违约金计算
|
||||
if err = countWaybillSettleInfo(db, order, v, store); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 最终的金额核算,多退少补
|
||||
if err = orderFeeSettle(db, order, bill, bills, store); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// countWaybillSettleInfo 计算订单的结算信息
|
||||
func countWaybillSettleInfo(db *dao.DaoDB, order *model.GoodsOrder, bill *model.Waybill, store *dao.StoreDetail) error {
|
||||
if handlerInfo := partner.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil {
|
||||
// 这一步必须要做,可能不是最后取消订单,需要更新违约金和取消状态
|
||||
deductFee, err := handlerInfo.Handler.GetDeliverLiquidatedDamages(bill.VendorOrderID, bill.VendorWaybillID)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,获取违约金异常:%v", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err), "")
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -475,102 +566,104 @@ func ResetCreateWaybillFee(db *dao.DaoDB, order *model.GoodsOrder, bill *model.W
|
||||
_, err = dao.UpdateEntity(db, bill, "ActualFee", "DesiredFee")
|
||||
}
|
||||
|
||||
// 获取订单运单详情列表
|
||||
store, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, order.VendorOrgCode)
|
||||
// 门店发单,支付运单违约金
|
||||
if store != nil && store.CreateDeliveryType == model.YES && deductFee != model.NO {
|
||||
err = partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(jxcontext.AdminCtx, store.ID, int(deductFee), partner.StoreAcctTypeExpendCreateWaybillDeductFee, bill.VendorOrderID, bill.VendorWaybillID, 0)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,获取违约金门店扣除失败:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, deductFee), "")
|
||||
globals.SugarLogger.Errorf("InsertStoreAcctIncomeAndUpdateStoreAcctBalance 483 : %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if store != nil && store.CreateDeliveryType == model.NO && deductFee != model.NO {
|
||||
err = partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, store.BrandID, int(deductFee), model.BrandBillTypeExpend, model.BrandBillFeeTypeDeductFee, order.VendorOrderID, order.VendorWaybillID)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,获取违约金品牌扣除失败:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, deductFee), "")
|
||||
globals.SugarLogger.Errorf("InsertBrandBill 489 : %v", err)
|
||||
return err
|
||||
}
|
||||
//// 获取运单的支出记录
|
||||
//orderBill, _ := dao.GetBrandBill(db, store.BrandID, order.VendorOrderID, model.BrandBillTypeExpend, model.BrandBillFeeTypeDelivery, order.VendorWaybillID)
|
||||
//if len(orderBill) == 0 {
|
||||
//} else {
|
||||
// // 退回扣除的配送费
|
||||
// partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, store.BrandID, orderBill[0].Price, model.BrandBillTypeIncome, model.BrandBillFeeTypeDeductFee, order.VendorOrderID, order.VendorWaybillID)
|
||||
// // 支出配送费违约金
|
||||
// partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, store.BrandID, int(deductFee), model.BrandBillTypeExpend, model.BrandBillFeeTypeDeductFee, order.VendorOrderID, order.VendorWaybillID)
|
||||
//}
|
||||
}
|
||||
|
||||
// 所有运单停止调度之后才开始退还余额
|
||||
bills, err := dao.GetWaybills(db, order.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
if err == nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,违约金扣除成功:%d", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, deductFee), "")
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 所有取消的运单
|
||||
cancelWaybill := make(map[string]*model.Waybill, 0)
|
||||
//finishWaybill := make(map[string]*model.Waybill, 0)
|
||||
//deliveryWaybill := make(map[string]*model.Waybill, 0)
|
||||
for _, v := range bills {
|
||||
if v.Status == model.WaybillStatusCanceled && v.VendorWaybillID != bill.VendorWaybillID {
|
||||
cancelWaybill[v.VendorWaybillID] = v
|
||||
}
|
||||
//if (v.Status == model.WaybillStatusDelivered || v.Status == model.OrderStatusFinished) && v.VendorWaybillID != bill.VendorWaybillID {
|
||||
// finishWaybill[v.VendorWaybillID] = v
|
||||
//}
|
||||
//if v.Status < model.WaybillStatusDelivered && v.VendorWaybillID != bill.VendorWaybillID {
|
||||
// deliveryWaybill[v.VendorOrderID] = v
|
||||
//}
|
||||
// 订单金额核算
|
||||
func orderFeeSettle(db *dao.DaoDB, order *model.GoodsOrder, bill *model.Waybill, bills []*model.Waybill, store *dao.StoreDetail) (err error) {
|
||||
billExpend := 0
|
||||
billIncome := 0
|
||||
allFee := 0
|
||||
// 门店结算,全部支出
|
||||
if store.CreateDeliveryType == model.YES {
|
||||
// 此订单支出的费用
|
||||
expendType := []int{partner.StoreAcctTypeExpendCreateWaybillEx, partner.StoreAcctTypeExpendCreateWaybillTip, partner.StoreAcctTypeExpendCreateWaybill2ndMore, partner.StoreAcctTypeExpendCreateWaybillDeductFee, partner.StoreAcctTypeRealFeeExpend}
|
||||
billExpend, err = dao.GetStoreAcctExpendTotal(db, store.ID, expendType, bill.VendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetStoreAcctExpendTotal 545 err :%v", err)
|
||||
return err
|
||||
}
|
||||
cancelWaybill[bill.VendorWaybillID] = bill
|
||||
// 还有配送中的订单,暂不退款
|
||||
//if len(deliveryWaybill) != model.NO {
|
||||
// return nil
|
||||
//}
|
||||
//// 如果已经有完成订单
|
||||
//if len(finishWaybill) != model.NO {
|
||||
// var cancelDeductFee int64 = 0
|
||||
// var tipFee int64 = 0
|
||||
// for _, v := range cancelWaybill {
|
||||
// cancelDeductFee += v.ActualFee
|
||||
// tipFee += v.TipFee
|
||||
// }
|
||||
//
|
||||
//}
|
||||
// 已经全部运单取消,退款结算
|
||||
if len(bills) == len(cancelWaybill) {
|
||||
// 门店结算,全部支出
|
||||
if store.CreateDeliveryType == model.YES {
|
||||
// 此订单支出的费用
|
||||
expendType := []int{partner.StoreAcctTypeExpendCreateWaybillEx, partner.StoreAcctTypeExpendCreateWaybillTip, partner.StoreAcctTypeExpendCreateWaybill2ndMore, partner.StoreAcctTypeExpendCreateWaybillDeductFee, partner.StoreAcctTypeRealFeeExpend}
|
||||
billExpend, err := dao.GetStoreAcctExpendTotal(db, store.ID, expendType, bill.VendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetStoreAcctExpendTotal 545 err :%v", err)
|
||||
return err
|
||||
}
|
||||
// 此订单退还的费用
|
||||
incomeType := []int{partner.StoreAcctTypeRealFeeIncome, partner.StoreAcctTypeIncomeCancelTemp, partner.StoreAcctTypeIncomeCancelReal}
|
||||
billIncome, err := dao.GetStoreAcctIncomeTotal(db, store.ID, incomeType, bill.VendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetStoreAcctIncomeTotal 551 err :%v", err)
|
||||
return err
|
||||
}
|
||||
var allFee int = 0
|
||||
for _, v := range bills {
|
||||
allFee += int(v.ActualFee)
|
||||
allFee += int(v.TipFee)
|
||||
}
|
||||
globals.SugarLogger.Errorf("计算错误:订单支出费用应该=退还费用+运单支出费用,支出费用:%d,已经退还费用:%d,剩余退还费用:%d", billExpend, billIncome, billExpend-billIncome)
|
||||
if allFee != billExpend-billIncome {
|
||||
globals.SugarLogger.Errorf("计算错误:订单支出费用应该=退还费用+运单支出费用,支出费用:%d,已经退还费用:%d,剩余退还费用:%d", billExpend, billIncome, billExpend-billIncome)
|
||||
}
|
||||
}
|
||||
// 品牌结算
|
||||
if store.CreateDeliveryType == model.NO {
|
||||
// 此订单退还的费用
|
||||
incomeType := []int{partner.StoreAcctTypeRealFeeIncome, partner.StoreAcctTypeIncomeCancelTemp, partner.StoreAcctTypeIncomeCancelReal}
|
||||
billIncome, err = dao.GetStoreAcctIncomeTotal(db, store.ID, incomeType, bill.VendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetStoreAcctIncomeTotal 551 err :%v", err)
|
||||
return err
|
||||
}
|
||||
for _, v := range bills {
|
||||
allFee += int(v.DesiredFee)
|
||||
allFee += int(v.TipFee)
|
||||
}
|
||||
// 运单支出费用统计,应该等于 支出费用- 退还费用
|
||||
globals.SugarLogger.Errorf("计算错误:订单支出费用应该=退还费用+运单支出费用,支出费用:%d,已经退还费用:%d,运单计算费用:%d", billExpend, billIncome, allFee)
|
||||
if allFee != billExpend-billIncome {
|
||||
globals.SugarLogger.Errorf("计算错误:订单支出费用应该=退还费用+运单支出费用,支出费用:%d,已经退还费用:%d,剩余退还费用:%d", billExpend, billIncome, billExpend-billIncome)
|
||||
}
|
||||
}
|
||||
if billExpend-billIncome == allFee {
|
||||
globals.SugarLogger.Debugf("计算正确,运单消耗[%d],账户支出[%d],账户退回[%d]", allFee, billExpend, billIncome)
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("计算正确,运单消耗[%d],账户支出[%d],账户退回[%d]", allFee, billExpend, billIncome), "")
|
||||
return nil
|
||||
}
|
||||
|
||||
abnormalAmount := billExpend - billIncome - allFee
|
||||
switch store.CreateDeliveryType {
|
||||
case model.NO: // 品牌结算
|
||||
if abnormalAmount > 0 { // 多退
|
||||
err = partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, store.BrandID, abnormalAmount, model.BrandBillTypeIncome, model.BrandBillFeeTypeSys, order.VendorOrderID, order.VendorWaybillID)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,品牌支出大于消耗,多退:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, abnormalAmount), "")
|
||||
globals.SugarLogger.Errorf("InsertBrandBill 489 : %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
if abnormalAmount < 0 {
|
||||
err = partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, store.BrandID, abnormalAmount*-1, model.BrandBillTypeExpend, model.BrandBillFeeTypeSys, order.VendorOrderID, order.VendorWaybillID)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,品牌支出小于消耗,少补:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, abnormalAmount), "")
|
||||
globals.SugarLogger.Errorf("InsertBrandBill 489 : %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
case model.YES: // 门店结算
|
||||
if abnormalAmount > 0 { // 多退
|
||||
err = partner.CurStoreAcctManager.InsertStoreAcctIncomeAndUpdateStoreAcctBalance(jxcontext.AdminCtx, store.ID, int(billExpend-billIncome-allFee), partner.StoreAcctTypeIncomeCancelReal, bill.VendorOrderID, bill.VendorWaybillID, 0)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,支出大于消耗,多退:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, abnormalAmount), "")
|
||||
globals.SugarLogger.Errorf("InsertStoreAcctIncomeAndUpdateStoreAcctBalance 483 : %v", err)
|
||||
}
|
||||
}
|
||||
if abnormalAmount < 0 {
|
||||
err = partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(jxcontext.AdminCtx, store.ID, int(abnormalAmount)*-1, partner.StoreAcctTypeExpendCreateWaybill2ndMore, bill.VendorOrderID, bill.VendorWaybillID, 0)
|
||||
if err != nil {
|
||||
partner.CurOrderManager.OnOrderMsg(order, fmt.Sprintf("订单[%s],运单平台[%d],运单[%s]取消,支出小于消耗,少补:%v,金额[%d]", order.VendorOrderID, bill.WaybillVendorID, bill.VendorWaybillID, err, abnormalAmount), "")
|
||||
globals.SugarLogger.Errorf("InsertStoreAcctIncomeAndUpdateStoreAcctBalance 483 : %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -715,6 +715,24 @@ func (c *OrderManager) GetLogisticsOrderStatusList(orderId, LogisticsId string,
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// GetWayBillStatusList 根据订单号和物流号查询运单的变化状态
|
||||
func (c *OrderManager) GetWayBillStatusList(orderId, LogisticsId string, vendorId int) ([]*model.OrderStatus, error) {
|
||||
sql := `SELECT *
|
||||
FROM order_status t1
|
||||
WHERE t1.vendor_order_id = ? AND t1.ref_vendor_order_id = ? AND t1.vendor_id = ?`
|
||||
sqlParams := []interface{}{
|
||||
LogisticsId,
|
||||
orderId,
|
||||
vendorId,
|
||||
}
|
||||
sql += ` ORDER BY status_time ASC `
|
||||
var result []*model.OrderStatus
|
||||
if err := dao.GetRows(dao.GetDB(), &result, sql, sqlParams...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// GetOrderStatusList2 查询订单流程 refVendorOrderID 订单Id
|
||||
func GetOrderStatusList2(refVendorOrderID string, wayBillId string, orderType int, vendorID int) (statusList []*model.OrderStatus, err error) {
|
||||
sql := `
|
||||
|
||||
Reference in New Issue
Block a user