diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index cb876dc82..e3d5a191b 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -1,6 +1,7 @@ package orderman import ( + "crypto/md5" "errors" "fmt" "math" @@ -29,7 +30,12 @@ import ( "github.com/astaxie/beego/orm" ) +var ( + orderNoBeginTimestamp int64 +) + func init() { + orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix() } type tSkuCountPrice struct { @@ -493,7 +499,10 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. v.JxSkuID = skuBindInfo.SkuID //京东商城的话,门店里可能取不到对应商品 if order.VendorID == model.VendorIDJDShop { - v.JxSkuID = v.SkuID + if v.SkuID == 0 && v.JxSkuID != 0 { + v.SkuID = v.JxSkuID + } + // v.JxSkuID = v.SkuID storeSkus, _ := dao.GetStoresSkusInfo(db, []int{order.StoreID}, []int{v.SkuID}) if len(storeSkus) > 0 { v.ShopPrice = int64(storeSkus[0].Price) @@ -627,6 +636,7 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao } else { order.EarningType = model.EarningTypeQuote } + order.OrderPayPercentage = payPercentage } if err = c.updateOrderSkuOtherInfo(order, db, payPercentage, changePriceType); err == nil { jxutils.RefreshOrderSkuRelated(order) @@ -1314,15 +1324,15 @@ func setJdsOrderSeq(order *model.GoodsOrder) (err error) { type tCount struct { Count int `json:"count"` } - var count = &tCount{} + var counts []*tCount sql := ` - SELECT count(*) count FROM goods_order WHERE store_id = ? AND order_create_at >= ? AND order_create_at <= ? AND vendor_id = ? + SELECT count(*) count FROM goods_order WHERE store_id = ? AND order_created_at >= ? AND order_created_at <= ? AND vendor_id = ? ` sqlParams := []interface{}{ order.StoreID, utils.Time2Date(time.Now()), utils.Time2Date(time.Now().AddDate(0, 0, 1)), order.VendorID, } - err = dao.GetRow(dao.GetDB(), &count, sql, sqlParams) - order.OrderSeq = count.Count + 1 + err = dao.GetRows(dao.GetDB(), &counts, sql, sqlParams) + order.OrderSeq = counts[0].Count + 1 return err } @@ -1414,7 +1424,10 @@ func MergeJdsOrders(ctx *jxcontext.Context, vendorOrderIDs []string) (vendorOrde order.SalePrice = salePrice order.ShopPrice = shopPrice order.TotalShopMoney = totalShop - order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(orders[0].VendorOrderID2)*10000) + utils.Int2Str(99) + order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(orders[0].VendorOrderID2)*10000) + utils.Int2Str(time.Now().Second()) + if len(order.VendorOrderID) < 18 { + order.VendorOrderID = order.VendorOrderID + "0" + } order.VendorOrderID2 = strings.Join(orderIDs, ",") order.Status = model.OrderStatusNew setJdsOrderSeq(order) @@ -1589,12 +1602,15 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) if goodsOrders[0].Status != model.OrderStatusCanceled { err = jdshop.ChangeOrderStatus(goodsOrders[0].VendorOrderID, model.OrderStatusCanceled, "订单转移被取消") } - suffix := utils.Str2Int(goodsOrders[0].VendorOrderID[12:len(goodsOrders[0].VendorOrderID)]) - suffix++ + // 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) + order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*10000) + utils.Int2Str(time.Now().Second()) + if len(order.VendorOrderID) < 18 { + order.VendorOrderID = order.VendorOrderID + "0" + } } for _, sku := range skus { sku.VendorOrderID = order.VendorOrderID @@ -1745,7 +1761,7 @@ func UpdateWaybillDesiredFee(ctx *jxcontext.Context, vendorOrderID string, desir waybill := &model.Waybill{ VendorOrderID: order.VendorOrderID, OrderVendorID: order.VendorID, - VendorWaybillID: "-1", + VendorWaybillID: utils.Int64ToStr(GenOrderNo(ctx)), WaybillVendorID: -1, Status: model.WaybillStatusDelivered, WaybillCreatedAt: time.Now(), @@ -1755,7 +1771,7 @@ func UpdateWaybillDesiredFee(ctx *jxcontext.Context, vendorOrderID string, desir DesiredFee: int64(desiredFee), } dao.CreateEntity(db, waybill) - order.VendorWaybillID = "-1" + order.VendorWaybillID = waybill.VendorWaybillID dao.UpdateEntity(db, order, "VendorWaybillID") } else { bill.DesiredFee = int64(desiredFee) @@ -1769,3 +1785,49 @@ func AcceptOrRefuseOrder(ctx *jxcontext.Context, vendorOrderID string, vendorID handler := partner.GetPurchaseOrderHandlerFromVendorID(vendorID) return handler.AcceptOrRefuseOrder(order, isAccept, ctx.GetUserName()) } + +func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) { + const prefix = 88 + const randPartNum = 1000 + orderNo = time.Now().Unix() - orderNoBeginTimestamp + // fmt.Println(orderNo) + orderNo = orderNo * randPartNum + md5Bytes := md5.Sum([]byte(utils.GetUUID())) + randPart := 0 + for k, v := range md5Bytes { + randPart += int(v) << ((k % 3) * 8) + } + orderNo += int64(randPart % randPartNum) + orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix + return orderNo +} + +func RefreshJdsOrderConsigneeInfo(ctx *jxcontext.Context, vendorOrderID string) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJDShop) + if order == nil { + return fmt.Errorf("未查询到此京东商城订单!") + } + waybill, err := partner.CurOrderManager.LoadWaybill(order.VendorWaybillID, order.WaybillVendorID) + if waybill != nil { + return fmt.Errorf("已经创建了三方运单不允许修改联系人信息!") + } + jdsOrder, err := jdshop.GetJdsOrder(order.VendorOrderID2) + if err != nil { + return err + } + if jdsOrder == nil { + return fmt.Errorf("未查询到对应的京东商城订单!") + } + order.ConsigneeAddress = jdshop.Decrypt(jdsOrder.ConsigneeInfo.FullAddress) + order.ConsigneeName = jdshop.Decrypt(jdsOrder.ConsigneeInfo.Fullname) + order.ConsigneeMobile = jdshop.Decrypt(jdsOrder.ConsigneeInfo.Mobile) + order.ConsigneeMobile2 = jdshop.Decrypt(jdsOrder.ConsigneeInfo.Telephone) + order.BuyerComment = jdsOrder.OrderRemark + if order.ConsigneeAddress != "" { + lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "") + order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng) + order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat) + } + partner.CurOrderManager.UpdateOrderFields(order, []string{"ConsigneeAddress", "ConsigneeName", "ConsigneeMobile", "ConsigneeMobile2", "BuyerComment", "ConsigneeLng", "ConsigneeLat"}) + return err +} diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 3bf1bd679..9f0de1131 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -938,7 +938,7 @@ func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, f sql := ` SELECT t2.* FROM afs_order t1 - JOIN order_sku_financial t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.is_afs_order = 1 + JOIN order_sku_financial t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.is_afs_order = 1 AND t1.afs_order_id = t2.afs_order_id WHERE t1.afs_finished_at >= ? AND t1.afs_finished_at <= ? AND t1.status = ? ` sqlParams := []interface{}{ diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 629ba16ff..cc627e6a8 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -6,6 +6,8 @@ import ( "sync" "time" + push "git.rosy.net.cn/jx-callback/business/jxutils/unipush" + "github.com/astaxie/beego" "git.rosy.net.cn/jx-callback/business/jxstore/cms" @@ -13,7 +15,6 @@ import ( "git.rosy.net.cn/jx-callback/business/authz" "git.rosy.net.cn/jx-callback/business/authz/autils" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" - "git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/netprinter" @@ -556,6 +557,8 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } s.updateOrderByBill(order, bill, false) s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) + //若接单时间不在门店的营业时间范围内要取消运单 + s.cancelWaybillNotInStoreOpentime(savedOrderInfo, bill) //京东商城的话,需要去把订单出库,如果是转移过的订单,则需要修改转移订单号 if order.VendorID == model.VendorIDJDShop { s.solutionJdsOrder(bill) @@ -677,6 +680,31 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo return err } +func (s *DefScheduler) cancelWaybillNotInStoreOpentime(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { + if savedOrderInfo != nil { + //TODO 2020-09-07 不在门店的营业时间内取消运单 + order := savedOrderInfo.order + if savedOrderInfo.storeDetail != nil { + if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 { + time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now()) + time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now()) + if time.Now().Sub(time1) < 0 || time.Now().Sub(time2) > 0 { + if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 { + time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now()) + time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now()) + if time.Now().Sub(time3) < 0 || time.Now().Sub(time4) > 0 { + s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) + } + } else { + s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) + } + } + } + } + } + return err +} + func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) { err = smsmsg.NotifyNewCourierOrder(bill) return err @@ -766,7 +794,6 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf } else { err = fmt.Errorf("不在门店营业时间范围内!") } - } } } @@ -807,14 +834,14 @@ func (s *DefScheduler) cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo func (s *DefScheduler) solutionJdsOrder(bill *model.Waybill) (err error) { if len(bill.VendorOrderID) > 12 { //表示此订单是京东商城2次转移的订单,不用出库,但要去修改运单号 - if utils.Str2Int(bill.VendorOrderID[12:len(bill.VendorOrderID)]) > 2 { - err = jdshop.CurPurchaseHandler.OrderTransfer(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true) - if err != nil { - globals.SugarLogger.Errorf("京东商城订单自动转移失败!", err) - } - } else { - err = jdshop.CurPurchaseHandler.OrderExport(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true) - } + // if utils.Str2Int(bill.VendorOrderID[12:len(bill.VendorOrderID)]) > 2 { + // err = jdshop.CurPurchaseHandler.OrderTransfer(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true) + // if err != nil { + // globals.SugarLogger.Errorf("京东商城订单自动转移失败!", err) + // } + // } else { + // err = jdshop.CurPurchaseHandler.OrderExport(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true) + // } } return err } @@ -1444,6 +1471,7 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { smsmsg.NotifyNewOrder(order) smsmsg.NotifyNewUserOrder(order) } + push.NotifyNewOrder(order) }) } } diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index fcc8e98d6..f28c60e9f 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -1682,3 +1682,5 @@ func checkPriceDefendOrderByPrice(db *dao.DaoDB, storeID, skuID, stock, jxPrice } return stock } + + diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index a0ce88a6d..e64f152fb 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -14,6 +14,8 @@ import ( "time" "unicode/utf8" + "git.rosy.net.cn/jx-callback/business/authz" + "git.rosy.net.cn/baseapi/platformapi/yinbaoapi" "git.rosy.net.cn/jx-callback/globals/refutil" @@ -1530,6 +1532,12 @@ func TmpGetJxBadCommentsByStoreId(ctx *jxcontext.Context, keyword string, storeI return retVal, err } +type GetStoreCourierMapsResult struct { + storeCourierMaps *model.StoreCourierMap + CourierAddress string `json:"courierAddress"` + CourierPhone string `json:"courierPhone"` +} + func GetStoreCourierMaps(ctx *jxcontext.Context, db *dao.DaoDB, storeID int, vendorID int) (storeCourierMaps []*model.StoreCourierMap, err error) { cond := map[string]interface{}{ model.FieldStoreID: storeID, @@ -1601,9 +1609,9 @@ func addStoreCourierMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendorID err = ErrCanNotFindVendor } //同步美团配送与否状态及美团门店是否存在 - if outStoreCourierMap.VendorID == model.VendorIDMTPS { - SetMTPSStatus(jxcontext.AdminCtx, outStoreCourierMap.StoreID, outStoreCourierMap.Status) - } + // if outStoreCourierMap.VendorID == model.VendorIDMTPS { + // SetMTPSStatus(jxcontext.AdminCtx, outStoreCourierMap.StoreID, outStoreCourierMap.Status) + // } return outStoreCourierMap, err } @@ -3534,3 +3542,107 @@ func GetJdDeliveryArea(ctx *jxcontext.Context, storeIDs []int) (err error) { } return err } + +func UpdateStorePushClient(ctx *jxcontext.Context, storeID int, cID string) (err error) { + var ( + db = dao.GetDB() + ) + storePushClients, err := dao.GetStorePushClient(db, storeID, cID) + if err != nil { + return err + } + if len(storePushClients) == 0 { + storePushClient := &model.StorePushClient{ + StoreID: storeID, + ClientID: cID, + } + dao.WrapAddIDCULDEntity(storePushClient, ctx.GetUserName()) + dao.CreateEntity(db, storePushClient) + } + return err +} + +func CreateStoreAudit(ctx *jxcontext.Context, storeAudit *model.StoreAudit) (err error) { + var ( + db = dao.GetDB() + ) + storeAudits, err := dao.GetStoreAudit(db, []int{model.StoreAuditStatusOnline}, storeAudit.UserID, "") + if len(storeAudits) > 0 { + return fmt.Errorf("您已申请过入驻,请不要重复申请!") + } + if storeAudit.UserID == "" { + storeAudit.UserID = ctx.GetUserID() + } + dao.WrapAddIDCULDEntity(storeAudit, ctx.GetUserName()) + dao.CreateEntity(db, storeAudit) + return err +} + +func GetStoreAudit(ctx *jxcontext.Context, statuss []int, keyword, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { + var ( + applyTimeStartp, applyTimeEndp, auditTimeStartp, auditTimeEndp time.Time + db = dao.GetDB() + ) + if applyTimeStart != "" { + applyTimeStartp = utils.Str2Time(applyTimeStart) + } + if applyTimeEnd != "" { + applyTimeEndp = utils.Str2Time(applyTimeEnd) + } + if auditTimeStart != "" { + auditTimeStartp = utils.Str2Time(auditTimeStart) + } + if auditTimeEnd != "" { + auditTimeEndp = utils.Str2Time(auditTimeEnd) + } + pagedInfo, err = dao.GetStoreAuditPage(db, statuss, keyword, applyTimeStartp, applyTimeEndp, auditTimeStartp, auditTimeEndp, pageSize, offset) + return pagedInfo, err +} + +func StoreAudit(ctx *jxcontext.Context, storeAudits []*model.StoreAudit, status int) (err error) { + db := dao.GetDB() + if status == model.StoreAuditStatusOnline { + return fmt.Errorf("审核标志不正确!") + } + task := tasksch.NewParallelTask("StoreAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeAudit := batchItemList[0].(*model.StoreAudit) + storeAudits, err := dao.GetStoreAudit(db, []int{model.StoreAuditStatusOnline}, storeAudit.UserID, "") + if len(storeAudits) == 0 || err != nil { + return retVal, fmt.Errorf("未查询到待审核信息!") + } + if len(storeAudits) > 1 { + return retVal, fmt.Errorf("查询到该用户的待审核信息大于1条!userID: [%s]", storeAudit.UserID) + } + //审核通过 + if status == model.StoreAuditStatusCreated { + storeAudits[0].AuditStatus = model.StoreAuditStatusCreated + //添加门店 + storeExt := &StoreExt{} + utils.Map2StructByJson(utils.Struct2MapByJson(&storeAudit), &storeExt, false) + storeID, err := CreateStore(ctx, storeExt, ctx.GetUserName()) + if err != nil { + return retVal, fmt.Errorf(err.Error()) + } + err = AddUsers4Role(ctx, autils.NewRole(authz.StoreRoleBoss, storeID), []string{storeAudit.UserID}) + if err != nil { + return retVal, fmt.Errorf(err.Error()) + } + } else if status == model.StoreAuditStatusRejected { + storeAudits[0].Status = model.StoreAuditStatusRejected + } else { + return retVal, fmt.Errorf("审核标志不正确!") + } + storeAudits[0].LastOperator = ctx.GetUserName() + storeAudits[0].Remark = storeAudit.Remark + _, err = dao.UpdateEntity(db, storeAudits[0], "UserID", "Status", "Remark") + //是否推送app消息 + if err == nil { + + } + return retVal, err + }, storeAudits) + tasksch.HandleTask(task, nil, true).Run() + task.GetID() + return err +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 7ba20c673..aed0e04dd 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -13,6 +13,8 @@ import ( "time" "unicode" + "git.rosy.net.cn/jx-callback/business/auth2" + "github.com/astaxie/beego" "git.rosy.net.cn/baseapi/platformapi/jdshopapi" @@ -206,6 +208,14 @@ type MatterStock struct { Stock int `json:"stock"` } +type ActStoreSkuParam struct { + model.ActStoreSku + + ActualActPrice int64 `json:"actualActPrice,omitempty"` // 单品级活动用,创建活动时商品的活动价格 + VendorPrice int64 `json:"vendorPrice,omitempty"` // 创建活动时的平台价格 + ErrMsg string `json:"errMsg,omitempty"` +} + const ( maxStoreNameBind = 10000 // 最大门店SkuName bind个数 maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 @@ -1285,6 +1295,9 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs skuBind.JxPrice = jxPrice updateFieldMap["UnitPrice"] = 1 updateFieldMap["JxPrice"] = 1 + + //TODO 2020-09-08 如果改价时商品在做直降,要取消这个商品的直降,再通过改价比例修改活动价,再上这个直降 + // checkActDirectDown(ctx, skuBind, beforeMsg) } } if skuBindInfo.StatusSaleBegin != 0 && skuBindInfo.StatusSaleEnd != 0 { @@ -1350,6 +1363,47 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs return skuIDs, err } +// func checkActDirectDown(ctx *jxcontext.Context, skuBind *model.StoreSkuBind, beforeSkuBind tStoreSkuBindAndSpec) (err error) { +// var ( +// originPrice = beforeSkuBind.Price +// price = skuBind.Price +// db = dao.GetDB() +// pageSize = 9999 +// // percent = price / originPrice +// ) +// if paged, _ := dao.QueryActs(db, 0, 0, pageSize, -1, "", -1, []int{model.ActStatusCreated}, []int{model.ActSkuDirectDown}, nil, skuBind.StoreID, []int{skuBind.SkuID}, 0, utils.ZeroTimeValue, utils.ZeroTimeValue, time.Now().AddDate(0, -2, 0), time.Now()); len(paged.Data) > 0 { +// for _, act := range paged.Data { +// if _, actStoreSkus, err := dao.GetActStoreSkuVendorList(db, act.ID, nil, []int{skuBind.StoreID}, []int{skuBind.SkuID}, "", 0, pageSize); err == nil && len(actStoreSkus) > 0 { +// var ( +// handler = partner.GetPurchasePlatformFromVendorID(actStoreSkus[0].VendorID).(partner.IPurchasePlatformActHandler) +// actStoreSkuParam []*ActStoreSkuParam +// ) +// for _, actStoreSku := range actStoreSkus { +// aa := &ActStoreSkuParam{ +// ActStoreSku: model.ActStoreSku{ +// StoreID: skuBind.StoreID, +// SkuID: actStoreSku.SkuID, +// ActID: act.ID, +// }, +// } +// actStoreSkuParam = append(actStoreSkuParam, aa) +// } +// DeleteActStoreSkuBind(ctx, db, act.ID, actStoreSkuParam) +// actMap, err := dao.GetActVendorInfo(db, act.ID, []int{actStoreSkus[0].VendorID}) +// if err != nil { +// return err +// } +// actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, act.ID, nil, nil, nil) +// if err != nil { +// return err +// } +// handler.SyncAct(ctx, nil, actMap[actStoreSkus[0].VendorID], nil, actStoreSkuMap[actStoreSkus[0].VendorID]) +// } +// } +// } +// return err +// } + func getSkuSaleStatus(inSkuBind *StoreSkuBindSkuInfo, skuNameBindInfo *StoreSkuBindInfo) int { tempSale := 0 if inSkuBind != nil { @@ -4643,7 +4697,8 @@ func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*Sto // globals.SugarLogger.Debugf("doStoreSkuAudit return2 storeID : %v nameID: %v", storeID, skuBindInfo.NameID) // return false, err // } - if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini { + if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != auth2.AuthTypeMobile { + globals.SugarLogger.Debugf("doStoreSkuAudit return3 storeID : %v loginType: %v", storeID, ctx.GetLoginType()) authInfo, err := ctx.GetV2AuthInfo() if err == nil && authInfo != nil { if len(storeAudits) > 0 { @@ -4940,3 +4995,127 @@ func GetSpecialtyStoreSkus(ctx *jxcontext.Context, storeIDs, vendorIDs []int) (e } return err } + +func checkActUpdate(actID int, actMap map[int]*model.Act2) (err error) { + if len(actMap) == 0 { + return fmt.Errorf("活动%d不存在或已被取消", actID) + } + errList := errlist.New() + for vendorID, act := range actMap { + if vendorID == model.VendorIDEBAI && act.CreateType != model.ActCreateTypeAPI { + errList.AddErr(fmt.Errorf("饿百平台不支持修改或取消网页活动")) + } + } + return errList.GetErrListAsOne() +} + +func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSkuParam []*ActStoreSkuParam) (originSyncStatus int8, err error) { + actMap, err := dao.GetActVendorInfo(db, actID, nil) + if err != nil { + return 0, err + } + if err = checkActUpdate(actID, actMap); err != nil { + return 0, err + } + + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, nil, nil) + if err != nil { + return 0, err + } + act := actMap[partner.GetVendorIDsFromActMap(actMap)[0]] + if act.Status != model.ActStatusCreated || time.Now().Sub(act.EndAt) > 0 { + return 0, fmt.Errorf("当前活动状态:%s,不能进行此操作,或已过期", model.ActStatusName[act.Status]) + } + + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) + for _, v := range actStoreSkuParam { + actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v + if _, err = dao.DeleteEntityLogically(db, &model.ActStoreSku{}, nil, ctx.GetUserName(), + map[string]interface{}{ + model.FieldActID: actID, + model.FieldStoreID: v.StoreID, + model.FieldSkuID: v.SkuID, + }); err != nil { + return 0, err + } + } + + isNeedCancelAct := true + for vendorID, act := range actMap { + originSyncStatus |= act.SyncStatus + isDeleteAll := true + isDeleteAtLeastOne := false + if true { //actStoreSkuParam != nil { + actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuMap[vendorID]) + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + if actStoreSkuParam == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { + if act.Type == model.ActSkuFake { + _, err = dao.DeleteEntityLogically(db, &model.ActStoreSkuMap{}, nil, ctx.GetUserName(), + map[string]interface{}{ + model.FieldActID: actID, + model.FieldStoreID: actStoreSku.StoreID, + model.FieldSkuID: actStoreSku.SkuID, + }) + } else { + _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), + map[string]interface{}{ + model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil) + } + if err != nil { + return 0, err + } + isDeleteAtLeastOne = true + } else { + isNeedCancelAct = false + isDeleteAll = false + } + } + } + } else { + isDeleteAll = true + isDeleteAtLeastOne = true + } + if isDeleteAll || isDeleteAtLeastOne { + syncStatus := int8(model.SyncFlagModifiedMask) + if isDeleteAll { + syncStatus = model.SyncFlagDeletedMask + } + syncStatus |= act.SyncStatus + if act.Type != model.ActSkuFake && vendorID != model.VendorIDJX { + if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), + map[string]interface{}{ + model.FieldSyncStatus: syncStatus, + }, ctx.GetUserName(), nil); err != nil { + return 0, err + } + } + } + if isDeleteAll != isNeedCancelAct { + globals.SugarLogger.Warnf("deleteActStoreBind, actID:%d isDeleteAll:%t != isNeedCancelAct:%t", act.ID, isDeleteAll, isNeedCancelAct) + } + } + + if isNeedCancelAct { + act := &model.Act{} + act.ID = actID + if _, err = dao.UpdateEntityLogically(db, act, + map[string]interface{}{ + model.FieldStatus: model.ActStatusCanceled, + }, ctx.GetUserName(), nil); err != nil { + return 0, err + } + } + dao.Commit(db) + return originSyncStatus, err +} diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 61aa4846a..db3b86369 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -1331,9 +1331,9 @@ func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) { goto ifExist } else { /*如果通过名字找不到,那就先通过ID去找名字*/ - ShopInfo, _ := api.MtpsAPI.ShopQuery(strconv.Itoa(storeId)) + ShopInfo, _ := api.MtpsAPI.GetStoreInfo(storeId) if ShopInfo != nil { - ShopName = ShopInfo.ShopName + ShopName = ShopInfo[0].PoiName if ShopName == "" { ShopName = StoreLists[0].Name[:len(StoreLists[0].Name)-3] } @@ -1345,8 +1345,23 @@ func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) { goto ifNotExist } } else { - /*如果通过ID找不到,那就直接去判断名字*/ - goto NameProblem + StoreCourierList, _ := dao.GetStoreCourierList(dao.GetDB(), []int{storeId}, []int{model.VendorIDMTPS}, model.StoreStatusAll, model.StoreAuditStatusAll) + if len(StoreCourierList) > 0 { + ShopInfo, _ := api.MtpsAPI.GetStoreInfo(utils.Str2Int(StoreCourierList[0].VendorStoreID)) + if ShopInfo != nil { + ShopName = ShopInfo[0].PoiName + StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName) + if StoreInfoList != nil && StoreInfoList.DataList != nil { + goto ifExist + } else { + /*如果通过API返回的名字也找不到*/ + goto ifNotExist + } + } + } else { + /*如果通过ID找不到,那就直接去判断名字*/ + goto NameProblem + } } NameProblem: { diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index aeb6478bc..ff48de932 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -300,7 +300,7 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus) skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0) - if skuItem.ImgWatermark != "" { + if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD { if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 { downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) @@ -443,7 +443,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag // if vendorID == model.VendorIDJDShop { // formalizeStoreSkuListForJds(skus) // } - singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) reorderHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IStoreSkuSorter) @@ -462,9 +461,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag var failedList []*partner.StoreSkuInfoWithErr for _, sku := range skus { if vendorID == model.VendorIDJDShop && storeID != model.JdShopMainStoreID { - if sku.SkuSyncStatus != 0 { - sku.SkuSyncStatus = model.SyncFlagSaleMask - } + return } if !useVendorPriceDirectly && !isSkuLockTimeValid(sku) { @@ -645,6 +642,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag updateList = rList2 } } + task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 39f79a2af..ce8925a4a 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -287,9 +287,9 @@ func Init() { "04:05:06", }) //京东的订单信息解密密钥获取 - // ScheduleTimerFuncByInterval(func() { - // jdshop.InitKey() - // }, 10*time.Second, 8*time.Hour) + ScheduleTimerFuncByInterval(func() { + jdshop.InitKey() + }, 10*time.Second, 8*time.Hour) ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() { act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx) }, discountActJxList) @@ -454,6 +454,25 @@ func doDailyWork() { cms.RefreshJdsSkusStatus(jxcontext.AdminCtx) //同步美团配送与否状态及美团门店是否存在 cms.SetMTPSStatus(jxcontext.AdminCtx, 0, 0) + //售后单如果超过12小时没有审核,就自动通过 + RefreshAfsOrderStatusAccess(jxcontext.AdminCtx) +} + +func RefreshAfsOrderStatusAccess(ctx *jxcontext.Context) { + var ( + offset = 0 + pageSize = 9999 + db = dao.GetDB() + ) + afsOrderList, _, err := dao.GetAfsOrdersByPage(db, "", "", "", time.Now().AddDate(0, 0, -7), time.Now(), offset, pageSize) + if err != nil { + return + } + for _, v := range afsOrderList { + if v.Status == model.AfsOrderStatusWait4Approve && time.Now().Sub(v.AfsCreatedAt).Hours() > 12 { + defsch.FixedScheduler.AgreeOrRefuseRefund(ctx, v.AfsOrderID, v.VendorID, model.AfsTypePartRefund, "超时系统同意") + } + } } func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 373d62240..1c2f75635 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -13,10 +13,10 @@ import ( const ( EventCategory = "sys" - EventTypeWXToken = "wxToken" - EventTypeWX2Token = "wx2Token" - EventTypeWX3Token = "wx3Token" - + EventTypeWXToken = "wxToken" + EventTypeWX2Token = "wx2Token" + EventTypeWX3Token = "wx3Token" + EventTypePushToken = "pushToken" EventTypeYLYToken = "ylyToken" EventTypeWeimobToken = "weimobToken" ) @@ -67,6 +67,13 @@ func (h *Hub) OnNewWX2Token(token string) { }) } +func (h *Hub) OnNewPushToken(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypePushToken, + Data: token, + }) +} + func (h *Hub) OnNewWX3Token(token string) { h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ Type: EventTypeWX3Token, @@ -99,6 +106,8 @@ func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (toke if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil { token = string(utils.MustMarshal(weimobToken)) } + case EventTypePushToken: + token = api.PushAPI.CBGetToken() case EventTypeWX2Token: token = api.WeixinMiniAPI2.CBGetToken() } @@ -136,3 +145,7 @@ func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *T func (h *Hub) GetWeimobToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { return h.GetToken(EventTypeWeimobToken, oldToken, waitTime) } + +func (h *Hub) GetPushToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypePushToken, oldToken, waitTime) +} diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index a76972b8a..c578cd043 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -161,7 +161,7 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) { vendorID = model.VendorIDWSC } else if orderIDLen == len("1000004390") { vendorID = model.VendorIDJX - } else if orderIDLen == len("124557362562000001") { + } else if orderIDLen == len("124557362562000001") || orderIDLen == len("13153183146800000100") { vendorID = model.VendorIDJDShop } } diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 9086c72a4..ced368d0a 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -28,6 +28,7 @@ const ( dingdingTokenExpires = 7200 * time.Second weimobTokenExpires = 7200 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second + pushTokenExpires = 7200 * time.Second maxRefreshGap = 5 * 60 * time.Second errRefreshGap = 10 * time.Second @@ -165,6 +166,33 @@ func RefreshWeixin2Token() (err error) { return err } +func RefreshPushToken() (err error) { + if api.PushAPI != nil { + err = RefreshConfig("push", pushTokenExpires, func() (token string, expireTimeStr string) { + globals.SugarLogger.Debugf("RefreshPushToken RunMode:%s", beego.BConfig.RunMode) + if globals.IsMainProductEnv() { + if tokenInfo, err := api.PushAPI.CBRetrieveToken(); err == nil { + globals.SugarLogger.Debugf("RefreshPushToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + token = tokenInfo.Token + } else { + globals.SugarLogger.Errorf("RefreshPushToken RefreshToken failed with error:%v", err) + } + } else { + if tokenInfo := getPushTokenFromRemote(api.PushAPI.CBGetToken()); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-pushTokenExpires)) + token = tokenInfo.Token + } + } + return token, expireTimeStr + }, func(value string) { + globals.SugarLogger.Debugf("RefreshPushToken setter value:%s", value) + syseventhub.SysEventHub.OnNewPushToken(value) + api.PushAPI.CBSetToken(value) + }) + } + return err +} + func RefreshWeixin3Token() (err error) { // if api.WeixinMiniAPI3 != nil { // err = RefreshConfig("wechat3", weixinTokenExpires, func() (token string, expireTimeStr string) { @@ -342,6 +370,15 @@ func getWX2TokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { return tokenInfo } +func getPushTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetPushTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetPushTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} + func getWX3TokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ diff --git a/business/jxutils/unipush/push.go b/business/jxutils/unipush/push.go new file mode 100644 index 000000000..288bc68e3 --- /dev/null +++ b/business/jxutils/unipush/push.go @@ -0,0 +1,74 @@ +package push + +import ( + "strings" + + "git.rosy.net.cn/baseapi/platformapi/unipushapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" + "github.com/astaxie/beego" +) + +func NotifyNewOrder(order *model.GoodsOrder) { + var ( + db = dao.GetDB() + ) + globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID) + storePushs, err := dao.GetStorePushClient(db, jxutils.GetSaleStoreIDFromOrder(order), "") + if err != nil { + return + } + for _, v := range storePushs { + sb := new(strings.Builder) + sb.WriteString("老板,") + sb.WriteString(order.ConsigneeName) + sb.WriteString("购买了商品") + sb.WriteString(getOrderDetailBrief(order)) + status, err2 := api.PushAPI.PushToSingle(v.ClientID, false, &unipushapi.Notification{ + Title: "京西菜市新订单推送", + Body: sb.String(), + }) + if err = err2; err != nil { + globals.SugarLogger.Debugf("NotifyNewOrder push error: [%v]", err) + continue + } + if status == unipushapi.SuccessOffLine { + _, err = api.PushAPI.PushToSingle(v.ClientID, true, &unipushapi.Notification{ + Body: sb.String(), + }) + if err != nil { + globals.SugarLogger.Debugf("NotifyNewOrder push2 error: [%v]", err) + continue + } + } + + } +} + +func getOrderDetailBrief(order *model.GoodsOrder) (brief string) { + sb := new(strings.Builder) + sb.WriteString(order.Skus[0].SkuName) + sb.WriteString("等共") + sb.WriteString(utils.Int2Str(order.Skus[0].Count)) + sb.WriteString("份(") + sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice)) + sb.WriteString("元/份)等,预计收入") + //TODO 2020-07-20 果园和菜市不同 + var price int64 + if beego.BConfig.RunMode == "jxgy" { + price = order.EarningPrice + } else { + if order.EarningType == model.EarningTypePoints { + price = order.ActualPayPrice + } else { + price = order.ShopPrice + } + } + sb.WriteString(jxutils.IntPrice2StandardString(price)) + sb.WriteString("元") + return sb.String() +} diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 40d942cc4..e95398189 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -787,7 +787,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat } sql += ` FROM goods_order t1 - LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id + LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id AND t1.vendor_order_id = t2.vendor_order_id LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) LEFT JOIN place city ON city.code = t5.city_code LEFT JOIN place district ON district.code = t5.district_code` diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 87f96bd53..0b511a55c 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -1,7 +1,6 @@ package dao import ( - "fmt" "time" "git.rosy.net.cn/baseapi/platformapi/aliupcapi" @@ -231,8 +230,6 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, sqlParams = append(sqlParams, parentCatID) } sql += " ORDER BY t1.seq" - fmt.Println(sql) - fmt.Println(sqlParams) err = GetRows(db, &catList, sql, sqlParams...) return catList, err } diff --git a/business/model/dao/store.go b/business/model/dao/store.go index b14feb9dd..b3d914b41 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -813,3 +813,103 @@ func DeleteStoreCategroies(db *DaoDB, userName string, storeID int) (err error) _, err = ExecuteSQL(db, sql, sqlParams) return err } + +func GetStorePushClient(db *DaoDB, storeID int, cID string) (storePushClient []*model.StorePushClient, err error) { + sql := ` + SELECT * + FROM store_push_client + WHERE deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if storeID > 0 { + sql += " AND store_id = ?" + sqlParams = append(sqlParams, storeID) + } + if cID != "" { + sql += " AND client_id = ?" + sqlParams = append(sqlParams, cID) + } + err = GetRows(db, &storePushClient, sql, sqlParams) + if err != nil { + return nil, err + } + return storePushClient, err +} + +func GetStoreAudit(db *DaoDB, auditStatuss []int, userID, keyword string) (storeAudit []*model.StoreAudit, err error) { + sql := ` + SELECT * + FROM store_audit + WHERE deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(auditStatuss) > 0 { + sql += " AND audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")" + sqlParams = append(sqlParams, auditStatuss) + } + if userID != "" { + sql += " AND user_id = ?" + sqlParams = append(sqlParams, userID) + } + if keyword != "" { + sql += " AND (user_id LIKE ? OR name LIKE ? OR tel1 LIKE ? OR tel2 LIKE ? OR address LIKE ?)" + sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") + } + err = GetRows(db, &storeAudit, sql, sqlParams) + if err != nil { + return nil, err + } + return storeAudit, err +} + +type tStoreAudit struct { + model.StoreAudit + UserName string `json:"userName"` + CityName string `json:"cityName"` +} + +func GetStoreAuditPage(db *DaoDB, statuss []int, keyword string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { + var requestList []*tStoreAudit + sql := ` + SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, b.name user_name, c.name city_name + FROM store_audit a + JOIN user b ON b.user_id = a.user_id + JOIN place c ON c.code = a.city_code + WHERE a.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(statuss) > 0 { + sql += " AND a.audit_status IN (" + GenQuestionMarks(len(statuss)) + ")" + sqlParams = append(sqlParams, statuss) + } + if applyTimeStart != utils.ZeroTimeValue && applyTimeEnd != utils.ZeroTimeValue { + sql += " AND a.created_at BETWEEN ? AND ?" + sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd) + } + if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue { + sql += " AND a.updated_at BETWEEN ? AND ?" + sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd) + } + if keyword != "" { + sql += " AND (a.user_id LIKE ? OR a.name LIKE ? OR a.tel1 LIKE ? OR a.tel2 LIKE ? OR a.address LIKE ?)" + sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") + } + sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?" + pageSize = jxutils.FormalizePageSize(pageSize) + sqlParams = append(sqlParams, pageSize, offset) + Begin(db) + defer Commit(db) + if err = GetRows(db, &requestList, sql, sqlParams...); err == nil { + return &model.PagedInfo{ + TotalCount: GetLastTotalRowCount(db), + Data: requestList, + }, nil + } + return pagedInfo, err +} diff --git a/business/model/order.go b/business/model/order.go index a8f841c35..4c6eeb301 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -111,15 +111,16 @@ type GoodsOrder struct { ModelTimeInfo `json:"-"` Flag int `json:"flag"` //非运单调整相关的其它状态 - InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头 - InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码 - InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱 - VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店 - EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号 - AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID - EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价 - OrderType int `json:"orderType"` //订单类型,0为普通订单,1为物料订单,2为进货订单 + InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头 + InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码 + InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱 + VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店 + EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号 + AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID + EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价 + OrderType int `json:"orderType"` //订单类型,0为普通订单,1为物料订单,2为进货订单 + OrderPayPercentage int `json:"orderPayPercentage"` // 以下只是用于传递数据 OriginalData string `orm:"-" json:"-"` diff --git a/business/model/store.go b/business/model/store.go index 3e72193cd..b995d813e 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -685,3 +685,75 @@ func (*StoreCategoryMap) TableUnique() [][]string { []string{"StoreID", "CategoryID", "DeletedAt"}, } } + +type StorePushClient struct { + ModelIDCULD + StoreID int `orm:"column(store_id)" json:"storeID"` + ClientID string `orm:"column(client_id);size(255)" json:"clientID"` +} + +func (*StorePushClient) TableUnique() [][]string { + return [][]string{ + []string{"StoreID", "ClientID"}, + } +} + +type StoreAudit struct { + ModelIDCULD + + Name string `orm:"size(255)" json:"name"` + CityCode int `orm:"default(0);null" json:"cityCode"` // todo ? + DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ? + Address string `orm:"size(255)" json:"address"` + Tel1 string `orm:"size(32);index" json:"tel1"` + Tel2 string `orm:"size(32);index" json:"tel2"` + OpenTime1 int16 `json:"openTime1" validate:"max=2359,min=1,ltfield=CloseTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 + CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上 + OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上 + CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上 + Lng int `json:"-"` // 乘了10的6次方 + Lat int `json:"-"` // 乘了10的6次方 + DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 + DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 + Status int `json:"status"` + SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条) + + IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` + IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` + IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"` + Licence string `orm:"size(255)" json:"licence"` // 营业执照图片 + LicenceCode string `orm:"size(32)" json:"licenceCode"` + + LicenceType int8 `json:"licenceType"` // 营业执照类型,0:个人,1:公司 + LicenceCorpName string `orm:"size(64)" json:"licenceCorpName"` // 营业执照公司名称 + LicenceOwnerName string `orm:"size(8)" json:"licenceOwnerName"` // 法人姓名 + LicenceAddress string `orm:"size(255)" json:"licenceAddress"` // 地址 + LicenceValid string `orm:"size(32)" json:"licenceValid"` // 有效期开始 + LicenceExpire string `orm:"size(32)" json:"licenceExpire"` // 有效期结束 + + IDName string `orm:"size(8);column(id_name)" json:"idName"` // 身份证姓名 + IDCode string `orm:"size(32);column(id_code)" json:"idCode"` // 身份证号 + IDValid string `orm:"column(id_valid);size(32)" json:"idValid"` // 有效期开始 + IDExpire string `orm:"column(id_expire);size(32)" json:"idExpire"` // 有效期结束 + + Licence2Image string `orm:"size(255)" json:"licence2Image"` // 食品经营许可证 + Licence2Code string `orm:"size(32)" json:"licence2Code"` // 食品经营许可证编号 + Licence2Valid string `orm:"size(32)" json:"licence2Valid"` // 有效期开始 + Licence2Expire string `orm:"size(32)" json:"licence2Expire"` // 有效期结束 + + UserID string `orm:"column(user_id);size(32)" json:"userID"` //谁发起的审核就把谁添加到这个门店里 + AuditStatus int `json:"auditStatus"` //0是待审核,1是通过,-1是不通过 + Remark string `orm:"size(255)" json:"remark"` //不通过原因 +} + +func (*StoreAudit) TableUnique() [][]string { + return [][]string{ + []string{"Name"}, + } +} + +func (*StoreAudit) TableIndex() [][]string { + return [][]string{ + []string{"UserID"}, + } +} diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index f74e1dd9a..c66233cf1 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -235,7 +235,7 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder) // storeTel = ",门店电话:" + storeDeatail.Tel2 // } billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) - billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment+"取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!")) + billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4("客户电话:"+order.ConsigneeMobile+","+order.BuyerComment+"取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!")) billParams.CargoType = dadaapi.CargoTypeFresh billParams.CargoWeight = float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight))) billParams.CargoNum = order.GoodsCount diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 5d18a4190..bdb727f75 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -244,7 +244,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee // if storeDeatail.Tel2 != "" { // storeTel = ",门店电话:" + storeDeatail.Tel2 // } - billParams.Note = utils.FilterMb4(order.BuyerComment + ",取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!") + billParams.Note = utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + ",取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!") billParams.GoodsDetail = string(utils.MustMarshal(goods)) billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq) billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq) diff --git a/business/partner/partner.go b/business/partner/partner.go index bd4e9d041..030d2fe75 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -71,6 +71,7 @@ var ( CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败" CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束" CancelWaybillReasonStrActive = "操作由人员主动发起" + CancelWaybillReasonNotInStoreOpenTime = "不在门店的营业时间范围内" ) var ( diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index ea00102c0..0b2e6ec8c 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -8,7 +8,6 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" - "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" @@ -218,7 +217,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo ConsigneeName: utils.Interface2String(userMap["name"]), ConsigneeMobile: jxutils.FormalizeMobile(utils.Interface2String(userMap["phone"])), ConsigneeAddress: utils.Interface2String(userMap["address"]), - CoordinateType: model.CoordinateTypeBaiDu, + CoordinateType: model.CoordinateTypeMars, BuyerComment: utils.TrimBlankChar(utils.Interface2String(orderMap["remark"])), ExpectedDeliveredTime: getExpectedDeliveredTime(orderMap), PickDeadline: utils.DefaultTimeValue, @@ -269,12 +268,12 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo deliveryGeo := userMap["coord_amap"].(map[string]interface{}) originalLng := utils.Interface2Float64WithDefault(deliveryGeo["longitude"], 0.0) // 饿百的订单在过一段时间后,经纬度信息会变成字符串"**" originalLat := utils.Interface2Float64WithDefault(deliveryGeo["latitude"], 0.0) - lng, lat, err2 := api.AutonaviAPI.CoordinateConvert(originalLng, originalLat, autonavi.CoordSysBaidu) - if err2 == nil { - originalLng = lng - originalLat = lat - order.CoordinateType = model.CoordinateTypeMars - } + // lng, lat, err2 := api.AutonaviAPI.CoordinateConvert(originalLng, originalLat, autonavi.CoordSysBaidu) + // if err2 == nil { + // originalLng = lng + // originalLat = lat + // order.CoordinateType = model.CoordinateTypeMars + // } order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng) order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat) diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index 17e01b310..e2591a6b7 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -402,7 +402,7 @@ func genStoreMapFromStore(store *tEbaiStoreInfo) map[string]interface{} { } } boxFee, _ := dao.GetSysConfigAsInt64(dao.GetDB(), model.ConfigSysEbaiBoxFee) - params["package_box_price"] = boxFee + params["package_box_price"] = jxutils.IntPrice2Standard(boxFee) params["service_phone"] = store.Tel1 params["address"] = store.Address // todo 饿百 开店审核通过后不允许修改商户信息 diff --git a/business/partner/purchase/jdshop/callback.go b/business/partner/purchase/jdshop/callback.go index 93a86a059..9abdee29e 100644 --- a/business/partner/purchase/jdshop/callback.go +++ b/business/partner/purchase/jdshop/callback.go @@ -41,6 +41,24 @@ func OnCallbackMsg(msg *jdshopapi.CallBackResult) (err error) { } } }) + case jcqapi.TopicOrderOut: + utils.CallFuncAsync(func() { + globals.SugarLogger.Debugf("jdsOrderOut", utils.Format4Output(msg, false)) + orders := getAllRealOrderID(msg.OrderID) + if len(orders) > 0 { + for _, order := range orders { + if order.ActualPayPrice == 0 { + if jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment)) == 0 { + order.ActualPayPrice = jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderTotalPrice) + utils.Str2Float64(msg.FreightPrice) - utils.Str2Float64(msg.SellerDiscount)) + } else { + order.ActualPayPrice = jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment)) + } + order.TotalShopMoney = utils.Float64TwoInt64(float64(order.ActualPayPrice) * jdshopapi.JdsPayPercentage) + partner.CurOrderManager.UpdateOrderFields(order, []string{"ActualPayPrice", "TotalShopMoney"}) + } + } + } + }) default: return fmt.Errorf("暂不支持的topic类型!topic: %v", msgType) } @@ -52,10 +70,11 @@ func SaveJdsOrders(msg *jdshopapi.CallBackResult) (err error) { if err != nil || order == nil { return err } - order.StoreID = 102919 - order.JxStoreID = 102919 - order.StoreName = "商城模板(成都发货)" - order.VendorStoreID = model.JdShopMainVendorStoreID + // order.StoreID = 102919 + // order.JxStoreID = 102919 + // order.StoreName = "商城模板(成都发货)" + // order.VendorStoreID = model.JdShopMainVendorStoreID + // order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id:[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName) ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "京东商城来新订单了!", noticeMsg) @@ -87,7 +106,6 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err ActualPayPrice: jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment)), Status: model.OrderStatusNew, TotalShopMoney: utils.Float64TwoInt64(math.Round(float64(jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment))) * jdshopapi.JdsPayPercentage)), - DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, DeliveryType: model.OrderDeliveryTypeStoreSelf, StatusTime: utils.Str2Time(msg.OrderStartTime), OrderSeq: 0, @@ -99,49 +117,8 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err lng, lat, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "") order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng) order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat) + order.CoordinateType = model.CoordinateTypeMars } - storeList, err := common.GetStoreListByLocation(jxcontext.AdminCtx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true) - if err != nil { - globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error()) - return order, err - } - order.StoreID = storeList[0].ID - order.StoreName = storeList[0].Name - globals.SugarLogger.Debugf("jds GetStoreListByLocation, orderID: %v storeID :%v", order.VendorOrderID, order.StoreID) - storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") - if len(storeMaps) > 0 { - order.VendorStoreID = storeMaps[0].VendorStoreID - } - // 如果是暂停,表示是预订单 - if msg.OrderState == jdshopapi.OrderStatusPause || msg.OrderState == jdshopapi.OrderStatusPopPause { - order.BusinessType = model.BusinessTypeDingshida - // order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime) - order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour) - } else if msg.OrderState == jdshopapi.OrderStatusWait { - order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour) - order.BusinessType = model.BusinessTypeImmediate - } else { - globals.SugarLogger.Debugf("暂不支持的京东商城订单类型!type: %v", msg.OrderState) - return nil, err - } - - if msg.IDSopShipmenttype == jdshopapi.IdSopShipmenttypeTC { - if time, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { - order.BusinessType = model.BusinessTypeDingshida - order.ExpectedDeliveredTime = utils.Str2Time(time) - } - } - - //结算类型 - storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), order.StoreID, model.VendorIDJDShop) - if storeDetail != nil { - if storeDetail.PayPercentage < 50 { - order.EarningType = model.EarningTypePoints - } else { - order.EarningType = model.EarningTypeQuote - } - } - setJdsOrderSeq(order) for _, v := range msg.ItemInfoList { sku := &model.OrderSku{ VendorID: model.VendorIDJDShop, @@ -151,15 +128,109 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err SkuName: v.SkuName, VendorPrice: jxutils.StandardPrice2Int(utils.Str2Float64(v.JdPrice)), SalePrice: jxutils.StandardPrice2Int(utils.Str2Float64(v.JdPrice)), - SkuID: utils.Str2Int(v.OuterSkuID), + // SkuID: utils.Str2Int(v.OuterSkuID), + } + if v.OuterSkuID != "" { + sku.SkuID = utils.Str2Int(v.OuterSkuID) } _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(v.SkuName) sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit) order.Skus = append(order.Skus, sku) } + storeList, err := common.GetStoreListByLocation(jxcontext.AdminCtx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 3000, false, true) + if err != nil { + globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error()) + return order, err + } + if len(storeList) > 0 { + for _, store := range storeList { + order.StoreID = store.ID + order.JxStoreID = store.ID + order.StoreName = store.Name + globals.SugarLogger.Debugf("jds GetStoreListByLocation, orderID: %v storeID :%v", order.VendorOrderID, order.StoreID) + //结算类型 + storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), order.StoreID, model.VendorIDJDShop) + if storeDetail != nil { + if storeDetail.PayPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } + } + var ( + shopPriceSum int + saleNormalSum int + ) + for _, sku := range order.Skus { + storeSkuList, _ := dao.GetStoresSkusInfo(dao.GetDB(), []int{order.StoreID}, []int{sku.SkuID}) + if len(storeSkuList) > 0 && storeSkuList[0].Status == model.StoreSkuBindStatusNormal { + saleNormalSum += 1 + shopPriceSum += storeSkuList[0].Price * sku.Count + } + } + //可售数小于一半就不行 + if math.Mod(float64(len(order.Skus)), float64(2)) == 0 { + if saleNormalSum < len(order.Skus)/2 { + buildOrderTo102919(order) + continue + } else { + if order.EarningType == model.EarningTypeQuote && shopPriceSum+700 > int(order.TotalShopMoney) { + buildOrderTo102919(order) + continue + } + } + } else { + if saleNormalSum <= len(order.Skus)/2 { + buildOrderTo102919(order) + continue + } else { + if order.EarningType == model.EarningTypeQuote && shopPriceSum+700 > int(order.TotalShopMoney) { + buildOrderTo102919(order) + continue + } + } + } + break + } + } else { + buildOrderTo102919(order) + } + storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + if len(storeMaps) > 0 { + order.VendorStoreID = storeMaps[0].VendorStoreID + } + // 如果是暂停,表示是预订单g + if msg.OrderState == jdshopapi.OrderStatusPause || msg.OrderState == jdshopapi.OrderStatusPopPause { + order.BusinessType = model.BusinessTypeDingshida + if time, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { + order.ExpectedDeliveredTime = utils.Str2Time(time) + } + order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour) + } else if msg.OrderState == jdshopapi.OrderStatusWait { + order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour) + order.BusinessType = model.BusinessTypeImmediate + } else { + globals.SugarLogger.Debugf("暂不支持的京东商城订单类型!type: %v", msg.OrderState) + return nil, err + } + if msg.IDSopShipmenttype == jdshopapi.IdSopShipmenttypeTC { + if time, err := api.JdShopAPI.GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil { + order.BusinessType = model.BusinessTypeDingshida + order.ExpectedDeliveredTime = utils.Str2Time(time) + } + } + setJdsOrderSeq(order) return order, err } +func buildOrderTo102919(order *model.GoodsOrder) { + order.StoreID = 102919 + order.JxStoreID = 102919 + order.StoreName = "商城模板(成都发货)" + order.VendorStoreID = model.JdShopMainVendorStoreID + order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled +} + func setJdsOrderSeq(order *model.GoodsOrder) (err error) { type tCount struct { Count int `json:"count"` @@ -182,6 +253,7 @@ func Decrypt(p string) (result string) { } data, _ := base64.StdEncoding.DecodeString(strings.ReplaceAll(p, " ", "+")) key := GetKey(hex.EncodeToString(data)[4:36]) + globals.SugarLogger.Debugf("Decrypt keys : %v", key) data2, _ := base64.StdEncoding.DecodeString(key) b := bytes.NewBuffer(data) b.Next(18) @@ -206,3 +278,17 @@ func getRealOrderID(orderID string) (order *model.GoodsOrder) { dao.GetRow(db, &order, sql, sqlParams) return order } + +func getAllRealOrderID(orderID string) (orders []*model.GoodsOrder) { + var ( + db = dao.GetDB() + ) + sql := ` + SELECT * FROM goods_order WHERE vendor_order_id2 = ? + ` + sqlParams := []interface{}{ + orderID, + } + dao.GetRows(db, &orders, sql, sqlParams) + return orders +} diff --git a/business/partner/purchase/jdshop/order.go b/business/partner/purchase/jdshop/order.go index 0e605f0e6..e56bc527f 100644 --- a/business/partner/purchase/jdshop/order.go +++ b/business/partner/purchase/jdshop/order.go @@ -1,12 +1,13 @@ package jdshop import ( - "encoding/json" "fmt" "net/http" "strings" "time" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/platformapi/jdshopapi" @@ -47,12 +48,7 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order * return p.Map2Order(utils.Struct2FlatMap(resultOrders)), err } func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) { - params := make(map[string]interface{}) - params["orderID"] = vendorOrderID - params["token"] = "JxCaIsHiGetJsdOrderTmpToken_20200731" - result, err := apiToYd("order/GetJdsOrder", params) - jdsOrder := &jdshopapi.GetOrderResult{} - json.Unmarshal([]byte(strings.ReplaceAll(result["data"].(string), "\\", "")), &jdsOrder) + jdsOrder, err := GetJdsOrder(vendorOrderID) return status2Jxstatus(jdsOrder.OrderState), err } @@ -72,6 +68,7 @@ func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单在京东商城已被取消!") } else { err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成") + err = p.OrderExport(jxcontext.AdminCtx, order.VendorOrderID, order.VendorOrderID, true) } return err } @@ -116,6 +113,32 @@ func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.Goods return err } func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) { + var ( + db = dao.GetDB() + diffShopPrice int64 + diffSalePrice int64 + ) + if order.Status >= model.OrderStatusDelivering { + return fmt.Errorf("配送中以后的订单无法进行售前退款!") + } + //1、删除原order_sku 中售前调整的商品 + for _, sku := range removedSkuList { + sql := `DELETE FROM order_sku WHERE vendor_order_id = ? AND vendor_id = ? AND sku_id = ?` + sqlParams := []interface{}{order.VendorOrderID, order.VendorID, sku.SkuID} + dao.ExecuteSQL(db, sql, sqlParams) + + diffShopPrice += sku.ShopPrice + diffSalePrice += sku.SalePrice + } + //2、修改goods_order 中的shopprice,若是扣点的订单,还要改new_earning_price和total_shop_money + order.AdjustCount += 1 + order.ShopPrice = order.ShopPrice - diffShopPrice + if order.EarningType == model.EarningTypePoints { + order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diffSalePrice)) * jdshopapi.JdsPayPercentage) + jxutils.RefreshOrderEarningPrice2(order, order.OrderPayPercentage) + partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "NewEarningPrice"}) + } + partner.CurOrderManager.UpdateOrderFields(order, []string{"AdjustCount", "ShopPrice"}) return err } @@ -208,3 +231,13 @@ func apiToYd(url string, params map[string]interface{}) (retVal map[string]inter }) return retVal, err } + +func GetJdsOrder(vendorOrderID string) (jdsOrder *jdshopapi.GetOrderResult, err error) { + params := make(map[string]interface{}) + params["orderID"] = vendorOrderID + params["token"] = jdshopapi.JdsYdToken + result, err := apiToYd("order/GetJdsOrder", params) + jdsOrder2 := &jdshopapi.GetOrderResult{} + err = utils.UnmarshalUseNumber([]byte(strings.ReplaceAll(result["data"].(string), "\\", "")), &jdsOrder2) + return jdsOrder2, err +} diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 6adddd84e..3bfc81402 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -1155,6 +1155,8 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { outOrders, _, _ := tryToSplitMatterOrder(buildJxOrderInfo(order, orderSkus)) //以下为仿照CreateOrder,改了一些参数 for k, v := range outOrders { + v.OrderType = model.OrderTypeMatter + v.FromStoreID = order.FromStoreID outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID, false) if err != nil { return err @@ -1661,7 +1663,7 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result } queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID) getTrackMessagePlusByOrderResult, err := api.JdEclpAPI.GetTrackMessagePlusByOrder(vendorOrderID) - if err != nil { + if err != nil || queryOrderStatus == nil { return nil, err } if len(queryOrderStatus.OrderStatusList) > 0 { @@ -1921,6 +1923,10 @@ func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err er // if code == jdeclpapi.SoStatusCode10022 || code == jdeclpapi.SoStatusCode10038 { //表示该订单在京东物流为暂停或已经逆向发货完成 if len(order.VendorOrderID) == 14 && order.EclpOutID != "" { //这是不分包的订单 _, err = createMatterOrder(buildJxOrderInfo(order, order.Skus), order, int64(01)) + if err != nil { + globals.SugarLogger.Debugf("SendFailedMatterOrder err : [%v]", err) + return err + } err = CancelMatterOrder(db, order, cancelMatterOrderReason) changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) for _, v := range order.Skus { @@ -1944,7 +1950,7 @@ func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err er } } } - err = CancelMatterOrder(db, order, cancelMatterOrderReason) + // err = CancelMatterOrder(db, order, cancelMatterOrderReason) changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) } else if len(order.VendorOrderID) == 16 && order.EclpOutID != "" { // 这是分包的子订单 return fmt.Errorf("请重发主订单!主订单号:[%v]", order.VendorOrderID[len(order.VendorOrderID)-2:]) diff --git a/conf/app.conf b/conf/app.conf index 9df9a53e6..c9ac13179 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -143,6 +143,11 @@ jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" jd2Secret = "1097abd7ef09427099b4922784af123a" +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + elmIsProd = false elmToken = "2d2b583447b04b6bba5a6f3faed3559b" elmAppKey = "RwT214gAsS" @@ -181,6 +186,11 @@ jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" jd2Secret = "1097abd7ef09427099b4922784af123a" +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" @@ -243,6 +253,11 @@ dingdingSecret = "LWrZAFeqUfuVv7n_tc8vPpCAx6PT4CwManx2XCVhJOqGsx2L5XCDuX1sAN_Jtv dingdingCallbackURL = "http://callback.jxc4.com/dingding/msg" +pushAppID = "5lyyrvHODG6wC8Sdr3a9h" +pushAppKey = "iFrkUDmR2g5eqQpfh2kQ57" +pushAppSecret = "WTn53qd6WAAdLMXfmXvzb7" +pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47" + [jxgy] httpport = 8088 EnableDocs = false @@ -310,6 +325,7 @@ dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" +getPushTokenURL = "http://www.jxc4.com/v2/sys/GetPushToken" jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" @@ -410,6 +426,11 @@ jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" jd2Secret = "1097abd7ef09427099b4922784af123a" +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" @@ -445,6 +466,7 @@ disableWeimob = false getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" getWeixin2TokenURL = "http://www.jxc4.com/v2/sys/GetWX2Token" getWeimobTokenURL = "http://www.jxc4.com/v2/sys/GetWeimobToken" +getPushTokenURL = "http://www.jxc4.com/v2/sys/GetPushToken" dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" diff --git a/controllers/act.go b/controllers/act.go index 8fc2c00fa..89e6843a2 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -189,7 +189,7 @@ func (c *ActController) CancelAct() { // @Param pageSize query int false "表页大小(缺省全部)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult -// @router /GetActStoreSkuInfo [get] +// @router /GetActStoreSkuInfo [get,post] func (c *ActController) GetActStoreSkuInfo() { c.callGetActStoreSkuInfo(func(params *tActGetActStoreSkuInfoParams) (retVal interface{}, errCode string, err error) { var vendorIDs []int diff --git a/controllers/cms_store.go b/controllers/cms_store.go index c15db3963..1d10c0ec6 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -825,3 +825,81 @@ func (c *StoreController) GetJdDeliveryArea() { return retVal, "", err }) } + +// @Title 修改门店对应Cid(个推推送uniapp消息用) +// @Description 修改门店对应Cid(个推推送uniapp消息用) +// @Param token header string true "认证token" +// @Param storeID formData int true "门店ID" +// @Param clientID formData string true "cID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateStorePushClient [post] +func (c *StoreController) UpdateStorePushClient() { + c.callUpdateStorePushClient(func(params *tStoreUpdateStorePushClientParams) (retVal interface{}, errCode string, err error) { + err = cms.UpdateStorePushClient(params.Ctx, params.StoreID, params.ClientID) + return retVal, "", err + }) +} + +// @Title 用户申请门店审核 +// @Description 用户申请门店审核 +// @Param token header string true "认证token" +// @Param payload formData string true "json数据,store对象" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CreateStoreAudit [post] +func (c *StoreController) CreateStoreAudit() { + c.callCreateStoreAudit(func(params *tStoreCreateStoreAuditParams) (retVal interface{}, errCode string, err error) { + store := &model.StoreAudit{} + if err = utils.UnmarshalUseNumber([]byte(params.Payload), store); err == nil { + err = cms.CreateStoreAudit(params.Ctx, store) + } + return retVal, "", err + }) +} + +// @Title 获取用户申请门店审核 +// @Description 获取用户申请门店审核 +// @Param token header string true "认证token" +// @Param applyTimeStart query string false "申请开始时间" +// @Param applyTimeEnd query string false "申请结束时间" +// @Param auditTimeStart query string false "审核开始时间" +// @Param auditTimeEnd query string false "审核结束时间" +// @Param name query string false "审核人" +// @Param statuss query string false "审核状态" +// @Param keyword query string false "关键字" +// @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetStoreAudit [get] +func (c *StoreController) GetStoreAudit() { + c.callGetStoreAudit(func(params *tStoreGetStoreAuditParams) (retVal interface{}, errCode string, err error) { + var ( + statuss []int + ) + if err = jxutils.Strings2Objs(params.Statuss, &statuss); err != nil { + return retVal, "", err + } + retVal, err = cms.GetStoreAudit(params.Ctx, statuss, params.Keyword, params.ApplyTimeStart, params.ApplyTimeEnd, params.AuditTimeStart, params.AuditTimeEnd, params.PageSize, params.Offset) + return retVal, "", err + }) +} + +// @Title 门店审核 +// @Description 门店审核 +// @Param token header string true "认证token" +// @Param payload fomData string true "json数据,storeaudit对象" +// @Param status formData int false "审核标志,1通过,-1 不通过" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /StoreAudit [post] +func (c *StoreController) StoreAudit() { + c.callStoreAudit(func(params *tStoreStoreAuditParams) (retVal interface{}, errCode string, err error) { + var stores []*model.StoreAudit + if err = utils.UnmarshalUseNumber([]byte(params.Payload), &stores); err == nil { + err = cms.StoreAudit(params.Ctx, stores, params.Status) + } + return retVal, "", err + }) +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 3bcf028cc..d88564eae 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1168,3 +1168,17 @@ func (c *OrderController) AcceptOrRefuseOrder() { return retVal, "", err }) } + +// @Title 刷新京东商城订单收货人信息 +// @Description 刷新京东商城订单收货人信息 +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /RefreshJdsOrderConsigneeInfo [put] +func (c *OrderController) RefreshJdsOrderConsigneeInfo() { + c.callRefreshJdsOrderConsigneeInfo(func(params *tOrderRefreshJdsOrderConsigneeInfoParams) (retVal interface{}, errCode string, err error) { + err = orderman.RefreshJdsOrderConsigneeInfo(params.Ctx, params.VendorOrderID) + return retVal, "", err + }) +} diff --git a/controllers/sys.go b/controllers/sys.go index 6c7160961..089f2156f 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -71,6 +71,23 @@ func (c *SysController) GetYLYToken() { }) } +// @Title 得到个推token +// @Description 得到个推token +// @Param accessKey query string true "假token" +// @Param oldToken query string false "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetPushToken [get] +func (c *SysController) GetPushToken() { + c.callGetPushToken(func(params *tSysGetPushTokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetPushToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} + // @Title 得到微盟token // @Description 得到微盟token // @Param accessKey query string true "假token" diff --git a/globals/api/api.go b/globals/api/api.go index 60e077ed4..a1efdd0c9 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -3,6 +3,8 @@ package api import ( "time" + "git.rosy.net.cn/baseapi/platformapi/unipushapi" + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" "git.rosy.net.cn/baseapi/platformapi/aliupcapi" @@ -46,6 +48,7 @@ var ( JdPageAPI *jdapi.API Jd2API *jdapi.API + Jd3API *jdapi.API FakeJdAPI *jdapi.API JdEclpAPI *jdeclpapi.API JdShopAPI *jdshopapi.API @@ -87,6 +90,8 @@ var ( YilianyunAPI2 *yilianyunapi.API ZhongwuAPI *zhongwuapi.API + PushAPI *unipushapi.API + Cacher cache.ICacher SMSClient *aliyunsmsclient.SmsClient ) @@ -111,6 +116,10 @@ func Init() { // Jd2API.SetJdCookie(beego.AppConfig.DefaultString("jd2StorePageCookie", "")) } + if globals.Jd3OrgCode != "" { + Jd3API = jdapi.New(beego.AppConfig.String("jd3Token"), beego.AppConfig.String("jd3AppKey"), beego.AppConfig.String("jd3Secret")) + } + fakeJdToken := beego.AppConfig.DefaultString("fakeJdToken", "") if fakeJdToken != "" { FakeJdAPI = jdapi.NewFakeJD(fakeJdToken, beego.AppConfig.String("fakeJdBaseURL")) @@ -243,6 +252,7 @@ func Init() { YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", "")) YilianyunAPI2 = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID2", ""), beego.AppConfig.DefaultString("yilianyunClientSecret2", "")) ZhongwuAPI = zhongwuapi.New(beego.AppConfig.DefaultInt("zhongwuAppID", 0), beego.AppConfig.DefaultString("zhongwuAppSecret", "")) + PushAPI = unipushapi.New(beego.AppConfig.DefaultString("pushAppID", ""), beego.AppConfig.DefaultString("pushAppKey", ""), beego.AppConfig.DefaultString("pushAppSecret", ""), beego.AppConfig.DefaultString("pushMasterSecret", "")) SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/") } diff --git a/globals/api/apimanager/apimanager.go b/globals/api/apimanager/apimanager.go index 86ccd7f2b..d40b657df 100644 --- a/globals/api/apimanager/apimanager.go +++ b/globals/api/apimanager/apimanager.go @@ -39,6 +39,8 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{}) pfAPI = api.FakeJdAPI } else if appOrgCode != "" && appOrgCode == globals.Jd2OrgCode { pfAPI = api.Jd2API + } else if appOrgCode != "" && appOrgCode == globals.Jd3OrgCode { + pfAPI = api.Jd3API } case model.VendorIDMTWM: pfAPI = api.MtwmAPI @@ -52,7 +54,7 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{}) func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) { switch vendorID { case model.VendorIDJD: - appOrgCodeList = jxutils.BatchString2Slice(globals.JdOrgCode, globals.Jd2OrgCode) + appOrgCodeList = jxutils.BatchString2Slice(globals.JdOrgCode, globals.Jd2OrgCode, globals.Jd3OrgCode) case model.VendorIDMTWM: appOrgCodeList = []string{api.MtwmAPI.GetAppID()} case model.VendorIDEBAI: diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 497fa7ec6..2f404080f 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -38,6 +38,8 @@ func Init() { orm.RegisterModel(&model.SkuCategory{}) orm.RegisterModel(&model.ThingMap{}) orm.RegisterModel(&model.SkuExinfoMap{}) + orm.RegisterModel(&model.StorePushClient{}) + orm.RegisterModel(&model.StoreAudit{}) orm.RegisterModel(&model.AuthBind{}, &model.User{}) diff --git a/globals/globals.go b/globals/globals.go index 022333e7b..df52f970b 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -38,6 +38,7 @@ var ( GetWeixin2TokenURL string GetWeixinTokenKey string GetYLYTokenURL string + GetPushTokenURL string GetWeimobTokenURL string StoreName string @@ -58,6 +59,7 @@ var ( JdOrgCode string Jd2OrgCode string + Jd3OrgCode string JdLoginName string IsStoreSkuAct bool @@ -111,6 +113,7 @@ func Init() { GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "") GetWeimobTokenURL = beego.AppConfig.DefaultString("getWeimobTokenURL", "") GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") + GetPushTokenURL = beego.AppConfig.DefaultString("getPushTokenURL", "") StoreName = beego.AppConfig.String("storeName") StoreNameMtwm = beego.AppConfig.String("storeNameMtwm") @@ -129,6 +132,7 @@ func Init() { TLPayNotifyURL = beego.AppConfig.DefaultString("tonglianPayNotifyURL", "") JdOrgCode = beego.AppConfig.DefaultString("jdOrgCode", "") Jd2OrgCode = beego.AppConfig.DefaultString("jd2OrgCode", "") + Jd3OrgCode = beego.AppConfig.DefaultString("jd3OrgCode", "") JdLoginName = beego.AppConfig.DefaultString("jdLoginName", "") IsAddEvent = beego.AppConfig.DefaultBool("addEvent", false) IsStoreSkuAct = !IsProductEnv() diff --git a/main.go b/main.go index f11b45595..51f9f9eec 100644 --- a/main.go +++ b/main.go @@ -147,7 +147,10 @@ func main() { if err := tasks.RefreshYilianyunToken(); err != nil { globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err) return - + } + if err := tasks.RefreshPushToken(); err != nil { + globals.SugarLogger.Errorf("RefreshPushToken failed with error:%s", err) + return } // if globals.IsProductEnv() { // orderman.SaveJdsOrders(nil, time.Now().Add(-2*time.Hour), time.Now()) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 20f774aea..43e739309 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -65,7 +65,7 @@ func init() { beego.ControllerComments{ Method: "GetActStoreSkuInfo", Router: `/GetActStoreSkuInfo`, - AllowHTTPMethods: []string{"get"}, + AllowHTTPMethods: []string{"get","post"}, MethodParams: param.Make(), Filters: nil, Params: nil}) @@ -1278,6 +1278,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: "RefreshJdsOrderConsigneeInfo", + Router: `/RefreshJdsOrderConsigneeInfo`, + AllowHTTPMethods: []string{"put"}, + 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: "RefreshOrderFinancial", @@ -1764,6 +1773,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: "CreateStoreAudit", + Router: `/CreateStoreAudit`, + AllowHTTPMethods: []string{"post"}, + 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: "CreateStorePriceScore", @@ -1863,6 +1881,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: "GetStoreAudit", + Router: `/GetStoreAudit`, + 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: "GetStoreCategoryMap", @@ -1980,6 +2007,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: "StoreAudit", + Router: `/StoreAudit`, + AllowHTTPMethods: []string{"post"}, + 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: "SyncJdStore", @@ -2079,6 +2115,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: "UpdateStorePushClient", + Router: `/UpdateStorePushClient`, + AllowHTTPMethods: []string{"post"}, + 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: "UpdateStoreVendorMap", @@ -2583,6 +2628,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], + beego.ControllerComments{ + Method: "GetPushToken", + Router: `/GetPushToken`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], beego.ControllerComments{ Method: "GetWX2Token",