405 lines
18 KiB
Go
405 lines
18 KiB
Go
package controllers
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/jx-callback/business/partner"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/defsch"
|
||
"git.rosy.net.cn/jx-callback/business/jxstore/misc"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"github.com/astaxie/beego"
|
||
)
|
||
|
||
// 订单相关API
|
||
type OrderController struct {
|
||
beego.Controller
|
||
}
|
||
|
||
func (c *OrderController) URLMapping() {
|
||
c.Mapping("GetOrderSkuInfo", c.GetOrderSkuInfo)
|
||
|
||
c.Mapping("FinishedPickup", c.FinishedPickup)
|
||
c.Mapping("SelfDelivering", c.SelfDelivering)
|
||
c.Mapping("CreateWaybillOnProviders", c.CreateWaybillOnProviders)
|
||
c.Mapping("SelfDelivered", c.SelfDelivered)
|
||
}
|
||
|
||
// @Title 完成拣货
|
||
// @Description 完成拣货
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属的厂商ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /FinishedPickup [post]
|
||
func (c *OrderController) FinishedPickup() {
|
||
c.callFinishedPickup(func(params *tOrderFinishedPickupParams) (retVal interface{}, errCode string, err error) {
|
||
err = defsch.FixedScheduler.PickupGoodsAndUpdateStatus(params.Ctx, params.VendorOrderID, params.VendorID, params.Ctx.GetUserName())
|
||
return nil, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 转自送
|
||
// @Description 转自送,对于配送类型为纯自送的,就是表示自送开始
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属的厂商ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /SelfDelivering [post]
|
||
func (c *OrderController) SelfDelivering() {
|
||
c.callSelfDelivering(func(params *tOrderSelfDeliveringParams) (retVal interface{}, errCode string, err error) {
|
||
err = defsch.FixedScheduler.SelfDeliveringAndUpdateStatus(params.Ctx, params.VendorOrderID, params.VendorID, params.Ctx.GetUserName())
|
||
return nil, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 自送送达
|
||
// @Description 自送送达
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属的厂商ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /SelfDelivered [post]
|
||
func (c *OrderController) SelfDelivered() {
|
||
c.callSelfDelivered(func(params *tOrderSelfDeliveredParams) (retVal interface{}, errCode string, err error) {
|
||
err = defsch.FixedScheduler.SelfDeliveredAndUpdateStatus(params.Ctx, params.VendorOrderID, params.VendorID, params.Ctx.GetUserName())
|
||
return nil, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 创建三方运单
|
||
// @Description 创建三方运单
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属的厂商ID"
|
||
// @Param forceCreate formData bool false "是否强制创建(忽略订单状态检查)"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /CreateWaybillOnProviders [post]
|
||
func (c *OrderController) CreateWaybillOnProviders() {
|
||
c.callCreateWaybillOnProviders(func(params *tOrderCreateWaybillOnProvidersParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, params.ForceCreate)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 取消所有三方运单
|
||
// @Description 取消所有三方运单
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属的厂商ID"
|
||
// @Param isStopSchedule formData bool false "是否停止运单调度"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /CancelAll3rdWaybills [post]
|
||
func (c *OrderController) CancelAll3rdWaybills() {
|
||
c.callCancelAll3rdWaybills(func(params *tOrderCancelAll3rdWaybillsParams) (retVal interface{}, errCode string, err error) {
|
||
err = defsch.FixedScheduler.CancelAll3rdWaybills(params.Ctx, params.VendorOrderID, params.VendorID, params.IsStopSchedule)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 得到门店订单信息
|
||
// @Description 得到门店订单信息
|
||
// @Param token header string true "认证token"
|
||
// @Param storeID query string true "京西门店ID"
|
||
// @Param lastHours query int 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)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 得到订单SKU信息
|
||
// @Description 得到订单SKU信息
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID query string true "订单ID"
|
||
// @Param vendorID query int true "订单所属的厂商ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /GetOrderSkuInfo [get]
|
||
func (c *OrderController) GetOrderSkuInfo() {
|
||
c.callGetOrderSkuInfo(func(params *tOrderGetOrderSkuInfoParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetOrderSkuInfo(params.Ctx, params.VendorOrderID, params.VendorID)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 得到订单详情
|
||
// @Description 得到订单详情
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID query string true "订单ID"
|
||
// @Param vendorID query int true "订单所属的厂商ID"
|
||
// @Param refresh query bool false "是否从购物平台刷新数据"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /GetOrderInfo [get]
|
||
func (c *OrderController) GetOrderInfo() {
|
||
c.callGetOrderInfo(func(params *tOrderGetOrderInfoParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetOrderInfo(params.Ctx, params.VendorOrderID, params.VendorID, params.Refresh)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 得到订单运单信息
|
||
// @Description 得到订单运单信息
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID query string true "订单ID"
|
||
// @Param vendorID query int true "订单所属的厂商ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /GetOrderWaybillInfo [get]
|
||
func (c *OrderController) GetOrderWaybillInfo() {
|
||
c.callGetOrderWaybillInfo(func(params *tOrderGetOrderWaybillInfoParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetOrderWaybillInfo(params.Ctx, params.VendorOrderID, params.VendorID)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 导出美团运单
|
||
// @Description 导出美团运单(excel文件),注意时间跨度不要太长,最多只能是一个月
|
||
// @Param token header string true "认证token"
|
||
// @Param fromDate query string true "开始日期(包含),格式(2006-01-02)"
|
||
// @Param toDate query string false "结束日期(包含),格式(2006-01-02)"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /ExportMTWaybills [get]
|
||
func (c *OrderController) ExportMTWaybills() {
|
||
var content []byte
|
||
var fromDate, toDate string
|
||
c.callExportMTWaybills(func(params *tOrderExportMTWaybillsParams) (retVal interface{}, errCode string, err error) {
|
||
fromDate = params.FromDate
|
||
toDate = params.ToDate
|
||
if toDate == "" {
|
||
toDate = fromDate
|
||
}
|
||
content, err = orderman.FixedOrderManager.ExportMTWaybills(params.Ctx, params.FromDate, params.ToDate)
|
||
globals.SugarLogger.Debug(err)
|
||
return retVal, model.ErrorCodeIgnore, err
|
||
})
|
||
if content != nil {
|
||
c.Ctx.ResponseWriter.Header().Set("Content-Type", "application/vnd.ms-excel")
|
||
fileName := strings.Replace(fmt.Sprintf("attachment;filename=美团运单表%s至%sat%s.xlsx", fromDate, toDate, utils.Time2Str(time.Now())), " ", "-", 1)
|
||
c.Ctx.ResponseWriter.Header().Set("content-disposition", fileName)
|
||
c.Ctx.ResponseWriter.Write(content)
|
||
}
|
||
}
|
||
|
||
// @Title 查询订单
|
||
// @Description 查询订单
|
||
// @Param token header string true "认证token"
|
||
// @Param orderID query string false "订单号,如果此项不为空,忽略其它所有查询条件(此项会废弃,用vendorOderID)"
|
||
// @Param vendorOrderID query string false "订单号,如果此项不为空,忽略其它所有查询条件"
|
||
// @Param keyword query string false "查询关键字"
|
||
// @Param fromDate query string false "开始日期(包含),格式(2006-01-02),如果订单号为空此项必须要求"
|
||
// @Param toDate query string false "结束日期(包含),格式(2006-01-02),如果订单号为空此项必须要求"
|
||
// @Param vendorIDs query string false "订单所属厂商列表[1,2,3],缺省不限制"
|
||
// @Param waybillVendorIDs query string false "承运人所属厂商列表[1,2,3],缺省不限制"
|
||
// @Param storeIDs query string false "京西门店ID列表[1,2,3],缺省不限制"
|
||
// @Param statuss query string false "订单状态列表[1,2,3],缺省不限制"
|
||
// @Param lockStatuss query string false "订单锁定状态列表[1,2,3],缺省不限制"
|
||
// @Param cities query string false "城市code列表[1,2,3],缺省不限制"
|
||
// @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 /GetOrders [get]
|
||
func (c *OrderController) GetOrders() {
|
||
c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetOrders(params.Ctx, params.FromDate, params.ToDate, params.MapData, params.Offset, params.PageSize)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 查询运单
|
||
// @Description 查询运单
|
||
// @Param token header string true "认证token"
|
||
// @Param keyword query string false "查询关键字"
|
||
// @Param fromDate query string true "开始日期(包含),格式(2006-01-02)"
|
||
// @Param toDate query string false "结束日期(包含),格式(2006-01-02)"
|
||
// @Param waybillVendorIDs query string false "承运人所属厂商列表[1,2,3],缺省不限制"
|
||
// @Param statuss query string false "运单状态列表[1,2,3],缺省不限制"
|
||
// @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 /GetWaybills [get]
|
||
func (c *OrderController) GetWaybills() {
|
||
c.callGetWaybills(func(params *tOrderGetWaybillsParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetWaybills(params.Ctx, params.FromDate, params.ToDate, params.MapData, params.Offset, params.PageSize)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 查询订单/运单事件
|
||
// @Description 查询订单/运单事件
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID query string true "订单/运单ID"
|
||
// @Param vendorID query int true "订单/运单所属厂商ID)"
|
||
// @Param orderType query int true "订单:1;运单:2;订单+运单:-1"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /GetOrderStatusList [get]
|
||
func (c *OrderController) GetOrderStatusList() {
|
||
c.callGetOrderStatusList(func(params *tOrderGetOrderStatusListParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = orderman.FixedOrderManager.GetOrderStatusList(params.Ctx, params.VendorOrderID, params.VendorID, params.OrderType)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 刷新订单真实手机号
|
||
// @Description 刷新订单真实手机号
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorID formData int true "厂商ID"
|
||
// @Param fromTime formData string false "起始时间"
|
||
// @Param toTime formData string false "结束时间"
|
||
// @Param isAsync formData bool true "是否异步操作"
|
||
// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /RefreshOrderRealMobile [put]
|
||
func (c *OrderController) RefreshOrderRealMobile() {
|
||
c.callRefreshOrderRealMobile(func(params *tOrderRefreshOrderRealMobileParams) (retVal interface{}, errCode string, err error) {
|
||
timeList, err2 := jxutils.BatchStr2Time(params.FromTime, params.ToTime)
|
||
if err = err2; err == nil {
|
||
retVal, err = misc.RefreshRealMobile(params.Ctx, params.VendorID, timeList[0], timeList[1], params.IsAsync, params.IsContinueWhenError)
|
||
}
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 设置订单打印状态
|
||
// @Description 同步商家SKU类别
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单/运单ID"
|
||
// @Param vendorID formData int true "订单/运单所属厂商ID)"
|
||
// @Param isPrinted formData bool true "是否打印"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /SetOrderPrintStatus [put]
|
||
func (c *OrderController) SetOrderPrintStatus() {
|
||
c.callSetOrderPrintStatus(func(params *tOrderSetOrderPrintStatusParams) (retVal interface{}, errCode string, err error) {
|
||
err = dao.SetOrderPrintFlag(dao.GetDB(), params.VendorOrderID, params.VendorID, params.IsPrinted)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 网络打印订单
|
||
// @Description 网络打印订单
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单/运单ID"
|
||
// @Param vendorID formData int true "订单/运单所属厂商ID)"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /PrintOrder [put]
|
||
func (c *OrderController) PrintOrder() {
|
||
c.callPrintOrder(func(params *tOrderPrintOrderParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = netprinter.PrintOrder(params.Ctx, params.VendorOrderID, params.VendorID)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 查询网络打印机状态
|
||
// @Description 查询网络打印机状态
|
||
// @Param token header string true "认证token"
|
||
// @Param storeID query int true "门店ID"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /GetPrinterStatus [get]
|
||
func (c *OrderController) GetPrinterStatus() {
|
||
c.callGetPrinterStatus(func(params *tOrderGetPrinterStatusParams) (retVal interface{}, errCode string, err error) {
|
||
retVal, err = netprinter.GetNetPrinterStatus(params.Ctx, params.StoreID)
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
func skuList2Map(skuList []*model.OrderSku) (skuMap map[int]*model.OrderSku) {
|
||
skuMap = make(map[int]*model.OrderSku)
|
||
for _, sku := range skuList {
|
||
skuID := jxutils.GetSkuIDFromOrderSku(sku)
|
||
if skuMap[skuID] == nil {
|
||
skuMap[skuID] = sku
|
||
} else {
|
||
skuMap[skuID].Count += sku.Count
|
||
}
|
||
}
|
||
return skuMap
|
||
}
|
||
|
||
// @Title 调整订单
|
||
// @Description 调整订单
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属厂商ID)"
|
||
// @Param removedSkuInfo formData string true "要去除的商品信息,只有skuID与Count字段有效"
|
||
// @Param reason formData string false "调整原因"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /AdjustOrder [put]
|
||
func (c *OrderController) AdjustOrder() {
|
||
c.callAdjustOrder(func(params *tOrderAdjustOrderParams) (retVal interface{}, errCode string, err error) {
|
||
var skuList []*model.OrderSku
|
||
err = jxutils.Strings2Objs(params.RemovedSkuInfo, &skuList)
|
||
if err == nil {
|
||
order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID)
|
||
if err == nil {
|
||
orderSkuMap := skuList2Map(order.Skus)
|
||
removeSkuMap := skuList2Map(skuList)
|
||
for _, sku := range removeSkuMap {
|
||
skuID := jxutils.GetSkuIDFromOrderSku(sku)
|
||
if orderSkuMap[skuID] == nil {
|
||
err = fmt.Errorf("找不到SKU:%d", skuID)
|
||
} else if sku.Count > orderSkuMap[skuID].Count {
|
||
err = fmt.Errorf("SKU:%d调整数量:%d大于实际数量:%d", skuID, sku.Count, orderSkuMap[skuID].Count)
|
||
}
|
||
if err != nil {
|
||
break
|
||
} else {
|
||
count := sku.Count
|
||
*sku = *orderSkuMap[skuID]
|
||
sku.Count = count
|
||
}
|
||
}
|
||
if err == nil {
|
||
err = defsch.FixedScheduler.AdjustOrder(params.Ctx, order, skuList, params.Reason)
|
||
}
|
||
}
|
||
}
|
||
return retVal, "", err
|
||
})
|
||
}
|
||
|
||
// @Title 取消订单
|
||
// @Description 取消订单
|
||
// @Param token header string true "认证token"
|
||
// @Param vendorOrderID formData string true "订单ID"
|
||
// @Param vendorID formData int true "订单所属厂商ID)"
|
||
// @Param reason formData string false "取消原因"
|
||
// @Success 200 {object} controllers.CallResult
|
||
// @Failure 200 {object} controllers.CallResult
|
||
// @router /CancelOrder [put]
|
||
func (c *OrderController) CancelOrder() {
|
||
c.callCancelOrder(func(params *tOrderCancelOrderParams) (retVal interface{}, errCode string, err error) {
|
||
order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID)
|
||
if err == nil {
|
||
err = defsch.FixedScheduler.CancelOrder(params.Ctx, order, params.Reason)
|
||
}
|
||
return retVal, "", err
|
||
})
|
||
}
|