Prechádzať zdrojové kódy

feat(limit-purchase): 优化限购规则删除逻辑与地区匹配逻辑

- 删除规则时增加状态码判断,提升删除操作的准确性
- 修复地区选择时 district 字段命名不一致的问题,统一为 area
- 更新地区去重逻辑以适配新的字段命名
- 完善地区显示拼接逻辑,确保地区名称正确展示
- 新增限购规则命中检测方法,支持省市区三级匹配逻辑
- 添加商品限购规则关联模型的关系定义,便于数据查询
runphp 3 mesiacov pred
rodič
commit
13190f6080

+ 14 - 10
resource/admin/LimitPurchaseRule.vue

@@ -594,9 +594,13 @@ export default {
       })
         .then(async () => {
           try {
-            await this.http().delete(`/limit_purchase/rule/${row.id}`)
-            this.$message.success('删除成功')
-            this.fetchRuleList()
+            const {code,msg} = await this.http().delete(`/limit_purchase/rule/${row.id}`)
+            if (code === 0 || code === 200) {
+              this.$message.success('删除成功')
+              this.fetchRuleList()
+            } else {
+              this.$message.error(msg || '删除失败')
+            }
           } catch (e) {
             console.error(e)
             this.$message.error('删除失败')
@@ -676,8 +680,8 @@ export default {
         province_name: this.selectedProvince,
         city_id: cityObj ? cityObj.code : null,
         city_name: this.selectedCity || null,
-        district_id: areaObj ? areaObj.code : null,
-        district_name: this.selectedArea || null
+        area_id: areaObj ? areaObj.code : null,
+        area_name: this.selectedArea || null
       };
 
       // 去重:检查是否已经存在相同或更广范围的地区
@@ -691,13 +695,13 @@ export default {
         }
         
         // 如果当前添加的是市级规则
-        if (region.city_name && !region.district_name) {
-          return item.city_name === region.city_name && !item.district_name;
+        if (region.city_name && !region.area_name) {
+          return item.city_name === region.city_name && !item.area_name;
         }
         
         // 如果当前添加的是区级规则
-        if (region.city_name && region.district_name) {
-          return item.city_name === region.city_name && item.district_name === region.district_name;
+        if (region.city_name && region.area_name) {
+          return item.city_name === region.city_name && item.area_name === region.area_name;
         }
         
         return false;
@@ -729,7 +733,7 @@ export default {
       const parts = []
       if (region.province_name) parts.push(region.province_name)
       if (region.city_name) parts.push(region.city_name)
-      if (region.district_name) parts.push(region.district_name)
+      if (region.area_name) parts.push(region.area_name)
       return parts.join(' - ') || '未知地区'
     }
   }

+ 39 - 1
src/Entity/GoodsLimitPurchaseRuleEntity.php

@@ -25,8 +25,46 @@ class GoodsLimitPurchaseRuleEntity extends BaseEntity
 
     public function updateRule(int $goodsID, int $ruleID): void
     {
-        if( 0 < LimitPurchaseRuleModel::where('id', $ruleID)->count()) {
+        if (0 < LimitPurchaseRuleModel::where('id', $ruleID)->count()) {
             $this->replace()->save(['goods_id' => $goodsID, 'rule_id' => $ruleID]);
         }
     }
+
+    /**
+     * 是否命中限购规则
+     * @param int $goodsID
+     * @param string $province
+     * @param string $city
+     * @param string $area
+     * @return bool
+     */
+    public function isHit(int $goodsID, string $province, string $city, string $area): bool
+    {
+        $entity = $this->with(['rule'])->where(['goods_id' => $goodsID])->findOrEmpty();
+        if ($entity->isEmpty() || $entity->rule->status === false) {
+            $defaultRule = GoodsLimitPurchaseRuleModel::where(['is_default' => true, 'status' => true])->findOrEmpty();
+            if ($defaultRule->isEmpty()) {
+                return false;
+            }
+            $regions = $defaultRule->regions;
+        } else {
+            $regions = $entity->rule->regions;
+        }
+        foreach ($regions as $region) {
+            if ($region['province_name'] == $province) {
+                if ($region['city_name'] == null) {
+                    return true;
+                }
+                if ($region['city_name'] == $city) {
+                    if ($region['area_name'] == null) {
+                        return true;
+                    }
+                }
+                if ($region['area_name'] == $area) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }

+ 6 - 0
src/Model/GoodsLimitPurchaseRuleModel.php

@@ -5,6 +5,7 @@ namespace SixShop\LimitPurchase\Model;
 
 use think\Model;
 use think\model\concern\SoftDelete;
+use think\model\relation\BelongsTo;
 
 /**
  * 商品限购规则关联模型
@@ -26,4 +27,9 @@ class GoodsLimitPurchaseRuleModel extends Model
             'name' => 'goods_limit_purchase_rule',
         ];
     }
+
+    public function rule():BelongsTo
+    {
+        return $this->belongsTo(LimitPurchaseRuleModel::class, 'rule_id', 'id');
+    }
 }