This commit is contained in:
2022-06-30 16:05:18 +08:00
12 changed files with 621 additions and 11 deletions

View File

@@ -464,12 +464,17 @@ public class AutoformulaServiceImpl implements AutoformulaService {
String is_need_move = bomdlt.getString("is_need_move");
String bomdtl_material_id = bomdlt.getString("material_id");
String bomdtl_material_code = bomdlt.getString("material_code");
String prior_level = bomdlt.getString("prior_level");
if (StrUtil.isEmpty(prior_level)) {
prior_level = "03";
}
if("1".equals(is_need_move)){
//查询库存
JSONArray bom_materials = WQL.getWO("QPF_AUTOFORMULA01")
.addParam("material_id",bomdtl_material_id)
.addParam("workorder_id",workorder_id)
.addParam("quality_scode","01")
.addParam("prior_level",prior_level)
.addParam("flag","22")
.process().getResultJSONArray(0);
if(bom_materials.size()==0){
@@ -1308,12 +1313,17 @@ public class AutoformulaServiceImpl implements AutoformulaService {
}
String is_need_move = bomdlt.getString("is_need_move");
String bomdtl_material_id = bomdlt.getString("material_id");
String prior_level = bomdlt.getString("prior_level");
if (StrUtil.isEmpty(prior_level)) {
prior_level = "03";
}
if(nedd_qty>0 && "1".equals(is_need_move)){
//查询库存
JSONArray bom_materials = WQL.getWO("QPF_AUTOFORMULA01")
.addParam("material_id",bomdtl_material_id)
.addParam("quality_scode","01")
.addParam("workorder_id",workorder_id)
.addParam("prior_level",prior_level)
.addParam("flag","22")
.process().getResultJSONArray(0);
if(bom_materials.size()==0){
@@ -2525,9 +2535,14 @@ public class AutoformulaServiceImpl implements AutoformulaService {
//获取Y1、X1、X2….剩余>0的物料
if(left_qty>0){
if(is_need_move.equals("1")){
String prior_level = bomdlt.getString("prior_level");
if (StrUtil.isEmpty(prior_level)) {
prior_level = "03";
}
JSONArray now_ivts = WQL.getWO("QPF_AUTOFORMULA01")
.addParam("material_id",bomdtl_material_id)
.addParam("quality_scode","01")
.addParam("prior_level",prior_level)
.addParam("workorder_id",workorder_id)
.addParam("flag","22")
.process().getResultJSONArray(0);
@@ -3426,11 +3441,16 @@ public class AutoformulaServiceImpl implements AutoformulaService {
String bomdtl_material_id = bomdlts_plan.getString("material_id");
double left_qty = bomdlts_plan.getDouble("formula_qty");
String is_need_move = bomdlts_plan.getString("is_need_move");
String prior_level = bomdlts_plan.getString("prior_level");
if (StrUtil.isEmpty(prior_level)) {
prior_level = "03";
}
if(is_need_move.equals("1")){
//二次分配新料库存
JSONArray now_ivts = WQL.getWO("QPF_AUTOFORMULA01")
.addParam("material_id",bomdtl_material_id)
.addParam("quality_scode","01")
.addParam("prior_level",prior_level)
.addParam("workorder_id",workorder_id)
.addParam("flag","22")
.process().getResultJSONArray(0);

View File

@@ -15,6 +15,7 @@
#################################################
输入.flag TYPEAS s_string
输入.quality_scode TYPEAS s_string
输入.prior_level TYPEAS s_string
输入.material_id TYPEAS s_string
输入.material_code TYPEAS s_string
输入.is_need_manage TYPEAS s_string
@@ -186,10 +187,13 @@
OPTION 输入.quality_scode <> ""
structivt.quality_scode = 输入.quality_scode
ENDOPTION
OPTION 输入.prior_level <> ""
structivt.ivt_level <= 输入.prior_level
ENDOPTION
OPTION 输入.is_pure <> ""
stockmaterialext.is_pure = 输入.is_pure
ENDOPTION
ORDER BY structivt.material_id,structivt.pcsn, structivt.sum_qty desc
ORDER BY structivt.material_id,structivt.ivt_level desc,structivt.pcsn, structivt.sum_qty desc
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -0,0 +1,38 @@
package org.nl.wms.sb.stat.websocket;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.mnt.websocket.MsgType;
import org.nl.modules.mnt.websocket.SocketMsg;
import org.nl.modules.mnt.websocket.WebSocketServer;
import org.nl.wms.pf.service.AutoPfTaskService;
import org.nl.wql.WQL;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
@Slf4j
@Component
@RequiredArgsConstructor
public class AutoWebSocketTask {
public void run() {
try {
String today = DateUtil.today();
HashMap<String, String> map = new HashMap<>();
map.put("flag", "1");
map.put("today", "%"+today+"%");
JSONArray resultJSONArray = WQL.getWO("TASK_AUTOWEBSOCKETTSK").addParamMap(map).process().getResultJSONArray(0);
SocketMsg socketMsg = new SocketMsg(resultJSONArray, MsgType.INFO);
WebSocketServer.sendInfo(socketMsg,"20");
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,163 @@
[交易说明]
交易名: 实时查询统计任务
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.today TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
mst.input_time AS input_time,
mst.repair_code AS repair_code,
(
CASE
mst.maintenancecycle
WHEN '01' THEN '计划维修'
WHEN '02' THEN '临时维修'
END
) AS maintenancecycle,
file.device_code,
file.device_name,
(
CASE
mst.invstatus
WHEN '01' THEN '生成'
WHEN '02' THEN '提交'
WHEN '03' THEN '开始'
WHEN '04' THEN '委外维修'
WHEN '05' THEN '委外验收'
WHEN '06' THEN '结束'
WHEN '07' THEN '确认'
WHEN '99' THEN '审核'
END
) AS invstatus,
mst.real_start_date,
mst.real_end_date
FROM
EM_BI_DeviceRepairMst mst
LEFT JOIN EM_BI_EquipmentFile file ON mst.devicerecord_id = file.devicerecord_id
WHERE
mst.is_delete = '0'
AND (mst.invstatus <> '99' or (mst.invstatus = '99' and mst.audit_time like 输入.today))
AND ( ISNULL( mst.source_bill_id ) OR mst.source_bill_type = 'WXJH' )
UNION
SELECT
st.create_time AS input_time,
st.request_code AS repair_code,
class.class_name AS maintenancecycle,
file.device_code,
file.device_name,
(
CASE
st.is_passed
WHEN '0' THEN
(
CASE st.is_passed
WHEN '0' THEN '否'
WHEN '1' THEN '是'
END
)
WHEN '1' THEN
(
CASE mst.invstatus
WHEN '01' THEN '生成'
WHEN '02' THEN '提交'
WHEN '03' THEN '开始'
WHEN '04' THEN '委外维修'
WHEN '05' THEN '委外验收'
WHEN '06' THEN '结束'
WHEN '07' THEN '确认'
WHEN '99' THEN '审核'
END
)
END
) AS invstatus,
mst.real_start_date,
mst.real_end_date
FROM
EM_BI_DeviceRepairRequest st
LEFT JOIN EM_BI_EquipmentFile file ON st.devicerecord_id = file.devicerecord_id
LEFT JOIN md_pb_classstandard class ON class.class_id = st.device_faultclass_id
LEFT JOIN EM_BI_DeviceRepairMst mst ON mst.source_bill_id = st.request_id
WHERE
st.is_delete = '0'
AND (st.status <> '99' or (st.status = '99' and st.finish_time like 输入.today))
AND mst.source_bill_type = 'BXD'
UNION
SELECT
mst.input_time AS input_time,
mst.maint_code AS repair_code,
(
CASE
mst.maintenancecycle
WHEN '01' THEN '计划保养'
WHEN '02' THEN '临时保养'
END
) AS maintenancecycle,
file.device_code,
file.device_name,
(
CASE
mst.invstatus
WHEN '01' THEN '生成'
WHEN '02' THEN '提交'
WHEN '03' THEN '开始'
WHEN '04' THEN '结束'
WHEN '05' THEN '确认'
WHEN '99' THEN '审核'
END
) AS invstatus,
mst.real_start_date,
mst.real_end_date
FROM
EM_BI_DeviceMaintenanceMst mst
LEFT JOIN EM_BI_EquipmentFile file ON mst.devicerecord_id = file.devicerecord_id
WHERE
mst.is_delete = '0'
AND (mst.invstatus <> '99' or (mst.invstatus = '99' and mst.audit_time like 输入.today))
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -47,4 +47,10 @@ public class ReturnOutBillController {
public ResponseEntity<Object> queryBillDtl(@RequestParam Map whereJson, Pageable page){
return new ResponseEntity<>(returnOutBillService.queryBillDtl(whereJson,page), HttpStatus.OK);
}
@GetMapping("/queryWashDtl")
@Log("查询软废库存")
@ApiOperation("查询软废库存")
public ResponseEntity<Object> queryWashDtl(@RequestParam Map whereJson, Pageable page){
return new ResponseEntity<>(returnOutBillService.queryWashDtl(whereJson,page), HttpStatus.OK);
}
}

View File

@@ -30,4 +30,12 @@ public interface ReturnOutBillService {
* @return Map<String, Object>
*/
Map<String, Object> queryBillDtl(Map whereJson, Pageable page);
/**
* 查询数据分页
*
* @param whereJson 条件
* @param page 分页参数
* @return Map<String, Object>
*/
Map<String, Object> queryWashDtl(Map whereJson, Pageable page);
}

View File

@@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.utils.SpringContextHolder;
import org.nl.wms.basedata.master.constant.MaterOptTypeEnum;
import org.nl.wms.basedata.master.service.ClassstandardService;
import org.nl.wms.st.core.service.ReturnOutBillService;
import org.nl.wql.WQL;
@@ -161,4 +162,19 @@ public class ReturnOutBillServiceImpl implements ReturnOutBillService {
return jo;
}
@Override
public Map<String, Object> queryWashDtl(Map whereJson, Pageable page) {
HashMap<String, String> map = new HashMap<>(whereJson);
if (StrUtil.isNotEmpty(map.get("search"))) {
map.put("search", "%" + map.get("search") + "%");
}
if (StrUtil.isNotEmpty(map.get("pcsn"))) {
map.put("pcsn", "%" + map.get("pcsn") + "%");
}
map.put("flag", "4");
map.put("material_ids", MaterOptTypeEnum.RF.getClass_idStr());
JSONObject jo = WQL.getWO("QST_IVT_RETURNOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "mb.material_id desc");
return jo;
}
}

View File

@@ -23,9 +23,11 @@
输入.mater_type TYPEAS f_string
输入.query_type TYPEAS s_string
输入.searchid TYPEAS s_string
输入.is_active TYPEAS s_string
输入.bucketunique TYPEAS s_string
输入.pcsn TYPEAS s_string
输入.storagevehicle_code TYPEAS s_string
输入.material_ids TYPEAS f_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
@@ -216,3 +218,55 @@
ENDSELECT
ENDPAGEQUERY
ENDIF
IF 输入.flag = "4"
PAGEQUERY
SELECT
structivt.*,
mb.material_name,
mb.material_code,
'' AS remark
FROM
(
SELECT
SUM( ivt.canuse_qty ) AS plan_qty,
SUM( ivt.ivt_qty ) AS sum_qty,
ivt.qty_unit_id,
ivt.qty_unit_name,
ivt.material_id,
ivt.pcsn,
ivt.is_active,
ivt.ivt_level,
ivt.quality_scode
FROM
st_ivt_structivt ivt
GROUP BY
ivt.material_id,
ivt.pcsn,
ivt.is_active,
ivt.ivt_level,
ivt.quality_scode,
ivt.qty_unit_id,
ivt.qty_unit_name
) structivt
LEFT JOIN md_me_materialbase mb ON mb.material_id = structivt.material_id
WHERE
1 = 1
AND structivt.plan_qty > 0
OPTION 输入.search <> ""
(mb.material_code like 输入.search
OR
mb.material_name like 输入.search)
ENDOPTION
OPTION 输入.pcsn <> ""
structivt.pcsn like 输入.pcsn
ENDOPTION
OPTION 输入.is_active <> ""
structivt.is_active = 输入.is_active
ENDOPTION
OPTION 输入.material_ids <> ""
mb.material_type_id in 输入.material_ids
ENDOPTION
ENDSELECT
ENDPAGEQUERY
ENDIF

View File

@@ -17,6 +17,12 @@ export const constantRouterMap = [
hidden: true,
meta: { title: '扩展屏' }
},
{
path: '/bigScreen/task/stat',
component: (resolve) => require(['@/views/wms/sb/stat/task/bigScreen'], resolve),
hidden: true,
meta: { title: '任务看板' }
},
{
path: '/404',
component: (resolve) => require(['@/views/features/404'], resolve),

View File

@@ -0,0 +1,128 @@
<template>
<div style="border: 1px solid #938d8d;margin-left: 10px;margin-right: 10px;">
<el-row>
<el-col :span="12">
<div class="grid-content bg-purple"><h2 style="margin-left: 30px;padding-top: 10px;">统计任务看板</h2></div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple-light">
<h2 style="text-align:right;margin-right: 140px;">{{ getTime }}</h2>
</div>
<div class="grid-content bg-purple-light">
<p style="text-align:right;margin-right: 110px;"><b>{{ getDate }}</b></p>
</div>
</el-col>
</el-row>
<br>
<br>
<div>
<!--表格渲染-->
<el-table
ref="table"
:data="tableData"
size="small"
style="width: 100%;"
border
:header-cell-style="{background:'#f5f7fa',color:'#606266'}"
>
<el-table-column type="index" label="序号" width="55" align="center" />
<el-table-column prop="input_time" label="生成时间" />
<el-table-column prop="repair_code" label="任务号" />
<el-table-column prop="maintenancecycle" label="任务类型" />
<!-- <el-table-column prop="" label="部门" />-->
<el-table-column prop="device_code" label="设备编码" />
<el-table-column prop="device_name" label="设备名称" />
<el-table-column prop="invstatus" label="状态" />
<el-table-column prop="real_start_date" label="开始时间" />
<el-table-column prop="real_end_date" label="结束时间" />
</el-table>
<!--分页组件-->
</div>
</div>
</template>
<script>
import crud from '@/mixins/crud'
export default {
name: 'BigscreenTask',
mixins: [crud],
data() {
return {
path: 'ws://localhost:8010/webSocket/20',
currentDate: new Date(),
getTime: '',
getDate: '',
tableData: []
}
},
created() {
},
mounted() {
// 定时器
const timer = setInterval(() => {
this.settime()// 你所加载数据的方法
}, 1000)
// 销毁定时器
this.$once('hook:beforeDestroy', () => {
clearInterval(timer)
})
this.init()
},
methods: {
settime() {
const _this = this
const yy = new Date().getFullYear()
const mm = new Date().getMonth() + 1
const dd = new Date().getDate()
const hh = new Date().getHours()
const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
_this.getDate = yy + '年' + mm + '月' + dd + '日 ' + '星期' + '日一二三四五六'.charAt(new Date().getDay())
_this.getTime = hh + ':' + mf + ':' + ss
},
// webSocket
init: function() {
if (typeof (WebSocket) === 'undefined') {
alert('您的浏览器不支持socket')
} else {
// 实例化socket
this.socket = new WebSocket(this.path)
// 监听socket连接
this.socket.onopen = this.open
// 监听socket错误信息
this.socket.onerror = this.error
// 监听socket消息
this.socket.onmessage = this.getMessage
}
},
open: function() {
console.log('socket连接成功')
},
error: function() {
console.log('连接错误')
},
getMessage: function(msg) {
debugger
const data = JSON.parse(msg.data)
this.tableData = data.msg
},
send: function() {
// eslint-disable-next-line no-undef
this.socket.send(params)
},
close: function() {
console.log('socket已经关闭')
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
</style>

View File

@@ -108,6 +108,16 @@
<span v-if="crud.status.cu > 0" class="crud-opts-right2">
<!--左侧插槽-->
<slot name="left" />
<el-button
slot="left"
class="filter-item"
type="primary"
icon="el-icon-plus"
size="mini"
@click="queryDtl()"
>
添加库存物料
</el-button>
<el-button
slot="left"
class="filter-item"
@@ -140,7 +150,7 @@
</template>
</el-table-column>
<el-table-column prop="material_name" label="物料名称" align="center" min-width="150px" show-overflow-tooltip />
<el-table-column show-overflow-tooltip prop="pcsn" label="批次号" align="center">
<el-table-column show-overflow-tooltip prop="pcsn" width="120" label="批次号" align="center">
<template scope="scope">
<el-input v-show="!scope.row.edit" v-model="scope.row.pcsn" size="mini" />
<span v-show="scope.row.edit">{{ scope.row.pcsn }}</span>
@@ -218,6 +228,7 @@
</template>
</el-table-column>
</el-table>
<AddDtl :dialog-show.sync="dtlShow" @tableChanged="tableChanged" />
<MaterDialog :dialog-show.sync="materShow" :mater-opt-code.sync="materType" @tableChanged2="tableChanged2" />
</el-dialog>
</template>
@@ -225,6 +236,7 @@
<script>
import CRUD, { crud, form } from '@crud/crud'
import MaterDialog from '@/views/wms/pub/MaterDialog'
import AddDtl from '@/views/wms/st/core/outbill/wastewashoutbill/AddDtl'
import checkoutbill from '@/api/wms/st/core/outbill/checkoutbill'
import crudStorattr from '@/api/wms/basedata/st/storattr'
import crudRawAssist from '@/api/wms/st/core/inbill/rawassist'
@@ -245,7 +257,7 @@ const defaultForm = {
}
export default {
name: 'AddDialog',
components: { MaterDialog },
components: { AddDtl, MaterDialog },
mixins: [crud(), form(defaultForm)],
props: {
dialogShow: {
@@ -260,6 +272,7 @@ export default {
materType: '',
materShow: false,
flagnow: false,
dtlShow: false,
nowrow: {},
nowindex: '',
storlist: [],
@@ -354,6 +367,7 @@ export default {
})
},
tableChanged(rows) {
// 插入第一条
const tablemap = new Map()
rows.forEach((item) => {
if (this.form.tableData.length !== 0) {
@@ -364,18 +378,12 @@ export default {
}
}
if (!this.flagnow) {
item.edit = true
item.quality_scode = '02'
item.ivt_level = '01'
item.is_active = '0'
item.edit = false
item.bill_status = '10'
tablemap.set(item.material_id, item)
}
} else {
item.edit = true
item.quality_scode = '02'
item.ivt_level = '01'
item.is_active = '0'
item.edit = false
item.bill_status = '10'
tablemap.set(item.material_id, item)
}
@@ -385,6 +393,13 @@ export default {
}
this.form.detail_count = this.form.tableData.length
},
async queryDtl() {
if (this.form.bill_type === '') {
this.crud.notify('请选择业务类型!', CRUD.NOTIFICATION_TYPE.INFO)
return
}
this.dtlShow = true
},
tableChanged2(row) {
for (let i = 0; i < this.form.tableData.length; i++) {
if (this.form.tableData[i].material_id === row.material_id) {

View File

@@ -0,0 +1,152 @@
<template>
<el-dialog
title="库存物料选择"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
:show-close="false"
width="1200px"
@open="open"
@close="close"
>
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<el-input
v-model="query.search"
clearable
size="mini"
placeholder="物料编码或名称"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<el-input
v-model="query.pcsn"
clearable
size="mini"
placeholder="批次号"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<el-select
v-model="query.is_active"
clearable
size="mini"
placeholder="是否可用"
class="filter-item"
@change="crud.toQuery"
>
<el-option
v-for="item in dict.is_usable"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<rrOperation />
</div>
<!--表格渲染-->
<el-table
ref="multipleTable"
v-loading="crud.loading"
:data="crud.data"
style="width: 100%;"
border
:header-cell-style="{background:'#f5f7fa',color:'#606266'}"
>
<el-table-column type="selection" width="55" />
<el-table-column show-overflow-tooltip prop="material_code" width="150" label="物料编码" />
<el-table-column show-overflow-tooltip prop="material_name" label="物料名称" />
<el-table-column show-overflow-tooltip prop="pcsn" label="批次" />
<el-table-column prop="quality_scode" label="品质类型" align="center" width="110px" :formatter="quality_scodeFormat" />
<el-table-column prop="ivt_level" label="库存等级" align="center" width="100px" :formatter="ivt_levelFormat" />
<el-table-column prop="is_active" label="是否可用" align="center" width="110px" :formatter="is_activeFormat" />
<el-table-column show-overflow-tooltip prop="sum_qty" :formatter="crud.formatNum3" width="120" label="库存重量" />
<el-table-column show-overflow-tooltip prop="plan_qty" :formatter="crud.formatNum3" label="可用重量" />
<el-table-column show-overflow-tooltip prop="qty_unit_name" label="重量单位" />
</el-table>
<!--分页组件-->
<pagination />
<span slot="footer" class="dialog-footer">
<el-button slot="left" type="info" @click="dialogVisible = false">关闭</el-button>
<el-button slot="left" type="primary" @click="submit">保存</el-button>
</span>
</el-dialog>
</template>
<script>
import CRUD, { header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
export default {
name: 'AddDtl',
components: { rrOperation, pagination },
cruds() {
return CRUD({ title: '用户', url: 'api/returnoutbill/queryWashDtl',
query: { pcsn: '', search: '', is_active: '' },
optShow: {
add: false,
edit: false,
del: false,
reset: false,
download: false
}})
},
dicts: [ 'ST_QUALITY_SCODE', 'ST_IVT_LEVEL', 'is_usable'],
mixins: [presenter(), header()],
props: {
dialogShow: {
type: Boolean,
default: false
}
},
data() {
return {
dialogVisible: false,
rows: []
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
}
},
created() {
},
methods: {
close() {
this.crud.resetQuery(false)
this.$emit('update:dialogShow', false)
},
open() {
this.crud.toQuery()
},
quality_scodeFormat(row) {
return this.dict.label.ST_QUALITY_SCODE[row.quality_scode]
},
ivt_levelFormat(row) {
return this.dict.label.ST_IVT_LEVEL[row.ivt_level]
},
is_activeFormat(row) {
return this.dict.label.is_usable[row.is_active]
},
submit() {
this.rows = this.$refs.multipleTable.selection
if (this.rows.length <= 0) {
this.$message('请先勾选物料')
return
}
this.crud.resetQuery(false)
this.$emit('update:dialogShow', false)
this.$emit('tableChanged', this.rows)
}
}
}
</script>