diff --git a/internal/dao/bundleDao.go b/internal/dao/bundleDao.go index 71081da..c380272 100644 --- a/internal/dao/bundleDao.go +++ b/internal/dao/bundleDao.go @@ -326,12 +326,11 @@ func UpdateBundleToValueAddService(tx *gorm.DB, records []*model.BundleToValueAd } func DeleteBundleToValueAddService(tx *gorm.DB, bundleUuid, valueUid string) error { return tx.Where("bundle_uuid = ? AND value_uid = ? AND deleted_at = 0", bundleUuid, valueUid).Delete(&model.BundleToValueAddService{}).Error - } -func GetValueAddServiceUuidsByBundleUuid(bundleUuid string) ([]string, error) { - var uuids []string - err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}).Where("bundle_uuid = ? and deleted_at = 0", bundleUuid).Pluck("value_uid", &uuids).Error - return uuids, err +func GetValueAddServiceUuidsByBundleUuid(bundleUuid string) ([]*model.ValueUidWithBenefits, error) { + var result []*model.ValueUidWithBenefits + err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}).Select("value_uid, benefits_type").Where("bundle_uuid = ? and deleted_at = 0", bundleUuid).Scan(&result).Error + return result, err } // GetBundleToValueAddServiceByBundleUuid 根据套餐UUID获取所有关联的增值服务uuid diff --git a/internal/logic/bundleLogic.go b/internal/logic/bundleLogic.go index 0f2bbd9..fc3505e 100644 --- a/internal/logic/bundleLogic.go +++ b/internal/logic/bundleLogic.go @@ -3,10 +3,12 @@ package logic import ( "encoding/json" "errors" + "fmt" "micro-bundle/internal/dao" "micro-bundle/pb/bundle" "micro-bundle/pkg/app" "micro-bundle/pkg/msg" + "strings" "time" "micro-bundle/internal/model" @@ -450,42 +452,64 @@ func HandleShelf(req *bundle.HandShelfRequest) (*bundle.CommonResponse, error) { // 差异更新套餐与增值服务中间表 func diffUpdateBundleToValueAddService(tx *gorm.DB, bundleUuid string, selectService []*model.BundleToValueAddService) error { - oldUuids, err := dao.GetValueAddServiceUuidsByBundleUuid(bundleUuid) + // 获取现有的关联记录(包含value_uid和benefits_type) + oldRecords, err := dao.GetValueAddServiceUuidsByBundleUuid(bundleUuid) if err != nil { return errors.New("查询套餐与增值服务关联失败") } - newUuids := make(map[string]*model.BundleToValueAddService) + + // 构建现有记录的复合键映射 (value_uid + benefits_type) + oldMap := make(map[string]struct{}) + for _, record := range oldRecords { + key := fmt.Sprintf("%s_%d", record.ValueUid, record.BenefitsType) + oldMap[key] = struct{}{} + } + + // 构建新记录的复合键映射 + newMap := make(map[string]*model.BundleToValueAddService) for _, s := range selectService { - newUuids[s.ValueUid] = s - } - oldSet := make(map[string]struct{}) - for _, uid := range oldUuids { - oldSet[uid] = struct{}{} + key := fmt.Sprintf("%s_%d", s.ValueUid, s.BenefitsType) + s.BundleUuid = bundleUuid + newMap[key] = s } + // 需要新增的 toAdd := make([]*model.BundleToValueAddService, 0) toDel := make([]string, 0) toUpdate := make([]*model.BundleToValueAddService, 0) - for uid, s := range newUuids { - if _, exist := oldSet[uid]; !exist { - s.BundleUuid = bundleUuid - toAdd = append(toAdd, s) + + for key, newRecord := range newMap { + if _, exists := oldMap[key]; exists { + // 记录存在,需要更新 + toUpdate = append(toUpdate, newRecord) } else { - s.BundleUuid = bundleUuid - toUpdate = append(toUpdate, s) + // 记录不存在,需要新增 + toAdd = append(toAdd, newRecord) } } + // 需要删除的 - for _, uid := range oldUuids { - if _, exist := newUuids[uid]; !exist { - toDel = append(toDel, uid) + for key := range oldMap { + if _, exists := newMap[key]; !exists { + // 旧记录在新数据中不存在,需要删除 + toDel = append(toDel, key) } } + if len(toDel) > 0 { - if err = tx.Where("bundle_uuid = ? AND value_uid IN ?", bundleUuid, toDel).Delete(&model.BundleToValueAddService{}).Error; err != nil { - return errors.New("删除套餐与增值服务关联失败") + for _, key := range toDel { + parts := strings.Split(key, "_") + if len(parts) == 2 { + valueUid := parts[0] + benefitsType := parts[1] + if err = tx.Where("bundle_uuid = ? AND value_uid = ? AND benefits_type = ? AND deleted_at = 0", + bundleUuid, valueUid, benefitsType).Delete(&model.BundleToValueAddService{}).Error; err != nil { + return errors.New("删除套餐与增值服务关联失败") + } + } } } + if len(toAdd) > 0 { if err = dao.CreateBundleToValueAddService(tx, toAdd); err != nil { return errors.New("保存套餐与增值服务关联失败") diff --git a/internal/model/valueAdd_bundle.go b/internal/model/valueAdd_bundle.go index 6d16a4a..add7a39 100644 --- a/internal/model/valueAdd_bundle.go +++ b/internal/model/valueAdd_bundle.go @@ -83,6 +83,11 @@ type PriceOption struct { Price float32 `json:"price"` // 价格(根据priceMode决定是单价还是总价) } +type ValueUidWithBenefits struct { + ValueUid string `json:"valueUid"` //增值服务UUID + BenefitsType int32 `json:"benefitsType"` //权益类型 +} + // 实现 driver.Valuer 接口 func (o PriceOptions) Value() (driver.Value, error) { return json.Marshal(o)