seatonwan9
2025-08-15 c92b723d893bddd1cf9093e660806b226dc00921
src/views/pointsManage/settings/index.vue
@@ -20,7 +20,7 @@
              <div class="rule-item" v-for="pointRuleDetial in rule.pointsRules">
                <span class="rule-desc">{{ pointRuleDetial.ruleName }} : {{ pointRuleDetial.ruleDescription}} </span>
                <el-input 
                  v-model="rules.benchmarkSubmission"
                  v-model="pointRuleDetial.pointsValue"
                  size="small"
                  style="width: 80px;"
                  placeholder="请输入"
@@ -28,7 +28,7 @@
                <span class="unit">积分</span>
                <span class="unit" v-if="pointRuleDetial.isLimit === 1">,每日积分上限</span>
                <el-input 
                  v-model="rules.productSubscribedDailyLimit"
                  v-model="pointRuleDetial.dailyLimit"
                  size="small"
                  style="width: 80px;"
                  placeholder="请输入"
@@ -119,90 +119,28 @@
          </template>
          
          <!-- 资源传播 -->
          <div class="rule-category">
            <h4>资源传播</h4>
          <div class="rule-category" v-for="consumeRule in rules.consumePointsRuleList">
            <h4>{{ consumeRule.category }}</h4>
            <div class="rule-subcategory">
              <h5>数字资源</h5>
<!--              <h5>数字资源</h5>-->
            <div class="rule-items">
              <div class="rule-item">
                <span class="rule-desc">提报产品被取消收藏,扣除</span>
              <div class="rule-item" v-for="pointRuleDetials in consumeRule.pointsRules">
                <span class="rule-desc">{{ pointRuleDetials.ruleName }} : {{ pointRuleDetials.ruleDescription}}</span>
                <el-input 
                  v-model="rules.productUnfavorited"
                  v-model="pointRuleDetials.pointsValue"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
              <div class="rule-item">
                <span class="rule-desc">提报产品被取消点赞,扣除</span>
                <span class="unit" v-if="pointRuleDetials.isLimit === 1">,每日积分上限</span>
                <el-input 
                  v-model="rules.productUnliked"
                          v-model="pointRuleDetials.dailyLimit"
                  size="small"
                  style="width: 60px;"
                          style="width: 80px;"
                  placeholder="请输入"
                          v-if="pointRuleDetials.isLimit === 1"
                />
                <span class="unit">积分</span>
              </div>
            </div>
            </div>
            <div class="rule-subcategory">
              <h5>产品订阅</h5>
            <div class="rule-items">
              <div class="rule-item">
                <span class="rule-desc">提报产品被取消订阅,扣除</span>
                <el-input
                  v-model="rules.productUnfavorited"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
              <div class="rule-item">
                <span class="rule-desc">提报产品被取消试用,扣除</span>
                <el-input
                  v-model="rules.productUnliked"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
            </div>
            </div>
            <div class="rule-subcategory">
              <h5>交流社区</h5>
            <div class="rule-items">
              <div class="rule-item">
                <span class="rule-desc">删除提问,扣除</span>
                <el-input
                  v-model="rules.productUnfavorited"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
              <div class="rule-item">
                <span class="rule-desc">删除评论,扣除</span>
                <el-input
                  v-model="rules.productUnliked"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
              <div class="rule-item">
                <span class="rule-desc">评论被取消点赞,扣除</span>
                <el-input
                  v-model="rules.productUnliked"
                  size="small"
                  style="width: 60px;"
                  placeholder="请输入"
                />
                <span class="unit">积分</span>
              </div>
            </div>
            </div>
@@ -211,134 +149,134 @@
        </el-card>
        <!-- 积分转换规则 -->
        <el-card class="rule-section" shadow="never">
          <template #header>
            <div class="card-header">
              <span class="section-title">积分转换规则</span>
            </div>
          </template>
<!--        <el-card class="rule-section" shadow="never">-->
<!--          <template #header>-->
<!--            <div class="card-header">-->
<!--              <span class="section-title">积分转换规则</span>-->
<!--            </div>-->
<!--          </template>-->
          
          <div class="rule-category">
            <h4>积分转换</h4>
            <div class="rule-subcategory">
              <h5>数字化标杆积分转换</h5>
              <div class="rule-items">
                <div class="rule-item">
                  <span class="rule-desc">数字化标杆个人</span>
                  <el-input
                    v-model="rules.benchmarkPersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化标杆单位</span>
                  <el-input
                    v-model="rules.benchmarkUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
                <div class="rule-item">
                  <span class="rule-desc">数字化标杆单位</span>
                  <el-input
                    v-model="rules.benchmarkUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化标杆个人</span>
                  <el-input
                    v-model="rules.benchmarkPersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
              </div>
            </div>
            <div class="rule-subcategory">
              <h5>数字化知识积分转换</h5>
              <div class="rule-items">
                <div class="rule-item">
                  <span class="rule-desc">数字化知识个人</span>
                  <el-input
                    v-model="rules.knowledgePersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化知识单位</span>
                  <el-input
                    v-model="rules.knowledgeUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
                <div class="rule-item">
                  <span class="rule-desc">数字化知识单位</span>
                  <el-input
                    v-model="rules.knowledgeUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化知识个人</span>
                  <el-input
                    v-model="rules.knowledgePersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
              </div>
            </div>
            <div class="rule-subcategory">
              <h5>数字化产品积分转换</h5>
              <div class="rule-items">
                <div class="rule-item">
                  <span class="rule-desc">数字化产品个人</span>
                  <el-input
                    v-model="rules.productPersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化产品单位</span>
                  <el-input
                    v-model="rules.productUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
                <div class="rule-item">
                  <span class="rule-desc">数字化产品单位</span>
                  <el-input
                    v-model="rules.productUnitToPersonal"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分兑换数字化产品个人</span>
                  <el-input
                    v-model="rules.productPersonalToUnit"
                    size="small"
                    style="width: 80px;"
                    placeholder="请输入"
                  />
                  <span class="unit">积分</span>
                </div>
              </div>
            </div>
          </div>
        </el-card>
<!--          <div class="rule-category">-->
<!--            <h4>积分转换</h4>-->
<!--            <div class="rule-subcategory">-->
<!--              <h5>数字化标杆积分转换</h5>-->
<!--              <div class="rule-items">-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化标杆个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.benchmarkPersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化标杆单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.benchmarkUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化标杆单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.benchmarkUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化标杆个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.benchmarkPersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--              </div>-->
<!--            </div>-->
<!--            <div class="rule-subcategory">-->
<!--              <h5>数字化知识积分转换</h5>-->
<!--              <div class="rule-items">-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化知识个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.knowledgePersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化知识单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.knowledgeUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化知识单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.knowledgeUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化知识个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.knowledgePersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--              </div>-->
<!--            </div>-->
<!--            <div class="rule-subcategory">-->
<!--              <h5>数字化产品积分转换</h5>-->
<!--              <div class="rule-items">-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化产品个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.productPersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化产品单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.productUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--                <div class="rule-item">-->
<!--                  <span class="rule-desc">数字化产品单位</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.productUnitToPersonal"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分兑换数字化产品个人</span>-->
<!--                  <el-input-->
<!--                    v-model="rules.productPersonalToUnit"-->
<!--                    size="small"-->
<!--                    style="width: 80px;"-->
<!--                    placeholder="请输入"-->
<!--                  />-->
<!--                  <span class="unit">积分</span>-->
<!--                </div>-->
<!--              </div>-->
<!--            </div>-->
<!--          </div>-->
<!--        </el-card>-->
      </div>
    </div>
@@ -351,17 +289,27 @@
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { ref, onMounted, watch } from 'vue'
import { useRoute } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ArrowLeft } from '@element-plus/icons-vue'
import pointsApi from '../../../api/pointsApi'
import qs from 'qs'
// 获取路由实例
const route = useRoute()
// 获取路由参数中的规则id
const ruleId = route.query.ruleId as string
// 定义props
interface Props {
  ruleId?: string
}
const props = withDefaults(defineProps<Props>(), {
  ruleId: ''
})
// 定义emits
const emit = defineEmits<{
  goBack: []
  saveSuccess: []
}>()
interface PointRule {
  category: string,
@@ -375,81 +323,29 @@
  createdAt: string,
  ruleType: number,
  pointsWinner: number,
  isLimit: number
  isLimit: number,
  pointsValue: number,
  dailyLimit: number
}
// 积分规则配置
interface PointsRules {
  getPointsRuleList: PointRule[],
  consumePointsRuleList: PointRule[],
  benchmarkSubmission: number,
  productSubscribedDailyLimit: number,
  productAccess: number,
  resourceTransaction: number,
  productSubscribed: number,
  productTrialed: number,
  productTrialedDailyLimit: number,
  resourceLiked: number,
  resourceLikedDailyLimit: number,
  dailyFirstLogin: number,
  postQuestion: number,
  postQuestionDailyLimit: number,
  postComment: number,
  postCommentDailyLimit: number,
  commentLiked: number,
  commentLikedDailyLimit: number,
  monthlyTop1: number,
  monthlyTop2: number,
  monthlyTop3: number,
  productUnfavorited: number,
  productUnliked: number,
  benchmarkPersonalToUnit: number,
  benchmarkUnitToPersonal: number,
  knowledgePersonalToUnit: number,
  knowledgeUnitToPersonal: number,
  productPersonalToUnit: number,
  productUnitToPersonal: number
  consumePointsRuleList: PointRule[]
}
const rules = ref<PointsRules>({
  consumePointsRuleList: [],
  getPointsRuleList: [],
  benchmarkSubmission: 0,
  productSubscribedDailyLimit: 0,
  productAccess: 0,
  resourceTransaction: 0,
  productSubscribed: 0,
  productTrialed: 0,
  productTrialedDailyLimit: 0,
  resourceLiked: 0,
  resourceLikedDailyLimit: 0,
  dailyFirstLogin: 0,
  postQuestion: 0,
  postQuestionDailyLimit: 0,
  postComment: 0,
  postCommentDailyLimit: 0,
  commentLiked: 0,
  commentLikedDailyLimit: 0,
  monthlyTop1: 0,
  monthlyTop2: 0,
  monthlyTop3: 0,
  productUnfavorited: 0,
  productUnliked: 0,
  benchmarkPersonalToUnit: 0,
  benchmarkUnitToPersonal: 0,
  knowledgePersonalToUnit: 0,
  knowledgeUnitToPersonal: 0,
  productPersonalToUnit: 0,
  productUnitToPersonal: 0
  getPointsRuleList: []
})
// 获取积分规则配置
const getPointsRules = async () => {
  try {
    if (ruleId) {
    if (props.ruleId) {
      // 如果有ruleId参数,则获取特定规则
     const formData = new URLSearchParams();
     formData.append('ruleId', ruleId);
      formData.append('ruleId', props.ruleId);
      const res = await pointsApi.getPointsRuleById(formData)
      if (res.code === 200 && res.data) {
@@ -458,12 +354,7 @@
        console.log(rules.value)
      }
    } else {
      // 如果没有ruleId参数,则获取所有规则
      const res = await pointsApi.getPointsRules()
      if (res.code === 200 && res.data) {
        // 将后端数据映射到前端规则对象
        Object.assign(rules.value, res.data)
      }
      ElMessage.error('对应规则设置不存在')
    }
  } catch (error) {
    console.error('获取积分规则失败:', error)
@@ -478,10 +369,16 @@
      cancelButtonText: '取消',
      type: 'warning',
    })
    const res = await pointsApi.savePointsRules(rules.value)
    let pointRuleDetials: PointRuleDetial[] = []
    rules.value.getPointsRuleList.forEach(k => {
        pointRuleDetials.push(...k.pointsRules)
    })
    rules.value.consumePointsRuleList.forEach(k =>  pointRuleDetials.push(...k.pointsRules))
    const res = await pointsApi.savePointsRules(pointRuleDetials)
    if (res.code === 200) {
      ElMessage.success('保存成功')
      // 发出保存成功事件
      emit('saveSuccess')
    } else {
      ElMessage.error(res.msg || '保存失败')
    }
@@ -514,11 +411,27 @@
// 返回上一页
const goBack = () => {
  // 如果是从组件调用,发出goBack事件
  if (props.ruleId) {
    emit('goBack')
  } else {
    // 否则使用原有的返回逻辑
  history.back()
}
}
// 监听ruleId变化
watch(() => props.ruleId, (newRuleId) => {
  if (newRuleId) {
    getPointsRules()
  }
}, { immediate: true })
onMounted(() => {
  // 只有在没有props.ruleId时才执行原有的逻辑
  if (!props.ruleId) {
  getPointsRules()
  }
})
</script>