package controller import ( "strings" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/legacyorder" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) // legacy const ( JX_ORDER_STATUS_WAIT_TO_ACCEPT = -1 //未接单(41000) JX_ORDER_STATUS_PICKING = 0 //拣货(32000->或定时召唤达达) JX_ORDER_STATUS_WAIT_FOR_DELIVERY = 1 //待配送(2->或转商家自送) JX_ORDER_STATUS_DELIVERING = 2 //配送中(33040) JX_ORDER_STATUS_DELIVERY_DONE = 3 //已完成(33060->90000) JX_ORDER_STATUS_EXCEPTION_APPLY = 4 //异常申请 JX_ORDER_STATUS_NOT_DELIVER = 5 //不配送 JX_ORDER_STATUS_AFTER_SALE = 6 //售后单 JX_ORDER_STATUS_CANCEL = 7 //已取消 JX_ORDER_STATUS_ADJUST = 8 //调整单 JX_DELIVERY_STATUS_NOT_DELIVERY = -1 //尚未申请配送 JX_DELIVERY_STATUS_WAIT_TO_GRAB = 0 //等待抢单 JX_DELIVERY_STATUS_GRAB_DONE = 1 //已抢单 JX_DELIVERY_STATUS_FAIL_TO_GET_GOODS = 2 //取货失败 JX_DELIVERY_STATUS_FAIL_TO_GET_GOODS_WAIT_TO_CONFIRM = 3 //取货失败待审核 JX_DELIVERY_STATUS_GET_GOODS_DONE = 4 //取货完成 JX_DELIVERY_STATUS_DELIVERY_FAIL = 5 //投递失败 JX_DELIVERY_STATUS_DELIVERY_DONE = 6 //已完成 JX_DELIVERY_STATUS_DELIVERY_CANCEL = 7 //已取消 ) const ( DD_CARRIER_NO = "9966" SELLER_CARRIER_NO = "2938" MTPS_CARRIER_NO = "1123" DDDELIVERY_CARRIER_NO = "3465" EME_SELF_CARRIER_NO = "9999" ) var ( VENDOR_ID2CARRIER_NO = map[int]string{ model.VendorIDJD: DD_CARRIER_NO, model.VendorIDELM: EME_SELF_CARRIER_NO, model.VendorIDDada: DDDELIVERY_CARRIER_NO, model.VendorIDMTPS: MTPS_CARRIER_NO, } CARRIERS_NAMES = map[string]string{ DD_CARRIER_NO: "达达专送", SELLER_CARRIER_NO: "门店自送", MTPS_CARRIER_NO: "美团配送", DDDELIVERY_CARRIER_NO: "达达众包", EME_SELF_CARRIER_NO: "饿了么蜂鸟", } BUSINESS_TAGS_MAP = map[string]string{ "one_dingshida": "0", "dj_aging_nextday": "1", "dj_aging_immediately": "2", "lengcang": "3", "lengdong": "3", } ) func legacyMapCoordinateType(coordType int) (jxorderCoordType int) { if coordType == model.CoordinateTypeMars { return 2 } return 0 } func legacyMapOrderStatus(orderStatus int) (retVal int8) { switch orderStatus { case model.OrderStatusNew: retVal = JX_ORDER_STATUS_WAIT_TO_ACCEPT case model.OrderStatusAccepted: retVal = JX_ORDER_STATUS_PICKING case model.OrderStatusDelivering: retVal = JX_ORDER_STATUS_DELIVERING case model.OrderStatusDelivered: retVal = JX_ORDER_STATUS_DELIVERY_DONE case model.OrderStatusAdjust: retVal = JX_ORDER_STATUS_ADJUST case model.OrderStatusApplyCancel: retVal = JX_ORDER_STATUS_EXCEPTION_APPLY case model.OrderStatusCanceled: retVal = JX_ORDER_STATUS_CANCEL } return retVal } func legacyMapWaybillStatus(status int) (retVal int8) { switch status { case model.WaybillStatusNew: retVal = JX_DELIVERY_STATUS_WAIT_TO_GRAB case model.WaybillStatusAccepted: retVal = JX_DELIVERY_STATUS_GRAB_DONE case model.WaybillStatusCourierArrived: retVal = JX_DELIVERY_STATUS_GET_GOODS_DONE case model.WaybillStatusDelivering: retVal = JX_DELIVERY_STATUS_GET_GOODS_DONE case model.WaybillStatusDelivered: retVal = JX_DELIVERY_STATUS_DELIVERY_DONE case model.WaybillStatusCanceled: retVal = JX_DELIVERY_STATUS_DELIVERY_CANCEL case model.WaybillStatusFailed: retVal = JX_DELIVERY_STATUS_DELIVERY_FAIL } return retVal } func (c *OrderController) legacyWriteJxOrder(order *model.GoodsOrder, db orm.Ormer, isDelFirst bool) (err error) { var result map[string]interface{} businessTags := "" if order.VendorID == model.VendorIDJD && utils.UnmarshalUseNumber([]byte(order.OriginalData), &result) == nil { tagList := strings.Split(result["businessTag"].(string), ";") list := []string{} for _, v := range tagList { if tag, ok := BUSINESS_TAGS_MAP[v]; ok { list = append(list, tag) } } businessTags = strings.Join(list, "|") + "|" } db.Begin() if isDelFirst { db.Raw("DELETE FROM "+globals.JxorderTableName+" WHERE order_id = ?", utils.Str2Int64(order.VendorOrderID)) db.Raw("DELETE FROM "+globals.JxorderskuTableName+" WHERE order_id = ?", utils.Str2Int64(order.VendorOrderID)) } jxorder := &legacyorder.Jxorder2{ VenderId: int8(order.VendorID), OrderId: utils.Str2Int64(order.VendorOrderID), JxStoreId: utils.Int2Str(jxutils.GetJxStoreIDFromOrder(order)), JxStoreName: order.StoreName, OrderNum: order.OrderSeq, OrderStatus: legacyMapOrderStatus(order.Status), OrderStatusTime: utils.Time2Str(order.StatusTime), BusinessTag: businessTags, SkuCount: order.SkuCount, OrderBuyerRemark: order.BuyerComment, BuyerFullName: order.ConsigneeName, BuyerFullAddress: order.ConsigneeAddress, BuyerMobile: order.ConsigneeMobile, BuyerCoordType: legacyMapCoordinateType(order.CoordinateType), BuyerLng: jxutils.IntCoordinate2Standard(order.ConsigneeLng), BuyerLat: jxutils.IntCoordinate2Standard(order.ConsigneeLat), CityName: "all", OrderStartTime: utils.Time2Str(order.StatusTime), JdStoreId: order.VendorStoreID, OrderTotalMoney: int(order.SalePrice), OrderDiscountMoney: int(order.SalePrice - order.ActualPayPrice), // DeliveryPackageWeight: float64(order.Weight) / 1000, } if order.ExpectedDeliveredTime.Sub(utils.DefaultTimeValue) > 0 { jxorder.OrderPreEndDelivTime = utils.Time2Str(order.ExpectedDeliveredTime) } _, err = db.Insert(jxorder) if err != nil { db.Rollback() globals.SugarLogger.Infof("insert jxorder:%v error:%v", jxorder, err) return err } sql := "INSERT INTO " + globals.JxorderskuTableName + "(vender_id, order_id, jx_sku_id, sku_name, jx_store_id, sku_price, sku_count, is_gift, promotion_type, sku_plat_discount, sku_vender_discount, sku_img) VALUES" params := []interface{}{} for _, sku := range order.Skus { sql += "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)," params = append(params, sku.VendorID, sku.VendorOrderID, sku.JxSkuID, sku.SkuName, jxutils.GetJxStoreIDFromOrder(order), sku.SalePrice, sku.Count, sku.SkuType, sku.PromotionType, 0, 0, "") } sql = sql[:len(sql)-1] + ";" if _, err = db.Raw(sql, params...).Exec(); err != nil { db.Rollback() baseapi.SugarLogger.Infof("insert jxordersku jxorder:%v error:%v", jxorder, err) } else { db.Commit() vendorOrderID := utils.Str2Int64(order.VendorOrderID) utils.CallFuncLogError(func() error { _, err = db.Raw(` UPDATE `+globals.JxorderTableName+` t1 JOIN jxstore t2 ON t2.storeid = t1.jx_store_id SET t1.store_lng = t2.lng, t1.store_lat = t2.lat WHERE t1.order_id = ?; `, vendorOrderID /*, vendorOrderID*/).Exec() return err }, "update jxorder") utils.CallFuncLogError(func() error { _, err = db.Raw(` UPDATE `+globals.JxorderskuTableName+` t1 JOIN jx_sku t2 ON t2.id = t1.jx_sku_id JOIN jx_sku_name t3 ON t3.id = t2.nameid SET t1.sku_img = t3.img WHERE t1.order_id = ?; `, vendorOrderID /*, vendorOrderID*/).Exec() return err }, "update jxordersku") } return err } func (c *OrderController) legacyJxOrderStatusChanged(status *model.OrderStatus, db orm.Ormer) (err error) { if db == nil { db = orm.NewOrm() } jxorder := &legacyorder.Jxorder2{ OrderId: utils.Str2Int64(status.VendorOrderID), } if err = db.Read(jxorder, "OrderId"); err == nil { utils.CallFuncLogError(func() error { jxorder.OrderStatus = legacyMapOrderStatus(status.Status) jxorder.OrderStatusTime = utils.Time2Str(status.StatusTime) updateFields := []string{ "OrderStatus", "OrderStatusTime", } if status.Status >= model.OrderStatusEndBegin { jxorder.DeliveryFinishTime = utils.Time2Str(status.StatusTime) updateFields = append(updateFields, "DeliveryFinishTime") } _, err = db.Update(jxorder, updateFields...) db.Raw(` UPDATE `+globals.JxorderTableName+` t1 JOIN waybill t2 ON t2.vendor_order_id = t1.order_id AND t2.status = 105 SET t1.delivery_price = IF(t2.waybill_vendor_id = 102, t2.desired_fee/100, t1.delivery_price), t1.delivery_price1 = IF(t2.waybill_vendor_id = 101, t2.desired_fee/100, t1.delivery_price1) WHERE t1.order_id = ? `, jxorder.OrderId).Exec() return err }, "legacyJxOrderStatusChanged") } else { globals.SugarLogger.Infof("read legacyJxOrder orderID:%d error:%v, ", jxorder.OrderId, err) } return err } func (c *WaybillController) legacyWaybillStatusChanged(bill *model.Waybill, db orm.Ormer) (err error) { if db == nil { db = orm.NewOrm() } jxorder := &legacyorder.Jxorder2{ OrderId: utils.Str2Int64(bill.VendorOrderID), } if err = db.Read(jxorder, "OrderId"); err == nil { utils.CallFuncLogError(func() error { updateFields := []string{ "DeliveryCarrierNo", "DeliveryCarrierName", "DeliveryManNo", "DeliveryManName", "DeliveryManPhone", "DeliveryBillNo", "DeliveryStatus", } // jxorder.DeliveryPackageWeight jxorder.DeliveryCarrierNo = VENDOR_ID2CARRIER_NO[bill.WaybillVendorID] jxorder.DeliveryCarrierName = CARRIERS_NAMES[jxorder.DeliveryCarrierNo] jxorder.DeliveryManNo = bill.CourierMobile jxorder.DeliveryManName = bill.CourierName jxorder.DeliveryManPhone = bill.CourierMobile jxorder.DeliveryBillNo = bill.VendorWaybillID jxorder.DeliveryStatus = legacyMapWaybillStatus(bill.Status) // jxorder.DeliveryConfirmTime if bill.Status == model.WaybillStatusNew { updateFields = append(updateFields, "DeliveryStartTime") jxorder.DeliveryStartTime = utils.Time2Str(bill.StatusTime) } else if bill.Status >= model.WaybillStatusEndBegin { jxorder.DeliveryFinishTime = utils.Time2Str(bill.StatusTime) updateFields = append(updateFields, "DeliveryFinishTime") } _, err = db.Update(jxorder, updateFields...) return err }, "legacyJxOrderStatusChanged") } else { globals.SugarLogger.Infof("read legacyJxOrder, orderID:%d error:%v", jxorder.OrderId, err) } return err }