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