diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go new file mode 100644 index 000000000..df843ee0f --- /dev/null +++ b/business/partner/purchase/jx/localjx/order.go @@ -0,0 +1,133 @@ +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 +}