Browse Source

智能电表+市场部管理

master
songguoqiang 11 months ago
parent
commit
7d62345322
  1. 57
      src/api/basedata/marketplaceData/index.ts
  2. 231
      src/views/basedata/marketplaceData/index.vue
  3. 131
      src/views/basedata/marketplaceData/marketplaceData.data.ts
  4. 2
      src/views/lab/platscale/index.vue
  5. 259
      src/views/lab/platscaledata/index.vue
  6. 341
      src/views/lab/platscaledata/platscale.data.ts
  7. 5
      src/views/tjanalysis/electricdatatotal/index.vue

57
src/api/basedata/marketplaceData/index.ts

@ -0,0 +1,57 @@
import request from '@/config/axios'
export interface MarketplaceDataVO {
id: number
type: string
name: string
describes: string
price: number
amountIncrease: string
field1: string
field2: string
field3: string
field4: string
available: string
concurrencyStamp: number
}
// 查询市场数据管理列表
export const getMarketplaceDataPage = async (params) => {
if (params.isSearch) {
delete params.isSearch
const data = {...params}
return await request.post({ url: '/basic/marketplace-data/senior', data })
} else {
return await request.get({ url: `/basic/marketplace-data/page`, params })
}
}
// 查询市场数据管理详情
export const getMarketplaceData = async (id: number) => {
return await request.get({ url: `/basic/marketplace-data/get?id=` + id })
}
// 新增市场数据管理
export const createMarketplaceData = async (data: MarketplaceDataVO) => {
return await request.post({ url: `/basic/marketplace-data/create`, data })
}
// 修改市场数据管理
export const updateMarketplaceData = async (data: MarketplaceDataVO) => {
return await request.put({ url: `/basic/marketplace-data/update`, data })
}
// 删除市场数据管理
export const deleteMarketplaceData = async (id: number) => {
return await request.delete({ url: `/basic/marketplace-data/delete?id=` + id })
}
// 导出市场数据管理 Excel
export const exportMarketplaceData = async (params) => {
return await request.download({ url: `/basic/marketplace-data/export-excel`, params })
}
// 下载导入模板
export const importTemplate = () => {
return request.download({ url: '/basic/marketplace-data/get-import-template' })
}

231
src/views/basedata/marketplaceData/index.vue

@ -0,0 +1,231 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<Search :schema="MarketplaceData.allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
</ContentWrap>
<!-- 列表头部 -->
<TableHead
:HeadButttondata="HeadButttondata"
@button-base-click="buttonBaseClick"
:routeName="routeName"
@updataTableColumns="updataTableColumns"
@searchFormClick="searchFormClick"
:allSchemas="MarketplaceData.allSchemas"
/>
<!-- 列表 -->
<ContentWrap>
<Table
:columns="tableColumns"
:data="tableObject.tableList"
:loading="tableObject.loading"
:pagination="{
total: tableObject.total
}"
v-model:pageSize="tableObject.pageSize"
v-model:currentPage="tableObject.currentPage"
v-model:sort="tableObject.sort"
>
<template #code="{row}">
<el-button type="primary" link @click="openDetail(row, '代码', row.code)">
<span>{{ row.code }}</span>
</el-button>
</template>
<template #action="{ row }">
<ButtonBase :Butttondata="butttondata" @button-base-click="buttonTableClick($event,row)" />
</template>
</Table>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<BasicForm
ref="basicFormRef"
@success="getList"
:rules="MarketplaceDataRules"
:formAllSchemas="MarketplaceData.allSchemas"
:searchTableParams="searchTableParams"
:apiUpdate="MarketplaceDataApi.updateMarketplaceData"
:apiCreate="MarketplaceDataApi.createMarketplaceData"
@searchTableSuccess="searchTableSuccess"
:isBusiness="false"
/>
<!-- 详情 -->
<!-- <Detail ref="detailRef" :isBasic="true" :allSchemas="MarketplaceData.allSchemas" /> -->
<!-- 导入 -->
<ImportForm ref="importFormRef" url="/basic/marketplace-data/import" :importTemplateData="importTemplateData" @success="importSuccess" />
</template>
<script setup lang="ts">
import download from '@/utils/download'
import { MarketplaceData,MarketplaceDataRules } from './marketplaceData.data'
import * as MarketplaceDataApi from '@/api/basedata/marketplaceData'
import * as defaultButtons from '@/utils/disposition/defaultButtons'
// import TableHead from '@/components/TableHead/src/TableHead.vue'
// import ImportForm from '@/components/ImportForm/src/ImportForm.vue'
// import Detail from '@/components/Detail/src/Detail.vue'
defineOptions({ name: 'marketplace' })
const message = useMessage() //
const { t } = useI18n() //
const route = useRoute() //
const routeName = ref()
routeName.value = route.name
const tableColumns = ref(MarketplaceData.allSchemas.tableColumns)
//
const updataTableColumns = (val) => {
tableColumns.value = val
}
//
const searchTableParams = ref([
//{
// formField: 'productItemCode',
// searchTableTitle: '',
// searchTableAllSchemas: Itembasic.allSchemas,
// searchTablePage: ItembasicApi.getItembasicPage
//}
])
const { tableObject, tableMethods } = useTable({
getListApi: MarketplaceDataApi.getMarketplaceDataPage //
})
//
const { getList, setSearchParams } = tableMethods
//
const HeadButttondata = [
defaultButtons.defaultAddBtn(null), //
// defaultButtons.defaultImportBtn({hasPermi:'wms:marketplaceData:import'}), //
// defaultButtons.defaultExportBtn({hasPermi:'wms:marketplaceData:export'}), //
defaultButtons.defaultFreshBtn(null), //
// defaultButtons.defaultFilterBtn(null), //
defaultButtons.defaultSetBtn(null), //
// {
// label: '',
// name: 'zdy',
// hide: false,
// type: 'primary',
// icon: 'Select',
// color: ''
// },
]
//
const buttonBaseClick = (val, item) => {
if (val == 'add') { //
openForm('create')
} else if (val == 'import') { //
handleImport()
} else if (val == 'export') { //
handleExport()
} else if (val == 'refresh') { //
getList()
} else if (val == 'filtrate') { //
} else { //
console.log('其他按钮', item)
}
}
// -
const butttondata = [
defaultButtons.mainListEditBtn(null), //
defaultButtons.mainListDeleteBtn(null), //
]
// -
const buttonTableClick = async (val, row) => {
if (val == 'edit') { //
openForm('update', row)
} else if (val == 'delete') { //
handleDelete(row.id)
}
}
/** 添加/修改操作 */
const basicFormRef = ref()
const openForm = (type: string, row?: any) => {
basicFormRef.value.open(type, row)
}
//
const searchTableSuccess = (formField, searchField, val, formRef) => {
nextTick(() => {
const setV = {}
setV[formField] = val[0][searchField]
formRef.setValues(setV)
})
}
/** 详情操作 */
const detailRef = ref()
const openDetail = (row: any, titleName: any, titleValue: any) => {
detailRef.value.openDetail(row, titleName, titleValue, 'basicMarketplaceData')
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await MarketplaceDataApi.deleteMarketplaceData(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const exportLoading = ref(false) //
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await MarketplaceDataApi.exportMarketplaceData(setSearchParams)
download.excel(data, '市场数据管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 导入 */
const importFormRef = ref()
const handleImport = () => {
importFormRef.value.open()
}
//
const importTemplateData = reactive({
templateUrl: '',
templateTitle: '市场数据管理导入模版.xls'
})
//
const importSuccess = () => {
getList()
}
//
const searchFormClick = (searchData) => {
tableObject.params = {
isSearch: true,
filters: searchData.filters
}
getList() //
}
/** 初始化 **/
onMounted(async () => {
getList()
importTemplateData.templateUrl = await MarketplaceDataApi.importTemplate()
})
</script>

131
src/views/basedata/marketplaceData/marketplaceData.data.ts

@ -0,0 +1,131 @@
import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
import { dateFormatter } from '@/utils/formatTime'
// 表单校验
export const MarketplaceDataRules = reactive({
available: [required],
concurrencyStamp: [required],
})
export const MarketplaceData = useCrudSchemas(reactive<CrudSchema[]>([
{
label: 'id',
field: 'id',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '品种',
field: 'type',
sort: 'custom',
form: {
component: 'Select'
},
isTable: false,
isForm: false,
},
{
label: '品种名称',
field: 'name',
sort: 'custom',
isSearch: true,
},
{
label: '描述',
field: 'describes',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '价格',
field: 'price',
sort: 'custom',
form:{
component:'InputNumber',
componentProps: {
min: 0,
precision: 4
}
}
},
{
label: '涨幅情况',
field: 'amountIncrease',
sort: 'custom',
},
{
label: '预留字段1',
field: 'field1',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '预留字段2',
field: 'field2',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '预留字段3',
field: 'field3',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '预留字段4',
field: 'field4',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '创建时间',
field: 'createTime',
sort: 'custom',
formatter: dateFormatter,
isSearch: true,
search: {
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD HH:mm:ss',
type: 'daterange',
defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')]
}
},
isForm: false,
},
{
label: '是否可用',
field: 'available',
sort: 'custom',
isTable: false,
isForm: false,
},
{
label: '并发乐观锁',
field: 'concurrencyStamp',
sort: 'custom',
form: {
component: 'InputNumber',
value: 0
},
isTable: false,
isForm: false,
},
{
label: '操作',
field: 'action',
isForm: false,
table: {
width: 150,
fixed: 'right'
}
}
]))

2
src/views/lab/platscale/index.vue

@ -113,7 +113,7 @@ const { getList, setSearchParams } = tableMethods
// //
const HeadButttondata = [ const HeadButttondata = [
defaultButtons.defaultAddBtn(null), // defaultButtons.defaultAddBtn(null), //
defaultButtons.defaultSyncDataBtn(null), // // defaultButtons.defaultSyncDataBtn(null), //
defaultButtons.defaultFreshBtn(null), // defaultButtons.defaultFreshBtn(null), //
defaultButtons.defaultSetBtn(null), // defaultButtons.defaultSetBtn(null), //
// { // {

259
src/views/lab/platscaledata/index.vue

@ -0,0 +1,259 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<Search :schema="Platscale.allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
</ContentWrap>
<!-- 列表头部 -->
<TableHead
:HeadButttondata="HeadButttondata"
@button-base-click="buttonBaseClick"
:routeName="routeName"
@updataTableColumns="updataTableColumns"
@searchFormClick="searchFormClick"
:allSchemas="Platscale.allSchemas"
/>
<!-- 列表 -->
<ContentWrap>
<Table
:columns="tableColumns"
:data="tableObject.tableList"
:loading="tableObject.loading"
:pagination="{
total: tableObject.total
}"
v-model:pageSize="tableObject.pageSize"
v-model:currentPage="tableObject.currentPage"
v-model:sort="tableObject.sort"
>
<template #code="{row}">
<el-button type="primary" link @click="openDetail(row, '代码', row.code)">
<span>{{ row.code }}</span>
</el-button>
</template>
<template #action="{ row }">
<!-- <el-button type="text" @click="auditStatus(row)">确认</el-button> -->
<ButtonBase :Butttondata="butttondata" @button-base-click="buttonTableClick($event,row)" />
</template>
</Table>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<BasicForm
ref="basicFormRef"
@success="getList"
:rules="PlatscaleRules"
:formAllSchemas="Platscale.allSchemas"
:searchTableParams="searchTableParams"
:apiUpdate="PlatscaleApi.updatePlatscale"
:apiCreate="PlatscaleApi.createPlatscale"
@searchTableSuccess="searchTableSuccess"
:isBusiness="false"
/>
<el-dialog title="请选择同步日期" v-model="syncData.dialogVisible" width="20%">
<div class="block">
<!-- <span class="demonstration">默认</span> -->
<el-date-picker
v-model="syncData.busDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择同步日期" style="width:100%" />
</div>
<br />
<span class="dialog-footer">
<el-button @click="syncData.dialogVisible = false"> </el-button>
<el-button type="primary" @click="toSyncData"> </el-button>
</span>
</el-dialog>
</template>
<script setup lang="ts">
import download from '@/utils/download'
import { Platscale,PlatscaleRules } from './platscale.data'
import * as PlatscaleApi from '@/api/lab/platscale'
import * as AsyncdataApi from '@/api/lab/asyncdata'
import * as defaultButtons from '@/utils/disposition/defaultButtons'
defineOptions({ name: 'platscaledata' })
const message = useMessage() //
const { t } = useI18n() //
const route = useRoute() //
const routeName = ref()
routeName.value = route.name
const tableColumns = ref(Platscale.allSchemas.tableColumns)
const syncData = reactive({dialogVisible: false , busDate: ''})
//
const updataTableColumns = (val) => {
tableColumns.value = val
}
//
const searchTableParams = ref([
//{
// formField: 'productItemCode',
// searchTableTitle: '',
// searchTableAllSchemas: Itembasic.allSchemas,
// searchTablePage: ItembasicApi.getItembasicPage
//}
])
const { tableObject, tableMethods } = useTable({
getListApi: PlatscaleApi.getPlatscalePage //
})
//
const { getList, setSearchParams } = tableMethods
//
const HeadButttondata = [
// defaultButtons.defaultAddBtn(null), //
// defaultButtons.defaultSyncDataBtn(null), //
defaultButtons.defaultFreshBtn(null), //
defaultButtons.defaultSetBtn(null), //
// {
// label: '',
// name: 'zdy',
// hide: false,
// type: 'primary',
// icon: 'Select',
// color: ''
// },
]
//
const buttonBaseClick = (val, item) => {
if (val == 'add') { //
openForm('create')
} else if (val == 'import') { //
handleImport()
} else if (val == 'export') { //
handleExport()
} else if (val == 'refresh') { //
getList()
} else if (val == 'syncData') { //
syncData.dialogVisible = true
} else { //
console.log('其他按钮', item)
}
}
function toSyncData () {
syncData.dialogVisible = false
AsyncdataApi.asyncLabData({busType: '1' , busDate: syncData.busDate}).then((data) => {
if (data) {
message.success('操作成功')
getList()
} else {
message.warning('正在执行同步操作, 5分钟之内不要重复执行 , 请等待......')
}
})
}
// -
const butttondata = [
// defaultButtons.mainListEditBtn(null), //
// defaultButtons.mainListDeleteBtn(null), //
]
// -
const buttonTableClick = async (val, row) => {
if (val == 'edit') { //
openForm('update', row)
} else if (val == 'delete') { //
handleDelete(row.id)
}
}
//
const auditStatus = async (row) => {
let data = {id: row.id , auditStatus: '1'}
//
await message.confirm('确认?')
//
await PlatscaleApi.updatePlatscale(data)
message.success('操作成功')
//
await getList()
}
/** 添加/修改操作 */
const basicFormRef = ref()
const openForm = (type: string, row?: any) => {
basicFormRef.value.open(type, row)
}
//
const searchTableSuccess = (formField, searchField, val, formRef) => {
nextTick(() => {
const setV = {}
setV[formField] = val[0][searchField]
formRef.setValues(setV)
})
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await PlatscaleApi.deletePlatscale(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const exportLoading = ref(false) //
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PlatscaleApi.exportPlatscale(setSearchParams)
download.excel(data, '实验室-地衡.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 导入 */
const importFormRef = ref()
const handleImport = () => {
importFormRef.value.open()
}
//
const importTemplateData = reactive({
templateUrl: '',
templateTitle: '实验室-地衡导入模版.xls'
})
//
const importSuccess = () => {
getList()
}
//
const searchFormClick = (searchData) => {
tableObject.params = {
isSearch: true,
filters: searchData.filters
}
getList() //
}
/** 初始化 **/
onMounted(async () => {
getList()
// importTemplateData.templateUrl = await PlatscaleApi.importTemplate()
})
</script>

341
src/views/lab/platscaledata/platscale.data.ts

@ -0,0 +1,341 @@
import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
import { dateFormatter , dateFormatter2 } from '@/utils/formatTime'
// 表单校验
export const PlatscaleRules = reactive({
})
export const Platscale = useCrudSchemas(reactive<CrudSchema[]>([
// {
// label: '主键、自增',
// field: 'id',
// sort: 'custom',
// isForm: false,
// },
// {
// label: '批号',
// field: 'batchNo',
// sort: 'custom',
// isSearch: true,
// table: {
// width: 150
// }
// },
// {
// label: '送样单位',
// field: 'sydw',
// sort: 'custom',
// isSearch: false,
// table: {
// width: 150
// }
// },
// {
// label: '标准',
// field: 'standard',
// sort: 'custom',
// isSearch: false,
// table: {
// width: 150
// }
// },
// {
// label: '材质',
// field: 'cz',
// sort: 'custom',
// isSearch: false,
// table: {
// width: 150
// }
// },
// {
// label: '规格',
// field: 'guig',
// sort: 'custom',
// isSearch: false,
// table: {
// width: 150
// }
// },
// {
// label: '实验人',
// field: 'testUser',
// sort: 'custom',
// isSearch: true,
// table: {
// width: 150
// },
// dictType: DICT_TYPE.LAB_USER_TEST_TYPE,
// dictClass: 'number'
// },
{
label: '车号',
field: 'ch',
sort: 'custom',
isSearch: true,
table: {
width: 150
}
},
{
label: '车型',
field: 'cx',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '品种',
field: 'pz',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '供货单位',
field: 'ghdw',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '运输单位',
field: 'ysdw',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '出入库',
field: 'crk',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '毛重',
field: 'mz',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '皮重',
field: 'pzh',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '净重',
field: 'jz',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '检斤员',
field: 'jjy',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '日期',
field: 'rq',
sort: 'custom',
isSearch: false,
formatter: dateFormatter2,
form: {
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD',
type: 'date'
}
},
table: {
width: 200
}
},
{
label: '一次计量时间',
field: 'jlsjOne',
sort: 'custom',
isSearch: false,
form: {
component: 'TimePicker',
componentProps: {
valueFormat: 'HH:mm:ss',
type: 'time'
}
},
table: {
width: 200
}
},
{
label: '二次计量时间',
field: 'jlsjTwo',
sort: 'custom',
isSearch: false,
form: {
component: 'TimePicker',
componentProps: {
valueFormat: 'HH:mm:ss',
type: 'time'
}
},
table: {
width: 200
}
},
{
label: '编号',
field: 'bh',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '送货单位',
field: 'shdw',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '性质',
field: 'xz',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '防伪码',
field: 'fwm',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '抽样时间',
field: 'cysj',
sort: 'custom',
isSearch: false,
table: {
width: 200
}
},
{
label: '抽样编号',
field: 'cybh',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '抽样结果',
field: 'cyjg',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '报告单编号',
field: 'bgdbh',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '是否抽检',
field: 'sfcj',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
{
label: '数据源',
field: 'dataSource',
sort: 'custom',
isSearch: false,
table: {
width: 150
}
},
// {
// label: '审核状态',
// field: 'auditStatus',
// sort: 'custom',
// isSearch: true,
// table: {
// width: 120,
// fixed: 'right'
// },
// dictType: DICT_TYPE.LAB_AUDIT_STATUS,
// dictClass: 'number'
// },
{
label: '采集时间',
field: 'createTime',
sort: 'custom',
formatter: dateFormatter,
isSearch: true,
search: {
component: 'DatePicker',
componentProps: {
valueFormat: 'YYYY-MM-DD HH:mm:ss',
type: 'daterange',
defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')]
}
},
isForm: false,
table: {
width: 200,
fixed: 'right'
}
},
// {
// label: '操作',
// field: 'action',
// isForm: false,
// table: {
// width: 180,
// fixed: 'right'
// }
// }
]))

5
src/views/tjanalysis/electricdatatotal/index.vue

@ -23,8 +23,7 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table <el-table
v-loading="loading" :data="dataList.dList" border="true" v-loading="loading" :data="dataList.dList" border="true" highlight-current-row="true">
highlight-current-row="true">
<el-table-column label="线路名称(智能电表)" prop="mname" align="center" :show-overflow-tooltip="true" /> <el-table-column label="线路名称(智能电表)" prop="mname" align="center" :show-overflow-tooltip="true" />
<el-table-column label="总" prop="idescTotal" align="center" :show-overflow-tooltip="true" /> <el-table-column label="总" prop="idescTotal" align="center" :show-overflow-tooltip="true" />
<el-table-column label="峰" prop="idescF" align="center" :show-overflow-tooltip="true" /> <el-table-column label="峰" prop="idescF" align="center" :show-overflow-tooltip="true" />
@ -33,6 +32,8 @@
<el-table-column label="谷值比例" prop="idescGt" align="center" :show-overflow-tooltip="true" /> <el-table-column label="谷值比例" prop="idescGt" align="center" :show-overflow-tooltip="true" />
<el-table-column label="平" prop="idescP" align="center" :show-overflow-tooltip="true" /> <el-table-column label="平" prop="idescP" align="center" :show-overflow-tooltip="true" />
<el-table-column label="平值比例" prop="idescPt" align="center" :show-overflow-tooltip="true" /> <el-table-column label="平值比例" prop="idescPt" align="center" :show-overflow-tooltip="true" />
<el-table-column label="尖峰" prop="idescJ" align="center" :show-overflow-tooltip="true" />
<el-table-column label="平值比例" prop="idescJt" align="center" :show-overflow-tooltip="true" />
</el-table> </el-table>
</ContentWrap> </ContentWrap>

Loading…
Cancel
Save