feat(库存管理): 添加状态字段并支持状态字典查询

在库存管理模块中添加状态字段,并支持通过字典查询状态选项。修改了前端组件、后端服务以及国际化文件,确保状态字段的显示、编辑和筛选功能正常
This commit is contained in:
user 2025-03-21 10:43:28 +08:00
parent 0193ccd13e
commit 96e6095199
9 changed files with 96 additions and 25 deletions

View File

@ -39,6 +39,7 @@ public class StockService {
existingStock.setName(stock.getName());
existingStock.setProperty(stock.getProperty());
existingStock.setRemark(stock.getRemark());
existingStock.setStatus(stock.getStatus());
existingStock.setSortNo(stock.getSortNo());
return stockRepository.save(existingStock);
});

View File

@ -26,8 +26,8 @@ export default defineComponent({
name: '',
property: '',
remark: '',
sortNo: 0,
status: '',
sortNo: 0,
version: 0,
});

View File

@ -54,6 +54,7 @@ export default defineComponent({
name: '',
property: '',
remark: '',
status: '1',
sortNo: 0,
version: 0,
});

View File

@ -59,8 +59,7 @@
<b-form-select id="filter-op" v-model="filterParams.status.op" :options="operatorSelect"></b-form-select>
<b-form-select id="filter-status" v-model="filterParams.status.value">
<option :value="null">{{ $t('entity.action.select') }}</option>
<option :value="1">生效</option>
<option :value="0">失效</option>
<option v-for="dict in statusDicts" :key="dict.number" :value="dict.number">{{ dict.name }}</option>
</b-form-select>
</b-input-group>
</div>

View File

@ -15,12 +15,14 @@ export default defineComponent({
const loading = ref(false);
const isSaving = ref(false);
const statusDicts = ref([]);
const stock = ref({
id: null,
number: '',
name: '',
property: '',
remark: '',
status: '',
sortNo: 0,
version: 0,
});
@ -28,11 +30,35 @@ export default defineComponent({
const loadData = async () => {
loading.value = true;
try {
const stockId = route.params?.id;
if (stockId) {
const { data } = await axios.get(`api/stocks/${stockId}`);
stock.value = data;
const [stockRes, statusDictsRes] = await Promise.all([
route.params?.id ? axios.get(`api/stocks/${route.params.id}`) : Promise.resolve({ data: stock.value }),
axios.get('api/dicts', {
params: {
number: { name: '' },
name: { name: '' },
property: { name: '' },
parentNumber: { op: '=', value: 'StatusType' },
status: { op: '=', value: '1' },
},
}),
]);
if (route.params?.id) {
stock.value = stockRes.data;
} else {
// 设置新建stock时的默认状态值
const defaultStatus = statusDictsRes.data.find(item => {
try {
const propertyObj = JSON.parse(item.property || '{}');
return propertyObj.default === 1;
} catch {
return false;
}
});
if (defaultStatus) {
stock.value.status = defaultStatus.number;
}
}
statusDicts.value = statusDictsRes.data;
} catch (e) {
alertService.showHttpError(e);
} finally {
@ -47,6 +73,7 @@ export default defineComponent({
const save = async () => {
isSaving.value = true;
try {
console.log(stock.value);
if (stock.value.id) {
await axios.put(`api/stocks/${stock.value.id}`, stock.value);
alertService.showInfo(t$('jewpmsApp.stock.updated', { param: stock.value.name }));
@ -70,6 +97,7 @@ export default defineComponent({
loading,
isSaving,
stock,
statusDicts,
previousState,
save,
};

View File

@ -50,6 +50,16 @@
<textarea class="form-control" id="stock-remark" data-cy="remark" name="remark" v-model="stock.remark"></textarea>
</div>
<div class="form-group">
<label class="form-control-label" for="stock-status">{{ $t('jewpmsApp.stock.status') }}</label>
<select class="form-control" id="stock-status" data-cy="status" name="status" v-model="stock.status">
<option value="">{{ $t('entity.action.select') }}</option>
<option v-for="item in statusDicts" :key="item.number" :value="item.number">
{{ item.name }}
</option>
</select>
</div>
<div class="form-group">
<label class="form-control-label" for="stock-sort-no">{{ $t('jewpmsApp.stock.sortNo') }}</label>
<input type="number" class="form-control" id="stock-sort-no" data-cy="sortNo" name="sortNo" v-model="stock.sortNo" />

View File

@ -15,12 +15,14 @@ export default defineComponent({
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,
});
@ -40,6 +42,7 @@ export default defineComponent({
number: { op: '=', value: null },
name: { op: '=', value: null },
property: { op: '=', value: null },
status: { op: '=', value: null },
});
const operatorSelect = [
@ -70,26 +73,38 @@ export default defineComponent({
const handleSyncList = async () => {
isFetching.value = true;
try {
const 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],
])
: []),
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' },
},
}),
]);
const stocksRes = await axios.get(
`api/stocks?${buildPaginationQuery({
page: page.value - 1,
size: itemsPerPage.value,
sort: sort(),
})}`,
{ params: params },
);
stocks.value = stocksRes.data;
statusDicts.value = statusDictsRes.data;
totalItems.value = stocksRes.headers['x-total-count'] || stocksRes.data.length;
} catch (e) {
alertService.showHttpError(e);
@ -153,6 +168,7 @@ export default defineComponent({
deleteStock,
operatorSelect,
changeOrder,
statusDicts,
};
},
});

View File

@ -47,6 +47,16 @@
<b-form-input id="filter-number" v-model="filterParams.property.value"></b-form-input>
</b-input-group>
</div>
<div class="form-group">
<label class="form-control-label">{{ $t('jewpmsApp.stock.status') }}</label>
<b-input-group class="form-control-group">
<b-form-select id="filter-op" v-model="filterParams.status.op" :options="operatorSelect"></b-form-select>
<b-form-select id="filter-status" v-model="filterParams.status.value">
<option :value="null">{{ $t('entity.action.select') }}</option>
<option v-for="dict in statusDicts" :key="dict.number" :value="dict.number">{{ dict.name }}</option>
</b-form-select>
</b-input-group>
</div>
</div>
</div>
@ -74,6 +84,10 @@
<span v-text="$t('jewpmsApp.stock.remark')"></span>
<jhi-sort-indicator :current-order="propOrder" :reverse="reverse" :field-name="'remark'"></jhi-sort-indicator>
</th>
<th scope="row" @click="changeOrder('status')">
<span v-text="$t('jewpmsApp.stock.status')"></span>
<jhi-sort-indicator :current-order="propOrder" :reverse="reverse" :field-name="'status'"></jhi-sort-indicator>
</th>
<th scope="row" @click="changeOrder('sortNo')">
<span v-text="$t('jewpmsApp.stock.sortNo')"></span>
<jhi-sort-indicator :current-order="propOrder" :reverse="reverse" :field-name="'sortNo'"></jhi-sort-indicator>
@ -87,6 +101,7 @@
<td>{{ stock.name }}</td>
<td>{{ stock.property }}</td>
<td>{{ stock.remark }}</td>
<td>{{ statusDicts.find(dict => dict.number === stock.status)?.name || '' }}</td>
<td>{{ stock.sortNo }}</td>
<td class="text-right">
<div class="btn-group">

View File

@ -22,6 +22,7 @@
"name": "仓位名称",
"property": "属性",
"remark": "备注",
"status": "状态",
"sortNo": "排序号",
"company": "所属公司",
"createdBy": "创建人",