调度任务处理和返工订单、计划页面问题修改

dev-scheduling
zhangdi 1 day ago
parent 71956a4937
commit 75865f417c
  1. 1
      src/api/productionManagement/WIPChange.js
  2. 9
      src/api/productionManagement/reworkOrder.js
  3. 25
      src/api/productionManagement/reworkPlan.js
  4. 10
      src/api/system/role.js
  5. 20
      src/views/productionManagement/WIPChange/components/assignDaialog.vue
  6. 8
      src/views/productionManagement/WIPChange/components/taskHandleDialog.vue
  7. 36
      src/views/productionManagement/WIPChange/components/taskHandleQuality.vue
  8. 1
      src/views/productionManagement/WIPChange/index.vue
  9. 2
      src/views/productionManagement/productionMonitoring/index.vue
  10. 245
      src/views/productionManagement/reworkOrder/components/reworkDetails.vue
  11. 64
      src/views/productionManagement/reworkOrder/index.vue
  12. 117
      src/views/productionManagement/reworkPlan/index.vue

@ -38,3 +38,4 @@ export const taskCompleteOrder = (data) => {
data data
}); });
}; };

@ -38,3 +38,12 @@ export const completeOrder = (params) => {
data: params, data: params,
}); });
}; };
// 质量任务处理 dispatchMan
export const taskCompleteOrder = (data) => {
return request({
url: '/blade-desk/disTasking/taskCompleteOrder',
method: 'post',
data
});
};

@ -0,0 +1,25 @@
import request from '@/axios';
// 返工计划列表数据 /ReworkProcess/loadReworkPlan
export const getList = (current, size, params) => {
return request({
url: '/blade-desk/ReworkProcess/loadReworkPlan',
method: 'get',
params: {
current,
size,
...params,
},
});
};
// 返工计划详情
export const getDetail = (params) => {
return request({
url: '/blade-desk/ReworkProcess/reviewFormMess',
method: 'get',
params: {
...params,
},
});
};

@ -94,3 +94,13 @@ export const getRoleAlias = () => {
params: {}, params: {},
}); });
}; };
// 按照角色别名查询数据
export const getUserByRoleAlias = (params) => {
return request({
url: '/blade-system/user/list-all-by-role-alias',
method: 'get',
params,
});
};

@ -3,7 +3,7 @@
<el-form ref="form" :model="formData" :rules="rules" label-width="80px" class="vd-form-row"> <el-form ref="form" :model="formData" :rules="rules" label-width="80px" class="vd-form-row">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="调度员" prop="disAssignMan"> <el-form-item label="调度员" prop="disAssignMan">
<el-select v-model="formData.disAssignMan" placeholder="请选择" clearable filterable> <el-select v-model="formData.disAssignMan" placeholder="请选择" clearable filterable>
<el-option <el-option
v-for="item in options" v-for="item in options"
@ -18,7 +18,7 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="处理意见" prop="resolution"> <el-form-item label="处理意见" prop="resolution" label-width="90px">
<el-input v-model="formData.resolution" type="textarea" /> <el-input v-model="formData.resolution" type="textarea" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -37,6 +37,8 @@
import { setDispatch, getRoleUserList } from '@/api/processManagement/taskDispatch'; import { setDispatch, getRoleUserList } from '@/api/processManagement/taskDispatch';
import { disTechnician } from '@/api/productionManagement/WIPChange.js'; import { disTechnician } from '@/api/productionManagement/WIPChange.js';
import { getUserByRoleAlias } from '@/api/system/role';
export default { export default {
props: { props: {
@ -55,7 +57,9 @@ export default {
openShow: false, openShow: false,
formData: { disAssignMan: null, resolution: null, ddtIdList: [] }, formData: { disAssignMan: null, resolution: null, ddtIdList: [] },
rules: { rules: {
disAssignMan: [{ required: true }], disAssignMan: [
{ required: true, message: '请选择调度员', trigger: ['change', 'submit'] }
],
}, },
options: [], options: [],
}; };
@ -66,8 +70,11 @@ export default {
}, },
methods: { methods: {
getRoleUserList() { getRoleUserList() {
getRoleUserList({ current: 1, size: 9999999 }).then(res => { // getRoleUserList({ current: 1, size: 9999999 }).then(res => {
this.options = res.data.data.records; // this.options = res.data.data.records;
// });
getUserByRoleAlias({roleAlias:'diaodu'}).then(res => {
this.options = res.data.data;
}); });
}, },
submit() { submit() {
@ -76,7 +83,8 @@ export default {
let query = { let query = {
ddtIdList: [this.rowItem.id], ddtIdList: [this.rowItem.id],
resolution: this.formData.resolution, resolution: this.formData.resolution,
disAssignMan: this.formData.disAssignMan, // disAssignMan: this.formData.disAssignMan,
dispatchMan: this.formData.disAssignMan,
}; };
disTechnician(query).then(res => { disTechnician(query).then(res => {
this.$message.success('操作成功'); this.$message.success('操作成功');

@ -9,14 +9,14 @@
> >
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="审理单号" prop="rsCode"> <el-form-item label="审理单号" prop="rsCode" label-width="90px">
<el-input v-model="formData.rsCode" type="text" /> <el-input v-model="formData.rsCode" type="text" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="处理意见" prop="handleResult"> <el-form-item label="处理意见" prop="handleResult" label-width="90px">
<el-input v-model="formData.handleResult" type="textarea" :rows="3" /> <el-input v-model="formData.handleResult" type="textarea" :rows="3" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -51,8 +51,8 @@ export default {
openShow: false, openShow: false,
formData: {}, formData: {},
rules: { rules: {
rsCode: [{ required: true }], rsCode: [{ required: true, message: '请输入审理单号', trigger: ['change', 'submit'] }],
handleResult: [{ required: true }], handleResult: [{ required: true, message: '请输入审理意见', trigger: ['change', 'submit'] }],
}, },
}; };
}, },

@ -6,27 +6,27 @@
width="30%" width="30%"
@close="closeDialog" @close="closeDialog"
> >
<el-form ref="form" v-model="formData" :rules="rules" label-width="80px" class="vd-form-row"> <el-form ref="form" :model="formData" :rules="rules">
<el-form-item label="订单是否继续" prop="rsCode" label-width="120px"> <el-form-item label="订单是否继续" prop="rsCode" label-width="120px">
<el-radio-group v-model="formData.rsCode"> <el-radio-group v-model="formData.rsCode">
<el-radio label="是" /> <el-radio label="是" value="是" />
<el-radio label="否" /> <el-radio label="否" value="否" />
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="处理意见" prop="handleResult"> <el-form-item label="处理意见" prop="handleResult" label-width="90px">
<el-input v-model="formData.handleResult" type="textarea" /> <el-input v-model="formData.handleResult" type="textarea" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="closeDialog"> </el-button> <el-button @click="closeDialog"> </el-button>
<el-button type="primary" @click="submit" :loading="saveLoading">确定</el-button> <el-button type="primary" @click="submitFn" :loading="saveLoading">确定</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import { getList, receiveOrder } from '@/api/productionManagement/reworkOrder'; import { getList, receiveOrder, taskCompleteOrder } from '@/api/productionManagement/reworkOrder';
import { taskComplete } from '@/api/productionManagement/WIPChange.js'; import { taskComplete } from '@/api/productionManagement/WIPChange.js';
export default { export default {
@ -44,10 +44,10 @@ export default {
return { return {
saveLoading: false, saveLoading: false,
openShow: false, openShow: false,
formData: { rsCode: null, handleResult: '' }, formData: { rsCode: '', handleResult: '' },
rules: { rules: {
rsCode: [{ required: true, message: '请选择', trigger: 'blur' }], rsCode: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }],
handleResult: [{ required: true, message: '请输入', trigger: 'blur' }], handleResult: [{ required: true, message: '请输入', trigger: ['change', 'submit'] }],
}, },
}; };
}, },
@ -59,9 +59,10 @@ export default {
this.openShow = false; this.openShow = false;
this.$emit('closeDialog'); this.$emit('closeDialog');
}, },
submit() { submitFn() {
this.$refs.form.validate(valid => { this.$refs.form.validate(valid => {
if (valid) { if (valid) {
this.saveLoading = true;
this.$confirm('请确认此操作', '提示', { this.$confirm('请确认此操作', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
@ -70,15 +71,26 @@ export default {
.then(() => { .then(() => {
this.rowItem.rsCode = this.rowItem.rsCode; this.rowItem.rsCode = this.rowItem.rsCode;
this.rowItem.handleResult = this.rowItem.handleResult; this.rowItem.handleResult = this.rowItem.handleResult;
receiveOrder(this.rowItem).then(res => { let query = {
ddtIdList: [this.rowItem.id], //ID
rsCode: this.rowItem.rsCode, //
handleResult: this.rowItem.handleResult, //
};
taskCompleteOrder(query)
.then(res => {
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
type: 'success', type: 'success',
}); });
this.saveLoading = false;
this.closeDialog(); this.closeDialog();
})
.catch(err => {
this.saveLoading = false;
}); });
}) })
.catch(err => { .catch(err => {
this.saveLoading = false;
this.$message.info(err.msg); this.$message.info(err.msg);
}); });
} }

@ -9,7 +9,6 @@
ref="crud" ref="crud"
@search-change="searchChange" @search-change="searchChange"
@search-reset="searchReset" @search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange" @current-change="currentChange"
@size-change="sizeChange" @size-change="sizeChange"
@refresh-change="refreshChange" @refresh-change="refreshChange"

@ -62,6 +62,8 @@
</template> </template>
</el-dropdown> </el-dropdown>
</template> </template>
</avue-crud> </avue-crud>
<!-- 打印标签 --> <!-- 打印标签 -->
<el-dialog append-to-body v-model="printDialog" title="打印标签" width="20%"> <el-dialog append-to-body v-model="printDialog" title="打印标签" width="20%">

@ -0,0 +1,245 @@
<template>
<el-dialog
title="详情"
append-to-body
:modelValue="openShow"
width="80%"
@close="closeDialog"
fullscreen
>
<avue-crud
:option="option"
:table-loading="loading"
:data="data"
v-model="form"
v-model:page="page"
ref="crud"
@search-change="searchChange"
@search-reset="searchReset"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad"
>
<template #menu-left> </template>
<template #menu-right> </template>
<template #menu="{ row }"> </template>
<template #heatTreat="scope"> </template>
</avue-crud>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { getDetail } from '@/api/productionManagement/reworkPlan';
export default {
props: {
showDialog: {
type: Boolean,
default: false,
},
rowItem: {
type: Object,
default: () => ({}),
},
},
data() {
return {
openShow: false,
form: {},
selectionList: [],
query: {},
loading: false,
page: {
pageSize: 10,
currentPage: 1,
total: 0,
},
option: {
columnSort: true,
tip: false,
height: 'auto',
calcHeight: 32,
simplePage: false,
searchShow: true,
searchMenuSpan: 6,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
index: true,
selection: false,
addBtn: false,
editBtn: false,
viewBtn: false,
delBtn: false,
editBtnText: '修改',
labelWidth: 120,
menuWidth: 80,
dialogWidth: 900,
dialogClickModal: false,
searchEnter: true,
excelBtn: false,
filterBtn: true,
searchShowBtn: false,
excelBtn: true,
showOverflowTooltip: true,
addBtnIcon: ' ',
viewBtnIcon: ' ',
delBtnIcon: ' ',
editBtnIcon: ' ',
gridBtn: false,
searchLabelPosition: 'left',
searchGutter: 24,
searchSpan: 6,
menuAlign: 'left',
gridBtn: false,
searchMenuPosition: 'right',
align: 'center',
menu: false,
header: false,
column: [
{
label: '审理单号',
prop: 'sheetNo',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '责任零件',
prop: 'p5layer1',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '责任批号',
prop: 'p5layer3',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '工序号',
prop: 'process',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '工序名字',
prop: 'processName',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '上级编号',
prop: 'precode',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '返修路线',
prop: 'reworkLine',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '发生单位',
prop: 'deptcode',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '责任部门',
prop: 'layer1',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '审理人',
prop: 'usercode',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '零件号',
prop: 'prtno',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '槽号槽名',
prop: 'lotno',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '备注',
prop: 'memo',
search: false,
sortable: true,
span: 12,
width: 150,
},
{
label: '处理意见',
prop: 'dispose',
search: false,
sortable: true,
span: 12,
width: 150,
},
],
},
data: [],
};
},
mounted() {
this.openShow = this.showDialog;
},
methods: {
init() {
let query = {
reworkCode: this.rowItem.redono,
queryType: true,
};
getDetail(query).then(res => {
this.data = res.data.data;
});
},
closeDialog() {
this.openShow = false;
this.$emit('closeDialog');
},
},
};
</script>
<style lang="scss" scoped></style>

@ -13,13 +13,24 @@
@current-change="currentChange" @current-change="currentChange"
@size-change="sizeChange" @size-change="sizeChange"
@refresh-change="refreshChange" @refresh-change="refreshChange"
@on-load="onLoad"
> >
<template #menu-left>
<el-input
v-model.trim="searchCode"
placeholder="请输入返修单号"
@keyup.enter.native="searchCodeFun"
/>
</template>
<template #menu="{ row }"> <template #menu="{ row }">
<!-- <el-button type="text">返工工艺</el-button> --> <!-- <el-button type="text">返工工艺</el-button> -->
<el-button type="text" @click="receiveData(row)" v-if="row.status == 0">接收</el-button> <el-button type="text" @click="receiveData(row)">接收</el-button>
<el-button type="text" @click="updateData(row)" v-if="row.status == 0">改数接收</el-button> <el-button type="text" @click="updateData(row)">改数接收</el-button>
<el-button type="text" @click="finishData(row)">完成</el-button> <el-button type="text" @click="finishData(row)" v-if="row.seqno === 1">完成</el-button>
</template>
<template #redono="scope">
<el-button type="text" @dblclick="detailsFn(scope.row)">
{{ scope.row.redono }}
</el-button>
</template> </template>
</avue-crud> </avue-crud>
<!-- 改数接收 --> <!-- 改数接收 -->
@ -30,15 +41,25 @@
@close="updateMakeQtyClose" @close="updateMakeQtyClose"
:itemData="itemData" :itemData="itemData"
></updateMakeQty> ></updateMakeQty>
<!-- 返工订单详情 -->
<reworkDetails
v-if="detailsShow"
:showDialog="detailsShow"
@closeDialog="closeDialog"
:rowItem="itemData"
></reworkDetails>
</basic-container> </basic-container>
</template> </template>
<script> <script>
import { getList, getReceiveOrder, completeOrder } from '@/api/productionManagement/reworkOrder'; import { getList, getReceiveOrder, completeOrder } from '@/api/productionManagement/reworkOrder';
import updateMakeQty from './components/updateMakeQty.vue'; import updateMakeQty from './components/updateMakeQty.vue';
import reworkDetails from './components/reworkDetails.vue';
export default { export default {
components: { updateMakeQty }, components: { updateMakeQty, reworkDetails },
data() { data() {
return { return {
searchCode: '', //
updateMakeQtyVisible: false, updateMakeQtyVisible: false,
itemData: {}, itemData: {},
page: { page: {
@ -48,6 +69,7 @@ export default {
}, },
data: [], data: [],
form: {}, form: {},
query:{},
option: { option: {
tip: false, tip: false,
height: 'auto', height: 'auto',
@ -74,7 +96,7 @@ export default {
editBtnIcon: ' ', editBtnIcon: ' ',
labelWidth: '200px', labelWidth: '200px',
dialogWidth: 600, dialogWidth: 600,
menuWidth:140, menuWidth: 160,
dialogClickModal: false, dialogClickModal: false,
searchEnter: true, searchEnter: true,
filterBtn: true, filterBtn: true,
@ -88,7 +110,6 @@ export default {
menuAlign: 'left', menuAlign: 'left',
gridBtn: false, gridBtn: false,
searchMenuPosition: 'right', searchMenuPosition: 'right',
menu:false,
column: [ column: [
{ {
label: '返工单号', label: '返工单号',
@ -241,9 +262,24 @@ export default {
}, },
mounted() {}, mounted() {},
methods: { methods: {
updateMakeQtyClose(){ searchCodeFun(val) {
if (!this.searchCode) return;
this.query.redono = this.searchCode;
this.searchCode = ''
this.onLoad(this.page, this.query);
},
//
detailsFn(row) {
this.detailsShow = true;
this.itemData = row;
},
updateMakeQtyClose() {
this.updateMakeQtyVisible = false; this.updateMakeQtyVisible = false;
this.onLoad(this.page,this.query) this.onLoad(this.page, this.query);
},
closeDialog() {
this.detailsShow = false;
this.onLoad(this.page, this.query);
}, },
updateData(row) { updateData(row) {
this.itemData = row; this.itemData = row;
@ -255,7 +291,7 @@ export default {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
}).then(() => { }).then(() => {
this.loading=true this.loading = true;
getReceiveOrder(row).then(res => { getReceiveOrder(row).then(res => {
this.$message({ this.$message({
message: '接收成功', message: '接收成功',
@ -271,7 +307,7 @@ export default {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
}).then(() => { }).then(() => {
this.loading=true this.loading = true;
completeOrder(row).then(() => { completeOrder(row).then(() => {
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
@ -283,11 +319,11 @@ export default {
}, },
currentChange(currentPage) { currentChange(currentPage) {
this.page.currentPage = currentPage; this.page.currentPage = currentPage;
this.onLoad(this.page, this.query); // this.onLoad(this.page, this.query);
}, },
sizeChange(pageSize) { sizeChange(pageSize) {
this.page.pageSize = pageSize; this.page.pageSize = pageSize;
this.onLoad(this.page, this.query); // this.onLoad(this.page, this.query);
}, },
refreshChange() { refreshChange() {
this.onLoad(this.page, this.query); this.onLoad(this.page, this.query);
@ -310,6 +346,8 @@ export default {
this.loading = false; this.loading = false;
this.page.total = res.data.data.total; this.page.total = res.data.data.total;
this.selectionClear(); this.selectionClear();
}).catch(() => {
this.loading = false;
}); });
}, },
}, },

@ -10,7 +10,6 @@
@row-del="rowDel" @row-del="rowDel"
@search-change="searchChange" @search-change="searchChange"
@search-reset="searchReset" @search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange" @current-change="currentChange"
@size-change="sizeChange" @size-change="sizeChange"
@refresh-change="refreshChange" @refresh-change="refreshChange"
@ -19,17 +18,32 @@
<template #menu-left> </template> <template #menu-left> </template>
<template #menu-right> </template> <template #menu-right> </template>
<template #menu="{ row }"> </template> <template #menu="{ row }"> </template>
<!-- <template #ppsName="scope">
<template #heatTreat="scope"> </template> <el-button type="text">
{{ scope.row.ppsName }}
</el-button>
</template> -->
<template #redono="scope">
<el-button type="text" @dblclick="detailsFn(scope.row)">
{{ scope.row.redono }}
</el-button>
</template>
</avue-crud> </avue-crud>
<!-- 返工订单详情 -->
<reworkDetails v-if="detailsShow" :showDialog="detailsShow" @closeDialog="closeDialog" :rowItem="rowItem"></reworkDetails>
</basic-container> </basic-container>
</template> </template>
<script> <script>
import { getList } from '@/api/productionManagement/reworkPlan.js';
import reworkDetails from '../reworkOrder/components/reworkDetails.vue';
export default { export default {
components: {}, components: {reworkDetails},
data() { data() {
return { return {
detailsShow:false,
rowItem:{},
form: {}, form: {},
selectionList: [], selectionList: [],
query: {}, query: {},
@ -80,17 +94,81 @@ export default {
gridBtn: false, gridBtn: false,
searchMenuPosition: 'right', searchMenuPosition: 'right',
align: 'center', align: 'center',
menu: false,
column: [ column: [
{ {
label: '配套人', label: '返工订单',
prop: 'partCode', prop: 'redono',
search: true,
sortable: true,
span: 12,
},
{
label: '发生单位',
prop: 'usedept',
search: false,
sortable: true,
span: 12,
},
{
label: '物料号',
prop: 'prtno',
search: true,
sortable: true,
span: 12,
},
{
label: '数量',
prop: 'amount',
search: false,
sortable: true,
span: 12,
},
{
label: '处理意见',
prop: 'detail',
search: false,
sortable: true,
span: 12,
},
{
label: '工艺路线',
prop: 'deptcode',
search: false,
sortable: true,
span: 12,
},
{
label: '备注',
prop: 'remark',
search: false,
sortable: true,
span: 12,
},
{
label: '需求日期',
prop: 'reqdate',
search: false,
sortable: true,
span: 12,
},
{
label: '批次号',
prop: 'splcode',
search: true,
sortable: true,
span: 12,
},
{
label: '生产标识',
prop: 'prtlotno',
search: false, search: false,
sortable: true, sortable: true,
span: 12, span: 12,
}, },
{ {
label: '配套时间', label: '生产标识',
prop: 'partName', prop: 'prtlotno',
search: false, search: false,
sortable: true, sortable: true,
span: 12, span: 12,
@ -102,6 +180,15 @@ export default {
}; };
}, },
methods: { methods: {
//
detailsFn(row){
this.detailsShow = true
this.rowItem = row
},
closeDialog(){
this.detailsShow = false
this.onLoad(this.page,this.query)
},
rowSave(row, done, loading) { rowSave(row, done, loading) {
// addPersonAbility(row).then( // addPersonAbility(row).then(
// () => { // () => {
@ -190,13 +277,15 @@ export default {
}, },
onLoad(page, params = {}) { onLoad(page, params = {}) {
// this.loading = true; this.loading = true;
// getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => { getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
// this.data = res.data.data.records; this.data = res.data.data.records;
// this.loading = false; this.loading = false;
// this.page.total = res.data.data.total; this.page.total = res.data.data.total;
// this.selectionClear(); // this.selectionClear();
// }); }).catch(() => {
this.loading = false;
});
}, },
}, },
mounted() {}, mounted() {},

Loading…
Cancel
Save