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 得到门店订单信息2 // @Description 得到门店订单信息2 // @Param token header string true "认证token" // @Param storeID query int true "京西门店ID" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetStoreOrderCountInfo2 [get] func (c *OrderController) GetStoreOrderCountInfo2() { c.callGetStoreOrderCountInfo2(func(params *tOrderGetStoreOrderCountInfo2Params) (retVal interface{}, errCode string, err error) { retVal, err = orderman.FixedOrderManager.GetStoreOrderCountInfo2(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.Ctx.GetUserName(), 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 true "调整原因" // @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 { var order *model.GoodsOrder 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 }) } // @Title 审核取货失败 // @Description 审核取货失败 // @Param token header string true "认证token" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属厂商ID" // @Param acceptIt formData bool true "是否批准" // @Param reason formData string false "原因" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /AcceptOrRefuseFailedGetOrder [put] func (c *OrderController) AcceptOrRefuseFailedGetOrder() { c.callAcceptOrRefuseFailedGetOrder(func(params *tOrderAcceptOrRefuseFailedGetOrderParams) (retVal interface{}, errCode string, err error) { order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) if err == nil { err = defsch.FixedScheduler.AcceptOrRefuseFailedGetOrder(params.Ctx, order, params.AcceptIt, 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" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /CallPMCourier [put] func (c *OrderController) CallPMCourier() { c.callCallPMCourier(func(params *tOrderCallPMCourierParams) (retVal interface{}, errCode string, err error) { order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) if err == nil { err = defsch.FixedScheduler.CallPMCourier(params.Ctx, order) } 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 /ConfirmReceiveGoods [put] func (c *OrderController) ConfirmReceiveGoods() { c.callConfirmReceiveGoods(func(params *tOrderConfirmReceiveGoodsParams) (retVal interface{}, errCode string, err error) { order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) if err == nil { err = defsch.FixedScheduler.ConfirmReceiveGoods(params.Ctx, order) } return retVal, "", err }) } // @Title 同意或拒绝用户取消订单申请 // @Description 同意或拒绝用户取消订单申请 // @Param token header string true "认证token" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属厂商ID" // @Param acceptIt formData bool true "是否批准" // @Param reason formData string false "原因" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /AgreeOrRefuseCancel [put] func (c *OrderController) AgreeOrRefuseCancel() { c.callAgreeOrRefuseCancel(func(params *tOrderAgreeOrRefuseCancelParams) (retVal interface{}, errCode string, err error) { order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) if err == nil { err = defsch.FixedScheduler.AgreeOrRefuseCancel(params.Ctx, order, params.AcceptIt, params.Reason) } return retVal, "", err }) }