You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
974 lines
40 KiB
974 lines
40 KiB
<template> |
|
<div class="system-edit-post-container"> |
|
<el-form ref="formRef" :model="model" :rules="rules" size="default" label-width="80px"> |
|
<el-card shadow="hover" :header="ModelTypeName[modelType]+'摊位配置'"> |
|
<template #header> |
|
{{ModelTypeName[modelType] +'摊位配置'}} |
|
<el-button v-show="item.show == false" @click="item.show = true" class="button-caret" type="text"> |
|
<el-icon> |
|
<ele-CaretBottom/> |
|
</el-icon> |
|
</el-button> |
|
<el-button v-show="item.show == true" @click="item.show = false" class="button-caret" type="text"> |
|
<el-icon> |
|
<ele-CaretTop/> |
|
</el-icon> |
|
</el-button> |
|
</template> |
|
<div v-show="item.show"> |
|
<div class="flex-warp"> |
|
<el-form-item label="摊位ID:" prop="stallId"> |
|
<el-input v-model="model.stallId" placeholder="请输入摊位ID" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
<span v-show="check&&!model.stallId" style="color: red">*</span> |
|
<el-form-item label="NPCID:" prop="NPCId"> |
|
<el-select v-model="model.NPCId" placeholder="请选择"> |
|
<el-option v-for="item in NPC" :key="item.Id" :label="item.Id+' '+item.Name" :value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
<!-- <el-input v-model="model.NPCId" placeholder="请输入NPCID"--> |
|
<!-- onkeyup="this.value=this.value.replace(/\D/g,'');"--> |
|
<!-- onafterpaste="this.value=this.value.replace(/\D/g,'')"/>--> |
|
</el-form-item> |
|
<span v-show="check&&!model.NPCId" style="color: red">*</span> |
|
<el-form-item label="规模:" prop="scale"> |
|
<el-select v-model="model.scale" filterable placeholder="请输入规模"> |
|
<el-option :key="-1" label="无" :value="-1"/> |
|
<el-option |
|
v-for="item in Scale" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.ScaleName" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<span v-show="check&&!model.scale" style="color: red">*</span> |
|
<el-form-item label="村落条件:" prop="village"> |
|
<el-select v-model="model.village" filterable placeholder="请输入村落条件"> |
|
<el-option :key="-1" label="无" :value="-1"/> |
|
<el-option |
|
v-for="item in Region" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.Region" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<span v-show="check&&!model.village" style="color: red">*</span> |
|
<el-form-item prop="renown" style="margin-left: -80px;width: 200px"> |
|
<el-input v-model="model.renown" placeholder="请输入声望值" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
<span v-show="check&&!model.renown" style="color: red">*</span> |
|
<el-form-item label="建筑条件:" prop="structure"> |
|
<el-select v-model="model.structure" filterable placeholder="请输入建筑条件"> |
|
<el-option :key="-1" label="无" :value="-1"/> |
|
<el-option |
|
v-for="item in Structure" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.Name +' '+ item.LvMark+'级 '" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<span v-show="check&&!model.structure" style="color: red">*</span> |
|
<el-form-item label="种类数量:" prop="num"> |
|
<el-input v-model="model.num" placeholder="请输入内容" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
<span v-show="check&&!model.num" style="color: red">*</span> |
|
</div> |
|
|
|
<el-table :data="model.items" :cell-style="{padding:'0'}" :row-style="{height:'40px'}"> |
|
<el-table-column width="30"> |
|
<template #default="scope"> |
|
<div class="flex-warp"> |
|
<el-button size="small" type="text" @click="delModelItem(scope.$index)"> |
|
<el-icon> |
|
<ele-Minus/> |
|
</el-icon> |
|
</el-button> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="物品名称" width="150"> |
|
<template #default="scope"> |
|
<div class="flex-warp"> |
|
<el-select v-model="scope.row.id" filterable placeholder="请选择物品" style="width: 80%"> |
|
<el-option v-for="item in ItemConfig" :key="item.Id" :label="item.Id +' '+ item.DetailsPageName" |
|
:value="item.Id"/> |
|
</el-select> |
|
<span v-show="check&&!scope.row.id" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="物品数量区间(min;max)" width="250"> |
|
<template #default="scope"> |
|
<div class="flex-warp" prop="numRange"> |
|
<el-input v-model="scope.row.numRangeMin" placeholder="请输入数量" style="width: 40%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span v-show="check&&!scope.row.numRangeMin" style="color: red">*</span> |
|
; |
|
<el-input v-model="scope.row.numRangeMax" placeholder="请输入数量" style="width: 40%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span v-show="check&&!Number(scope.row.numRangeMax)" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="货币类型" width="200"> |
|
<template #default="scope"> |
|
<div class="flex-warp"> |
|
<el-select v-model="scope.row.currencyType" filterable placeholder="请选择货币类型" style="width: 80%"> |
|
<el-option v-for="item in currencyType" :key="item.Id" :label="item.Name" :value="item.Id"/> |
|
</el-select> |
|
<span v-show="check&&!Number(scope.row.currencyType)" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="权重" width="200"> |
|
<template #default="scope"> |
|
<div class="flex-warp" prop="weight"> |
|
<el-input v-model="scope.row.weight" placeholder="请输入权重" style="width: 90%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span v-show="check&&!Number(scope.row.weight)" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="价格"> |
|
<template #default="scope"> |
|
<div class="flex-warp" prop="price"> |
|
<el-input v-model="scope.row.price" placeholder="请输入价格" style="width: 90%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span v-show="check&&!Number(scope.row.price)" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣"> |
|
<template #default="scope"> |
|
<div class="flex-warp" prop="discount"> |
|
<el-input v-model="scope.row.discount" placeholder="请输入折扣" style="width: 80%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
%<span v-show="check&&!scope.row.discount" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣概率"> |
|
<template #default="scope"> |
|
<div class="flex-warp" prop="discountProb"> |
|
<el-input v-model="scope.row.discountProb" placeholder="请输入折扣概率" style="width: 80%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
%<span v-show="check&&!scope.row.discountProb" style="color: red">*</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="操作" width="100"> |
|
<template #header> |
|
<div class="flex-warp-item" style="float: right;"> |
|
<div class="flex-warp-item-box"> |
|
<el-button size="default" type="primary" @click="onQuickFillingModelItem()" v-waves> |
|
快速复制 |
|
</el-button> |
|
</div> |
|
<span style="font-size: 8px">*全部使用第一行数据</span> |
|
</div> |
|
</template> |
|
<template #default="scope"> |
|
<el-button size="small" type="text" @click="onCopyModelItem(scope.row)">复制</el-button> |
|
<el-button size="small" type="text" @click="onPasteModelItem(scope.$index)">粘贴</el-button> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<div style="margin: 10px 0"> |
|
<el-button size="default" type="primary" @click="addModelItem()"> |
|
<el-icon> |
|
<ele-Plus/> |
|
</el-icon> |
|
添加 |
|
</el-button> |
|
</div> |
|
<el-form label-width="90px"> |
|
<el-form-item label="摊位介绍:" prop="introduce"> |
|
<el-input v-model="model.introduce" type="textarea" placeholder="请输入摊位介绍" style="width: 90%"/> |
|
<span v-show="check&&!model.introduce" style="color: red">*</span> |
|
</el-form-item> |
|
<el-form-item label="摊位名称:" prop="remark"> |
|
<el-input v-model="model.remark" type="textarea" placeholder="请输入摊位名称" style="width: 90%"/> |
|
<span v-show="check&&!model.remark" style="color: red">*</span> |
|
</el-form-item> |
|
</el-form> |
|
<div style="justify-content: center"> |
|
<el-button size="default" type="primary" class="ml10" @click="saveModel"> |
|
<el-icon> |
|
<ele-RefreshRight/> |
|
</el-icon> |
|
保存配置 |
|
</el-button> |
|
</div> |
|
</div> |
|
</el-card> |
|
|
|
<el-card shadow="hover" :header="ModelTypeName[modelType]+'配置记录'"> |
|
<template #header> |
|
{{ModelTypeName[modelType]+'配置记录'}} |
|
<el-button v-show="item.listShow == false" @click="item.listShow = true" class="button-caret" type="text"> |
|
<el-icon size="20"> |
|
<ele-CaretBottom/> |
|
</el-icon> |
|
</el-button> |
|
<el-button v-show="item.listShow == true" @click="item.listShow = false" class="button-caret" type="text"> |
|
<el-icon> |
|
<ele-CaretTop/> |
|
</el-icon> |
|
</el-button> |
|
</template> |
|
<div v-show="item.listShow"> |
|
<el-form class="flex-warp" style="margin: 2px 0;"> |
|
<el-form-item label="摊位ID:" prop="name"> |
|
<el-input v-model="modelId" placeholder="请输入摊位ID" style="width: 100px" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<el-button size="small" type="primary" @click="getModel" style="margin: 2px">查找</el-button> |
|
</el-form-item> |
|
</el-form> |
|
<div v-show="stalls.length == 0">暂无摊位配置</div> |
|
<div v-for="model in stalls"> |
|
<el-form class="flex-warp"> |
|
<el-divider style="margin: 4px 0;"></el-divider> |
|
<el-form-item prop="name" style="padding: 1px"> |
|
摊位ID: {{model.StallId}},NPCID: |
|
{{model.NPCId?(NPC.find(r=>r.Id==model.NPCId)?NPC.find(r=>r.Id==model.NPCId).Name:model.NPCId):"无"}},规模条件:{{Scale.find(r=>r.Id==model.ScaleId)? |
|
(model.ScaleId+ " " + Scale.find(r=>r.Id==model.ScaleId).ScaleName): (model.ScaleId==-1?"无":"")}}, |
|
村落条件:{{Region.find(r=>r.Id==model.VillageId)? |
|
(model.VillageId+ " " + Region.find(r=>r.Id==model.VillageId).Region): (model.VillageId==-1?"无":"")}} |
|
{{model.Renown}},建筑条件: |
|
{{Structure.find(r=>r.Id==model.StructureId)? |
|
(model.StructureId+" "+Structure.find(r=>r.Id==model.StructureId).Name): |
|
(model.StructureId==-1?"无":"")}},种类数量:{{model.Num}} |
|
</el-form-item> |
|
<el-table style="margin-top:-30px;" :data="model.Items" :row-style="{height:1+'px'}" |
|
:cell-style="{padding:1+'px'}"> |
|
<el-table-column label="物品名称"> |
|
<template #default="scope"> |
|
{{ItemConfig.find(r=>r.Id==scope.row.ItemId)?ItemConfig.find(r=>r.Id==scope.row.ItemId).Id+ |
|
' '+ItemConfig.find(r=>r.Id==scope.row.ItemId).Name:''}} |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="物品数量区间(min;max)" width="200"> |
|
<template #default="scope"> |
|
{{scope.row.ItemNums[0]}};{{scope.row.ItemNums[1]}} |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="货币类型"> |
|
<template #default="scope"> |
|
{{currencyType.find(r=>r.Id==scope.row.CurrencyType)?currencyType.find(r=>r.Id==scope.row.CurrencyType).Name:""}} |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="权重"> |
|
<template #default="scope"> |
|
{{scope.row.Weight}} |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="价格"> |
|
<template #default="scope"> |
|
{{scope.row.Price}} |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣"> |
|
<template #default="scope"> |
|
{{scope.row.Discount}}% |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣概率"> |
|
<template #default="scope"> |
|
{{scope.row.DiscountProb}}% |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<div style="width: 9000px;margin: 10px 0;"> |
|
摊位介绍: {{model.Introduce}} |
|
摊位名称:{{model.Remark}} |
|
<el-form-item style="float: right"> |
|
<el-button size="small" type="primary" @click="makeStall(model.Type, model.StringId)">修改</el-button> |
|
<el-button size="small" type="danger" @click="delModel(model.StringId, model.StallId)">删除</el-button> |
|
</el-form-item> |
|
</div> |
|
</el-form> |
|
</div> |
|
<el-row justify="space-evenly"> |
|
<el-pagination :hide-on-single-page="true" v-model:page-size="pageSize" v-model:current-page="page" |
|
:pager-count="5" @current-change="handleCurrentChange" layout="total, prev, pager, next" |
|
:total="stallTotal"/> |
|
</el-row> |
|
</div> |
|
</el-card> |
|
|
|
<el-dialog v-model="editModelVisible" width="90%" :show-close="false" |
|
:header="ModelTypeName[modelType]+'摊位配置'" |
|
:body-style="{backgroundColor: '#fff' }" style=" background-color: #009999;" @close="destroyEditData"> |
|
<template #header> |
|
{{ModelTypeName[modelType]+'摊位配置'}} |
|
<el-button v-show="item.show == false" @click="item.show = true" |
|
style="float: right;min-width: 20px;height: 17px;line-height: 17px;color: white" type="text"> |
|
<el-icon size="20"> |
|
<ele-CaretBottom/> |
|
</el-icon> |
|
</el-button> |
|
<el-button v-show="item.show == true" @click="item.show = false" |
|
style="float: right;min-width: 20px;height: 17px;line-height: 17px;color: white" type="text"> |
|
<el-icon> |
|
<ele-CaretTop/> |
|
</el-icon> |
|
</el-button> |
|
</template> |
|
<div v-show="item.show"> |
|
<div class="flex-warp"> |
|
<el-form-item label="摊位ID:" prop="stallId"> |
|
<el-input v-model="model.stallId" placeholder="请输入摊位ID" disabled |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
<el-form-item label="NPCID:" prop="NPCId"> |
|
<el-select v-model="model.NPCId" placeholder="请选择"> |
|
<el-option v-for="item in NPC" :key="item.Id" :label="item.Id+' '+item.Name" :value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item label="规模条件:" prop="scale"> |
|
<el-select v-model="model.scale" filterable placeholder="请输入村落条件"> |
|
<el-option |
|
v-for="item in Scale" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.ScaleName" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item label="村落条件:" prop="village"> |
|
<el-select v-model="model.village" filterable placeholder="请输入村落条件"> |
|
<el-option |
|
v-for="item in Region" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.Region" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item prop="renown" style="margin-left: -80px;width: 200px"> |
|
<el-input v-model="model.renown" placeholder="请输入声望值" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
<el-form-item label="建筑条件:" prop="structure"> |
|
<el-select v-model="model.structure" filterable placeholder="请输入建筑条件"> |
|
<el-option |
|
v-for="item in Structure" |
|
:key="item.Id" |
|
:label="item.Id +' '+ item.Name+' ' + item.LvMark+'级 '" |
|
:value="item.Id"> |
|
</el-option> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item label="种类数量:" prop="num"> |
|
<el-input v-model="model.num" placeholder="请输入内容" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</el-form-item> |
|
</div> |
|
<div class="flex-warp"> |
|
<el-table :data="model.items" :inline="true" :cell-style="{padding:'0'}" :row-style="{height:'40px'}"> |
|
<el-table-column width="30"> |
|
<template #default="scope"> |
|
<el-button size="small" type="text" @click="delModelItem(scope.$index)"> |
|
<el-icon> |
|
<ele-Minus/> |
|
</el-icon> |
|
</el-button> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="物品名称" width="150"> |
|
<template #default="scope"> |
|
<el-select v-model="scope.row.id" filterable placeholder="请选择物品"> |
|
<el-option v-for="item in ItemConfig" :key="item.Id" :label="item.Id +' '+ item.Name" |
|
:value="item.Id"/> |
|
</el-select> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="物品数量区间(min;max)" width="250"> |
|
<template #default="scope"> |
|
<el-input v-model="scope.row.numRangeMin" placeholder="请输入数量" style="width: 40%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
; |
|
<el-input v-model="scope.row.numRangeMax" placeholder="请输入数量" style="width: 40%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="货币类型"> |
|
<template #default="scope"> |
|
<el-select v-model="scope.row.currencyType" filterable placeholder="请选择货币类型"> |
|
<el-option v-for="item in currencyType" :key="item.Id" :label="item.Name" :value="item.Id"/> |
|
</el-select> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="权重"> |
|
<template #default="scope"> |
|
<el-input v-model="scope.row.weight" placeholder="请输入权重" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="价格"> |
|
<template #default="scope"> |
|
<el-input v-model="scope.row.price" placeholder="请输入价格" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣"> |
|
<template #default="scope"> |
|
<el-input v-model="scope.row.discount" placeholder="请输入折扣" style="width: 80%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span style="margin: 10px 0">%</span> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="折扣概率"> |
|
<template #default="scope"> |
|
<el-input v-model="scope.row.discountProb" placeholder="请输入折扣概率" style="width: 80%" |
|
onkeyup="this.value=this.value.replace(/\D/g,'');" |
|
onafterpaste="this.value=this.value.replace(/\D/g,'')"/> |
|
<span style="margin:10px 0">%</span> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="操作" width="100"> |
|
<template #header> |
|
<div class="flex-warp-item" style="float: right;"> |
|
<div class="flex-warp-item-box"> |
|
<el-button size="default" type="primary" @click="onQuickFillingModelItem()" v-waves> |
|
快速复制 |
|
</el-button> |
|
</div> |
|
<span style="font-size: 8px">*全部使用第一行数据</span> |
|
</div> |
|
</template> |
|
<template #default="scope"> |
|
<el-button size="small" type="text" @click="onCopyModelItem(scope.row)">复制</el-button> |
|
<el-button size="small" type="text" @click="onPasteModelItem(scope.$index)">粘贴</el-button> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<div style="margin: 10px 0"> |
|
<el-button size="default" type="primary" @click="addModelItem()"> |
|
<el-icon> |
|
<ele-Plus/> |
|
</el-icon> |
|
添加 |
|
</el-button> |
|
</div> |
|
</div> |
|
<el-form label-width="90px"> |
|
<el-form-item label="摊位介绍:" prop="introduce"> |
|
<el-input v-model="model.introduce" type="textarea" placeholder="请输入摊位介绍"/> |
|
</el-form-item> |
|
<el-form-item label="摊位名称:" prop="remark"> |
|
<el-input v-model="model.remark" type="textarea" placeholder="请输入摊位名称"/> |
|
</el-form-item> |
|
</el-form> |
|
<div style="width: 100%;display: flex;justify-content: space-between;padding: 0 50px;"> |
|
<el-button size="default" type="success" @click="destroyEditData"> |
|
<el-icon> |
|
<ele-Close/> |
|
</el-icon> |
|
取消保存 |
|
</el-button> |
|
<el-button size="default" type="primary" @click="saveModel"> |
|
<el-icon> |
|
<ele-RefreshRight/> |
|
</el-icon> |
|
保存配置 |
|
</el-button> |
|
</div> |
|
</div> |
|
</el-dialog> |
|
</el-form> |
|
</div> |
|
</template> |
|
<script lang="ts"> |
|
import {reactive, toRefs, defineComponent, ref, unref, onMounted} from 'vue'; |
|
import { |
|
gameGMDelModel, |
|
gameGMUpdateModel, |
|
gameGMInsertModel, |
|
gameGMGetModel |
|
} from '/@/api/game'; |
|
import AllItemConfigCategory from "/@/api/config/AllItemConfigCategory.json"; |
|
import StructureConfigCategory from "/@/api/config/StructureConfigCategory.json"; |
|
import RegionConfigCategory from "/@/api/config/RegionConfigCategory.json"; |
|
import NpcConfigCategory from "/@/api/config/NpcConfigCategory.json"; |
|
import ScaleConfigCategory from "/@/api/config/ScaleConfigCategory.json"; |
|
import {ElLoading, ElMessage, ElMessageBox} from "element-plus"; |
|
import type {Action} from 'element-plus' |
|
import {MODEL_TYPE, MODEL_TYPE_NAME} from "/@/api/common/consts"; |
|
|
|
interface TableDataState{ |
|
model: object; |
|
Scale: object[]; |
|
Region: object[]; |
|
Structure: object[]; |
|
ItemConfig: object; |
|
currencyType: object; |
|
rules: object; |
|
dbs: object[]; |
|
stallDbs: object[]; |
|
stalls: object[]; |
|
modelItem: object; |
|
listModelVisible: boolean; |
|
editModelVisible: boolean; |
|
modelType: number; |
|
stallTotal: number; |
|
modelId: number; |
|
page: number; |
|
pageSize: number; |
|
item: object; |
|
NPC: object; |
|
} |
|
|
|
export default defineComponent({ |
|
name: 'systemGameMarketBuyModel', |
|
setup: function(){ |
|
const formRef = ref<HTMLElement|null>(null); |
|
const menuRef = ref(); |
|
const state = reactive<TableDataState>({ |
|
check: false, |
|
ModelType: MODEL_TYPE, |
|
ModelTypeName: MODEL_TYPE_NAME, |
|
model: { |
|
stallId: 1, |
|
scale: -1, |
|
village: -1, |
|
structure: -1, |
|
}, |
|
item: {show: true, listShow: true}, |
|
Scale: ScaleConfigCategory, |
|
Region: RegionConfigCategory, |
|
Structure: StructureConfigCategory, |
|
listModelVisible: false, |
|
editModelVisible: false, |
|
modelType: 0, |
|
stallTotal: 0, |
|
stallDbs: [{type: 1}, {type: 2}], |
|
stalls: [], |
|
dbs: [], |
|
ItemConfig: AllItemConfigCategory, |
|
currencyType: [{Id: 1, Name: "铜币"}, {Id: 2, Name: "桃花石"}], |
|
rules: {}, |
|
modelItem: {}, |
|
modelId: "", |
|
page: 0, |
|
pageSize: 5, |
|
NPC: NpcConfigCategory.filter((r: {Type: number;}) => r.Type == 4), |
|
}); |
|
|
|
onMounted(() => { |
|
getDBModel(); |
|
}); |
|
var getDBModel = () => { |
|
gameGMGetModel({mType: 0}).then((res) => { |
|
console.log("gameGMGetModel: ", res); |
|
state.stallDbs = res.data.model; |
|
listStall(MODEL_TYPE.buy); |
|
}).finally(() => { |
|
}); |
|
}; |
|
var listStall = (type: number) => { |
|
if(state.stallDbs){ |
|
state.stallDbs.sort((a, b) => { |
|
return a.StallId < b.StallId ? -1:1; |
|
}); |
|
} |
|
if(!type){ |
|
return |
|
} |
|
state.listModelVisible = true; |
|
state.modelType = type; |
|
if(state.stallDbs){ |
|
state.stalls = state.stallDbs.filter(r => r.Type == type); |
|
state.stallTotal = state.stalls.length; |
|
state.stalls = state.stalls.slice(state.page * state.pageSize, (state.page + 1) * state.pageSize); |
|
let id = 0; |
|
for(let i in state.stallDbs){ |
|
if(state.stallDbs[i].StallId > id){ |
|
id = state.stallDbs[i].StallId; |
|
} |
|
} |
|
state.model.stallId = id + 1; |
|
} |
|
console.log(state.stalls, state.page, (state.page + 1) * state.pageSize); |
|
}; |
|
var makeStall = (type: number, id: string) => { |
|
state.editModelVisible = true; |
|
state.modelType = type; |
|
state.model = { |
|
stallId: 1, |
|
scale: -1, |
|
village: -1, |
|
structure: -1, |
|
}; |
|
if(!id){ |
|
return; |
|
} |
|
let model = state.stallDbs.find(r => r.StringId == id); |
|
if(model){ |
|
describeModel(model); |
|
} |
|
}; |
|
var getModel = () => { |
|
if(state.modelId){ |
|
state.stalls = state.stallDbs.filter(r => r.StallId == state.modelId && r.Type == state.modelType); |
|
state.stallTotal = state.stalls.length; |
|
return; |
|
} |
|
state.stalls = state.stallDbs.filter(r => r.Type == state.modelType); |
|
state.stallTotal = state.stalls.length; |
|
}; |
|
var delModel = (id: number, stallId: number) => { |
|
ElMessageBox.alert('是否确认删除该配置?', '提示', { |
|
confirmButtonText: 'OK', |
|
cancelButtonText: 'Cancel', |
|
callback: (action: Action) => { |
|
if (action == "confirm"){ |
|
gameGMDelModel({id: id, stallId: stallId}).then(() => { |
|
gameGMGetModel({mType: 0}).then((res) => { |
|
console.log("gameGMGetModel: ", res); |
|
state.stallDbs = res.data.model; |
|
listStall(state.modelType); |
|
}).finally(() => { |
|
}); |
|
ElMessage({ |
|
type: 'success', |
|
message: `删除成功`, |
|
}) |
|
}).finally(() => { |
|
}); |
|
} |
|
} |
|
}) |
|
}; |
|
var saveModel = () => { |
|
const loading = ElLoading.service({ |
|
lock: true, |
|
text: 'Loading', |
|
background: 'rgba(0, 0, 0, 0.7)', |
|
}); |
|
state.check = true; |
|
let model = dbModel(); |
|
if(!model.Items || !model.Introduce || !model.Num || !model.Remark || (!model.Renown && model.Renown != 0) |
|
|| !model.StallId || !model.ScaleId || !model.StructureId || !model.VillageId || !model.Type){ |
|
ElMessage.error("保存失败,请检查表单是否填写完整"); |
|
loading.close(); |
|
return; |
|
} |
|
for(let i in model.Items){ |
|
let item = model.Items[i]; |
|
if(!item.CurrencyType || (!item.Discount && item.Discount != 0) || (!item.DiscountProb && item.DiscountProb != 0) |
|
|| !item.ItemId || !item.ItemNums || !item.Price || !item.Weight || !item.Weight || item.ItemNums.length < 2){ |
|
ElMessage.error("保存失败,请检查表单是否填写完整"); |
|
loading.close(); |
|
return; |
|
} |
|
} |
|
state.editModelVisible = false; |
|
if(state.model._id){ |
|
gameGMUpdateModel({model: model}).then(() => { |
|
let index = state.stallDbs.findIndex(r => r._id == model._id); |
|
state.stallDbs.splice(index, 1, model); |
|
model.StringId = state.model._id; |
|
console.log(model, index); |
|
state.check = false; |
|
state.model = { |
|
stallId: 1, |
|
scale: -1, |
|
village: -1, |
|
structure: -1, |
|
}; |
|
listStall(state.modelType); |
|
ElMessage({ |
|
type: 'success', |
|
message: `更新成功`, |
|
}); |
|
}).finally(() => { |
|
loading.close(); |
|
}) |
|
}else{ |
|
gameGMInsertModel({model: model}).then(() => { |
|
gameGMGetModel({mType: 0}).then((res) => { |
|
console.log("gameGMGetModel: ", res); |
|
state.stallDbs = res.data.model; |
|
state.check = false; |
|
state.model = { |
|
stallId: 1, |
|
scale: -1, |
|
village: -1, |
|
structure: -1, |
|
}; |
|
listStall(state.modelType); |
|
ElMessage({ |
|
type: 'success', |
|
message: `添加成功`, |
|
}); |
|
}) |
|
}).finally(() => { |
|
loading.close(); |
|
}); |
|
} |
|
}; |
|
var dbModel = () => { |
|
let items = []; |
|
for(let i in state.model.items){ |
|
let item = state.model.items[i]; |
|
if(item){ |
|
items.push({ |
|
ItemId: Number(item.id), |
|
ItemNums: [Number(item.numRangeMin), Number(item.numRangeMax)], |
|
CurrencyType: Number(item.currencyType), |
|
Weight: Number(item.weight), |
|
Price: Number(item.price), |
|
Discount: Number(item.discount), |
|
DiscountProb: Number(item.discountProb) |
|
}) |
|
} |
|
} |
|
let model = { |
|
_id: state.model._id, |
|
StallId: Number(state.model.stallId), |
|
NPCId: Number(state.model.NPCId), |
|
VillageId: Number(state.model.village), |
|
Renown: Number(state.model.renown), |
|
StructureId: Number(state.model.structure), |
|
ScaleId: Number(state.model.scale), |
|
Num: Number(state.model.num), |
|
Items: items, |
|
Introduce: state.model.introduce, |
|
Remark: state.model.remark, |
|
Type: state.modelType |
|
}; |
|
|
|
return model |
|
}; |
|
var describeModel = (stall: any) => { |
|
state.modelType = stall.Type; |
|
state.model = { |
|
_id: stall.StringId, |
|
items: [], |
|
stallId: stall.StallId, |
|
NPCId: stall.NPCId, |
|
scale: stall.ScaleId || -1, |
|
village: stall.VillageId || -1, |
|
structure: stall.StructureId || -1, |
|
renown: stall.Renown, |
|
num: stall.Num, |
|
introduce: stall.Introduce, |
|
remark: stall.Remark, |
|
mType: stall.Type |
|
}; |
|
for(let i in stall.Items){ |
|
let item = stall.Items[i]; |
|
if(item){ |
|
state.model.items.push({ |
|
id: item.ItemId, |
|
numRangeMin: item.ItemNums[0], |
|
numRangeMax: item.ItemNums[1], |
|
currencyType: item.CurrencyType, |
|
weight: item.Weight, |
|
price: item.Price, |
|
discount: item.Discount, |
|
discountProb: item.DiscountProb |
|
}) |
|
} |
|
} |
|
}; |
|
var delModelItem = (index: number) => { |
|
state.model.items.splice(index, 1); |
|
}; |
|
var onQuickFillingModelItem = () => { |
|
for(let i = 1; i < state.model.items.length; i++){ |
|
state.model.items[i].id = state.model.items[0].id; |
|
state.model.items[i].currencyType = state.model.items[0].currencyType; |
|
state.model.items[i].numRangeMin = state.model.items[0].numRangeMin; |
|
state.model.items[i].numRangeMax = state.model.items[0].numRangeMax; |
|
state.model.items[i].weight = state.model.items[0].weight; |
|
state.model.items[i].price = state.model.items[0].price; |
|
state.model.items[i].discount = state.model.items[0].discount; |
|
state.model.items[i].discountProb = state.model.items[0].discountProb; |
|
} |
|
}; |
|
var onCopyModelItem = (modelItem: any) => { |
|
state.modelItem = modelItem; |
|
console.log("onCopyModelItem", state.modelItem); |
|
}; |
|
var onPasteModelItem = (index: number) => { |
|
if(!state.modelItem){ |
|
console.log("onPasteModelItem", state.modelItem); |
|
return; |
|
} |
|
state.model.items[index].id = state.modelItem.id; |
|
state.model.items[index].currencyType = state.modelItem.currencyType; |
|
state.model.items[index].numRangeMin = state.modelItem.numRangeMin; |
|
state.model.items[index].numRangeMax = state.modelItem.numRangeMax; |
|
state.model.items[index].weight = state.modelItem.weight; |
|
state.model.items[index].price = state.modelItem.price; |
|
state.model.items[index].discount = state.modelItem.discount; |
|
state.model.items[index].discountProb = state.modelItem.discountProb; |
|
}; |
|
var addModelItem = () => { |
|
if(!state.model.items){ |
|
state.model.items = []; |
|
} |
|
state.model.items.push({}); |
|
}; |
|
const handleCurrentChange = () => { |
|
console.log(`current page: ${state.page}`); |
|
state.page = state.page - 1; |
|
listStall(state.modelType); |
|
}; |
|
const destroyListData = () => { |
|
state.page = 0; |
|
state.modelType = 0; |
|
state.modelId = ""; |
|
state.stalls = []; |
|
state.stallTotal = 0; |
|
}; |
|
const destroyEditData = () => { |
|
state.model = {}; |
|
state.editModelVisible = false; |
|
}; |
|
const onTableRowClassName = ({row, rowIndex}) => { |
|
console.log("onTableRowClassName", row, rowIndex); |
|
if(row.Day % 2 == 0 || row.day % 2 == 0){ |
|
return 'warning-row'; |
|
}else{ |
|
return ''; |
|
} |
|
}; |
|
return { |
|
menuRef, |
|
formRef, |
|
listStall, |
|
getModel, |
|
makeStall, |
|
saveModel, |
|
delModelItem, |
|
onQuickFillingModelItem, |
|
onCopyModelItem, |
|
onPasteModelItem, |
|
addModelItem, |
|
delModel, |
|
getDBModel, |
|
handleCurrentChange, |
|
destroyListData, |
|
destroyEditData, |
|
onTableRowClassName, |
|
...toRefs(state), |
|
}; |
|
}, |
|
}); |
|
</script> |
|
|
|
<style scoped lang="scss"> |
|
.el-table { |
|
--el-table-border-color: var(--el-border-color-lighter); |
|
--el-table-border: 0px solid var(--el-table-border-color); |
|
} |
|
|
|
.el-table .el-table__cell { |
|
padding: 1px 0; |
|
min-width: 0; |
|
box-sizing: border-box; |
|
text-overflow: ellipsis; |
|
vertical-align: middle; |
|
position: relative; |
|
text-align: left; |
|
z-index: 1; |
|
} |
|
|
|
.el-input .el-input__inner { |
|
height: 25px; |
|
line-height: 25px; |
|
padding: 0; |
|
} |
|
|
|
.system-edit-post-container { |
|
.menu-data-tree { |
|
border: var(--el-input-border, var(--el-border-base)); |
|
border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); |
|
padding: 5px; |
|
} |
|
} |
|
|
|
.editable-cell__input { |
|
display: inline; |
|
width: 10%; |
|
|
|
.el-input__inner { |
|
padding: 0 8px; |
|
font-size: 12px; |
|
} |
|
} |
|
|
|
.left-block { |
|
margin-left: -20px; |
|
} |
|
|
|
.table-num-left { |
|
margin-left: -80px; |
|
} |
|
|
|
.num-left { |
|
margin-left: -30px; |
|
} |
|
|
|
.table-item { |
|
margin-top: 10px; |
|
margin-bottom: -10px; |
|
} |
|
|
|
.title-label-block { |
|
margin-left: -20px; |
|
} |
|
|
|
.label-block { |
|
padding-left: 10px; |
|
} |
|
|
|
.box-card .el-card__header { |
|
background-color: #409EFF; |
|
color: #fff; |
|
} |
|
|
|
.change-icon { |
|
font-size: 20px; |
|
} |
|
|
|
::v-deep .warning-row { |
|
background: #ffffd5; |
|
} |
|
|
|
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td { |
|
background: #ffffd5; |
|
} |
|
|
|
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { |
|
background-color: inherit; |
|
} |
|
</style>
|
|
|