Compare commits

2 Commits
15 changed files with 136 additions and 16 deletions
@@ -43,6 +43,19 @@ from utils.page_util import PageUtil
class MasterDao: class MasterDao:
"""菌种、客户、现场、产线、隧道和仓库主数据数据库操作层。""" """菌种、客户、现场、产线、隧道和仓库主数据数据库操作层。"""
@staticmethod
def _parse_id_list(ids_str: str | None) -> list[int]:
if not ids_str:
return []
result: list[int] = []
for item in ids_str.split(','):
item = item.strip()
if item.isdigit():
val = int(item)
if val > 0:
result.append(val)
return result
@staticmethod @staticmethod
async def _paginate( async def _paginate(
db: AsyncSession, db: AsyncSession,
@@ -139,6 +152,9 @@ class MasterDao:
conditions.append(BizStrain.strain_name.like(f'%{query_object.strain_name}%')) conditions.append(BizStrain.strain_name.like(f'%{query_object.strain_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizStrain.status == query_object.status) conditions.append(BizStrain.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizStrain.strain_id.in_(ids))
statement = select(BizStrain).where(*conditions).order_by(BizStrain.strain_id) statement = select(BizStrain).where(*conditions).order_by(BizStrain.strain_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -187,6 +203,9 @@ class MasterDao:
conditions.append(BizCustomer.customer_name.like(f'%{query_object.customer_name}%')) conditions.append(BizCustomer.customer_name.like(f'%{query_object.customer_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizCustomer.status == query_object.status) conditions.append(BizCustomer.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizCustomer.customer_id.in_(ids))
statement = select(BizCustomer).where(*conditions).order_by(BizCustomer.customer_id) statement = select(BizCustomer).where(*conditions).order_by(BizCustomer.customer_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -237,6 +256,9 @@ class MasterDao:
conditions.append(BizCustomerSite.site_name.like(f'%{query_object.site_name}%')) conditions.append(BizCustomerSite.site_name.like(f'%{query_object.site_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizCustomerSite.status == query_object.status) conditions.append(BizCustomerSite.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizCustomerSite.site_id.in_(ids))
statement = select(BizCustomerSite).where(*conditions).order_by(BizCustomerSite.site_id) statement = select(BizCustomerSite).where(*conditions).order_by(BizCustomerSite.site_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -298,6 +320,9 @@ class MasterDao:
conditions.append(BizProductionLine.line_name.like(f'%{query_object.line_name}%')) conditions.append(BizProductionLine.line_name.like(f'%{query_object.line_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizProductionLine.status == query_object.status) conditions.append(BizProductionLine.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizProductionLine.line_id.in_(ids))
statement = select(BizProductionLine).where(*conditions).order_by(BizProductionLine.line_id) statement = select(BizProductionLine).where(*conditions).order_by(BizProductionLine.line_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -359,6 +384,9 @@ class MasterDao:
conditions.append(BizTunnel.tunnel_name.like(f'%{query_object.tunnel_name}%')) conditions.append(BizTunnel.tunnel_name.like(f'%{query_object.tunnel_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizTunnel.status == query_object.status) conditions.append(BizTunnel.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizTunnel.tunnel_id.in_(ids))
statement = select(BizTunnel).where(*conditions).order_by(BizTunnel.tunnel_id) statement = select(BizTunnel).where(*conditions).order_by(BizTunnel.tunnel_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -418,6 +446,9 @@ class MasterDao:
conditions.append(BizWarehouse.warehouse_name.like(f'%{query_object.warehouse_name}%')) conditions.append(BizWarehouse.warehouse_name.like(f'%{query_object.warehouse_name}%'))
if query_object.status: if query_object.status:
conditions.append(BizWarehouse.status == query_object.status) conditions.append(BizWarehouse.status == query_object.status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizWarehouse.warehouse_id.in_(ids))
statement = select(BizWarehouse).where(*conditions).order_by(BizWarehouse.warehouse_id) statement = select(BizWarehouse).where(*conditions).order_by(BizWarehouse.warehouse_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -466,6 +497,9 @@ class MasterDao:
conditions.append(BizPallet.pallet_code.like(f'%{query_object.pallet_code}%')) conditions.append(BizPallet.pallet_code.like(f'%{query_object.pallet_code}%'))
if query_object.asset_status: if query_object.asset_status:
conditions.append(BizPallet.asset_status == query_object.asset_status) conditions.append(BizPallet.asset_status == query_object.asset_status)
ids = cls._parse_id_list(getattr(query_object, 'ids', None))
if ids:
conditions.append(BizPallet.pallet_id.in_(ids))
statement = select(BizPallet).where(*conditions).order_by(BizPallet.pallet_id) statement = select(BizPallet).where(*conditions).order_by(BizPallet.pallet_id)
return await cls._paginate(db, statement, query_object, is_page) return await cls._paginate(db, statement, query_object, is_page)
@@ -50,6 +50,7 @@ class StrainPageQueryModel(BaseModel):
description='菌种名称', description='菌种名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteStrainModel(BaseModel): class DeleteStrainModel(BaseModel):
@@ -110,6 +111,7 @@ class CustomerPageQueryModel(BaseModel):
description='客户名称', description='客户名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteCustomerModel(BaseModel): class DeleteCustomerModel(BaseModel):
@@ -167,6 +169,7 @@ class SitePageQueryModel(BaseModel):
description='现场名称', description='现场名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteSiteModel(BaseModel): class DeleteSiteModel(BaseModel):
@@ -223,6 +226,7 @@ class LinePageQueryModel(BaseModel):
description='产线名称', description='产线名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteLineModel(BaseModel): class DeleteLineModel(BaseModel):
@@ -281,6 +285,7 @@ class TunnelPageQueryModel(BaseModel):
description='隧道名称', description='隧道名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteTunnelModel(BaseModel): class DeleteTunnelModel(BaseModel):
@@ -342,6 +347,7 @@ class WarehousePageQueryModel(BaseModel):
description='仓库名称', description='仓库名称',
) )
status: Literal['0', '1'] | None = Field(default=None, description='状态') status: Literal['0', '1'] | None = Field(default=None, description='状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeleteWarehouseModel(BaseModel): class DeleteWarehouseModel(BaseModel):
@@ -416,6 +422,7 @@ class PalletPageQueryModel(BaseModel):
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数') page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号') pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
asset_status: Literal['0', '1'] | None = Field(default=None, description='资产状态') asset_status: Literal['0', '1'] | None = Field(default=None, description='资产状态')
ids: str | None = Field(default=None, description='主键ID列表(英文逗号分隔)')
class DeletePalletModel(BaseModel): class DeletePalletModel(BaseModel):
@@ -318,3 +318,22 @@ class MasterExcelServiceTest(unittest.IsolatedAsyncioTestCase):
exported = sheet_rows(empty) exported = sheet_rows(empty)
self.assertEqual([('菌种编码', '菌种名称', '状态', '备注')], [row[:4] for row in exported]) self.assertEqual([('菌种编码', '菌种名称', '状态', '备注')], [row[:4] for row in exported])
self.assertEqual(1, len(exported)) self.assertEqual(1, len(exported))
async def test_export_passes_query_with_ids(self) -> None:
rows = [
StrainModel(strainId=1, strainCode='S001', strainName='香菇', status='0', remark='甲'),
]
query = StrainPageQueryModel(ids='1')
list_strain = AsyncMock(return_value=rows)
with patch.dict(_LISTERS, {'strain': list_strain}):
binary = await MasterExcelService.export_resource(self.db, 'strain', query, self.scope)
self.assertFalse(list_strain.await_args.kwargs['is_page'])
self.assertEqual(query, list_strain.await_args.args[1])
self.assertEqual('1', list_strain.await_args.args[1].ids)
self.assertEqual(
[
('菌种编码', '菌种名称', '状态', '备注'),
('S001', '香菇', '正常', '甲'),
],
[row[:4] for row in sheet_rows(binary)],
)
@@ -737,6 +737,30 @@ class TestMasterDao(unittest.IsolatedAsyncioTestCase):
self.assertIs(page, result) self.assertIs(page, result)
self.assertIn(f"biz_strain.strain_code LIKE '%{strain_code}%'", compile_sql(statement)) self.assertIn(f"biz_strain.strain_code LIKE '%{strain_code}%'", compile_sql(statement))
async def test_list_master_resources_support_ids_filtering(self) -> None:
page = PageModel(rows=[], pageNum=1, pageSize=10, total=0, hasNext=False)
cases = (
('strain', StrainPageQueryModel, 'biz_strain.strain_id IN (1, 2)'),
('customer', CustomerPageQueryModel, 'biz_customer.customer_id IN (1, 2)'),
('site', SitePageQueryModel, 'biz_customer_site.site_id IN (1, 2)'),
('line', LinePageQueryModel, 'biz_production_line.line_id IN (1, 2)'),
('warehouse', WarehousePageQueryModel, 'biz_warehouse.warehouse_id IN (1, 2)'),
)
for resource, model_cls, expected_sql in cases:
with (
self.subTest(resource=resource),
patch.object(PageUtil, 'paginate', new=AsyncMock(return_value=page)) as paginate_mock,
):
await getattr(MasterDao, f'list_{resource}')(
self.db,
model_cls(ids='1,2,abc'),
TestBatchScope.formal(),
is_page=False,
)
statement = paginate_mock.await_args.args[1]
sql = compile_sql(statement)
self.assertIn(expected_sql, sql)
async def test_get_queries_use_expected_table_and_primary_key(self) -> None: async def test_get_queries_use_expected_table_and_primary_key(self) -> None:
cases = ( cases = (
('strain', 'biz_strain', 'strain_id'), ('strain', 'biz_strain', 'strain_id'),
@@ -98,7 +98,7 @@ MASTER_MODEL_FIELDS = {
'update_time', 'update_time',
'remark', 'remark',
}, },
StrainPageQueryModel: {'page_num', 'page_size', 'strain_code', 'strain_name', 'status'}, StrainPageQueryModel: {'page_num', 'page_size', 'strain_code', 'strain_name', 'status', 'ids'},
DeleteStrainModel: {'strain_ids'}, DeleteStrainModel: {'strain_ids'},
CustomerModel: { CustomerModel: {
'customer_id', 'customer_id',
@@ -111,7 +111,7 @@ MASTER_MODEL_FIELDS = {
'update_time', 'update_time',
'remark', 'remark',
}, },
CustomerPageQueryModel: {'page_num', 'page_size', 'customer_code', 'customer_name', 'status'}, CustomerPageQueryModel: {'page_num', 'page_size', 'customer_code', 'customer_name', 'status', 'ids'},
DeleteCustomerModel: {'customer_ids'}, DeleteCustomerModel: {'customer_ids'},
SiteModel: { SiteModel: {
'site_id', 'site_id',
@@ -126,7 +126,7 @@ MASTER_MODEL_FIELDS = {
'update_time', 'update_time',
'remark', 'remark',
}, },
SitePageQueryModel: {'page_num', 'page_size', 'customer_id', 'site_code', 'site_name', 'status'}, SitePageQueryModel: {'page_num', 'page_size', 'customer_id', 'site_code', 'site_name', 'status', 'ids'},
DeleteSiteModel: {'site_ids'}, DeleteSiteModel: {'site_ids'},
LineModel: { LineModel: {
'line_id', 'line_id',
@@ -140,7 +140,7 @@ MASTER_MODEL_FIELDS = {
'update_time', 'update_time',
'remark', 'remark',
}, },
LinePageQueryModel: {'page_num', 'page_size', 'site_id', 'line_code', 'line_name', 'status'}, LinePageQueryModel: {'page_num', 'page_size', 'site_id', 'line_code', 'line_name', 'status', 'ids'},
DeleteLineModel: {'line_ids'}, DeleteLineModel: {'line_ids'},
WarehouseModel: { WarehouseModel: {
'warehouse_id', 'warehouse_id',
@@ -154,7 +154,7 @@ MASTER_MODEL_FIELDS = {
'update_time', 'update_time',
'remark', 'remark',
}, },
WarehousePageQueryModel: {'page_num', 'page_size', 'warehouse_code', 'warehouse_name', 'status'}, WarehousePageQueryModel: {'page_num', 'page_size', 'warehouse_code', 'warehouse_name', 'status', 'ids'},
DeleteWarehouseModel: {'warehouse_ids'}, DeleteWarehouseModel: {'warehouse_ids'},
PalletModel: { PalletModel: {
'pallet_id', 'pallet_id',
@@ -170,7 +170,7 @@ MASTER_MODEL_FIELDS = {
}, },
PalletCreateModel: {'pallet_code', 'capacity_packages', 'remark'}, PalletCreateModel: {'pallet_code', 'capacity_packages', 'remark'},
PalletEditModel: {'pallet_id', 'capacity_packages', 'asset_status', 'remark'}, PalletEditModel: {'pallet_id', 'capacity_packages', 'asset_status', 'remark'},
PalletPageQueryModel: {'page_num', 'page_size', 'pallet_code', 'asset_status'}, PalletPageQueryModel: {'page_num', 'page_size', 'pallet_code', 'asset_status', 'ids'},
DeletePalletModel: {'pallet_ids'}, DeletePalletModel: {'pallet_ids'},
UserAssignModel: {'user_ids'}, UserAssignModel: {'user_ids'},
} }
@@ -1856,7 +1856,7 @@ test('六个基础资料页面逐页满足 API、权限、分页和安全删除
assert.doesNotMatch(source, /\bhandle(?:Import|Export)\b|proxy\.download\(/) assert.doesNotMatch(source, /\bhandle(?:Import|Export)\b|proxy\.download\(/)
assert.match( assert.match(
masterToolbar, masterToolbar,
new RegExp(`<master-excel-actions resource="${resource}" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList"\\s*/>`), new RegExp(`<master-excel-actions resource="${resource}" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList"\\s*/>`),
`${resource} 必须复用基础资料导入导出组件` `${resource} 必须复用基础资料导入导出组件`
) )
assert.match( assert.match(
@@ -1979,7 +1979,7 @@ test('隧道资料页复用基础资料导入导出组件', async () => {
const masterToolbar = source.match(/<el-row\b[^>]*class="[^"]*\bmaster-toolbar\b[^"]*"[^>]*>[\s\S]*?<\/el-row>/)?.[0] || '' const masterToolbar = source.match(/<el-row\b[^>]*class="[^"]*\bmaster-toolbar\b[^"]*"[^>]*>[\s\S]*?<\/el-row>/)?.[0] || ''
assert.match( assert.match(
masterToolbar, masterToolbar,
/<master-excel-actions resource="tunnel" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList"\s*\/>/ /<master-excel-actions resource="tunnel" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList"\s*\/>/
) )
assert.match(masterToolbar, /<\/template>\s*<master-excel-actions\b[\s\S]*?\/>\s*<right-toolbar\b/) assert.match(masterToolbar, /<\/template>\s*<master-excel-actions\b[\s\S]*?\/>\s*<right-toolbar\b/)
assert.doesNotMatch(source, />\s*(?:导入|导出)\s*<\/el-button>/) assert.doesNotMatch(source, />\s*(?:导入|导出)\s*<\/el-button>/)
@@ -98,6 +98,16 @@
display: inline-block !important; display: inline-block !important;
} }
.el-sub-menu {
.el-sub-menu__icon-arrow {
position: absolute;
top: 50%;
right: var(--el-menu-base-level-padding, 20px);
margin-top: -6px;
width: auto !important;
}
}
// menu hover // menu hover
.sub-menu-title-noDropdown, .sub-menu-title-noDropdown,
.el-sub-menu__title { .el-sub-menu__title {
@@ -126,6 +136,14 @@
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.06) !important; background-color: rgba(0, 0, 0, 0.06) !important;
} }
.el-sub-menu__icon-arrow {
position: absolute;
top: 50%;
right: var(--el-menu-base-level-padding, 20px);
margin-top: -6px;
width: auto !important;
}
} }
& .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title, & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,
@@ -235,6 +253,16 @@
// when menu collapsed // when menu collapsed
.el-menu--vertical { .el-menu--vertical {
.el-sub-menu {
.el-sub-menu__icon-arrow {
position: absolute;
top: 50%;
right: var(--el-menu-base-level-padding, 20px);
margin-top: -6px;
width: auto !important;
}
}
&>.el-menu { &>.el-menu {
.svg-icon { .svg-icon {
margin-right: 16px; margin-right: 16px;
@@ -95,6 +95,10 @@ const props = defineProps({
queryParams: { queryParams: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
},
selectedIds: {
type: Array,
default: () => []
} }
}); });
const emit = defineEmits(["imported"]); const emit = defineEmits(["imported"]);
@@ -136,9 +140,13 @@ function downloadTemplate() {
} }
function handleExport() { function handleExport() {
const exportParams = { ...props.queryParams };
if (Array.isArray(props.selectedIds) && props.selectedIds.length > 0) {
exportParams.ids = props.selectedIds.join(",");
}
proxy.download( proxy.download(
`master/${props.resource}/export`, `master/${props.resource}/export`,
{ ...props.queryParams }, exportParams,
`${props.resource}_${new Date().getTime()}.xlsx` `${props.resource}_${new Date().getTime()}.xlsx`
); );
} }
@@ -32,7 +32,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="customer" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="customer" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -35,7 +35,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="line" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="line" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -29,7 +29,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="pallet" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="pallet" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -36,7 +36,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="site" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="site" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -39,7 +39,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="strain" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="strain" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -35,7 +35,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="tunnel" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="tunnel" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
@@ -33,7 +33,7 @@
<el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button> <el-button type="warning" plain icon="FolderAdd" :disabled="!selectedIds.length" @click="openAdoptionDialog" v-hasPermi="['system:testbatch:adopt']">纳入测试批次</el-button>
</el-col> </el-col>
</template> </template>
<master-excel-actions resource="warehouse" :allow-import="isMasterWriteAllowed" :query-params="queryParams" @imported="getList" /> <master-excel-actions resource="warehouse" :allow-import="isMasterWriteAllowed" :query-params="queryParams" :selected-ids="selectedIds" @imported="getList" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" /> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>