@@ -6,7 +6,7 @@
< BasicTable ref = "actionRef" :columns = "columns" :request = "loadDataTable" :row-key = "r=>r.id" :action-column = "actionColumn" :scroll-x = "scrollX" :resize-height-offset = "-10000" > < template # tableTitle > < n-button v-if = "hasPermission(['/memberLevel/save'])" type="primary" @click="openEdit()" > 新增等级 < / n -button > < / template > < / BasicTable >
< BasicTable ref = "actionRef" :columns = "columns" :request = "loadDataTable" :row-key = "r=>r.id" :action-column = "actionColumn" :scroll-x = "scrollX" :resize-height-offset = "-10000" > < template # tableTitle > < n-button v-if = "hasPermission(['/memberLevel/save'])" type="primary" @click="openEdit()" > 新增等级 < / n -button > < / template > < / BasicTable >
< / n-card >
< / n-card >
< n-modal v -model :show = "showEdit" preset = "card" :title = "form.id?'编辑等级':'新增等级'" class = "level-modal" >
< n-modal v -model :show = "showEdit" preset = "card" :title = "form.id?'编辑等级':'新增等级'" class = "level-modal" >
< n-alert type = "info" :show-icon = "false" > 金额以元录入 , 服务端按分保存 ; 佣金以百分比录入 , 服务端按万分比保存 。 < / n-alert >
< n-alert type = "info" :show-icon = "false" > 金额以元录入 , 服务端按分保存 ; 佣金以百分比录入 ; 自动派单会在所设时间范围内随机生成倒计时 。 < / n-alert >
< n-form ref = "formRef" :model = "form" :rules = "rules" label -placement = " left " label -width = " 110 " >
< n-form ref = "formRef" :model = "form" :rules = "rules" label -placement = " left " label -width = " 110 " >
< n-grid :cols = "2" :x-gap = "16" >
< n-grid :cols = "2" :x-gap = "16" >
< n-form-item-gi label = "等级编码" path = "levelCode" required > < n-input v -model :value = "form.levelCode" placeholder = "如 VIP1" / > < / n-form-item-gi >
< n-form-item-gi label = "等级编码" path = "levelCode" required > < n-input v -model :value = "form.levelCode" placeholder = "如 VIP1" / > < / n-form-item-gi >
@@ -18,6 +18,8 @@
< n-form-item-gi label = "每日接单次数" > < n-input-number v -model :value = "form.dailyOrderLimit" :min = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "每日接单次数" > < n-input-number v -model :value = "form.dailyOrderLimit" :min = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "佣金比例(%) " > < n-input-number v -model :value = "form.commissionPercent" :min = "0" :max = "100" :precision = "2" / > < / n-form-item-gi >
< n-form-item-gi label = "佣金比例(%) " > < n-input-number v -model :value = "form.commissionPercent" :min = "0" :max = "100" :precision = "2" / > < / n-form-item-gi >
< n-form-item-gi label = "每日提现次数" > < n-input-number v -model :value = "form.dailyWithdrawLimit" :min = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "每日提现次数" > < n-input-number v -model :value = "form.dailyWithdrawLimit" :min = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "最短派单(分钟)" path = "autoOrderDelayMinMinutes" > < n-input-number v -model :value = "form.autoOrderDelayMinMinutes" :min = "0" :precision = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "最长派单(分钟)" path = "autoOrderDelayMaxMinutes" > < n-input-number v -model :value = "form.autoOrderDelayMaxMinutes" :min = "0" :precision = "0" / > < / n-form-item-gi >
< n-form-item-gi label = "排序" > < n-input-number v -model :value = "form.sort" / > < / n-form-item-gi >
< n-form-item-gi label = "排序" > < n-input-number v -model :value = "form.sort" / > < / n-form-item-gi >
< n-form-item-gi label = "备注" :span = "2" > < n-input v -model :value = "form.remark" type = "textarea" / > < / n-form-item-gi >
< n-form-item-gi label = "备注" :span = "2" > < n-input v -model :value = "form.remark" type = "textarea" / > < / n-form-item-gi >
< / n-grid >
< / n-grid >
@@ -28,11 +30,11 @@
< / template >
< / template >
< script lang = "ts" setup >
< script lang = "ts" setup >
import { computed , h , onMounted , reactive , ref } from 'vue' ; import { useDialog , useMessage } from 'naive-ui' ; import { BasicTable , TableAction } from '@/components/Table' ; import { BasicForm , useForm } from '@/components/Form' ; import { usePermission } from '@/hooks/web/usePermission' ; import { useDictStore } from '@/store/modules/dict' ; import { adaTableScrollX } from '@/utils/hotgo' ; import { List , View , Save , Status , Delete } from '@/api/memberLevel' ; import { columns , schemas , loadOptions } from './model' ;
import { computed , h , onMounted , reactive , ref } from 'vue' ; import { useDialog , useMessage } from 'naive-ui' ; import { BasicTable , TableAction } from '@/components/Table' ; import { BasicForm , useForm } from '@/components/Form' ; import { usePermission } from '@/hooks/web/usePermission' ; import { useDictStore } from '@/store/modules/dict' ; import { adaTableScrollX } from '@/utils/hotgo' ; import { List , View , Save , Status , Delete } from '@/api/memberLevel' ; import { columns , schemas , loadOptions } from './model' ;
const message = useMessage ( ) , dialog = useDialog ( ) , dict = useDictStore ( ) ; const { hasPermission } = usePermission ( ) ; const actionRef = ref ( ) , searchFormRef = ref < any > ( { } ) , formRef = ref < any > ( ) , showEdit = ref ( false ) , saving = ref ( false ) ; const form = reactive < any > ( { } ) ; const rules = { levelCode : { required : true , message : '请输入等级编码' , trigger : [ 'input' , 'blur' ] } , name : { required : true , message : '请输入等级名称' , trigger : [ 'input' , 'blur' ] } } ; const [ register ] = useForm ( { gridProps : { cols : '1 s:1 m:2 l:3' } , labelWidth : 80 , schemas } ) ; const loadDataTable = res => List ( { ... searchFormRef . value ? . formModel , ... res } ) ; const reloadTable = ( ) => actionRef . value ? . reload ( ) ; const reset = ( o , v ) => { Object . keys ( o ) . forEach ( k => delete o [ k ] ) ; Object . assign ( o , v ) } ;
const message = useMessage ( ) , dialog = useDialog ( ) , dict = useDictStore ( ) ; const { hasPermission } = usePermission ( ) ; const actionRef = ref ( ) , searchFormRef = ref < any > ( { } ) , formRef = ref < any > ( ) , showEdit = ref ( false ) , saving = ref ( false ) ; const form = reactive < any > ( { } ) ; const rules = { levelCode : { required : true , message : '请输入等级编码' , trigger : [ 'input' , 'blur' ] } , name : { required : true , message : '请输入等级名称' , trigger : [ 'input' , 'blur' ] } , autoOrderDelayMaxMinutes : { validator : ( ) => Number ( form . autoOrderDelayMaxMinutes ) >= Number ( form . autoOrderDelayMinMinutes ) , message : '最长派单时间不能小于最短派单时间' , trigger : [ 'input' , 'blur' ] } } ; const [ register ] = useForm ( { gridProps : { cols : '1 s:1 m:2 l:3' } , labelWidth : 80 , schemas } ) ; const loadDataTable = res => List ( { ... searchFormRef . value ? . formModel , ... res } ) ; const reloadTable = ( ) => actionRef . value ? . reload ( ) ; const reset = ( o , v ) => { Object . keys ( o ) . forEach ( k => delete o [ k ] ) ; Object . assign ( o , v ) } ;
const actionColumn = reactive ( { width : 210 , title : '操作' , key : 'action' , fixed : 'right' , render : row => h ( TableAction as any , { style : 'button' , actions : [ { label : '编辑' , onClick : ( ) => openEdit ( row ) , auth : [ '/memberLevel/view' ] } , { label : row . status === 1 ? '停用' : '启用' , onClick : ( ) => toggleStatus ( row ) , auth : [ '/memberLevel/status' ] } , { label : '删除' , type : 'error' , onClick : ( ) => remove ( row ) , auth : [ '/memberLevel/delete' ] } ] } ) } ) ; const scrollX = computed ( ( ) => adaTableScrollX ( columns , actionColumn . width ) ) ;
const actionColumn = reactive ( { width : 210 , title : '操作' , key : 'action' , fixed : 'right' , render : row => h ( TableAction as any , { style : 'button' , actions : [ { label : '编辑' , onClick : ( ) => openEdit ( row ) , auth : [ '/memberLevel/view' ] } , { label : row . status === 1 ? '停用' : '启用' , onClick : ( ) => toggleStatus ( row ) , auth : [ '/memberLevel/status' ] } , { label : '删除' , type : 'error' , onClick : ( ) => remove ( row ) , auth : [ '/memberLevel/delete' ] } ] } ) } ) ; const scrollX = computed ( ( ) => adaTableScrollX ( columns , actionColumn . width ) ) ;
function emptyForm ( ) { return { id : 0 , levelCode : '' , name : '' , iconAttachmentId : 0 , iconUrl : '' , upgradeYuan : 0 , giftYuan : 0 , dailyOrderLimit : 0 , commissionPercent : 0 , dailyWithdrawLimit : 0 , sort : 0 , status : 1 , remark : '' } }
function emptyForm ( ) { return { id : 0 , levelCode : '' , name : '' , iconAttachmentId : 0 , iconUrl : '' , upgradeYuan : 0 , giftYuan : 0 , dailyOrderLimit : 0 , commissionPercent : 0 , dailyWithdrawLimit : 0 , autoOrderDelayMinMinutes : 15 , autoOrderDelayMaxMinutes : 20 , sort : 0 , status : 1 , remark : '' } }
async function openEdit ( row ? ) { reset ( form , emptyForm ( ) ) ; showEdit . value = true ; if ( ! row ) return ; const r : any = await View ( { id : row . id } ) ; const v = r . published || r . draft ; Object . assign ( form , { id : r . level . id , levelCode : r . level . levelCode , name : r . level . name , iconAttachmentId : r . level . iconAttachmentId , iconUrl : r . level . iconUrl , sort : r . level . sort , status : r . level . status , remark : r . level . remark || '' , upgradeYuan : ( v ? . upgradeAmount || 0 ) / 100 , giftYuan : ( v ? . giftAmount || 0 ) / 100 , dailyOrderLimit : v ? . dailyOrderLimit || 0 , commissionPercent : ( v ? . commissionRate || 0 ) / 100 , dailyWithdrawLimit : v ? . dailyWithdrawLimit || 0 } ) }
async function openEdit ( row ? ) { reset ( form , emptyForm ( ) ) ; showEdit . value = true ; if ( ! row ) return ; const r : any = await View ( { id : row . id } ) ; const v = r . published || r . draft ; const levelRules = v ? . ruleJson || { } ; Object . assign ( form , { id : r . level . id , levelCode : r . level . levelCode , name : r . level . name , iconAttachmentId : r . level . iconAttachmentId , iconUrl : r . level . iconUrl , sort : r . level . sort , status : r . level . status , remark : r . level . remark || '' , upgradeYuan : ( v ? . upgradeAmount || 0 ) / 100 , giftYuan : ( v ? . giftAmount || 0 ) / 100 , dailyOrderLimit : v ? . dailyOrderLimit || 0 , commissionPercent : ( v ? . commissionRate || 0 ) / 100 , dailyWithdrawLimit : v ? . dailyWithdrawLimit || 0 , autoOrderDelayMinMinutes : Number ( levelRules . auto _order _delay _min _seconds ? ? 900 ) / 60 , autoOrderDelayMaxMinutes : Number ( levelRules . auto _order _delay _max _seconds ? ? 1200 ) / 60 } ) }
async function saveLevel ( ) { try { await formRef . value ? . validate ( ) } catch { return } saving . value = true ; try { await Save ( { ... form , upgradeAmount : Math . round ( form . upgradeYuan * 100 ) , giftAmount : Math . round ( form . giftYuan * 100 ) , commissionRate : Math . round ( form . commissionPercent * 100 ) } ) ; message . success ( '保存成功' ) ; showEdit . value = false ; reloadTable ( ) ; dict . loadOptions ( [ 'memberLevelOption' ] ) } finally { saving . value = false } }
async function saveLevel ( ) { try { await formRef . value ? . validate ( ) } catch { return } saving . value = true ; try { await Save ( { ... form , upgradeAmount : Math . round ( form . upgradeYuan * 100 ) , giftAmount : Math . round ( form . giftYuan * 100 ) , commissionRate : Math . round ( form . commissionPercent * 100 ) , autoOrderDelayMinSeconds : Math . round ( form . autoOrderDelayMinMinutes * 60 ) , autoOrderDelayMaxSeconds : Math . round ( form . autoOrderDelayMaxMinutes * 60 ) } ) ; message . success ( '保存成功' ) ; showEdit . value = false ; reloadTable ( ) ; dict . loadOptions ( [ 'memberLevelOption' ] ) } finally { saving . value = false } }
async function toggleStatus ( row ) { await Status ( { id : row . id , status : row . status === 1 ? 2 : 1 } ) ; message . success ( '状态已更新' ) ; reloadTable ( ) }
async function toggleStatus ( row ) { await Status ( { id : row . id , status : row . status === 1 ? 2 : 1 } ) ; message . success ( '状态已更新' ) ; reloadTable ( ) }
function remove ( row ) { dialog . warning ( { title : '删除等级' , content : '仅无会员且未被任务大厅引用的等级可删除。' , positiveText : '确认删除' , negativeText : '取消' , onPositiveClick : async ( ) => { await Delete ( { id : row . id , reason : '后台删除未使用等级' } ) ; message . success ( '删除成功' ) ; reloadTable ( ) } } ) }
function remove ( row ) { dialog . warning ( { title : '删除等级' , content : '仅无会员且未被任务大厅引用的等级可删除。' , positiveText : '确认删除' , negativeText : '取消' , onPositiveClick : async ( ) => { await Delete ( { id : row . id , reason : '后台删除未使用等级' } ) ; message . success ( '删除成功' ) ; reloadTable ( ) } } ) }
onMounted ( loadOptions ) ;
onMounted ( loadOptions ) ;