From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/mall/trade/config/index.vue |  291 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 291 insertions(+), 0 deletions(-)

diff --git a/src/views/mall/trade/config/index.vue b/src/views/mall/trade/config/index.vue
new file mode 100644
index 0000000..6aa4b97
--- /dev/null
+++ b/src/views/mall/trade/config/index.vue
@@ -0,0 +1,291 @@
+<template>
+  <doc-alert title="銆愪氦鏄撱�戜氦鏄撹鍗�" url="https://doc.iocoder.cn/mall/trade-order/" />
+  <doc-alert title="銆愪氦鏄撱�戣喘鐗╄溅" url="https://doc.iocoder.cn/mall/trade-cart/" />
+
+  <ContentWrap>
+    <el-form
+      ref="formRef"
+      v-loading="formLoading"
+      :model="formData"
+      :rules="formRules"
+      label-width="120px"
+    >
+      <el-form-item v-show="false" label="hideId">
+        <el-input v-model="formData.id" />
+      </el-form-item>
+      <el-tabs>
+        <!-- 鍞悗 -->
+        <el-tab-pane label="鍞悗">
+          <el-form-item label="閫�娆剧悊鐢�" prop="afterSaleRefundReasons">
+            <el-select
+              v-model="formData.afterSaleRefundReasons"
+              allow-create
+              filterable
+              multiple
+              placeholder="璇风洿鎺ヨ緭鍏ラ��娆剧悊鐢�"
+            >
+              <el-option
+                v-for="reason in formData.afterSaleRefundReasons"
+                :key="reason"
+                :label="reason"
+                :value="reason"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="閫�璐х悊鐢�" prop="afterSaleReturnReasons">
+            <el-select
+              v-model="formData.afterSaleReturnReasons"
+              allow-create
+              filterable
+              multiple
+              placeholder="璇风洿鎺ヨ緭鍏ラ��璐х悊鐢�"
+            >
+              <el-option
+                v-for="reason in formData.afterSaleReturnReasons"
+                :key="reason"
+                :label="reason"
+                :value="reason"
+              />
+            </el-select>
+          </el-form-item>
+        </el-tab-pane>
+        <!-- 閰嶉�� -->
+        <el-tab-pane label="閰嶉��">
+          <el-form-item label="鍚敤鍖呴偖" prop="deliveryExpressFreeEnabled">
+            <el-switch v-model="formData.deliveryExpressFreeEnabled" style="user-select: none" />
+            <el-text class="w-full" size="small" type="info"> 鍟嗗煄鏄惁鍚敤鍏ㄥ満鍖呴偖</el-text>
+          </el-form-item>
+          <el-form-item label="婊¢鍖呴偖" prop="deliveryExpressFreePrice">
+            <el-input-number
+              v-model="formData.deliveryExpressFreePrice"
+              :min="0"
+              :precision="2"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ユ弧棰濆寘閭�"
+            />
+            <el-text class="w-full" size="small" type="info">
+              鍟嗗煄鍟嗗搧婊″灏戦噾棰濆嵆鍙寘閭紝鍗曚綅锛氬厓
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鍚敤闂ㄥ簵鑷彁" prop="deliveryPickUpEnabled">
+            <el-switch v-model="formData.deliveryPickUpEnabled" style="user-select: none" />
+          </el-form-item>
+        </el-tab-pane>
+        <!-- 鍒嗛攢 -->
+        <el-tab-pane label="鍒嗛攢">
+          <el-form-item label="鍒嗕剑鍚敤" prop="brokerageEnabled">
+            <el-switch v-model="formData.brokerageEnabled" style="user-select: none" />
+            <el-text class="w-full" size="small" type="info"> 鍟嗗煄鏄惁寮�鍚垎閿�妯″紡</el-text>
+          </el-form-item>
+          <el-form-item label="鍒嗕剑妯″紡" prop="brokerageEnabledCondition">
+            <el-radio-group v-model="formData.brokerageEnabledCondition">
+              <el-radio
+                v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_ENABLED_CONDITION)"
+                :key="dict.value"
+                :value="dict.value"
+              >
+                {{ dict.label }}
+              </el-radio>
+            </el-radio-group>
+            <el-text class="w-full" size="small" type="info">
+              浜轰汉鍒嗛攢锛氭瘡涓敤鎴烽兘鍙互鎴愪负鎺ㄥ箍鍛�
+            </el-text>
+            <el-text class="w-full" size="small" type="info">
+              鎸囧畾鍒嗛攢锛氫粎鍙湪鍚庡彴鎵嬪姩璁剧疆鎺ㄥ箍鍛�
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鍒嗛攢鍏崇郴缁戝畾" prop="brokerageBindMode">
+            <el-radio-group v-model="formData.brokerageBindMode">
+              <el-radio
+                v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_BIND_MODE)"
+                :key="dict.value"
+                :value="dict.value"
+              >
+                {{ dict.label }}
+              </el-radio>
+            </el-radio-group>
+            <el-text class="w-full" size="small" type="info">
+              棣栨缁戝畾锛氬彧瑕佺敤鎴锋病鏈夋帹骞夸汉锛岄殢鏃堕兘鍙互缁戝畾鎺ㄥ箍鍏崇郴
+            </el-text>
+            <el-text class="w-full" size="small" type="info">
+              娉ㄥ唽缁戝畾锛氬彧鏈夋柊鐢ㄦ埛娉ㄥ唽鏃舵垨棣栨杩涘叆绯荤粺鏃舵墠鍙互缁戝畾鎺ㄥ箍鍏崇郴
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鍒嗛攢娴锋姤鍥�">
+            <UploadImgs v-model="formData.brokeragePosterUrls" height="125px" width="75px" />
+            <el-text class="w-full" size="small" type="info">
+              涓汉涓績鍒嗛攢娴锋姤鍥剧墖锛屽缓璁昂瀵� 600x1000
+            </el-text>
+          </el-form-item>
+          <el-form-item label="涓�绾ц繑浣f瘮渚�" prop="brokerageFirstPercent">
+            <el-input-number
+              v-model="formData.brokerageFirstPercent"
+              :max="100"
+              :min="0"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ヤ竴绾ц繑浣f瘮渚�"
+            />
+            <el-text class="w-full" size="small" type="info">
+              璁㈠崟浜ゆ槗鎴愬姛鍚庣粰鎺ㄥ箍浜鸿繑浣g殑鐧惧垎姣�
+            </el-text>
+          </el-form-item>
+          <el-form-item label="浜岀骇杩斾剑姣斾緥" prop="brokerageSecondPercent">
+            <el-input-number
+              v-model="formData.brokerageSecondPercent"
+              :max="100"
+              :min="0"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ヤ簩绾ц繑浣f瘮渚�"
+            />
+            <el-text class="w-full" size="small" type="info">
+              璁㈠崟浜ゆ槗鎴愬姛鍚庣粰鎺ㄥ箍浜虹殑鎺ㄨ崘浜鸿繑浣g殑鐧惧垎姣�
+            </el-text>
+          </el-form-item>
+          <el-form-item label="浣i噾鍐荤粨澶╂暟" prop="brokerageFrozenDays">
+            <el-input-number
+              v-model="formData.brokerageFrozenDays"
+              :min="0"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ヤ剑閲戝喕缁撳ぉ鏁�"
+            />
+            <el-text class="w-full" size="small" type="info">
+              闃叉鐢ㄦ埛閫�娆撅紝浣i噾琚彁鐜颁簡锛屾墍浠ラ渶瑕佽缃剑閲戝喕缁撴椂闂达紝鍗曚綅锛氬ぉ
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鎻愮幇鏈�浣庨噾棰�" prop="brokerageWithdrawMinPrice">
+            <el-input-number
+              v-model="formData.brokerageWithdrawMinPrice"
+              :min="0"
+              :precision="2"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ユ彁鐜版渶浣庨噾棰�"
+            />
+            <el-text class="w-full" size="small" type="info">
+              鐢ㄦ埛鎻愮幇鏈�浣庨噾棰濋檺鍒讹紝鍗曚綅锛氬厓
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鎻愮幇鎵嬬画璐�" prop="brokerageWithdrawFeePercent">
+            <el-input-number
+              v-model="formData.brokerageWithdrawFeePercent"
+              :max="100"
+              :min="0"
+              class="!w-xs"
+              placeholder="璇疯緭鍏ユ彁鐜版墜缁垂"
+            />
+            <el-text class="w-full" size="small" type="info">
+              鎻愮幇鎵嬬画璐圭櫨鍒嗘瘮锛岃寖鍥� 0-100锛�0 涓烘棤鎻愮幇鎵嬬画璐广�備緥锛氳缃� 10锛屽嵆鏀跺彇 10% 鎵嬬画璐癸紝鎻愮幇
+              10 鍏冿紝鍒拌处 9 鍏冿紝1 鍏冩墜缁垂
+            </el-text>
+          </el-form-item>
+          <el-form-item label="鎻愮幇鏂瑰紡" prop="brokerageWithdrawTypes">
+            <el-checkbox-group v-model="formData.brokerageWithdrawTypes">
+              <el-checkbox
+                v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_WITHDRAW_TYPE)"
+                :key="dict.value"
+                :value="dict.value"
+              >
+                {{ dict.label }}
+              </el-checkbox>
+            </el-checkbox-group>
+            <el-text class="w-full" size="small" type="info"> 鍟嗗煄寮�閫氭彁鐜扮殑浠樻鏂瑰紡</el-text>
+          </el-form-item>
+        </el-tab-pane>
+      </el-tabs>
+      <!-- 淇濆瓨 -->
+      <el-form-item>
+        <el-button :loading="formLoading" type="primary" @click="submitForm"> 淇濆瓨</el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+</template>
+
+<script lang="ts" setup>
+import * as ConfigApi from '@/api/mall/trade/config'
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { cloneDeep } from 'lodash-es'
+
+defineOptions({ name: 'TradeConfig' })
+
+const message = useMessage() // 娑堟伅寮圭獥
+
+const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤
+const formRef = ref()
+const formData = ref({
+  id: null,
+  afterSaleRefundReasons: [],
+  afterSaleReturnReasons: [],
+  deliveryExpressFreeEnabled: false,
+  deliveryExpressFreePrice: 0,
+  deliveryPickUpEnabled: false,
+  brokerageEnabled: false,
+  brokerageEnabledCondition: undefined,
+  brokerageBindMode: undefined,
+  brokeragePosterUrls: [],
+  brokerageFirstPercent: 0,
+  brokerageSecondPercent: 0,
+  brokerageWithdrawMinPrice: 0,
+  brokerageWithdrawFeePercent: 0,
+  brokerageFrozenDays: 0,
+  brokerageWithdrawTypes: []
+})
+const formRules = reactive({
+  deliveryExpressFreePrice: [{ required: true, message: '婊¢鍖呴偖涓嶈兘涓虹┖', trigger: 'blur' }],
+  brokerageEnabledCondition: [{ required: true, message: '鍒嗕剑妯″紡涓嶈兘涓虹┖', trigger: 'blur' }],
+  brokerageBindMode: [{ required: true, message: '鍒嗛攢鍏崇郴缁戝畾妯″紡涓嶈兘涓虹┖', trigger: 'blur' }],
+  brokerageFirstPercent: [{ required: true, message: '涓�绾ц繑浣f瘮渚嬩笉鑳戒负绌�', trigger: 'blur' }],
+  brokerageSecondPercent: [{ required: true, message: '浜岀骇杩斾剑姣斾緥涓嶈兘涓虹┖', trigger: 'blur' }],
+  brokerageWithdrawMinPrice: [
+    { required: true, message: '鐢ㄦ埛鎻愮幇鏈�浣庨噾棰濅笉鑳戒负绌�', trigger: 'blur' }
+  ],
+  brokerageWithdrawFeePercent: [{ required: true, message: '鎻愮幇鎵嬬画璐逛笉鑳戒负绌�', trigger: 'blur' }],
+  brokerageFrozenDays: [{ required: true, message: '浣i噾鍐荤粨鏃堕棿涓嶈兘涓虹┖', trigger: 'blur' }],
+  brokerageWithdrawTypes: [
+    {
+      required: true,
+      message: '鎻愮幇鏂瑰紡涓嶈兘涓虹┖',
+      trigger: 'change'
+    }
+  ]
+})
+
+const submitForm = async () => {
+  if (formLoading.value) return
+  // 鏍¢獙琛ㄥ崟
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+  // 鎻愪氦璇锋眰
+  formLoading.value = true
+  try {
+    const data = cloneDeep(unref(formData.value)) as unknown as ConfigApi.ConfigVO
+    // 閲戦鏀惧ぇ
+    data.deliveryExpressFreePrice = data.deliveryExpressFreePrice * 100
+    data.brokerageWithdrawMinPrice = data.brokerageWithdrawMinPrice * 100
+    await ConfigApi.saveTradeConfig(data)
+    message.success('淇濆瓨鎴愬姛')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 鏌ヨ浜ゆ槗涓績閰嶇疆 */
+const getConfig = async () => {
+  formLoading.value = true
+  try {
+    const data = await ConfigApi.getTradeConfig()
+    if (data != null) {
+      formData.value = data
+      // 閲戦缂╁皬
+      formData.value.deliveryExpressFreePrice = data.deliveryExpressFreePrice / 100
+      formData.value.brokerageWithdrawMinPrice = data.brokerageWithdrawMinPrice / 100
+    }
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 鍒濆鍖� **/
+onMounted(() => {
+  getConfig()
+})
+</script>

--
Gitblit v1.8.0