Merge remote-tracking branch 'origin/jdshop' into jxact
This commit is contained in:
@@ -131,6 +131,11 @@ func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model
|
||||
// return err
|
||||
// }, "OnAdjustOrder delete order_sku, orderID:%s", order.VendorOrderID)
|
||||
order.AdjustCount = adjustCount + 1
|
||||
//扣点的订单需要修改订单的totalshopmoney
|
||||
if err == nil && order.EarningType == model.EarningTypePoints {
|
||||
order2, _ := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID)
|
||||
order.TotalShopMoney = order2.TotalShopMoney
|
||||
}
|
||||
isDuplicated, err = c.SaveOrder(order, true, db)
|
||||
}
|
||||
if err == nil {
|
||||
@@ -1321,6 +1326,154 @@ func setJdsOrderSeq(order *model.GoodsOrder) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func MergeJdsOrders(ctx *jxcontext.Context, vendorOrderIDs []string) (vendorOrderIDJds string, err error) {
|
||||
globals.SugarLogger.Debugf("jds MergeJdsOrders vendorOrderIDs: %v", vendorOrderIDs)
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
orders []*model.GoodsOrder
|
||||
orderSkus []*model.OrderSku
|
||||
orderIDs []string
|
||||
storeDuplicate = make(map[int]int)
|
||||
storeID int
|
||||
)
|
||||
for _, vendorOrderID := range vendorOrderIDs {
|
||||
order, _ := dao.GetSimpleOrder(db, vendorOrderID)
|
||||
if err != nil || order == nil {
|
||||
return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID)
|
||||
}
|
||||
if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled {
|
||||
return "", fmt.Errorf("暂不支持此状态的订单进行转移!订单号:[%v]", vendorOrderID)
|
||||
}
|
||||
if order.VendorID != model.VendorIDJDShop {
|
||||
return "", fmt.Errorf("暂不支持非京狗的订单进行转移!订单号:[%v]", vendorOrderID)
|
||||
}
|
||||
storeDuplicate[jxutils.GetSaleStoreIDFromOrder(order)] = jxutils.GetSaleStoreIDFromOrder(order)
|
||||
orders = append(orders, order)
|
||||
|
||||
//订单商品
|
||||
skus, _ := dao.GetSimpleOrderSkus(db, order.VendorOrderID, nil)
|
||||
orderSkus = append(orderSkus, skus...)
|
||||
|
||||
orderIDs = append(orderIDs, vendorOrderID)
|
||||
}
|
||||
if len(storeDuplicate) > 1 {
|
||||
return "", fmt.Errorf("只能选择相同门店的订单进行合并!")
|
||||
} else {
|
||||
storeID = jxutils.GetSaleStoreIDFromOrder(orders[0])
|
||||
}
|
||||
for _, order := range orders {
|
||||
var waybill *model.Waybill
|
||||
//将订单和运单取消
|
||||
waybills, err := dao.GetWaybills(db, order.VendorOrderID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if len(waybills) > 0 {
|
||||
for _, v := range waybills {
|
||||
if v.Status != model.WaybillStatusCanceled {
|
||||
waybill = v
|
||||
}
|
||||
}
|
||||
if waybill != nil {
|
||||
if waybill.WaybillVendorID != model.VendorIDJDWL {
|
||||
if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil {
|
||||
err = handler.Handler.CancelWaybill(waybill, 0, "订单合并被取消")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if err = jdshop.ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单合并被取消"); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
//重新构建order的数据
|
||||
storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
if err != nil || len(storeMaps) == 0 {
|
||||
return "", fmt.Errorf("该门店未绑定京狗平台,请先绑定后再转移!门店:[%v]", storeID)
|
||||
}
|
||||
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
||||
var (
|
||||
newEarningPrice int64
|
||||
actualPrice int64
|
||||
shopPrice int64
|
||||
salePrice int64
|
||||
totalShop int64
|
||||
)
|
||||
for _, v := range orders {
|
||||
newEarningPrice += v.NewEarningPrice
|
||||
actualPrice += v.ActualPayPrice
|
||||
shopPrice += v.ShopPrice
|
||||
salePrice += v.SalePrice
|
||||
totalShop += v.TotalShopMoney
|
||||
}
|
||||
store := stores[0]
|
||||
order := orders[0]
|
||||
order.ID = 0
|
||||
order.NewEarningPrice = newEarningPrice
|
||||
order.ActualPayPrice = actualPrice
|
||||
order.SalePrice = salePrice
|
||||
order.ShopPrice = shopPrice
|
||||
order.TotalShopMoney = totalShop
|
||||
order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(orders[0].VendorOrderID2)*10000) + utils.Int2Str(99)
|
||||
order.VendorOrderID2 = strings.Join(orderIDs, ",")
|
||||
order.Status = model.OrderStatusNew
|
||||
setJdsOrderSeq(order)
|
||||
if order.BusinessType == model.BusinessTypeImmediate {
|
||||
var (
|
||||
opentime1 = jxutils.JxOperationTime2TimeByDate(store.OpenTime1, order.CreatedAt)
|
||||
opentime2 = jxutils.JxOperationTime2TimeByDate(store.OpenTime2, order.CreatedAt)
|
||||
closetime1 = jxutils.JxOperationTime2TimeByDate(store.CloseTime1, order.CreatedAt)
|
||||
closetime2 = jxutils.JxOperationTime2TimeByDate(store.CloseTime2, order.CreatedAt)
|
||||
orderCreatedAt = order.CreatedAt
|
||||
)
|
||||
if store.OpenTime1 == 0 || store.CloseTime1 == 0 {
|
||||
return "", fmt.Errorf("该门店没有营业时间,不能接单!门店:[%v]", storeID)
|
||||
}
|
||||
if !(orderCreatedAt.Sub(opentime1) >= 0 && orderCreatedAt.Sub(closetime1) <= 0) {
|
||||
if store.OpenTime2 != 0 && store.CloseTime2 != 0 {
|
||||
if !(orderCreatedAt.Sub(opentime2) >= 0 && orderCreatedAt.Sub(closetime2) <= 0) {
|
||||
if orderCreatedAt.Sub(opentime1) < 0 {
|
||||
order.ExpectedDeliveredTime = opentime1
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
} else {
|
||||
if orderCreatedAt.Sub(opentime2) < 0 {
|
||||
order.ExpectedDeliveredTime = opentime2
|
||||
} else {
|
||||
order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1)
|
||||
}
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if orderCreatedAt.Sub(opentime1) < 0 {
|
||||
order.ExpectedDeliveredTime = opentime1
|
||||
} else {
|
||||
order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1)
|
||||
}
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
}
|
||||
}
|
||||
}
|
||||
//结算类型
|
||||
if store.PayPercentage < 50 {
|
||||
order.EarningType = model.EarningTypePoints
|
||||
} else {
|
||||
order.EarningType = model.EarningTypeQuote
|
||||
}
|
||||
if storeID != model.JdShopMainStoreID {
|
||||
order.DeliveryFlag = model.NO
|
||||
}
|
||||
//skus
|
||||
for _, sku := range orderSkus {
|
||||
sku.VendorOrderID = order.VendorOrderID
|
||||
sku.ID = 0
|
||||
}
|
||||
order.Skus = orderSkus
|
||||
err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
|
||||
vendorOrderIDJds = order.VendorOrderID
|
||||
return vendorOrderIDJds, err
|
||||
}
|
||||
|
||||
func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) {
|
||||
globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID)
|
||||
var (
|
||||
@@ -1354,10 +1507,8 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int)
|
||||
}
|
||||
if waybill != nil {
|
||||
if waybill.WaybillVendorID != model.VendorIDJDWL {
|
||||
handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID]
|
||||
err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消")
|
||||
if err != nil {
|
||||
return "", err
|
||||
if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil {
|
||||
err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1440,6 +1591,9 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int)
|
||||
}
|
||||
suffix := utils.Str2Int(goodsOrders[0].VendorOrderID[12:len(goodsOrders[0].VendorOrderID)])
|
||||
suffix++
|
||||
if len(order.VendorOrderID2) > 18 {
|
||||
order.VendorOrderID2 = order.VendorOrderID2[0:12]
|
||||
}
|
||||
order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*100000) + utils.Int2Str(suffix)
|
||||
}
|
||||
for _, sku := range skus {
|
||||
@@ -1553,7 +1707,10 @@ func AdjustJdsOrderSimple(ctx *jxcontext.Context, vendorOrderID string, skuID in
|
||||
)
|
||||
orderSkus, err := dao.GetSimpleOrderSkus(db, vendorOrderID, []int{skuID})
|
||||
order, err := dao.GetSimpleOrder(db, vendorOrderID)
|
||||
|
||||
//如果不是商城模板店
|
||||
if jxutils.GetSaleStoreIDFromOrder(order) != model.JdShopMainStoreID {
|
||||
return fmt.Errorf("目前只支持商城模板店的简单售前删除!")
|
||||
}
|
||||
orderSkus2, err := dao.GetSimpleOrderSkus(db, vendorOrderID, nil)
|
||||
if len(orderSkus2) == 1 {
|
||||
return fmt.Errorf("这一单只剩这最后一个商品了,不允许删除!")
|
||||
@@ -1571,6 +1728,7 @@ func AdjustJdsOrderSimple(ctx *jxcontext.Context, vendorOrderID string, skuID in
|
||||
} else {
|
||||
_, err = dao.DeleteEntity(db, orderSku)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
dao.Commit(db)
|
||||
scheduler.CurrentScheduler.OnAfsOrderNew(afsOrder, false)
|
||||
return err
|
||||
@@ -261,7 +262,13 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
|
||||
}
|
||||
}
|
||||
if len(vendorSkuIDs) > 0 {
|
||||
l, err := dao.GetStoreSkuPriceAndWeight(db, order.VendorStoreID, order.VendorID, vendorSkuIDs)
|
||||
var vendorStoreID string
|
||||
if order.VendorID == model.VendorIDJDShop {
|
||||
vendorStoreID = model.JdShopMainVendorStoreID
|
||||
} else {
|
||||
vendorStoreID = order.VendorStoreID
|
||||
}
|
||||
l, err := dao.GetStoreSkuPriceAndWeight(db, vendorStoreID, order.VendorID, vendorSkuIDs)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Warnf("updateAfsOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err)
|
||||
return err
|
||||
|
||||
@@ -64,11 +64,11 @@ type OrderCount struct {
|
||||
Flag bool `json:"flag"` //true表示可以买
|
||||
}
|
||||
|
||||
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
||||
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours, lastMinutes int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
||||
globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID)
|
||||
if lastHours > maxLastHours {
|
||||
lastHours = maxLastHours
|
||||
} else if lastHours == 0 {
|
||||
} else if lastHours == 0 && lastMinutes == 0 {
|
||||
lastHours = defLastHours
|
||||
}
|
||||
|
||||
@@ -80,7 +80,12 @@ func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, l
|
||||
AND t1.order_created_at >= ?`
|
||||
sqlParams := []interface{}{
|
||||
storeID,
|
||||
time.Now().Add(-time.Duration(lastHours) * time.Hour),
|
||||
// time.Now().Add(-time.Duration(lastHours) * time.Hour),
|
||||
}
|
||||
if lastMinutes != 0 {
|
||||
sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastMinutes)*time.Minute))
|
||||
} else {
|
||||
sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastHours)*time.Hour))
|
||||
}
|
||||
if !isIncludeFake {
|
||||
sql += " AND (t1.flag & ?) = 0"
|
||||
|
||||
@@ -5,6 +5,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||
@@ -213,6 +215,37 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
|
||||
flag = model.AfsOrderFlagRefuseUserRefund
|
||||
afsOrder.RefuseReason = reason
|
||||
partner.CurOrderManager.UpdateAfsOrderFields(afsOrder, []string{"RefuseReason"})
|
||||
} else {
|
||||
if order, _ := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
|
||||
if order.EarningType == model.EarningTypePoints {
|
||||
var (
|
||||
skuMap = make(map[int]*model.OrderSku)
|
||||
diff int64
|
||||
db = dao.GetDB()
|
||||
)
|
||||
for _, sku := range order.Skus {
|
||||
skuMap[sku.SkuID] = sku
|
||||
}
|
||||
storeDetail, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
|
||||
waybills, _ := dao.GetWaybills(db, order.VendorOrderID)
|
||||
//京东商城和京西要重新算totalshopmoney等
|
||||
if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX {
|
||||
skus, _ := dao.GetAfsOrderSkuInfo(db, order.VendorOrderID, afsOrderID, order.VendorID, false)
|
||||
for _, v := range skus {
|
||||
if skuMap[v.SkuID] != nil {
|
||||
diff += skuMap[v.SkuID].SalePrice * int64(v.Count)
|
||||
}
|
||||
}
|
||||
order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diff)) * jdshopapi.JdsPayPercentage)
|
||||
if len(waybills) > 0 {
|
||||
jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, waybills[0])
|
||||
} else {
|
||||
jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage)
|
||||
}
|
||||
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
dao.SetAfsOrderFlag(dao.GetDB(), ctx.GetUserName(), afsOrderID, vendorID, flag)
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod
|
||||
}
|
||||
}
|
||||
}
|
||||
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished)
|
||||
s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished)
|
||||
if status.Status >= model.OrderStatusEndBegin {
|
||||
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
||||
}
|
||||
|
||||
@@ -3455,3 +3455,82 @@ func UpdateStorePricePack(ctx *jxcontext.Context, storeID, vendorID int, pricePa
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func GetJdDeliveryArea(ctx *jxcontext.Context, storeIDs []int) (err error) {
|
||||
type tmp struct {
|
||||
JdID string `json:"jdID"`
|
||||
S int `json:"s"`
|
||||
}
|
||||
type SpecialtyStoreSkus struct {
|
||||
StoreID int `json:"门店ID"`
|
||||
StoreName string `json:"门店名"`
|
||||
City string `json:"城市"`
|
||||
Area int `json:"面积"`
|
||||
}
|
||||
var (
|
||||
ss []*tmp
|
||||
excelTitle = []string{
|
||||
"门店ID",
|
||||
"门店名",
|
||||
"城市",
|
||||
"面积",
|
||||
}
|
||||
sheetList []*excel.Obj2ExcelSheetConfig
|
||||
specialtyStoreSkus []*SpecialtyStoreSkus
|
||||
downloadURL, fileName string
|
||||
)
|
||||
storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJD}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
for _, v := range storeMaps {
|
||||
time.Sleep(time.Second / 3)
|
||||
station, err := jd.GetAPI("320406").GetDeliveryRangeByStationNo2(v.VendorStoreID)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if station.DeliveryRangeType == 2 {
|
||||
strs := strings.Split(station.DeliveryRange, ";")
|
||||
ss = append(ss, &tmp{
|
||||
JdID: v.VendorStoreID,
|
||||
S: utils.Float64TwoInt(math.Ceil((jxutils.ComputeSignedArea(strs[:len(strs)-1])))),
|
||||
})
|
||||
}
|
||||
}
|
||||
for i := 0; i < len(ss)-1; i++ {
|
||||
for j := 0; j < len(ss)-1-i; j++ {
|
||||
if ss[j].S > ss[j+1].S {
|
||||
temp := ss[j]
|
||||
ss[j] = ss[j+1]
|
||||
ss[j+1] = temp
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, v := range ss {
|
||||
storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), v.JdID, model.VendorIDJD)
|
||||
place, _ := dao.GetPlaceByCode(dao.GetDB(), storeDetail.CityCode)
|
||||
specialtyStoreSku := &SpecialtyStoreSkus{
|
||||
StoreID: storeDetail.ID,
|
||||
StoreName: storeDetail.Name,
|
||||
City: place.Name,
|
||||
Area: v.S,
|
||||
}
|
||||
specialtyStoreSkus = append(specialtyStoreSkus, specialtyStoreSku)
|
||||
}
|
||||
excelConf := &excel.Obj2ExcelSheetConfig{
|
||||
Title: "sheet1",
|
||||
Data: specialtyStoreSkus,
|
||||
CaptionList: excelTitle,
|
||||
}
|
||||
sheetList = append(sheetList, excelConf)
|
||||
if excelConf != nil {
|
||||
downloadURL, fileName, err = jxutils.UploadExeclAndPushMsg(sheetList, "面积")
|
||||
} else {
|
||||
baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess is nil!")
|
||||
}
|
||||
if err != nil {
|
||||
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName, err)
|
||||
} else {
|
||||
noticeMsg := fmt.Sprintf("[详情点我]%s/billshow/?normal=true&path=%s \n", globals.BackstageHost, downloadURL)
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, ctx.GetUserID(), "异步任务完成", noticeMsg)
|
||||
baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess downloadURL: [%v]", downloadURL)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -4721,6 +4721,7 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
|
||||
}
|
||||
return storeSkuAudits2, "", err
|
||||
}
|
||||
deletedDuplicateWaitAuditData(ctx, db)
|
||||
task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeAudit := batchItemList[0].(*model.StoreSkuAudit)
|
||||
@@ -4801,6 +4802,45 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
|
||||
return nil, hint, err
|
||||
}
|
||||
|
||||
func deletedDuplicateWaitAuditData(ctx *jxcontext.Context, db *dao.DaoDB) {
|
||||
var (
|
||||
duplicateDatas []*model.StoreSkuAudit
|
||||
duplicateStore = make(map[int][]*model.StoreSkuAudit)
|
||||
)
|
||||
sql := `
|
||||
SELECT a.*
|
||||
FROM store_sku_audit a ,
|
||||
(
|
||||
SELECT count(*), store_id ,name_id ,status, deleted_at
|
||||
FROM store_sku_audit
|
||||
WHERE status = 0
|
||||
AND deleted_at = ?
|
||||
GROUP BY 2,3,4,5
|
||||
HAVING count(*) > 1
|
||||
) b
|
||||
WHERE a.store_id = b.store_id
|
||||
AND a.name_id = b.name_id
|
||||
AND a.status= b.status
|
||||
AND a.deleted_at = b.deleted_at
|
||||
`
|
||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||
dao.GetRows(db, &duplicateDatas, sql, sqlParams)
|
||||
for _, v := range duplicateDatas {
|
||||
duplicateStore[v.StoreID] = append(duplicateStore[v.StoreID], v)
|
||||
}
|
||||
for _, v := range duplicateStore {
|
||||
duplicateSkuName := make(map[int][]*model.StoreSkuAudit)
|
||||
for _, vv := range v {
|
||||
duplicateSkuName[vv.NameID] = append(duplicateSkuName[vv.NameID], vv)
|
||||
}
|
||||
for _, vv := range duplicateSkuName {
|
||||
for i := 0; i < len(vv)-1; i++ {
|
||||
dao.DeleteEntity(db, vv[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func GetSpecialtyStoreSkus(ctx *jxcontext.Context, storeIDs, vendorIDs []int) (err error) {
|
||||
type SpecialtyStoreSkus struct {
|
||||
StoreID int `json:"门店ID"`
|
||||
|
||||
@@ -1098,7 +1098,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
// storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
_, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城门店的可售信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false,
|
||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
|
||||
@@ -1107,7 +1107,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
|
||||
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
|
||||
err = syncJdsStoresSkus(ctx, db, t, storeMap, isAsync, isContinueWhenError)
|
||||
}
|
||||
err = syncJdsStoreStock(ctx, db, t, storeSkus, storeMap, isAsync, isContinueWhenError)
|
||||
// err = syncJdsStoreStock(ctx, db, t, storeSkus, storeMap, isAsync, isContinueWhenError)
|
||||
}
|
||||
}
|
||||
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||
@@ -1116,15 +1116,6 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
|
||||
}
|
||||
|
||||
func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) {
|
||||
// storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// storeSkus, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// for _, storeMap := range storeMaps {
|
||||
task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeSku := batchItemList[0].(*model.StoreSkuBind)
|
||||
@@ -1146,7 +1137,53 @@ func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch
|
||||
}, storeSkus)
|
||||
tasksch.HandleTask(task, parentTask, true).Run()
|
||||
_, err = task.GetResult(0)
|
||||
// }
|
||||
return err
|
||||
}
|
||||
|
||||
func SyncJdsStoreStock(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
storeMaps []*model.StoreMap
|
||||
)
|
||||
sql := `
|
||||
SELECT * FROM store_map WHERE vendor_id = ? AND vendor_store_id <> '' AND store_id <> ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
model.VendorIDJDShop, model.JdShopMainStoreID,
|
||||
}
|
||||
err = dao.GetRows(db, &storeMaps, sql, sqlParams)
|
||||
storeSkus, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
task1 := tasksch.NewParallelTask("syncJdsStoreStock1", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
task2 := tasksch.NewParallelTask("syncJdsStoreStock2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task2 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeSku := batchItemList[0].(*model.StoreSkuBind)
|
||||
stock := 0
|
||||
storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID})
|
||||
if storeSku.JdsID != 0 {
|
||||
if len(storeSku2) > 0 {
|
||||
if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal {
|
||||
stock = 9999
|
||||
}
|
||||
if storeMap.VendorStoreID != "" {
|
||||
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID))
|
||||
}
|
||||
} else {
|
||||
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID))
|
||||
}
|
||||
}
|
||||
return retVal, err
|
||||
}, storeSkus)
|
||||
tasksch.HandleTask(task2, task1, true).Run()
|
||||
_, err = task2.GetResult(0)
|
||||
return retVal, err
|
||||
}, storeMaps)
|
||||
tasksch.HandleTask(task1, nil, true).Run()
|
||||
_, err = task1.GetResult(0)
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -414,7 +414,7 @@ func doDailyWork2() {
|
||||
//同步京东商城门店的商品
|
||||
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
|
||||
//刷新京东商城的门店库存
|
||||
// cms.SyncJdsStoreStock(jxcontext.AdminCtx, dao.GetDB(), nil, true, true)
|
||||
cms.SyncJdsStoreStock(jxcontext.AdminCtx, true, true)
|
||||
}
|
||||
|
||||
func doDailyWork() {
|
||||
@@ -449,7 +449,7 @@ func doDailyWork() {
|
||||
//同步银豹到京西
|
||||
// cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true)
|
||||
//刷新京东商城订单结算价
|
||||
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102"))
|
||||
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102"))
|
||||
//同步上架京东商城待售商品
|
||||
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
|
||||
//同步美团配送与否状态及美团门店是否存在
|
||||
|
||||
@@ -1583,14 +1583,9 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) {
|
||||
// fmt.Println("addList2", addList)
|
||||
// fmt.Println("updateList2", utils.Format4Output(updateList, false))
|
||||
// fmt.Println("deleteList2", deleteList)
|
||||
var skuNames []model.SkuName
|
||||
sql := `
|
||||
SELECT * FROM sku_name WHERE img = 'https://image.jxc4.com/noGoodsImg.jpg' AND deleted_at = '1970-01-01 00:00:00'
|
||||
`
|
||||
dao.GetRows(dao.GetDB(), &skuNames, sql, nil)
|
||||
for _, v := range skuNames {
|
||||
cms.DeleteSkuName(ctx, v.ID, ctx.GetUserName())
|
||||
}
|
||||
// cms.DeletedDuplicateWaitAuditData(ctx, dao.GetDB())
|
||||
// orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102"))
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -974,3 +974,33 @@ func GetDefendPriceIssue() (issue int) {
|
||||
func GetLastDefendPriceIssue() (issue int) {
|
||||
return utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102"))
|
||||
}
|
||||
|
||||
//根据一堆坐标求面积
|
||||
//有待考证,不过暂时拿来用
|
||||
func ComputeSignedArea(path []string) (s float64) {
|
||||
var (
|
||||
radius = 6371009
|
||||
len = len(path)
|
||||
total float64
|
||||
prev = path[len-1]
|
||||
)
|
||||
if len < 3 {
|
||||
return
|
||||
}
|
||||
prevTanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(prev, ",")[1])/180*math.Pi) / 2))
|
||||
prevLng := utils.Str2Float64(strings.Split(prev, ",")[0]) / 180 * math.Pi
|
||||
for i := 0; i < len; i++ {
|
||||
tanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(path[i], ",")[1])/180*math.Pi) / 2))
|
||||
lng := utils.Str2Float64(strings.Split(path[i], ",")[0]) / 180 * math.Pi
|
||||
total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng)
|
||||
prevTanLat = tanLat
|
||||
prevLng = lng
|
||||
}
|
||||
return math.Abs(total * (float64(radius) * float64(radius)))
|
||||
}
|
||||
|
||||
func polarTriangleArea(tan1, lng1, tan2, lng2 float64) (s float64) {
|
||||
deltaLng := lng1 - lng2
|
||||
t := tan1 * tan2
|
||||
return 2 * math.Atan2(t*math.Sin(deltaLng), 1+t*math.Cos(deltaLng))
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ type ModelTimeInfo struct {
|
||||
type GoodsOrder struct {
|
||||
ID int64 `orm:"column(id)" json:"id"`
|
||||
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||
VendorOrderID2 string `orm:"column(vendor_order_id2);size(48);index" json:"vendorOrderID2"`
|
||||
VendorOrderID2 string `orm:"column(vendor_order_id2);size(200);index" json:"vendorOrderID2"`
|
||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
@@ -50,6 +51,13 @@ func (c *PurchaseHandler) onWaybillMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiap
|
||||
order.CourierName = utils.Interface2String(result["name"])
|
||||
order.CourierMobile = utils.Interface2String(result["phone"])
|
||||
}
|
||||
if order.Status == model.WaybillStatusNew {
|
||||
order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.WaybillVendorID)
|
||||
if order2.Status == model.OrderStatusWaitAccepted {
|
||||
order2.Status = model.OrderStatusNew
|
||||
scheduler.CurrentScheduler.OnOrderNew(order2, false)
|
||||
}
|
||||
}
|
||||
} else if order.Status == model.WaybillStatusCanceled {
|
||||
utils.AfterFuncWithRecover(timeout4WaybillCancel, func() {
|
||||
if localOrder, err2 := partner.CurOrderManager.LoadOrder(order.VendorOrderID, model.VendorIDEBAI); err2 == nil {
|
||||
|
||||
@@ -117,8 +117,6 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
// order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime)
|
||||
order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour)
|
||||
globals.SugarLogger.Warnf("来暂停的订单了!%v", msg.OrderID)
|
||||
return nil, err
|
||||
} else if msg.OrderState == jdshopapi.OrderStatusWait {
|
||||
order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
order.BusinessType = model.BusinessTypeImmediate
|
||||
|
||||
@@ -6,6 +6,8 @@ import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
@@ -13,19 +15,20 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
||||
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrder *model.AfsOrder, approveType int, reason string) (err error) {
|
||||
var status int
|
||||
if approveType == partner.AfsApproveTypeRefused {
|
||||
status = model.AfsOrderStatusFailed
|
||||
} else {
|
||||
status = model.AfsOrderStatusFinished
|
||||
|
||||
}
|
||||
orderStatus := &model.OrderStatus{
|
||||
VendorOrderID: order.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
||||
VendorID: order.VendorID,
|
||||
VendorOrderID: afsOrder.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
||||
VendorID: afsOrder.VendorID,
|
||||
OrderType: model.OrderTypeAfsOrder,
|
||||
RefVendorOrderID: order.VendorOrderID,
|
||||
RefVendorID: order.VendorID,
|
||||
RefVendorOrderID: afsOrder.VendorOrderID,
|
||||
RefVendorID: afsOrder.VendorID,
|
||||
VendorStatus: utils.Int2Str(status),
|
||||
Status: status,
|
||||
StatusTime: time.Now(),
|
||||
@@ -53,17 +56,18 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G
|
||||
var (
|
||||
skuMap = make(map[int]*model.OrderSku)
|
||||
salePrice int64
|
||||
db = dao.GetDB()
|
||||
)
|
||||
for _, sku := range order.Skus {
|
||||
skuMap[sku.SkuID] = sku
|
||||
}
|
||||
orderStatus := buildOrderStatus(ctx, order, reason)
|
||||
afsOrder := &model.AfsOrder{
|
||||
VendorID: order.VendorID,
|
||||
AfsOrderID: orderStatus.VendorOrderID,
|
||||
VendorOrderID: orderStatus.RefVendorOrderID,
|
||||
VendorStoreID: order.VendorStoreID,
|
||||
StoreID: order.StoreID,
|
||||
VendorID: order.VendorID,
|
||||
AfsOrderID: orderStatus.VendorOrderID,
|
||||
VendorOrderID: orderStatus.RefVendorOrderID,
|
||||
// VendorStoreID: order.VendorStoreID,
|
||||
// StoreID: jxutils.GetSaleStoreIDFromOrder(order),
|
||||
AfsCreatedAt: time.Now(),
|
||||
VendorAppealType: "",
|
||||
AppealType: model.AfsAppealTypeRefund,
|
||||
@@ -81,6 +85,10 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G
|
||||
VendorSkuID: utils.Int2Str(sku.SkuID),
|
||||
SkuID: sku.SkuID,
|
||||
}
|
||||
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{sku.SkuID})
|
||||
if len(storeSkus) > 0 {
|
||||
orderSku.VendorSkuID = utils.Int64ToStr(storeSkus[0].JdsID)
|
||||
}
|
||||
if skuMap[sku.SkuID] != nil {
|
||||
orderSku.Name = skuMap[sku.SkuID].SkuName
|
||||
orderSku.UserMoney = skuMap[sku.SkuID].SalePrice * int64(sku.Count)
|
||||
|
||||
@@ -118,6 +118,7 @@ type JxOrderInfo struct {
|
||||
IsBuyNowPrice int `json:"isBuyNowPrice"`
|
||||
IsPriceDefend int `json:"isPriceDefend"`
|
||||
OrderID2 string `json:"-"`
|
||||
UserID string `json:"userID"`
|
||||
}
|
||||
|
||||
type DeliveryTimeItem struct {
|
||||
@@ -815,18 +816,20 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
outJxOrder.FreightPrice = 500
|
||||
// }
|
||||
//如果是守价的订单,需要查询本期中该用户是否已经守价过,如果守价过就只算一次运费
|
||||
priceDefendOrders, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, 1, deliveryAddress.UserID, utils.ZeroTimeValue, utils.ZeroTimeValue, false)
|
||||
if len(priceDefendOrders) > 0 {
|
||||
flag2 := false
|
||||
for _, v := range priceDefendOrders {
|
||||
if v.StoreID != jxOrder.StoreID {
|
||||
flag2 = true
|
||||
if jxOrder.OrderType == model.OrderTypeDefendPrice {
|
||||
priceDefendOrders, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, 1, deliveryAddress.UserID, utils.ZeroTimeValue, utils.ZeroTimeValue, false)
|
||||
if len(priceDefendOrders) > 0 {
|
||||
flag2 := false
|
||||
for _, v := range priceDefendOrders {
|
||||
if v.StoreID != jxOrder.StoreID {
|
||||
flag2 = true
|
||||
}
|
||||
}
|
||||
if flag2 {
|
||||
return nil, nil, fmt.Errorf("同一期不允许相同用户在不同门店进行守价!")
|
||||
}
|
||||
outJxOrder.FreightPrice = 0
|
||||
}
|
||||
if flag2 {
|
||||
return nil, nil, fmt.Errorf("同一期不允许相同用户在不同门店进行守价!")
|
||||
}
|
||||
outJxOrder.FreightPrice = 0
|
||||
}
|
||||
} else {
|
||||
outJxOrder.FreightPrice = 0
|
||||
@@ -876,6 +879,9 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if jxOrder.OrderType == model.OrderTypeDefendPrice {
|
||||
outJxOrder.Skus[0].DefendPrice = jxOrder.Skus[0].DefendPrice
|
||||
}
|
||||
if jxOrder.UserID != "" {
|
||||
outJxOrder.UserID = jxOrder.UserID
|
||||
}
|
||||
} else {
|
||||
outJxOrder = nil
|
||||
deliveryAddress = nil
|
||||
@@ -952,6 +958,12 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd
|
||||
}
|
||||
order.OrderCreatedAt = order.StatusTime
|
||||
order.VendorUserID = order.UserID
|
||||
if order.UserID == "" && order.VendorUserID == "" {
|
||||
if jxOrder.UserID != "" {
|
||||
order.UserID = jxOrder.UserID
|
||||
order.VendorUserID = jxOrder.UserID
|
||||
}
|
||||
}
|
||||
if jxOrder.ExpectedDeliveredTimestamp != 0 {
|
||||
order.ExpectedDeliveredTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp)
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
@@ -1961,6 +1973,8 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) {
|
||||
userOrderMap[v.AddressID] = append(userOrderMap[v.AddressID], v)
|
||||
}
|
||||
for kk, vv := range userOrderMap {
|
||||
addressList, _, _ := dao.QueryUserDeliveryAddress(db, kk, nil, 0, 0)
|
||||
address := addressList[0]
|
||||
if len(vv) == 1 {
|
||||
jxOrder := &JxOrderInfo{
|
||||
BuyerComment: "守价订单",
|
||||
@@ -1973,6 +1987,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) {
|
||||
},
|
||||
IsPriceDefend: model.YES,
|
||||
OrderID: utils.Str2Int64(vv[0].VendorOrderID),
|
||||
UserID: address.UserID,
|
||||
}
|
||||
if _, err := CreateOrder(ctx, jxOrder, kk, OrderCreateTypeNormal, 0, false); err == nil {
|
||||
err = SettleDiscountActByPriceDefend(ctx, vv[0], false)
|
||||
@@ -1987,6 +2002,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) {
|
||||
StoreID: vv[0].StoreID,
|
||||
IsPriceDefend: model.YES,
|
||||
OrderID: GenOrderNo(ctx),
|
||||
UserID: address.UserID,
|
||||
}
|
||||
for _, priceDefend := range vv {
|
||||
sku := &JxSkuInfo{
|
||||
|
||||
@@ -73,6 +73,7 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G
|
||||
skuMap = make(map[int]*model.OrderSku)
|
||||
appID = ""
|
||||
salePrice int64
|
||||
db = dao.GetDB()
|
||||
)
|
||||
if time.Now().Sub(order.OrderCreatedAt) > 24*time.Hour {
|
||||
return fmt.Errorf("已超过售后申请时间,如有疑问请联系门店!")
|
||||
@@ -122,7 +123,7 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G
|
||||
}
|
||||
|
||||
if !isJxShop(appID) {
|
||||
orderPays, err := dao.GetOrderPayList(dao.GetDB(), order.VendorOrderID, order.VendorID)
|
||||
orderPays, err := dao.GetOrderPayList(db, order.VendorOrderID, order.VendorID)
|
||||
if err == nil {
|
||||
_, err = localjx.RefundOrderByTL(ctx, orderPays[0], order.VendorOrderID, int(salePrice), reason)
|
||||
if err != nil {
|
||||
|
||||
@@ -401,7 +401,7 @@ enableJdShopWrite = false
|
||||
|
||||
jdOrgCode = "320406"
|
||||
jdLoginName = "jd_jxcs1223"
|
||||
jdToken = "77e703b7-7997-441b-a12a-2e522efb117a"
|
||||
jdToken = "29afd5a8-f93f-4d4c-9fce-a7297340af59"
|
||||
jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d"
|
||||
jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4"
|
||||
|
||||
|
||||
@@ -808,3 +808,20 @@ func (c *StoreController) GetNearSupplyGoodsStoreByStoreID() {
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 获取京东门店手动划的配送范围面积
|
||||
// @Description 获取京东门店手动划的配送范围面积
|
||||
// @Param token header string true "认证token"
|
||||
// @Param storeIDs query string true "门店IDs"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetJdDeliveryArea [get]
|
||||
func (c *StoreController) GetJdDeliveryArea() {
|
||||
var storeIDs []int
|
||||
c.callGetJdDeliveryArea(func(params *tStoreGetJdDeliveryAreaParams) (retVal interface{}, errCode string, err error) {
|
||||
if jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil {
|
||||
err = cms.GetJdDeliveryArea(params.Ctx, storeIDs)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -29,10 +29,10 @@ type EventController struct {
|
||||
}
|
||||
|
||||
//连接的客户端,吧每个客户端都放进来
|
||||
var clients = make(map[*websocket.Conn]bool)
|
||||
var clients = make(map[string][]*websocket.Conn)
|
||||
|
||||
//广播频道(通道)
|
||||
var broadcast = make(chan []*model.ImMessageRecord)
|
||||
var broadcast = make(chan map[string]*model.ImMessageRecord)
|
||||
|
||||
// 配置升级程序(升级为websocket)
|
||||
var upgrader = websocket.Upgrader{}
|
||||
@@ -129,47 +129,51 @@ func (c *EventController) TestWebsocket() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer ws.Close()
|
||||
var (
|
||||
vendorOrderID = c.GetString("vendorOrderID")
|
||||
msgMap = make(map[string]*model.ImMessageRecord)
|
||||
)
|
||||
//将当前客户端放入map中
|
||||
clients[ws] = true
|
||||
//聊天记录
|
||||
clients[vendorOrderID] = append(clients[vendorOrderID], ws)
|
||||
|
||||
db := dao.GetDB()
|
||||
_, _, err = jxcontext.New(nil, c.GetString("token"), c.Ctx.ResponseWriter, c.Ctx.Request)
|
||||
if err != nil {
|
||||
msg := &CallResult{
|
||||
Code: model.ErrCodeGeneralFailed,
|
||||
Desc: err.Error(),
|
||||
}
|
||||
ws.WriteJSON(&msg)
|
||||
}
|
||||
records, _ := dao.GetImMessageRecord(db, c.GetString("vendorOrderID"), "", 0, -1)
|
||||
if len(records) > 0 {
|
||||
// 把消息 写入通道
|
||||
broadcast <- records
|
||||
} else {
|
||||
broadcast <- []*model.ImMessageRecord{
|
||||
&model.ImMessageRecord{
|
||||
Content: "第一条",
|
||||
},
|
||||
if globals.IsProductEnv() {
|
||||
_, _, err = jxcontext.New(nil, c.GetString("token"), c.Ctx.ResponseWriter, c.Ctx.Request)
|
||||
if err != nil {
|
||||
msg := &CallResult{
|
||||
Code: model.ErrCodeGeneralFailed,
|
||||
Desc: err.Error(),
|
||||
}
|
||||
ws.WriteJSON(&msg)
|
||||
}
|
||||
}
|
||||
|
||||
c.EnableRender = false //Beego不启用渲染
|
||||
|
||||
var s []*model.ImMessageRecord
|
||||
var s *model.ImMessageRecord
|
||||
for {
|
||||
//接收客户端的消息
|
||||
err := ws.ReadJSON(&s)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error())
|
||||
delete(clients, ws) //删除map中的客户端
|
||||
break //结束循环
|
||||
index := 0
|
||||
for k, v := range clients[vendorOrderID] {
|
||||
if v == ws {
|
||||
index = k
|
||||
}
|
||||
}
|
||||
wsList := clients[vendorOrderID]
|
||||
clients[vendorOrderID] = clients[vendorOrderID][0:0]
|
||||
clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...)
|
||||
clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...)
|
||||
// delete(clients, ws) //删除map中的客户端
|
||||
break //结束循环
|
||||
} else {
|
||||
//接受消息 业务逻辑
|
||||
broadcast <- s
|
||||
for _, v := range s {
|
||||
dao.WrapAddIDCULDEntity(v, "")
|
||||
dao.CreateEntity(db, v)
|
||||
}
|
||||
msgMap[vendorOrderID] = s
|
||||
broadcast <- msgMap
|
||||
dao.WrapAddIDCULDEntity(s, "")
|
||||
dao.CreateEntity(db, s)
|
||||
// fmt.Println("接受到从页面上反馈回来的信息 ", utils.Format4Output(s, false))
|
||||
}
|
||||
}
|
||||
@@ -186,14 +190,26 @@ func handleMessages() {
|
||||
msg := <-broadcast
|
||||
globals.SugarLogger.Debugf("clients len %v", len(clients))
|
||||
//循环map客户端
|
||||
for client := range clients {
|
||||
//把通道中的消息发送给客户端
|
||||
globals.SugarLogger.Debugf("msg %v", utils.Format4Output(msg, false))
|
||||
err := client.WriteJSON(msg)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
||||
client.Close() //关闭
|
||||
delete(clients, client) //删除map中的客户端
|
||||
for vendorOrderID, mmsg := range msg {
|
||||
for _, client := range clients[vendorOrderID] {
|
||||
//把通道中的消息发送给客户端
|
||||
globals.SugarLogger.Debugf("msg %v", utils.Format4Output(mmsg, false))
|
||||
err := client.WriteJSON(mmsg)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
||||
client.Close() //关闭
|
||||
index := 0
|
||||
for k, v := range clients[vendorOrderID] {
|
||||
if v == client {
|
||||
index = k
|
||||
}
|
||||
}
|
||||
wsList := clients[vendorOrderID]
|
||||
clients[vendorOrderID] = clients[vendorOrderID][0:0]
|
||||
clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...)
|
||||
clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...)
|
||||
// delete(clients, client) //删除map中的客户端
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,13 +172,14 @@ func (c *OrderController) CancelWaybill() {
|
||||
// @Param token header string true "认证token"
|
||||
// @Param storeID query int true "京西门店ID"
|
||||
// @Param lastHours query int false "最近多少小时的信息(缺省为两天)"
|
||||
// @Param lastMinutes query int false "最近多少分钟的信息(缺省为不传)"
|
||||
// @Param isIncludeFake query bool false "是否包括假订单"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetStoreOrderCountInfo [get]
|
||||
func (c *OrderController) GetStoreOrderCountInfo() {
|
||||
c.callGetStoreOrderCountInfo(func(params *tOrderGetStoreOrderCountInfoParams) (retVal interface{}, errCode string, err error) {
|
||||
retVal, err = orderman.FixedOrderManager.GetStoreOrderCountInfo(params.Ctx, params.StoreID, params.LastHours, params.IsIncludeFake)
|
||||
retVal, err = orderman.FixedOrderManager.GetStoreOrderCountInfo(params.Ctx, params.StoreID, params.LastHours, params.LastMinutes, params.IsIncludeFake)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -1076,6 +1077,23 @@ func (c *OrderController) TransferJdsOrder() {
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 合并订单(京东商城用)
|
||||
// @Description 合并订单(京东商城用)
|
||||
// @Param token header string true "认证token"
|
||||
// @Param vendorOrderIDs formData string true "订单号s"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /MergeJdsOrders [post]
|
||||
func (c *OrderController) MergeJdsOrders() {
|
||||
c.callMergeJdsOrders(func(params *tOrderMergeJdsOrdersParams) (retVal interface{}, errCode string, err error) {
|
||||
var vendorOrderIDs []string
|
||||
if err = jxutils.Strings2Objs(params.VendorOrderIDs, &vendorOrderIDs); err == nil {
|
||||
retVal, err = orderman.MergeJdsOrders(params.Ctx, vendorOrderIDs)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 京东商城订单发送京东物流
|
||||
// @Description 京东商城订单发送京东物流
|
||||
// @Param token header string true "认证token"
|
||||
|
||||
@@ -1224,6 +1224,15 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "MergeJdsOrders",
|
||||
Router: `/MergeJdsOrders`,
|
||||
AllowHTTPMethods: []string{"post"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "PartRefundOrder",
|
||||
@@ -1827,6 +1836,15 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"],
|
||||
beego.ControllerComments{
|
||||
Method: "GetJdDeliveryArea",
|
||||
Router: `/GetJdDeliveryArea`,
|
||||
AllowHTTPMethods: []string{"get"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"],
|
||||
beego.ControllerComments{
|
||||
Method: "GetNearSupplyGoodsStoreByStoreID",
|
||||
|
||||
Reference in New Issue
Block a user