feat(stock): 优化库存筛选功能

- 添加操作符选择下拉菜单,支持多种筛选条件
- 重构筛选逻辑,提高可维护性
- 优化表单样式,提升用户体验
- 新增国际化支持,添加操作符的中文翻译
This commit is contained in:
user 2025-03-20 10:51:36 +08:00
parent f9602b1e85
commit 71e4414b06
5 changed files with 55 additions and 31 deletions

View File

@ -42,6 +42,17 @@ export default defineComponent({
property: { op: '=', value: null },
});
const operatorSelect = [
{ value: '=', text: t$('entity.operator.equal') },
{ value: '>', text: t$('entity.operator.greaterThan') },
{ value: '<', text: t$('entity.operator.lessThan') },
{ value: '>=', text: t$('entity.operator.greaterOrEqual') },
{ value: '<=', text: t$('entity.operator.lessOrEqual') },
{ value: '!=', text: t$('entity.operator.notEqual') },
{ value: 'like', text: t$('entity.operator.like') },
{ value: 'not like', text: t$('entity.operator.notLike') },
];
const handleFilter = () => {
showFilter.value = !showFilter.value;
page.value = 1; // 重置页码
@ -60,9 +71,9 @@ export default defineComponent({
isFetching.value = true;
try {
const processedParams = showFilter.value
? Object.entries(filterParams.value).reduce((acc, [key, { op, value }]) => {
if (value !== null && value !== '') {
acc[key] = { op, value };
? Object.entries(filterParams.value).reduce((acc, [key, filterParam]) => {
if (filterParam.value !== null && filterParam.value !== '') {
acc[key] = encodeURIComponent(JSON.stringify({ op: filterParam.op, value: filterParam.value }));
}
return acc;
}, {})
@ -138,6 +149,7 @@ export default defineComponent({
handlePageSizeChange,
prepareDelete,
deleteStock,
operatorSelect,
changeOrder,
};
},

View File

@ -28,39 +28,24 @@
<div class="form-section">
<div class="form-group">
<label class="form-control-label" for="filter-number">{{ $t('jewpmsApp.stock.number') }}</label>
<div class="d-flex">
<select class="form-control w-auto mr-2" v-model="filterParams.number.op">
<option value="=">=</option>
<option value="like">like</option>
<option value=">">></option>
<option value="<"><</option>
</select>
<input type="text" class="form-control" id="filter-number" v-model="filterParams.number.value" />
</div>
<b-input-group class="form-control-group">
<b-form-select id="filter-op" v-model="filterParams.number.op" :options="operatorSelect"></b-form-select>
<b-form-input id="filter-number" v-model="filterParams.number.value"></b-form-input>
</b-input-group>
</div>
<div class="form-group">
<label class="form-control-label" for="filter-name">{{ $t('jewpmsApp.stock.name') }}</label>
<div class="d-flex">
<select class="form-control w-auto mr-2" v-model="filterParams.name.op">
<option value="=">=</option>
<option value="like">like</option>
<option value=">">></option>
<option value="<"><</option>
</select>
<input type="text" class="form-control" id="filter-name" v-model="filterParams.name.value" />
</div>
<b-input-group class="form-control-group">
<b-form-select id="filter-op" v-model="filterParams.name.op" :options="operatorSelect"></b-form-select>
<b-form-input id="filter-number" v-model="filterParams.name.value"></b-form-input>
</b-input-group>
</div>
<div class="form-group">
<label class="form-control-label" for="filter-property">{{ $t('jewpmsApp.stock.property') }}</label>
<div class="d-flex">
<select class="form-control w-auto mr-2" v-model="filterParams.property.op">
<option value="=">=</option>
<option value="like">like</option>
<option value=">">></option>
<option value="<"><</option>
</select>
<input type="text" class="form-control" id="filter-property" v-model="filterParams.property.value" />
</div>
<b-input-group class="form-control-group">
<b-form-select id="filter-op" v-model="filterParams.property.op" :options="operatorSelect"></b-form-select>
<b-form-input id="filter-number" v-model="filterParams.property.value"></b-form-input>
</b-input-group>
</div>
</div>
</div>

View File

@ -10,6 +10,7 @@ import {
BFormDatepicker,
BFormGroup,
BFormInput,
BFormSelect,
BInputGroup,
BInputGroupPrepend,
BLink,
@ -57,4 +58,5 @@ export function initBootstrapVue(vue) {
vue.component('b-form-datepicker', BFormDatepicker);
vue.component('b-input-group', BInputGroup);
vue.component('b-input-group-prepend', BInputGroupPrepend);
vue.component('b-form-select', BFormSelect);
}

View File

@ -51,6 +51,11 @@
flex-wrap: wrap;
}
.form-control {
flex: 1;
min-width: 0;
}
.form-control-label {
font-weight: bold;
width: 120px;
@ -59,9 +64,19 @@
flex-shrink: 0;
}
.form-control {
.form-control-group {
flex: 1;
min-width: 0;
display: flex;
gap: 5px;
}
.form-control-group .custom-select {
flex: 0 0 auto;
width: auto;
}
.form-control-group .form-control {
flex: 1 1 auto;
}
@media (max-width: 350px) {

View File

@ -173,6 +173,16 @@
"timeout": "相机初始化超时"
}
},
"operator": {
"equal": "等于",
"greaterThan": "大于",
"lessThan": "小于",
"greaterOrEqual": "大等于",
"lessOrEqual": "小等于",
"notEqual": "不等于",
"like": "包括",
"notLike": "不包括"
},
"detail": {
"field": "字段",
"value": "值"