package localjx import ( "fmt" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "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" ) type JxSkuInfo struct { SkuID int `json:"skuID"` Count int `json:"count"` Price int64 `json:"price,omitempty"` // 原价 SalePrice int64 `json:"salePrice,omitempty"` // 售卖价 } type JxOrderInfo struct { Skus []*JxSkuInfo `json:"skus"` ExpectedDeliveredTime *time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间 TotalPrice int64 `json:"totalPrice"` // 单位为分 订单总价 FreightPrice int64 `json:"freightPrice"` // 单位为分 订单配送费 OrderPrice int64 `json:"orderPrice"` // 单位为分 订单商品价格 ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 } func PreCreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, ExpectedDeliveredTime *time.Time) (outJxOrder *JxOrderInfo, err error) { return outJxOrder, err } func formalizeSkus(skus []*JxSkuInfo) (outSkus []*JxSkuInfo) { skuMap := make(map[int]int) for _, v := range skus { skuMap[v.SkuID] += v.Count } for skuID, skuCount := range skuMap { outSkus = append(outSkus, &JxSkuInfo{ SkuID: skuID, Count: skuCount, }) } return outSkus } func isTimeInOpTime(openTime1, closeTime1, openTime2, closeTime2 int16, time2Check time.Time) bool { timeStrList := []string{ jxutils.OperationTime2StrWithSecond(openTime1), jxutils.OperationTime2StrWithSecond(closeTime1), } if openTime1 > 0 { timeStrList = append(timeStrList, jxutils.OperationTime2StrWithSecond(openTime2), jxutils.OperationTime2StrWithSecond(closeTime2), ) } checkTimeStr := utils.Time2TimeStr(time2Check) for i := 0; i < len(timeStrList); i += 2 { if checkTimeStr >= timeStrList[i] && checkTimeStr <= timeStrList[i+1] { return true } } return false } func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, storeID int, addressID int64, ExpectedDeliveredTime *time.Time) (outJxOrder *JxOrderInfo, err error) { db := dao.GetDB() // 配送范围检查 storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDJX) if err != nil { return nil, err } addressList, _, err := dao.QueryUserDeliveryAddress(db, addressID, []string{ctx.GetUserID()}, 0, 0) if err != nil { return nil, err } if len(addressList) == 0 { return nil, fmt.Errorf("地址ID不正确") } deliveryAddress := addressList[0] if distance := jxutils.Point2StoreDistance(deliveryAddress.Lng, deliveryAddress.Lat, storeDetail.Lng, storeDetail.Lat, storeDetail.DeliveryRangeType, storeDetail.DeliveryRange); distance == 0 { return nil, fmt.Errorf("送货地址:%s不在门店%s的配送范围", deliveryAddress.DetailAddress, storeDetail.Name) } // 营业状态及时间检查 if storeDetail.Status == model.StoreStatusDisabled { return nil, fmt.Errorf("门店:%s状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } checkTime := time.Now() if ExpectedDeliveredTime == nil { if storeDetail.Status != model.StoreStatusOpened { return nil, fmt.Errorf("门店:%s不是营业状态,状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } } else { checkTime = *ExpectedDeliveredTime } if !isTimeInOpTime(storeDetail.OpenTime1, storeDetail.CloseTime1, storeDetail.OpenTime2, storeDetail.CloseTime2, checkTime) { return nil, fmt.Errorf("门店:%s不在营业时间范围", storeDetail.Name) } skus := formalizeSkus(jxOrder.Skus) var skuIDs []int for _, v := range skus { skuIDs = append(skuIDs, v.SkuID) } storeSkuList, err := dao.GetStoresSkusInfo(db, []int{storeID}, skuIDs) if err != nil { return nil, err } storeSkuMap := make(map[int]*model.StoreSkuBind) for _, v := range storeSkuList { storeSkuMap[v.SkuID] = v } outJxOrder = &JxOrderInfo{} for _, v := range skus { outJxOrder.Skus = append(outJxOrder.Skus, &JxSkuInfo{ SkuID: v.SkuID, Count: v.Count, Price: v.Price, SalePrice: v.SalePrice, }) outJxOrder.TotalPrice += int64(v.Count) * v.SalePrice } return outJxOrder, err }