diff --git a/business/model/user_vendor_order.go b/business/model/user_vendor_order.go new file mode 100644 index 000000000..ccd8b93d4 --- /dev/null +++ b/business/model/user_vendor_order.go @@ -0,0 +1,80 @@ +package model + +import "git.rosy.net.cn/jx-callback/business/model/dao" + +type UserVendorOrder struct { + ModelIDCUL + UserId string `orm:"size(128);column(user_id);index" json:"userID"` // 用户ID + LocalWayBill string `orm:"size(128);column(local_way_bill);index" json:"localWayBill"` // 本地订单ID + OtherWayBill string `orm:"size(128);column(other_way_bill);index" json:"otherWayBill"` // 第三方运单ID + Goods string `orm:"column(goods)" json:"goods"` // 商品名称 + GuaranteeValueAmount float64 `orm:"column(guarantee_value_amount)" json:"guaranteeValueAmount"` // 保价金额 + Weight int `orm:"size(64);column(weight)" json:"weight"` // 重量kg + Length int `orm:"size(64);column(length)" json:"length"` // 所有包裹累计长cm + Height int `orm:"size(64);column(height)" json:"height"` // 所有包裹累计高cm + Width int `orm:"size(64);column(width)" json:"width"` // 所有包裹累计宽cm(向上取整) + OrderSendTime string `orm:"size(128);column(orderSendTime)" json:"orderSendTime"` // 预约时间 + PackageNum int `orm:"size(128);column(package_num)" json:"packageNum"` // 包裹数量 + ReceiveAddressID int64 `orm:"size(128);column(receive_address_id)" json:"receiveAddressID"` // 收件人地址ID + Remark string `orm:"size(512);column(remark)" json:"remark"` // 运单备注 + SenderAddressID int64 `orm:"size(128);column(sender_address_id)" json:"senderAddressID"` // 寄件人地址ID + ThirdPlatform int `orm:"size(16);column(third_platform)" json:"thirdPlatform"` // 第三方平台-京东商家下单传3 + Type int `orm:"size(8);column(type)" json:"type"` // 快递公司 + PromiseTimeType int `orm:"size(8);column(promise_Time_type)" json:"promiseTimeType"` // 快递时效产品 + DeliveryType int `orm:"size(8);column(delivery_type)" json:"deliveryType"` // 产品类型 + ChannelFee float64 `orm:"column(channel_fee)" json:"channelFee"` // 渠道价 + ServiceCharge float64 `orm:"column(service_charge)" json:"serviceCharge"` // 服务费 + GuarantFee float64 `orm:"column(guarant_fee)" json:"guarantFee"` // 保价费用 + OriginalFee float64 `orm:"column(original_fee)" json:"originalFee"` // 原价 + Bulk float64 `orm:"column(bulk)" json:"bulk"` // 体积抛比系数 + Increment float64 `orm:"column(increment)" json:"increment"` // 增值(物流) + ChannelType int `orm:"size(8);column(channel_type)" json:"channelType"` // 渠道类型(1-快递,2-物流,3-国际物流,4-整车) + OrderStatus int `orm:"size(8);column(order_status)" json:"orderType"` // 订单状态(1-待支付,2-支付失败,3-支付成功,4-取件,5-配送,6-,4-取消) + Img string `orm:"text;column(img)" json:"img"` // 包裹图片 +} + +func (*UserVendorOrder) TableUnique() [][]string { + return [][]string{ + []string{"LocalWayBill", "DeletedAt"}, + []string{"OtherWayBill", "DeletedAt"}, + []string{"CreatedAt", "DeletedAt"}, + } +} + +func (u *UserVendorOrder) CreateVendorOrder() error { + return dao.CreateEntity(dao.GetDB(), u) +} + +// MakeOrderParamReq 下订单请求参数 +type MakeOrderParamReq struct { + PromiseTimeType int `json:"promiseTimeType"` // 快递时效产品 + DeliveryType int `json:"deliveryType"` // 产品类型 + Goods string `json:"goods"` // 商品名称 + GuaranteeValueAmount float64 `json:"guaranteeValueAmount"` // 保价金额 + Weight int `json:"weight"` // 重量kg + Length int `json:"length"` // 所有包裹累计长cm + Height int `json:"height"` // 所有包裹累计高cm + Width int `json:"width"` // 所有包裹累计宽cm(向上取整) + OrderSendTime string `json:"orderSendTime"` // 预约时间 + PackageNum int `json:"packageNum"` // 包裹数量 + ReceiveAddressId int64 `json:"receiveAddressId"` // 收件人ID + ReceiveAddress string `json:"receiveAddress"` // 收件人地址 + ReceiveName string `json:"receiveName"` // 收件人姓名 + ReceivePhone string `json:"receivePhone"` // 收件人手机号 + Remark string `json:"remark"` // 运单备注 + SenderAddressID int64 `json:"senderAddressId"` // 寄件人地址Id + SenderAddress string `json:"senderAddress"` // 寄件人地址 + SenderName string `json:"senderName"` // 寄件人姓名 + SenderPhone string `json:"senderPhone"` // 寄件人手机号 + ThirdPlatform int `json:"thirdPlatform"` // 第三方平台-京东商家下单传3 + Type int `json:"type"` // 快递公司 + ChannelType int `json:"channelType"` // 渠道类型(1-快递,2-物流,3-国际物流,4-整车) + Img string `json:"img"` // 包裹图片 + // 快递费 + ChannelFee float64 `json:"channel_fee"` // 渠道价 + Bulk float64 `json:"bulk"` // 体积抛比系数 + ServiceCharge float64 `json:"service_charge"` // 服务费 + GuarantFee float64 `json:"guarant_fee"` // 保价费用 + OriginalFee float64 `json:"original_fee"` // 原价 + Increment float64 `json:"increment"` // 物流 +} diff --git a/business/q_bida/q_bida_server.go b/business/q_bida/q_bida_server.go index 0121d4a72..88a8a631f 100644 --- a/business/q_bida/q_bida_server.go +++ b/business/q_bida/q_bida_server.go @@ -2,26 +2,103 @@ package q_bida import ( "errors" + "fmt" bida "git.rosy.net.cn/baseapi/platformapi/q_bida" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals/api" + "time" ) -func QueryExpressPrice(param *bida.GetExpressPriceReq) ([]*bida.GetExpressPriceData, error) { +// QueryExpressPrice 查询配送价格,获取所有快递价格 +func QueryExpressPrice(param *bida.GetExpressPriceReq) (map[string]*bida.GetExpressPriceRes, error) { if param.Weight <= 0 { return nil, errors.New("物品重量必须大于0") } - fee, err := api.QBiDaAPI.GetExpressPrice(param) - if err != nil { - return nil, err - } - // 渠道费每公斤加价两毛 - for _, v := range fee { - if v.ChannelFee != 0 { - addFee := v.ChannelFee + int64(param.Width*2) - v.ChannelFee = addFee + result := make(map[string]*bida.GetExpressPriceRes, 0) + if param.Type == 0 { + // 渠道费每公斤加价两毛 + for i := 1; i <= 14; i++ { + param.Type = i + fee, err := api.QBiDaAPI.GetExpressPrice(param) + if err != nil { + return nil, err + } + if fee.Code != 0 { + result[fmt.Sprintf("%d", i)] = fee + continue + } + if fee.Data.ChannelFee != 0 { + addFee := fee.Data.ChannelFee + utils.Int2Float64(param.Width*2) + fee.Data.ChannelFee = addFee + result[fmt.Sprintf("%d", i)] = fee + } + } + } else { + fee, err := api.QBiDaAPI.GetExpressPrice(param) + if err != nil { + return nil, err + } + if fee.Code != 0 { + // result[fmt.Sprintf("%d", param.Type)] = fee + return nil, errors.New(fee.Msg) + } + if fee.Data.ChannelFee != 0 { + addFee := fee.Data.ChannelFee + utils.Int2Float64(param.Width*2) + fee.Data.ChannelFee = addFee + result[fmt.Sprintf("%d", param.Type)] = fee } } - return fee, nil + return result, nil +} + +// CreateWayOrder 创建快递订单 +func CreateWayOrder(ctx *jxcontext.Context, param *model.MakeOrderParamReq, userId string) error { + // 检查价格 + if err := checkWayFeeIsTrue(param); err != nil { + return err + } + + // 创建三方订单 + otherId, err := createOtherOrder(param) + if err != nil { + return err + } + + // 第三方数据创建成功,则创建本地数据 + vendorOrder := &model.UserVendorOrder{ + UserId: userId, + LocalWayBill: utils.Int64ToStr(time.Now().Unix()) + userId[:4], // 当前时间秒数加用户ID前四位 + OtherWayBill: otherId, + PromiseTimeType: param.PromiseTimeType, + DeliveryType: param.DeliveryType, + Goods: param.Goods, + GuaranteeValueAmount: param.GuaranteeValueAmount, + Weight: param.Weight, + Length: param.Length, + Height: param.Height, + Width: param.Width, + OrderSendTime: param.OrderSendTime, + PackageNum: param.PackageNum, + ReceiveAddressID: param.ReceiveAddressId, + Remark: param.Remark, + SenderAddressID: param.SenderAddressID, + ThirdPlatform: param.ThirdPlatform, + Type: param.Type, + ChannelFee: param.ChannelFee, + ServiceCharge: param.ServiceCharge, + GuarantFee: param.GuarantFee, + OriginalFee: param.OriginalFee, + Bulk: param.Bulk, + Increment: param.Increment, + ChannelType: param.ChannelType, + OrderStatus: model.YES, // 创建 + Img: param.Img, + } + dao.WrapAddIDCULEntity(vendorOrder, ctx.GetUserName()) + return vendorOrder.CreateVendorOrder() } diff --git a/business/q_bida/q_bida_server_utils.go b/business/q_bida/q_bida_server_utils.go new file mode 100644 index 000000000..d92abaa7a --- /dev/null +++ b/business/q_bida/q_bida_server_utils.go @@ -0,0 +1,61 @@ +package q_bida + +import ( + "errors" + "fmt" + bida "git.rosy.net.cn/baseapi/platformapi/q_bida" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals/api" +) + +// 检查快递费是否正确 +func checkWayFeeIsTrue(param *model.MakeOrderParamReq) error { + // 检查运费提交是否准确 + orderWayFee, err := QueryExpressPrice(&bida.GetExpressPriceReq{ + PromiseTimeType: param.PromiseTimeType, + DeliveryType: param.DeliveryType, + GoodsValue: param.GuaranteeValueAmount, + ReceiveAddress: param.ReceiveAddress, + SendAddress: param.SenderAddress, + Type: param.Type, + Weight: param.Weight, + Length: param.Length, + Height: param.Height, + Width: param.Width, + SendPhone: param.SenderPhone, + }) + if err != nil { + return err + } + if fee, ok := orderWayFee[fmt.Sprintf("%d", param.Type)]; !ok || fee.Code != 0 || fee.Data.ChannelFee != param.ChannelFee { + return errors.New("价格核算错误,价格不匹配") + } + return nil +} + +// 创建QBiDa订单 +func createOtherOrder(param *model.MakeOrderParamReq) (string, error) { + // 创建三方订单 + return api.QBiDaAPI.CreateOrder(&bida.MakeOrderReq{ + PromiseTimeType: param.PromiseTimeType, + DeliveryType: param.DeliveryType, + Goods: param.Goods, + GuaranteeValueAmount: param.GuaranteeValueAmount, + Weight: param.Weight, + Length: param.Length, + Height: param.Height, + Width: param.Width, + OrderSendTime: param.OrderSendTime, + PackageNum: param.PackageNum, + ReceiveAddress: param.ReceiveAddress, + ReceiveName: param.ReceiveName, + ReceivePhone: param.ReceivePhone, + Remark: param.Remark, + SenderAddress: param.SenderAddress, + SenderName: param.SenderName, + SenderPhone: param.SenderPhone, + ThirdPlatform: param.ThirdPlatform, + Type: param.Type, + Img: param.Img, + }) +} diff --git a/controllers/q_bida.go b/controllers/q_bida.go index 4e1d883c0..916292dea 100644 --- a/controllers/q_bida.go +++ b/controllers/q_bida.go @@ -2,6 +2,7 @@ package controllers import ( bida "git.rosy.net.cn/baseapi/platformapi/q_bida" + "git.rosy.net.cn/jx-callback/business/model" bidaServer "git.rosy.net.cn/jx-callback/business/q_bida" "github.com/astaxie/beego/server/web" ) @@ -78,6 +79,38 @@ func (c *QBiDaExpressController) QueryExpressPrice() { // @router /CreateWayOrder [post] func (c *QBiDaExpressController) CreateWayOrder() { c.callCreateWayOrder(func(params *tExpressCreateWayOrderParams) (interface{}, string, error) { + param := &model.MakeOrderParamReq{ + PromiseTimeType: params.PromiseTimeType, + DeliveryType: params.DeliveryType, + Goods: params.Goods, + GuaranteeValueAmount: params.GuaranteeValueAmount, + Weight: params.Weight, + Length: params.Length, + Height: params.Height, + Width: params.Width, + OrderSendTime: params.OrderSendTime, + PackageNum: params.PackageNum, + ReceiveAddress: params.ReceiveAddress, + ReceiveName: params.ReceiveName, + ReceivePhone: params.ReceivePhone, + Remark: params.Remark, + SenderAddress: params.SenderAddress, + SenderName: params.SenderName, + SenderPhone: params.SenderPhone, + ThirdPlatform: params.ThirdPlatform, + Type: params.Type, + ReceiveAddressId: 0, + SenderAddressID: 0, + ChannelType: 0, + Img: "", + ChannelFee: 0, + Bulk: 0, + ServiceCharge: 0, + GuarantFee: 0, + OriginalFee: 0, + Increment: 0, + } + bidaServer.CreateWayOrder(c.Ctx, params) return nil, "", nil }) } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 5d602ffa6..95a7627f8 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -45,6 +45,9 @@ func Init() { orm.RegisterModel(&model.NewConfig{}, &legacymodel.Config{}) orm.RegisterModel(&model.AddressDistinguish{}) orm.RegisterModel(&model.VendorMatterCategory{}) //平台物流分类(手动添的) + + // 物流订单 + orm.RegisterModel(&model.UserVendorOrder{}) } //打印机 diff --git a/routers/router.go b/routers/router.go index b48013e3a..b2a98a054 100644 --- a/routers/router.go +++ b/routers/router.go @@ -73,6 +73,7 @@ func init() { web.AutoRouter(&controllers.TongLianController{}) web.AutoRouter(&controllers.MTWMController{}) web.AutoRouter(&controllers.PrintController{}) + web.AutoRouter(&controllers.QBiDaExpressController{}) // 如下都是用于检测存活的空接口 web.Any("/", func(ctx *beecontext.Context) {