package dao import ( "errors" "fmt" "strings" "time" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals/refutil" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" ) type StoreSkuAndAct struct { *model.StoreSkuBind ActMap map[int]*model.StoreSkuAct } var ( dataResFieldMap = map[int]string{ model.VendorIDMTWM: "mtwm_url", model.VendorIDEBAI: "ebai_url", model.VendorIDJDShop: "jds_url", } salePriceLimit = 100 ) type SkuStoreCatInfo struct { VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 MapID int `orm:"column(map_id)"` // 这个主要用于判断是否有store_sku_category_map model.SkuCategory VendorCatID string `orm:"column(vendor_cat_id)"` CatSyncStatus int8 ParentMapID int `orm:"column(parent_map_id)"` // 这个主要用于判断是否有父store_sku_category_map ParentCatName string ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` ParentCatSyncStatus int8 StoreCatID int `orm:"column(store_category_id)"` StoreCatName string StoreCatSeq int StoreParentCatName string IsSysCat int CityCode int IsJxCat int VendorCategoryName string VendorCategorySeq int VendorCategoryID int `orm:"column(vendor_category_id)"` } type StoreSkuSyncInfo struct { StoreSkuSyncInfoJds []*StoreSkuSyncInfo VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 StoreID int `orm:"column(store_id)"` SkuID int `orm:"column(sku_id)"` // 这个与Sku.ID的区别是SkuID是必然存在的 BoxFee int64 Price int64 UnitPrice int64 Stock int // 平台相关的store sku信息 StoreSkuStatus int SkuSyncStatus int8 VendorSkuID string `orm:"column(vendor_sku_id)"` JdsWareID int64 `orm:"column(jds_ware_id)" json:"jdsWareID"` BindDeletedAt time.Time `orm:"type(datetime)" json:"bindDeletedAt"` model.Sku ExdSkuID string `orm:"column(exd_sku_id)"` ExdCategoryThirdID int `orm:"column(exd_category_third_id)"` BrandID int `orm:"column(brand_id)"` ExBrandID int `orm:"column(ex_brand_id)"` StoreName string // sku_name Prefix string ExPrefix string ExPrefixBegin *time.Time ExPrefixEnd *time.Time // NameID int `orm:"column(name_id)"` VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 Name string Unit string Upc string IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 NameStatus int SellCities []string NameCategoryID int `orm:"column(name_category_id)"` YbNameSuffix string //银豹的商品条码后缀 YbBarCode string //银豹的商品条码 JdsStockSwitch int PreparationTime int // 平台相关的图片信息 Img string Img2 string Img3 string Img4 string Img5 string DescImg string ImgWatermark string `json:"imgWatermark"` //图片水印 ImgMix string //合成水印后的图片 ImgOrigin string //skuname里的img VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) CategoryName string `json:"categoryName"` //分类名 // sku的商家分类信息 SkuCatSyncStatus int8 SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"` // sku_name的商家分类信息 CatSyncStatus int8 VendorCatID string `orm:"column(vendor_cat_id)"` SkuVendorMapCatID string `orm:"column(sku_vendor_map_cat_id)"` VendorPrice int64 LockTime *time.Time MergedStatus int SkuName string SkuNameOrigin string StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` ActPercentage int `json:"actPercentage"` // 直降活动百分比 ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"` VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 MtLadderBoxPrice int `json:"mtLadderBoxPrice"` //美团门店商品的包装费 IsDeletedBySku bool `json:"isDeletedBySku"` //京东商城用,同步下架的商品库里的sku时,要做区分来决定调的api } type MissingStoreSkuInfo struct { StoreID int `orm:"column(store_id)"` NameID int `orm:"column(name_id)"` SkuID int `orm:"column(sku_id)"` SpecQuality float32 SpecUnit string Unit string RefPrice int } type StoreSkuBindWithVendorInfo struct { model.StoreSkuBind VendorStoreID string `orm:"column(vendor_store_id)"` VendorSkuID string `orm:"column(vendor_sku_id)"` } type StoreSkuNameInfo struct { StoreID int `orm:"column(store_id)"` NameID int `orm:"column(name_id)"` UnitPrice int64 } // GetStoreSkus用 type StoreSkuNameExt struct { StoreID int `orm:"column(store_id)" json:"storeID"` StoreName string `json:"storeName"` SkuID int `orm:"column(sku_id)" json:"skuID"` model.SkuName PayPercentage int `json:"-"` UnitPrice int `json:"unitPrice"` Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"` SkusStr string `json:"-"` PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 RealMidUnitPrice int `json:"realMidUnitPrice"` Count int `json:"count"` YbSkuName string `json:"ybSkuName"` AuditUnitPrice int `json:"auditUnitPrice"` //审核价格 } type StoreSkuNameExt2 struct { ID int `orm:"column(id)" json:"id"` Prefix string `orm:"size(255)" json:"prefix"` Name string `orm:"size(255)" json:"name"` CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别 Unit string `orm:"size(8)" json:"unit"` SpecQuality float32 `json:"-"` // 为份必然为500,这个主要作用只是用于确保SkuName的唯一性 SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性 Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 Img string `orm:"size(512)" json:"img"` Status int `orm:"default(1)" json:"status"` // skuname状态,取值同sku.Status YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀 StoreID int `orm:"column(store_id)" json:"storeID"` StoreName string `json:"storeName"` SkuID int `orm:"column(sku_id)" json:"skuID"` PayPercentage int `json:"-"` UnitPrice int `json:"unitPrice"` Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"` SkusStr string `json:"-"` PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 RealMidUnitPrice int `json:"realMidUnitPrice"` Count int `json:"count"` AuditUnitPrice int `json:"auditUnitPrice"` //审核价格 } // GetStoreSkus用 type StoreSkuNamesInfo struct { TotalCount int `json:"totalCount"` SkuNames []*StoreSkuNameExt `json:"skuNames"` } type StoreSkuNamesInfo2 struct { TotalCount int `json:"totalCount"` SkuNames []*StoreSkuNameExt2 `json:"skuNames"` } type StoreSkuVendorInfo struct { VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorSkuID string `orm:"column(vendor_sku_id)" json:"vendorSkuID"` SyncStatus int8 `json:"syncStatus"` VendorPrice int `json:"vendorPrice"` LockTime *time.Time `json:"lockTime,omitempty"` ActPrice int `json:"actPrice"` ActID int `orm:"column(act_id)" json:"actID"` ActType int `orm:"column(act_type)" json:"actType"` EarningPrice int `json:"earningPrice"` EarningActID int `orm:"column(earning_act_id)" json:"earningActID"` // 新活动信息 VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` HintActID int `orm:"column(hint_act_id);size(48);index" json:"hintActID"` ActPercentage int `json:"actPercentage"` // 直降活动百分比 ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"` VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 } type StoreSkuExt struct { NameID int `orm:"column(name_id)" json:"nameID"` SkuID int `orm:"column(sku_id)" json:"id"` Comment string `orm:"size(255)" json:"comment"` SkuCategoryID int `orm:"column(sku_category_id)" json:"categoryID"` SkuSpecQuality float32 `json:"specQuality"` SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality SkuStatus int `json:"status"` Stock int `json:"stock"` BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"` BindUpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"` BindLastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员 BindDeletedAt time.Time `orm:"type(datetime)" json:"deletedAt"` SubStoreID int `orm:"column(sub_store_id)" json:"subStoreID"` BindPrice int `json:"price"` // 单位为分,不用int64的原因是这里不需要累加 UnitPrice int `json:"unitPrice"` // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致 StoreSkuStatus int `json:"storeSkuStatus"` AutoSaleAt time.Time `orm:"type(datetime);null" json:"autoSaleAt"` StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` Count int `json:"count"` Times int `json:"times"` // VendorInfoMap用于替换其之下的所有信息 VendorInfoMap map[int]*StoreSkuVendorInfo `json:"vendorInfoMap,omitempty"` JdID string `orm:"column(sku_jd_id);null;index" json:"jdID"` EbaiID string `orm:"column(ebai_id);index" json:"ebaiID"` MtwmID string `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致 YbID string `orm:"column(yb_id);index" json:"ybID"` JdsID string `orm:"column(jds_id);index" json:"jdsID"` JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"` MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"` YbSyncStatus int8 `orm:"default(2)" json:"ybSyncStatus"` JdsSyncStatus int8 `orm:"default(2)" json:"jdsSyncStatus"` //京东商城 JdPrice int `json:"jdPrice"` EbaiPrice int `json:"ebaiPrice"` MtwmPrice int `json:"mtwmPrice"` JxPrice int `json:"jxPrice"` YbPrice int `json:"ybPrice"` JdsPrice int `json:"jdsPrice"` JdLockTime *time.Time `orm:"null" json:"jdLockTime,omitempty"` JdsLockTime *time.Time `orm:"null" json:"jdsLockTime,omitempty"` EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime,omitempty"` MtwmLockTime *time.Time `orm:"null" json:"mtwmLockTime,omitempty"` JxLockTime *time.Time `orm:"null" json:"jxLockTime,omitempty"` YbLockTime *time.Time `orm:"null" json:"ybLockTime,omitempty"` ActPrice int `json:"actPrice"` ActID int `orm:"column(act_id)" json:"actID"` ActType int `orm:"column(act_type)" json:"actType"` DiscountType int `json:"discountType"` DiscountValue1 int `json:"discountValue1"` DiscountValue2 int `json:"discountValue2"` EarningPrice int `json:"earningPrice"` EarningActID int `orm:"column(earning_act_id)" json:"earningActID"` EclpID string `orm:"column(eclp_id)" json:"eclpID"` TrendType int `json:"trendType"` TrendPrice int `json:"trendPrice"` MtLadderBoxPrice int `json:"mtLadderBoxPrice"` } type SkuNameAndPlace struct { model.SkuName UnitPrice int `json:"unitPrice"` CityCode int `json:"cityCode"` CityName string `json:"cityName"` Sequence int `json:"sequence"` Count int `json:"count"` Type int `json:"type"` Skus []*model.SkuAndName `json:"skus"` } type StoreSkuPriceAndWeight struct { VendorSkuID string `orm:"column(vendor_sku_id)"` SkuID int `orm:"column(sku_id)"` Weight int Price int Prefix string Name string Unit string Comment string SpecQuality float32 SpecUnit string } type StoreSkuAndName struct { StoreSkuSyncInfo JdSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` EbaiSyncStatus int8 `orm:"default(2)"` } // todo 应该通过需要同步的skuid来驱动同步分类,而不是当前这种分开的逻辑 // 单门店模式厂商适用 // 从store_sku_bind中,得到所有依赖的商家分类信息 func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int) (cats []*SkuStoreCatInfo, err error) { sql := ` SELECT DISTINCT t4.*, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status, t4p.name parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status FROM store_sku_bind t1 JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? ` if level == 2 { sql += ` JOIN sku_category t4 ON (t3.category_id = t4.id OR t2.category_id = t4.id) AND t4.level = 2 AND t4.deleted_at = ? ` } else { sql += ` LEFT JOIN sku_category t4c ON (t3.category_id = t4c.id OR t2.category_id = t4c.id) JOIN sku_category t4 ON (t4.id = t4c.parent_id OR (t3.category_id = t4.id OR t2.category_id = t4.id)) AND t4.level = 1 AND t4.deleted_at = ? ` } sql += ` LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.store_id = t1.store_id AND t5p.deleted_at = ? WHERE t1.deleted_at = ? AND t1.%s_sync_status & ? = 0 AND t1.store_id = ? AND ((t1.status = ? AND t2.status = ? AND t3.status = ?) OR (t1.%s_sync_status & ? = 0)) ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, model.SyncFlagDeletedMask, storeID, model.SkuStatusNormal, model.SkuStatusNormal, model.SkuStatusNormal, model.SyncFlagNewMask, } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) if err = GetRows(db, &cats, sql, sqlParams...); err != nil { return nil, err } return cats, err } // 单门店模式厂商适用 // 单纯的从已经创建的store_sku_category_map中,得到相关的同步信息 func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` SELECT t4.*, ts.store_category_name store_cat_name, ts.store_category_seq store_cat_seq, ts.id store_category_id, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status, t4p.name parent_cat_name, tsp.store_category_name store_parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status, t1.is_sys_cat, t1.vendor_org_code, t6.city_code FROM store_sku_category_map t5 JOIN sku_category t4 ON t5.category_id = t4.id LEFT JOIN store_category_map ts ON ts.store_id = t5.store_id AND ts.category_id = t4.id AND ts.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } fieldPrefixParams := []interface{}{fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix} if len(skuIDs) > 0 { sql += ` LEFT JOIN ( SELECT DISTINCT b.category_id FROM sku a JOIN sku_name b ON a.name_id = b.id AND b.deleted_at = ? WHERE a.id IN (` + GenQuestionMarks(len(skuIDs)) + `) AND a.deleted_at = ? ) t6 ON t6.category_id = t4.id ` sqlParams = append(sqlParams, utils.DefaultTimeValue, skuIDs, utils.DefaultTimeValue) } sql += ` LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_category_map tsp ON tsp.store_id = t5.store_id AND tsp.category_id = t4p.id AND tsp.deleted_at = ? LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id LEFT JOIN store_map t1 ON t1.store_id = t5.store_id AND t1.vendor_id = ? LEFT JOIN store t6 ON t6.id = t5.store_id WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?` sqlParams = append(sqlParams, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.YES) if mustDirty { sql += " AND t5.%s_sync_status <> 0" fieldPrefixParams = append(fieldPrefixParams, fieldPrefix) } if level > 0 { sql += " AND t4.level = ?" sqlParams = append(sqlParams, level) } if err = GetRows(db, &cats, fmt.Sprintf(sql, fieldPrefixParams...), sqlParams...); err != nil { return nil, err } return cats, err } func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int, skuIDs []int) (cats []*SkuStoreCatInfo, err error) { return GetStoreCategories(db, vendorID, storeID, skuIDs, level, true) } // 以store_sku_bind为基础来做同步,正常情况下使用 // 单多门店模式厂商通用 func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) { if vendorID < 0 { panic("vendorID<0") } isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) skuVendorIDField := fmt.Sprintf("t1.%s_id", fieldPrefix) if !isSingleStorePF { skuVendorIDField = "t2m.vendor_thing_id" } sql := ` SELECT t14.vendor_id, t14.vendor_org_code, t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status, %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock, t1.mt_ladder_box_price, t2.*, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix, t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, IF(t15.%s <> '', t15.%s, t3.img3) img3, IF(t20.%s <> '', t20.%s, t3.img4) img4, IF(t21.%s <> '', t21.%s, t3.img5) img5, IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, t4.%s_category_id vendor_vendor_cat_id, t4.name category_name, ts.name store_name, ts.brand_id, tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, tsu.img_watermark_mix img_mix, tsu.brand_id ex_brand_id, tsu1.vendor_category_id sku_vendor_map_cat_id` fmtParams := []interface{}{ skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix, } if isSingleStorePF { sql += `, t5.%s_sync_status cat_sync_status, t5.%s_id vendor_cat_id, t5sku.%s_sync_status sku_cat_sync_status, t5sku.%s_id sku_vendor_cat_id` fmtParams = append(fmtParams, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) } else { sql += `, t4m.vendor_thing_id vendor_cat_id, t5skum.vendor_thing_id sku_vendor_cat_id` } if globals.IsStoreSkuAct { sql += `, act.vendor_act_id, act.act_percentage, act.sync_status act_sync_status, act.vendor_act_price` } sql += ` FROM store_sku_bind t1 JOIN store_map t14 ON t14.store_id = t1.store_id AND t14.vendor_id = ? AND t14.deleted_at = ? LEFT JOIN store ts ON ts.id = t1.store_id AND ts.deleted_at = ? LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ?/* AND t2.status = ?*/ LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ?/* AND t3.status = ?*/ LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 LEFT JOIN data_resource t15 ON t15.main_url = t3.img3 LEFT JOIN data_resource t20 ON t20.main_url = t3.img4 LEFT JOIN data_resource t21 ON t21.main_url = t3.img5 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t3.id AND tsu.deleted_at = ? AND tsu.vendor_id = t14.vendor_id LEFT JOIN sku_vendor_category_map tsu1 ON tsu1.name_id = t3.id AND tsu1.deleted_at = ? AND tsu1.vendor_id = t14.vendor_id ` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, } if globals.IsStoreSkuAct { sql += ` LEFT JOIN store_sku_act act ON act.store_id = t1.store_id AND act.sku_id = t1.sku_id AND act.vendor_id = ?` sqlParams = append(sqlParams, vendorID) } if isSingleStorePF { sql += ` LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN store_sku_category_map t5sku ON t2.category_id = t5sku.category_id AND t5sku.store_id = t1.store_id AND t5sku.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue) } else { sql += ` LEFT JOIN sku_category t5sku ON t5sku.id = t2.category_id JOIN thing_map t2m ON t2m.thing_id = t1.sku_id AND t2m.vendor_org_code = t14.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ? LEFT JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = t14.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ? LEFT JOIN thing_map t5skum ON t5skum.thing_id = t5sku.id AND t5skum.vendor_org_code = t14.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.deleted_at = ? ` sqlParams = append(sqlParams, model.ThingTypeSku, vendorID, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue) } sql += " WHERE 1 = 1" if storeID > 0 { sql += " AND t1.store_id = ?" sqlParams = append(sqlParams, storeID) } if mustDirty { sql += " AND (t1.%s_sync_status <> 0 OR (%s <> %s AND t3.id IS NULL)" fmtParams = append(fmtParams, fieldPrefix, skuVendorIDField) if isSingleStorePF { fmtParams = append(fmtParams, "0") } else { fmtParams = append(fmtParams, "''") } // if globals.IsStoreSkuAct { // sql += " OR act.sync_status <> 0" // } sql += ")" } else { sql += " AND t1.deleted_at = ?" sqlParams = append(sqlParams, utils.DefaultTimeValue) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } // 多门店平台没有成功创建的商品,不直接过滤,让上层同步时报错 // if !isSingleStorePF { // sql += " AND t2.%s_id <> 0" // fmtParams = append(fmtParams, fieldPrefix) // } sql = fmt.Sprintf(sql, fmtParams...) sql += " ORDER BY t1.price" // globals.SugarLogger.Debug(sql) if err = GetRows(db, &skus, sql, sqlParams...); err != nil { return nil, err } return skus, err } func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*StoreSkuSyncInfo, err error) { return GetStoreSkus2(db, vendorID, storeID, skuIDs, true) } // 以sku为基础来做全同步, // 多门店模式厂商适用 func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInfo, err error) { globals.SugarLogger.Debugf("GetFullStoreSkus, storeID:%d, vendorID:%d", storeID, vendorID) // 对于多门店平台,商品库删除后,不需要操作门店商品,所以sku_name用JOIN, sku与sku_name也可以直接排除下架的 sql := ` SELECT sm.vendor_id, sm.vendor_org_code, sm.yb_app_id, sm.yb_app_key, t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time, t1.store_id, t1.deleted_at bind_deleted_at, t1.stock, t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, t4.%s_category_id vendor_vendor_cat_id, t4m.sync_status cat_sync_status, t4m.vendor_thing_id vendor_cat_id, t5skum.sync_status sku_cat_sync_status, t5skum.vendor_thing_id sku_vendor_cat_id FROM sku t2 JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ?/* AND t3.status = ?*/ JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? JOIN store_map sm ON sm.vendor_id = ? AND sm.store_id = ? AND sm.deleted_at = ? JOIN thing_map t2m ON t2m.thing_id = t2.id AND t2m.vendor_org_code = sm.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ? JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = sm.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ? LEFT JOIN store_sku_bind t1 ON sm.store_id = t1.store_id AND t1.sku_id = t2.id AND t1.deleted_at = ? LEFT JOIN sku_category t5sku ON t2.category_id = t5sku.id LEFT JOIN thing_map t5skum ON t5skum.thing_id = t2.category_id AND t5skum.vendor_org_code = sm.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.deleted_at = ? LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img WHERE t2.deleted_at = ?/* AND t2.status = ?*/ AND t2m.vendor_thing_id <> '' ORDER BY t1.price DESC` sqlParams := []interface{}{ utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.ThingTypeSku, vendorID, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, // model.SkuStatusNormal, } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix) if err = GetRows(db, &skus, sql, sqlParams...); err != nil { return nil, err } return skus, err } func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, vendorSkuIDs []string) (l []*StoreSkuPriceAndWeight, err error) { var vendorSkuIDField, sqlThingMap string var thingMapParams []interface{} if vendorID == model.VendorIDJX { vendorSkuIDField = "t1.id" } else if model.MultiStoresVendorMap[vendorID] != 0 { sqlThingMap = ` JOIN thing_map t4 ON t4.thing_type = ? AND t4.thing_id = t1.id AND t4.deleted_at = ? AND t4.vendor_id = t3.vendor_id AND t4.vendor_org_code = t3.vendor_org_code` thingMapParams = []interface{}{ model.ThingTypeSku, utils.DefaultTimeValue, } vendorSkuIDField = "t4.vendor_thing_id" } else { vendorSkuIDField = fmt.Sprintf("t2.%s_id", ConvertDBFieldPrefix(model.VendorNames[vendorID])) } sql := fmt.Sprintf(` SELECT %s vendor_sku_id, t1.id sku_id, t2.price, t1.weight, t5.prefix, t5.name, t1.comment, t5.unit, t1.spec_quality, t1.spec_unit FROM sku t1 JOIN store_sku_bind t2 ON t2.sku_id = t1.id AND t2.deleted_at = ? JOIN store_map t3 ON t3.store_id = t2.store_id AND t3.vendor_id = ? AND t3.vendor_store_id = ? AND t3.deleted_at = ? JOIN sku_name t5 ON t5.id = t1.name_id %s WHERE %s IN (`+GenQuestionMarks(len(vendorSkuIDs))+`)`, vendorSkuIDField, sqlThingMap, vendorSkuIDField) sqlParams := []interface{}{ utils.DefaultTimeValue, vendorID, vendorStoreID, utils.DefaultTimeValue, } sqlParams = append(sqlParams, thingMapParams...) if vendorID == model.VendorIDJX { sqlParams = append(sqlParams, utils.StringSlice2Int(vendorSkuIDs)) } else { sqlParams = append(sqlParams, vendorSkuIDs) } err = GetRows(db, &l, sql, sqlParams...) return l, err } // 这个函数之前是要设置没有删除或同步标志不为0的,会导致将同步标志不为0且删除了的把标志去掉,现在改为只设置没有删除的 func SetStoreSkuSyncStatus(db *DaoDB, vendorID int, storeIDs []int, skuIDs []int, syncStatus int) (num int64, err error) { globals.SugarLogger.Debugf("SetStoreSkuSyncStatus, storeIDs:%v, vendorID:%d", storeIDs, vendorID) isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` UPDATE store_sku_bind t1 SET t1.%s_sync_status = t1.%s_sync_status | ? ` fmtParams := []interface{}{ fieldPrefix, fieldPrefix, } sqlParams := []interface{}{ syncStatus, } if isSingleStorePF && (syncStatus&model.SyncFlagNewMask) != 0 { sql += `, t1.%s_id = 0 ` fmtParams = append(fmtParams, fieldPrefix) } sql += " WHERE t1.deleted_at = ? AND t1.%s_sync_status & ? = 0" fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SyncFlagDeletedMask) if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } sql = fmt.Sprintf(sql, fmtParams...) return ExecuteSQL(db, sql, sqlParams...) } func SetStoreCategorySyncStatus(db *DaoDB, vendorID int, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) { globals.SugarLogger.Debugf("SetStoreCategorySyncStatus, storeIDs:%v, vendorID:%d", storeIDs, vendorID) isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` UPDATE store_sku_category_map t1 SET t1.%s_sync_status = IF(t1.deleted_at = ?, t1.%s_sync_status | ?, 0) ` fmtParams := []interface{}{ fieldPrefix, fieldPrefix, } sqlParams := []interface{}{ utils.DefaultTimeValue, syncStatus, } if isSingleStorePF && (syncStatus&model.SyncFlagNewMask) != 0 { sql += `, t1.%s_id = 0 ` fmtParams = append(fmtParams, fieldPrefix) } sql += " WHERE (t1.deleted_at = ? OR t1.%s_sync_status <> 0)" fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, utils.DefaultTimeValue) if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(catIDs) > 0 { sql += " AND t1.category_id IN (" + GenQuestionMarks(len(catIDs)) + ")" sqlParams = append(sqlParams, catIDs) } sql = fmt.Sprintf(sql, fmtParams...) return ExecuteSQL(db, sql, sqlParams...) } // func GetImgFieldName(vendorID int) (fieldName string) { // fieldName = imgFieldMap[vendorID] // if fieldName == "" { // fieldName = "img" // } // return fieldName // } func GetDataResFieldName(vendorID int) (fieldName string) { fieldName = dataResFieldMap[vendorID] if fieldName == "" { fieldName = "main_url" } return fieldName } // func GetDescImgFieldName(vendorID int) (fieldName string) { // fieldName = descImgFieldMap[vendorID] // if fieldName == "" { // fieldName = "desc_img" // } // return fieldName // } func GetStoresSkusInfo(db *DaoDB, storeIDs, skuIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { sql := ` SELECT * FROM store_sku_bind t1 WHERE t1.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } // vendorID, vendorStoreIDs和vendorSkuIDs都是必须参数 func GetStoresSkusInfoByVendorInfo(db *DaoDB, vendorID int, vendorStoreIDs, vendorSkuIDs []string) (storeSkuList []*StoreSkuBindWithVendorInfo, err error) { if len(vendorStoreIDs) == 0 || len(vendorSkuIDs) == 0 { return nil, nil } sql := ` SELECT t1.*, %s.%s_id vendor_sku_id, t2.vendor_store_id FROM store_sku_bind t1 JOIN store_map t2 ON t2.store_id = t1.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? JOIN sku t3 ON t3.id = t1.sku_id WHERE t1.deleted_at = ? AND t2.vendor_store_id IN (` + GenQuestionMarks(len(vendorStoreIDs)) + `) AND %s.%s_id IN (` + GenQuestionMarks(len(vendorSkuIDs)) + `)` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorStoreIDs, vendorSkuIDs, } isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 tableName := "t1" if !isSingleStorePF { tableName = "t3" } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, tableName, fieldPrefix, tableName, fieldPrefix) err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetMissingStoreSkuFromOrder(db *DaoDB, storeIDs []int, fromTime time.Time) (storeSkuList []*MissingStoreSkuInfo, err error) { if time.Now().Sub(fromTime) > 24*time.Hour*60 { return nil, fmt.Errorf("GetMissingStoreSkuFromOrder,时间超过60天") } sql := ` SELECT IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) store_id, t4.name_id, t1.sku_id, t4.spec_quality, t4.spec_unit, t5.unit, COUNT(*) ct, CAST(AVG(IF(t1.vendor_price <> 0, t1.vendor_price, t1.sale_price)) AS SIGNED) ref_price FROM order_sku t1 JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id LEFT JOIN store_sku_bind t3 ON t3.store_id = IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) AND t3.sku_id = t1.sku_id AND t3.deleted_at = ? JOIN sku t4 ON t4.id = t1.sku_id JOIN sku_name t5 ON t5.id = t4.name_id WHERE t2.status = ? AND IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) > 0 AND t1.sku_id > 0 AND t1.shop_price = 0 AND t1.order_created_at > ? AND t3.id IS NULL ` sqlParams := []interface{}{ utils.DefaultTimeValue, model.OrderStatusFinished, fromTime, } if len(storeIDs) > 0 { sql += " AND IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` GROUP BY 1,2,3,4,5,6 ORDER BY 1,2,3,4,5,6 ` err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetAutoSaleStoreSku(db *DaoDB, storeIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { sql := ` SELECT * FROM store_sku_bind t1 WHERE t1.deleted_at = ? AND t1.auto_sale_at <> ?` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetExistingStoreSkuNameInfo(db *DaoDB, storeIDs, skuNameIDs []int) (storeSkuNameList []*StoreSkuNameInfo, err error) { if len(storeIDs) == 0 || len(skuNameIDs) == 0 { return nil, nil } sql := ` SELECT t1.store_id, t2.name_id, MAX(t1.unit_price) unit_price FROM store_sku_bind t1 JOIN sku t2 ON t2.id = t1.sku_id WHERE t1.deleted_at = ? AND t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.name_id IN (` + GenQuestionMarks(len(skuNameIDs)) + `) GROUP BY 1, 2` sqlParams := []interface{}{ utils.DefaultTimeValue, storeIDs, skuNameIDs, } err = GetRows(db, &storeSkuNameList, sql, sqlParams...) return storeSkuNameList, err } func (s *StoreSkuSyncInfo) GetSeq() int { if s.Seq > 0 { return s.Seq } return int(s.VendorPrice) } func GetStoresSkusInfoBySaleTime(db *DaoDB, storeID int) (storeSkuBindList []*model.StoreSkuBind, err error) { sql := ` SELECT t1.* FROM store_sku_bind t1 WHERE t1.status_sale_begin <> 0 AND t1.status_sale_end <> 0 AND t1.status = ? AND t1.deleted_at = ? ` sqlParams := []interface{}{ model.SkuStatusNormal, utils.DefaultTimeValue, } if storeID > 0 { sql += ` AND t1.store_id = ?` sqlParams = append(sqlParams, storeID) } err = GetRows(db, &storeSkuBindList, sql, sqlParams...) return storeSkuBindList, err } func UpdateStoreSkuBindSyncStatusForSaleStatus(db *DaoDB, vendorIDs []int, storeID int) (num int64, err error) { sql := ` UPDATE store_sku_bind SET ` fmtParams := []interface{}{} sqlParams := []interface{}{} if len(vendorIDs) > 0 { for _, v := range vendorIDs { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v]) sql += ` %s_sync_status = %s_sync_status | ?,` fmtParams = append(fmtParams, fieldPrefix) fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, model.SyncFlagSaleMask) } } else { return 0, errors.New("取平台ID名有错误!partner.GetPurchasePlatformVendorIDs()") } sql = sql[0:strings.LastIndex(sql, ",")] sql = fmt.Sprintf(sql, fmtParams...) sql += ` WHERE status = ? AND deleted_at = ? AND status_sale_begin <> 0 AND status_sale_end <> 0 ` sqlParams = append(sqlParams, model.StoreSkuBindStatusNormal, utils.DefaultTimeValue) if storeID > 0 { sql += ` AND store_id = ?` sqlParams = append(sqlParams, storeID) } return ExecuteSQL(db, sql, sqlParams...) } func UpdateStoreSkuBindSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num int64, err error) { sql := ` UPDATE store_sku_bind a JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? JOIN sku_name c ON c.id = b.name_id AND c.deleted_at = ? SET ` fmtParams := []interface{}{} sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, } if len(vendorIDs) > 0 { for _, v := range vendorIDs { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v]) sql += ` %s_sync_status = %s_sync_status | ?,` fmtParams = append(fmtParams, fieldPrefix, fieldPrefix) sqlParams = append(sqlParams, model.SyncFlagModifiedMask) } } else { return 0, errors.New("取平台ID名有错误!partner.GetPurchasePlatformVendorIDs()") } sql = sql[0:strings.LastIndex(sql, ",")] sql = fmt.Sprintf(sql, fmtParams...) sql += ` WHERE a.deleted_at = ? AND c.ex_prefix != "" AND (c.ex_prefix_begin = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') OR c.ex_prefix_end = DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')) ` sqlParams = append(sqlParams, utils.DefaultTimeValue) return ExecuteSQL(db, sql, sqlParams...) } func UpdateSkuSyncStatusForExPrefix(db *DaoDB, vendorIDs []int) (num int64, err error) { sql := ` UPDATE thing_map t1 JOIN sku t2 ON t2.id = t1.thing_id AND t2.deleted_at = ? JOIN sku_name t3 ON t3.id = t2.name_id AND t3.deleted_at = ? AND t3.ex_prefix <> '' AND (t3.ex_prefix_begin = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') OR t3.ex_prefix_end = DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')) SET t1.sync_status = t1.sync_status | ? WHERE t1.deleted_at = ? AND t1.thing_type = ? AND t1.sync_status & ? <> 0 ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, model.SyncFlagModifiedMask, utils.DefaultTimeValue, model.ThingTypeSku, model.SyncFlagDeletedMask, } if len(vendorIDs) > 0 { sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } return ExecuteSQL(db, sql, sqlParams...) } func DeleteSkuNameExPrefixOverdue(db *DaoDB) (num int64, err error) { sql := ` UPDATE sku_name SET ex_prefix_begin = null,ex_prefix_end = null WHERE deleted_at = ? AND DATE_FORMAT(DATE_ADD(NOW(),INTERVAL '6' HOUR),'%Y-%m-%d 00:00:00') >= ex_prefix_end ` sqlParams := []interface{}{utils.DefaultTimeValue} return ExecuteSQL(db, sql, sqlParams...) } func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT a.*, c.unit, c.name, b.name_id, a.status store_sku_status FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON b.name_id = c.id WHERE 1=1 AND a.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if nameID != 0 { sql += " AND b.name_id = ?" sqlParams = append(sqlParams, nameID) } if len(storeIDs) > 0 { sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` AND a.status != ? ORDER BY a.updated_at DESC ` sqlParams = append(sqlParams, model.SkuStatusDeleted) err = GetRows(db, &skuList, sql, sqlParams...) return skuList, err } func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) { sql := ` SELECT t1.count, t2.id sku_id, t3.*, t1.store_id, t1.store_name FROM( SELECT SUM(b.count) count,c.id,a.store_id,d.name store_name FROM goods_order a JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ? JOIN sku_name t1 ON t1.id = c.name_id AND t1.deleted_at = ? STRAIGHT_JOIN store_sku_bind t4 ON t4.store_id = IF(a.jx_store_id = 0,a.store_id,a.jx_store_id) AND t4.sku_id = b.sku_id AND t4.status = ? AND t4.deleted_at = ? JOIN store d ON d.id = a.store_id WHERE 1=1 AND a.order_created_at BETWEEN ? and NOW() ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, time.Now().AddDate(0, -1, 0), } if len(storeIDs) > 0 { sql += " AND a.store_id IN(" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` AND b.sale_price > ? GROUP BY 2,3,4)t1 JOIN sku t2 ON t2.id = t1.id JOIN sku_name t3 ON t3.id = t2.name_id UNION SELECT 0 count, a.sku_id, g.*, a.store_id, e.name store_name FROM store_sku_bind a LEFT JOIN act_store_sku b ON a.store_id = b.store_id AND b.sku_id = a.sku_id LEFT JOIN act_map c ON c.act_id = b.act_id LEFT JOIN act d ON d.id = c.act_id JOIN store e ON e.id = a.store_id JOIN sku f ON a.sku_id = f.id AND f.deleted_at = ? JOIN sku_name g ON g.id = f.name_id AND g.deleted_at = ? WHERE 1=1 ` sqlParams = append(sqlParams, salePriceLimit, utils.DefaultTimeValue, utils.DefaultTimeValue) if len(storeIDs) > 0 { sql += " AND a.store_id IN(" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` AND NOW() BETWEEN d.begin_at AND d.end_at AND a.status = ? AND a.deleted_at = ? AND (d.type = ? OR d.type = ?) UNION SELECT 0 count, a.sku_id, c.*, a.store_id, d.name store_name FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? AND b.status = ? JOIN sku_name c ON b.name_id = c.id AND c.deleted_at = ? AND c.status = ? JOIN store d ON d.id = a.store_id AND d.deleted_at = ? AND d.status <> ? WHERE a.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) AND a.deleted_at = ? AND a.status = ? ORDER BY 1 DESC LIMIT ? ` sqlParams = append(sqlParams, model.StoreSkuBindStatusNormal, utils.DefaultTimeValue, model.ActSkuDirectDown, model.ActSkuSecKill, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.StoreStatusDisabled, storeIDs, utils.DefaultTimeValue, model.StoreSkuBindStatusNormal, 30) err = GetRows(db, &storeSkuNameExt, sql, sqlParams...) var skuNamesInfo = &StoreSkuNamesInfo{ SkuNames: storeSkuNameExt, } for _, v := range storeSkuNameExt { var skus []*StoreSkuExt sql2 := ` SELECT a.id sku_id,a.*,t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at, t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at, t4.ebai_id, t4.mtwm_id, t4.ebai_sync_status, t4.mtwm_sync_status, t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, t4.stock, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit FROM sku a JOIN sku_name t1 ON a.name_id = t1.id AND t1.deleted_at = ? JOIN store_sku_bind t4 ON t4.sku_id = a.id AND t4.deleted_at = ? WHERE a.id = ? AND a.deleted_at = ? ` sqlParams2 := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, v.SkuID, utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql2 += " AND t4.store_id IN(" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams2 = append(sqlParams2, storeIDs) } err = GetRows(db, &skus, sql2, sqlParams2...) v.Skus = skus err = UpdateActPrice4StoreSkuNameNew(db, storeIDs, []int{v.SkuID}, skuNamesInfo, model.VendorIDJX) } return storeSkuNameExt, err } func GetTopSkusByCityCode(db *DaoDB, cityCode int, orderCreate time.Time) (skuNameAndPlace []*SkuNameAndPlace, err error) { sql := ` SELECT SUM(b.count) count, e.name city_name, d.city_code, f.* FROM goods_order a JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ? JOIN sku_name f ON f.id = c.name_id JOIN store d ON d.id = IF(a.jx_store_id = 0,a.store_id,a.jx_store_id) AND d.deleted_at = ? AND d.city_code = ? JOIN place e ON e.code = d.city_code WHERE 1=1 AND b.sale_price > ? AND a.order_created_at BETWEEN ? and NOW() GROUP BY 2,3,4 ORDER BY count DESC ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, cityCode, salePriceLimit, orderCreate, } err = GetRows(db, &skuNameAndPlace, sql, sqlParams...) return skuNameAndPlace, err } func GetTopCategoriesByStoreIDs(db *DaoDB, storeIDs []int, limit int) (skuCategory []*model.SkuCategory, err error) { sql := ` SELECT DISTINCT t5.* FROM( SELECT d.* FROM ( SELECT t3.*,t1.count FROM( SELECT SUM(b.count) count,d.category_id FROM goods_order a JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ? JOIN sku_name d ON d.id = c.name_id AND d.deleted_at = ? JOIN store e ON e.id = IF(a.jx_store_id = 0,a.store_id,a.jx_store_id) AND e.status != -2 JOIN (SELECT city_code FROM store WHERE 1=1 ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND id IN(" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` )t6 ON t6.city_code = e.city_code WHERE 1=1 AND a.order_created_at BETWEEN ? and NOW() AND b.sale_price > ? GROUP BY d.category_id)t1 JOIN sku_category t3 ON t1.category_id = t3.id AND t3.level = ? AND t3.deleted_at = ? ORDER BY t1.count DESC)t4 JOIN sku_category d ON d.id = t4.parent_id AND d.level = ? Order by t4.count DESC)t5 LIMIT ? ` sqlParams = append(sqlParams, time.Now().AddDate(0, -1, 0), salePriceLimit, 2, utils.DefaultTimeValue, 1, limit) err = GetRows(db, &skuCategory, sql, sqlParams...) return skuCategory, err } func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.SkuCategory, err error) { sql := ` SELECT * FROM( SELECT t1.* FROM sku_category t1 JOIN ( SELECT DISTINCT t3.category_id FROM store_sku_bind t1 JOIN sku t2 ON t2.id = t1.sku_id AND t2.deleted_at = ? AND t2.status = ? JOIN sku_name t3 ON t3.id = t2.name_id AND t3.deleted_at = ? AND t3.status = ? WHERE t1.deleted_at = ? AND t1.status = ? AND t1.store_id = ? ) t2 ON t2.category_id = t1.id WHERE t1.deleted_at = ?` sqlParams := []interface{}{ utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, storeID, utils.DefaultTimeValue, } if parentID >= 0 { sql += " AND t1.parent_id = ?" sqlParams = append(sqlParams, parentID) } sql += ` UNION SELECT DISTINCT t3.* FROM sku_category t1 JOIN ( SELECT DISTINCT t3.category_id FROM store_sku_bind t1 JOIN sku t2 ON t2.id = t1.sku_id AND t2.deleted_at = ? AND t2.status = ? JOIN sku_name t3 ON t3.id = t2.name_id AND t3.deleted_at = ? AND t3.status = ? WHERE t1.deleted_at = ? AND t1.status = ? AND t1.store_id = ? ) t2 ON t2.category_id = t1.id JOIN sku_category t3 ON t3.id = t1.parent_id AND t3.deleted_at = ? WHERE t1.deleted_at = ? ` sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, storeID, utils.DefaultTimeValue, utils.DefaultTimeValue, ) if parentID >= 0 { sql += " AND t1.parent_id = ?" sqlParams = append(sqlParams, parentID) } sql += ` ) a ORDER BY a.level, a.seq` err = GetRows(db, &catList, sql, sqlParams...) return catList, err } func GetStoreSkuNamePrice(db *DaoDB) (storeSkuNamePriceList []*model.StoreSkuNamePrice, err error) { sql := ` SELECT * FROM store_sku_name_price WHERE deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } err = GetRows(db, &storeSkuNamePriceList, sql, sqlParams...) if err != nil { return nil, err } return storeSkuNamePriceList, err } func SetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int, vendorPrice int, lockTime time.Time) { pLockTime := utils.Time2Pointer(lockTime) switch vendorID { case model.VendorIDJD: storeSkuBind.JdPrice = vendorPrice storeSkuBind.JdLockTime = pLockTime case model.VendorIDMTWM: storeSkuBind.MtwmPrice = vendorPrice storeSkuBind.MtwmLockTime = pLockTime case model.VendorIDEBAI: storeSkuBind.EbaiPrice = vendorPrice storeSkuBind.EbaiLockTime = pLockTime case model.VendorIDJX: storeSkuBind.JxPrice = vendorPrice storeSkuBind.JxLockTime = pLockTime } } func GetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int) (vendorPrice int) { switch vendorID { case model.VendorIDJD: vendorPrice = storeSkuBind.JdPrice case model.VendorIDMTWM: vendorPrice = storeSkuBind.MtwmPrice case model.VendorIDEBAI: vendorPrice = storeSkuBind.EbaiPrice case model.VendorIDJX: vendorPrice = storeSkuBind.JxPrice } return vendorPrice } func SetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int, syncStatus int8) { switch vendorID { case model.VendorIDJD: storeSkuBind.JdSyncStatus = syncStatus case model.VendorIDMTWM: storeSkuBind.MtwmSyncStatus = syncStatus case model.VendorIDEBAI: storeSkuBind.EbaiSyncStatus = syncStatus } } func GetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int) (syncStatus int8) { switch vendorID { case model.VendorIDJD: syncStatus = storeSkuBind.JdSyncStatus case model.VendorIDMTWM: syncStatus = storeSkuBind.MtwmSyncStatus case model.VendorIDEBAI: syncStatus = storeSkuBind.EbaiSyncStatus } return syncStatus } func SetStoreCatMapSyncStatus(storeCatMap *model.StoreSkuCategoryMap, vendorID int, syncStatus int8) { switch vendorID { case model.VendorIDMTWM: storeCatMap.MtwmSyncStatus = syncStatus case model.VendorIDEBAI: storeCatMap.EbaiSyncStatus = syncStatus } } // skuIDs为空,会导致性能极低,所以要skuIDs必须有值 func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesInfo *StoreSkuNamesInfo, actVendorID int) (err error) { if len(storeIDs) == 0 || len(skuIDs) == 0 { return nil } var vendorIDs []int var storeMapMap map[int][]*model.StoreMap var storeSkuActMap map[int64]*model.StoreSkuAct if !globals.IsStoreSkuAct { if actVendorID >= 0 { vendorIDs = []int{actVendorID} } } else { storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "") if err != nil { return err } storeMapMap = StoreMapList2Map(storeMapList) storeSkuActList, err2 := GetStoresSkusAct(db, 0, false, storeIDs, skuIDs, nil, false, 0, 0) if err = err2; err != nil { return err } storeSkuActMap = make(map[int64]*model.StoreSkuAct) for _, v := range storeSkuActList { storeSkuActMap[jxutils.Combine2Int(int(jxutils.Combine2Int(v.StoreID, v.SkuID)), v.VendorID)] = v } } actStoreSkuList, err := GetEffectiveActStoreSkuInfo(db, 0, vendorIDs, model.ActTypeAll, storeIDs, skuIDs, time.Now(), time.Now()) if err != nil { globals.SugarLogger.Errorf("updateActPrice4StoreSkuNameNew can not get sku promotion info for error:%v", err) return err } actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true) actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false) for _, skuName := range skuNamesInfo.SkuNames { if len(skuName.Skus) > 0 { for _, v := range skuName.Skus { if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { v.ActPrice = int(actStoreSku.ActualActPrice) v.ActID = actStoreSku.ActID v.ActType = actStoreSku.Type v.EarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.ActPrice), skuName.PayPercentage)) v.TrendType = actStoreSku.TrendType v.TrendPrice = actStoreSku.TrendPrice v.DiscountType = actStoreSku.DiscountType v.DiscountValue1 = actStoreSku.DiscountValue1 v.DiscountValue2 = actStoreSku.DiscountValue2 } if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { v.EarningPrice = int(actStoreSku.EarningPrice) v.EarningActID = actStoreSku.ActID } else { earningPrice := int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.BindPrice), skuName.PayPercentage)) if v.EarningPrice == 0 || earningPrice < v.EarningPrice { v.EarningPrice = earningPrice } } if globals.IsStoreSkuAct { v.VendorInfoMap = make(map[int]*StoreSkuVendorInfo) for _, storeMap := range storeMapMap[skuName.StoreID] { vendorID := storeMap.VendorID vendorInfo := &StoreSkuVendorInfo{ VendorID: vendorID, } vendorInfo.VendorPrice = refutil.GetObjFieldByName(v, GetVendorPriceStructField(model.VendorNames[vendorID])).(int) lockTime, _ := refutil.GetObjFieldByName(v, GetVendorLockTimeStructField(model.VendorNames[vendorID])).(*time.Time) vendorInfo.LockTime = lockTime if vendorID != model.VendorIDJX { vendorInfo.VendorSkuID = refutil.GetObjFieldByName(v, GetVendorThingIDStructField(model.VendorNames[vendorID])).(string) vendorInfo.SyncStatus = refutil.GetObjFieldByName(v, GetSyncStatusStructField(model.VendorNames[vendorID])).(int8) } else { vendorInfo.VendorSkuID = utils.Int2Str(v.SkuID) } if storeSkuAct := storeSkuActMap[jxutils.Combine2Int(int(jxutils.Combine2Int(skuName.StoreID, v.SkuID)), vendorID)]; storeSkuAct != nil { vendorInfo.VendorActID = storeSkuAct.VendorActID vendorInfo.ActPercentage = storeSkuAct.ActPercentage vendorInfo.ActSyncStatus = storeSkuAct.SyncStatus vendorInfo.VendorActPrice = storeSkuAct.VendorActPrice vendorInfo.HintActID = storeSkuAct.HintActID } if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, vendorID); actStoreSku != nil { vendorInfo.ActPrice = int(actStoreSku.ActualActPrice) vendorInfo.ActID = actStoreSku.ActID vendorInfo.ActType = actStoreSku.Type vendorInfo.EarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.ActPrice), skuName.PayPercentage)) } if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, vendorID); actStoreSku != nil { vendorInfo.EarningPrice = int(actStoreSku.EarningPrice) vendorInfo.EarningActID = actStoreSku.ActID } else { earningPrice := int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.BindPrice), skuName.PayPercentage)) if v.EarningPrice == 0 || earningPrice < v.EarningPrice { vendorInfo.EarningPrice = earningPrice } } v.VendorInfoMap[vendorID] = vendorInfo } } } } else { skuName.UnitPrice = skuName.Price } } return err } func GetDeletedStoreSkuBind(db *DaoDB, storeID, skuID int) (storeSkuBind *model.StoreSkuBind) { sql := ` SELECT a.* FROM store_sku_bind a WHERE a.store_id = ? AND a.sku_id = ? ORDER BY a.deleted_at DESC` sqlParams := []interface{}{ storeID, skuID, } if err := GetRow(db, &storeSkuBind, sql, sqlParams...); err != nil { storeSkuBind = nil } return storeSkuBind } func GetStoreSkuBindByNameID(db *DaoDB, storeID, nameID, status int) (storeSkuBind []*model.StoreSkuBind, err error) { sql := ` SELECT c.* FROM sku a JOIN store_sku_bind c ON c.sku_id = a.id WHERE c.store_id = ? AND a.name_id = ? AND c.deleted_at = ? AND a.deleted_at = ? ` sqlParams := []interface{}{ storeID, nameID, utils.DefaultTimeValue, utils.DefaultTimeValue, } err = GetRows(db, &storeSkuBind, sql, sqlParams...) return storeSkuBind, err } func GetPriceReferPrice(db *DaoDB, cityCode int, skuID int, snapDate time.Time) (result *PriceReferSnapshotExt, err error) { var ( pRefer *PriceReferSnapshotExt priceRefer = &PriceReferSnapshotExt{} ) sql := ` SELECT a.max_unit_price, a.min_unit_price, a.avg_unit_price, a.mid_unit_price, a.sku_id id, b.spec_quality, c.unit, b.spec_unit FROM price_refer_snapshot a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON c.id = b.name_id WHERE 1=1 AND a.snapshot_at = ? AND a.city_code = ? ` sqlParams := []interface{}{ snapDate, cityCode, } if skuID > 0 { sql += " AND a.sku_id = ?" sqlParams = append(sqlParams, skuID) } err = GetRow(db, &pRefer, sql, sqlParams...) if err != nil { return nil, err } if pRefer != nil { var ( specQuality float64 ) if pRefer.Unit == model.SpecialUnit { if pRefer.SpecUnit == model.SpecUnitNames[1] || pRefer.SpecUnit == model.SpecUnitNames[2] { specQuality = float64(pRefer.SpecQuality) * 1000 } else { specQuality = float64(pRefer.SpecQuality) } priceRefer.MaxPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MaxUnitPrice))) priceRefer.MinPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MinUnitPrice))) priceRefer.AvgPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.AvgUnitPrice))) priceRefer.MidPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MidUnitPrice))) } else { priceRefer.MaxPrice = pRefer.MaxUnitPrice priceRefer.MinPrice = pRefer.MinUnitPrice priceRefer.AvgPrice = pRefer.AvgUnitPrice priceRefer.MidPrice = pRefer.MidUnitPrice } } return priceRefer, err } func GetStoreSkusAndSkuName(db *DaoDB, storeIDs, skuIDs, nameIDs []int) (storeSkuAndName []*StoreSkuAndName, err error) { sql := ` SELECT a.id bind_id, a.store_id, a.jd_sync_status, a.mtwm_sync_status, a.ebai_sync_status, a.unit_price, a.price, c.id name_id, c.unit, b.* FROM store_sku_bind a JOIN sku b ON b.id = a.sku_id AND b.deleted_at = ? JOIN sku_name c ON c.id = b.name_id AND c.deleted_at = ? WHERE a.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } if len(nameIDs) > 0 { sql += " AND b.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" sqlParams = append(sqlParams, nameIDs) } err = GetRows(db, &storeSkuAndName, sql, sqlParams...) return storeSkuAndName, err } func UpdateYbOtherSku(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) { sql := ` UPDATE store_sku_bind a JOIN sku b ON a.sku_id = b.id AND b.name_id = ? JOIN (SELECT * FROM store_sku_bind WHERE sku_id = ?)c ON c.store_id = a.store_id SET a.yb_id = c.yb_id,a.yb_sync_status = c.yb_sync_status,a.yb_price = c.yb_price WHERE a.store_id = ? AND a.yb_sync_status <> ? ` sqlParams := []interface{}{ storeSkuSyncInfo.NameID, storeSkuSyncInfo.SkuID, storeSkuSyncInfo.StoreID, 0, } _, err = ExecuteSQL(db, sql, sqlParams) return err } func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) { sql := ` UPDATE store_sku_bind SET jds_ware_id = ?, jds_id = ? WHERE store_id = ? AND sku_id = ? AND deleted_at = ? ` sqlParams := []interface{}{ storeSkuSyncInfo.JdsWareID, storeSkuSyncInfo.VendorSkuID, storeSkuSyncInfo.StoreID, storeSkuSyncInfo.SkuID, utils.DefaultTimeValue, } _, err = ExecuteSQL(db, sql, sqlParams) return err } type tStoreSkuAudit struct { model.StoreSkuAudit SkuName string `orm:"size(255)" json:"skuName"` StoreName string `json:"storeName"` Prefix string `orm:"size(255)" json:"prefix"` Unit string `orm:"size(8)" json:"unit"` SpecQuality float32 `json:"-"` // 为份必然为500,这个主要作用只是用于确保SkuName的唯一性 SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性 Img string `orm:"size(512)" json:"img"` Name string `json:"name"` MidUnitPrice int `json:"midUnitPrice"` CityName string `json:"cityName"` PayPercentage int `json:"payPercentage"` StoreLevel string `json:"storeLevel"` } func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, marketManPhone, cityName string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { var requestList []*tStoreSkuAudit sql := ` SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, c.name sku_name, c.prefix, c.unit, c.spec_quality, c.spec_unit, c.img, d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage, d.store_level FROM store_sku_audit a LEFT JOIN user b ON a.user_id = b.user_id LEFT JOIN sku_name c ON c.id = a.name_id AND c.deleted_at = ? LEFT JOIN store d ON d.id = a.store_id AND d.deleted_at = ? LEFT JOIN place f ON f.code = d.city_code LEFT JOIN price_refer_snapshot e ON e.name_id = c.id AND e.city_code = ? AND e.snapshot_at = ? WHERE a.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, 0, utils.Time2Date(time.Now().AddDate(0, 0, -1)), utils.DefaultTimeValue} if len(storeIDs) > 0 { sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(nameIDs) > 0 { sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" sqlParams = append(sqlParams, nameIDs) } if len(statuss) > 0 { sql += " AND a.status IN (" + GenQuestionMarks(len(statuss)) + ")" sqlParams = append(sqlParams, statuss) } if remark != "" { sql += " AND a.remark LIKE ? " sqlParams = append(sqlParams, "%"+remark+"%") } if name != "" { sql += " AND b.name LIKE ? " sqlParams = append(sqlParams, "%"+name+"%") } if applyTimeStart != utils.ZeroTimeValue && applyTimeEnd != utils.ZeroTimeValue { sql += " AND a.created_at BETWEEN ? AND ?" sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd) } if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue { sql += " AND a.updated_at BETWEEN ? AND ?" sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd) } if len(types) > 0 { sql += " AND a.type IN (" + GenQuestionMarks(len(types)) + ")" sqlParams = append(sqlParams, types) } if keyword != "" { sql += " AND (b.name LIKE ? OR a.remark LIKE ? OR a.name_id LIKE ? OR a.user_id LIKE ? OR a.store_id LIKE ? OR f.name LIKE ?)" sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") } if marketManPhone != "" { sql += " AND d.market_man_phone LIKE ? " sqlParams = append(sqlParams, "%"+marketManPhone+"%") } if cityName != "" { sql += " AND f.name LIKE ? " sqlParams = append(sqlParams, "%"+cityName+"%") } sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?" pageSize = jxutils.FormalizePageSize(pageSize) sqlParams = append(sqlParams, pageSize, offset) txDB, _ := Begin(db) defer Commit(db, txDB) if err = GetRowsTx(txDB, &requestList, sql, sqlParams...); err == nil { return &model.PagedInfo{ TotalCount: GetLastTotalRowCount2(db, txDB), Data: requestList, }, nil } return pagedInfo, err } func GetStoreSkuAuditLight(db *DaoDB, storeIDs, nameIDs []int, status int) (storeSkuAudit []*model.StoreSkuAudit, err error) { sql := ` SELECT a.* FROM store_sku_audit a WHERE a.deleted_at = ? ` sqlParams := []interface{}{utils.DefaultTimeValue} if len(storeIDs) > 0 { sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(nameIDs) > 0 { sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" sqlParams = append(sqlParams, nameIDs) } if status != model.StoreAuditStatusAll { sql += " AND a.status = ? " sqlParams = append(sqlParams, status) } err = GetRows(db, &storeSkuAudit, sql, sqlParams...) return storeSkuAudit, err } func GetTopSkusByNoCityCode(db *DaoDB) (skuNameAndPlace []*SkuNameAndPlace, err error) { var skuName1 []model.SkuName _, err = db.Db.QueryTable("sku_name").Filter("best_seller", "1").All(&skuName1) for k, _ := range skuName1 { skuNameAndPlace1 := &SkuNameAndPlace{ SkuName: skuName1[k], } skuNameAndPlace = append(skuNameAndPlace, skuNameAndPlace1) } return skuNameAndPlace, err } func GetStoreSkuHistory(db *DaoDB, storeIDs, skuIDs []int, status int, snapShot time.Time) (storeSkuHistory []*model.StoreSkuBindHistory, err error) { sql := ` SELECT a.* FROM store_sku_bind_history a WHERE a.deleted_at = ? ` sqlParams := []interface{}{utils.DefaultTimeValue} if len(storeIDs) > 0 { sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } if status != model.StoreAuditStatusAll { sql += " AND a.status = ? " sqlParams = append(sqlParams, status) } if !utils.IsTimeZero(snapShot) { sql += " AND a.snapshot_at = ? " sqlParams = append(sqlParams, snapShot) } err = GetRows(db, &storeSkuHistory, sql, sqlParams...) return storeSkuHistory, err } func GetStoreSkuCategoryMap(db *DaoDB, categoryID, storeID int) (storeSkuCategoryMap *model.StoreSkuCategoryMap, err error) { sql := ` SELECT * FROM store_sku_category_map WHERE deleted_at = ? ` sqlParams := []interface{}{utils.DefaultTimeValue} if categoryID != 0 { sql += " AND category_id = ? " sqlParams = append(sqlParams, categoryID) } if storeID != 0 { sql += " AND store_id = ? " sqlParams = append(sqlParams, storeID) } GetRow(db, &storeSkuCategoryMap, sql, sqlParams) return storeSkuCategoryMap, err } func GetStoreSkuListWithVendor(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT DISTINCT b.*, c.vendor_thing_id vendor_sku_id FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? AND b.status = ? LEFT JOIN thing_map c ON c.thing_id = b.id AND c.thing_type = ? AND c.vendor_id = ? AND c.vendor_org_code = ? AND c.deleted_at = ? WHERE a.deleted_at = ? AND a.status = ? AND a.store_id = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, model.SkuStatusNormal, model.ThingTypeSku, vendorID, vendorOrgCode, utils.DefaultTimeValue, utils.DefaultTimeValue, model.StoreSkuBindStatusNormal, storeID, } err = GetRows(db, &skuList, sql, sqlParams) return skuList, err } type GetStoresSkusForManageStateResult struct { SkuID int `orm:"column(sku_id)"` UnitPrice int MidUnitPrice int } func GetStoresSkusForManageState(db *DaoDB, storeID, status int) (storeSkuList []*GetStoresSkusForManageStateResult, err error) { sql := ` SELECT t1.sku_id, t1.unit_price, t2.mid_unit_price FROM store_sku_bind t1 LEFT JOIN price_refer_snapshot t2 ON t1.sku_id = t2.sku_id AND t2.city_code = ? AND t2.snapshot_at = ? WHERE t1.deleted_at = ? ` sqlParams := []interface{}{ 0, utils.Time2Date(time.Now().AddDate(0, 0, -1)), utils.DefaultTimeValue, } if storeID != 0 { sql += " AND t1.store_id = ?" sqlParams = append(sqlParams, storeID) } if status != model.StoreSkuBindStatusNA { sql += " AND t1.status = ? " sqlParams = append(sqlParams, status) } err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err }