jewpms/src/main/webapp/app/entities/stock/stock.component.ts
user 96e6095199 feat(库存管理): 添加状态字段并支持状态字典查询
在库存管理模块中添加状态字段,并支持通过字典查询状态选项。修改了前端组件、后端服务以及国际化文件,确保状态字段的显示、编辑和筛选功能正常
2025-03-21 10:43:28 +08:00

175 lines
4.8 KiB
TypeScript

import { defineComponent, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import { useAlertService } from '@/shared/alert/alert.service';
import buildPaginationQuery from '@/shared/sort/sorts';
import axios from 'axios';
export default defineComponent({
compatConfig: { MODE: 3 },
name: 'Stock',
setup() {
const { t: t$ } = useI18n();
const alertService = useAlertService();
const router = useRouter();
const isFetching = ref(false);
const stocks = ref([]);
const statusDicts = ref([]);
const stock = ref({
id: null,
number: '',
name: '',
property: '',
remark: '',
status: '1',
sortNo: 0,
version: 0,
});
const removeId = ref(null);
const deleteDialog = ref(null);
const showFilter = ref(false);
const propOrder = ref('id');
const reverse = ref(false);
// 分页相关变量
const page = ref(1);
const itemsPerPage = ref(10);
const totalItems = ref(0);
// 过滤参数
const filterParams = ref({
number: { op: '=', value: null },
name: { op: '=', value: null },
property: { op: '=', value: null },
status: { 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; // 重置页码
handleSyncList();
};
const sort = () => {
const result = [`${propOrder.value},${reverse.value ? 'desc' : 'asc'}`];
if (propOrder.value !== 'id') {
result.push('id');
}
return result;
};
const handleSyncList = async () => {
isFetching.value = true;
try {
const [stocksRes, statusDictsRes] = await Promise.all([
axios.get(
`api/stocks?${buildPaginationQuery({
page: page.value - 1,
size: itemsPerPage.value,
sort: sort(),
})}`,
{
params: Object.fromEntries([
...Object.keys(stock.value).map(key => [`${key}[name]`, '']),
...(showFilter.value
? Object.entries(filterParams.value)
.filter(([, filterParam]) => filterParam.value !== null && filterParam.value !== '')
.flatMap(([key, filterParam]) => [
[`${key}[op]`, filterParam.op],
[`${key}[value]`, filterParam.value],
])
: []),
]),
},
),
axios.get('api/dicts', {
params: {
number: { name: '' },
name: { name: '' },
parentNumber: { op: '=', value: 'StatusType' },
status: { op: '=', value: '1' },
},
}),
]);
stocks.value = stocksRes.data;
statusDicts.value = statusDictsRes.data;
totalItems.value = stocksRes.headers['x-total-count'] || stocksRes.data.length;
} catch (e) {
alertService.showHttpError(e);
} finally {
isFetching.value = false;
}
};
const handlePageChange = newPage => {
page.value = newPage;
handleSyncList();
};
const prepareDelete = row => {
removeId.value = row.id;
stock.value = { ...row };
deleteDialog.value.show();
};
const deleteStock = async () => {
try {
await axios.delete(`api/stocks/${removeId.value}`);
alertService.showInfo(t$('jewpmsApp.stock.deleted'));
removeId.value = null;
handleSyncList();
deleteDialog.value.hide();
} catch (e) {
alertService.showHttpError(e);
}
};
const changeOrder = (prop: string): void => {
propOrder.value = prop;
reverse.value = !reverse.value;
handleSyncList();
};
const handlePageSizeChange = () => {
page.value = 1; // 重置页码
handleSyncList();
};
handleSyncList();
return {
stocks,
stock,
isFetching,
showFilter,
filterParams,
page,
itemsPerPage,
totalItems,
propOrder,
reverse,
handleSyncList,
handleFilter,
handlePageChange,
handlePageSizeChange,
prepareDelete,
deleteStock,
operatorSelect,
changeOrder,
statusDicts,
};
},
});