|
@@ -42,20 +42,6 @@
|
|
|
class="!w-200px"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
- <!--
|
|
|
- <el-form-item :label="t('workOrderMaterial.materialGroup')" prop="materialGroupId" style="margin-left: 5px">
|
|
|
- <el-tree-select
|
|
|
- filterable
|
|
|
- v-model="queryParams.materialGroupId"
|
|
|
- :data="materialGroupList"
|
|
|
- :props="defaultProps"
|
|
|
- check-strictly
|
|
|
- node-key="id"
|
|
|
- :placeholder="t('workOrderMaterial.groupHolder')"
|
|
|
- class="!w-220px"
|
|
|
- clearable
|
|
|
- />
|
|
|
- </el-form-item> -->
|
|
|
<el-form-item>
|
|
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" />
|
|
|
{{ t('workOrderMaterial.search') }}</el-button>
|
|
@@ -105,9 +91,19 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column :label="t('workOrderMaterial.materialName')" align="center" prop="name" />
|
|
|
<el-table-column :label="t('workOrderMaterial.materialCode')" align="center" prop="code" />
|
|
|
- <!-- <el-table-column :label="t('deviceForm.model')" align="center" prop="model" /> -->
|
|
|
<el-table-column :label="t('workOrderMaterial.unit')" align="center" prop="unit" />
|
|
|
- <!-- <el-table-column :label="t('form.remark')" align="center" prop="remark" show-overflow-tooltip /> -->
|
|
|
+ <el-table-column :label="t('route.quantity')" align="center" prop="quantity">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ type="number"
|
|
|
+ :controls="false"
|
|
|
+ v-model="scope.row.quantity"
|
|
|
+ @click.stop=""
|
|
|
+ @focus="handleInputFocus(scope.row)"
|
|
|
+ @blur="(event) => handleQuantityBlur(event, scope.row)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column
|
|
|
:label="t('deviceList.createTime')"
|
|
|
align="center"
|
|
@@ -148,7 +144,7 @@ const emit = defineEmits<{
|
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
|
const loading = ref(true) // 列表的加载中
|
|
|
const queryFormRef = ref() // 搜索的表单
|
|
|
-const list = ref<DictDataVO[]>([]) // 列表的数据
|
|
|
+const list = ref<MaterialApi.MaterialVO[]>([]) // 列表的数据
|
|
|
const total = ref(0) // 列表的总页数
|
|
|
const selectedRows = ref<MaterialApi.MaterialVO[]>([]); // 多选数据(存储所有选中行的数组)
|
|
|
const tableRef = ref();
|
|
@@ -168,17 +164,24 @@ const queryParams = reactive({
|
|
|
|
|
|
const selectedRow = ref(null);
|
|
|
|
|
|
+// 更新选中物料数量的方法
|
|
|
+const updateSelectedRowQuantity = (row: MaterialApi.MaterialVO) => {
|
|
|
+ const selectedItem = selectedRows.value.find(item => item.id === row.id);
|
|
|
+ if (selectedItem) {
|
|
|
+ selectedItem.quantity = row.quantity;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
// 处理单选逻辑
|
|
|
const selectRow = (row) => {
|
|
|
- // selectedRow.value = selectedRow.value?.id === row.id ? null : row;
|
|
|
- // emit('choose', row)
|
|
|
const index = selectedRows.value.findIndex(item => item.id === row.id);
|
|
|
if (index > -1) {
|
|
|
selectedRows.value.splice(index, 1); // 取消选中
|
|
|
+ row.quantity = undefined;
|
|
|
} else {
|
|
|
- selectedRows.value.push(row); // 选中
|
|
|
+ selectedRows.value.push({ ...row }); // 选中
|
|
|
}
|
|
|
- // dialogVisible.value = false
|
|
|
};
|
|
|
|
|
|
// 点击整行选中
|
|
@@ -203,6 +206,14 @@ const getList = async () => {
|
|
|
const data = await MaterialApi.getMaterialPage(queryParams)
|
|
|
list.value = data.list
|
|
|
total.value = data.total
|
|
|
+
|
|
|
+ // 同步selectedRows中的数量到当前页数据
|
|
|
+ list.value.forEach(row => {
|
|
|
+ const selectedItem = selectedRows.value.find(item => item.id === row.id);
|
|
|
+ if (selectedItem && selectedItem.quantity !== undefined) {
|
|
|
+ row.quantity = selectedItem.quantity;
|
|
|
+ }
|
|
|
+ });
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
@@ -228,12 +239,52 @@ const removeTag = (material: MaterialApi.MaterialVO) => {
|
|
|
if (rowInTable) {
|
|
|
const rowIndex = list.value.indexOf(rowInTable);
|
|
|
// 这里可以添加逻辑强制更新行状态(如果需要)
|
|
|
+ rowInTable.quantity = undefined;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// 处理 消耗数量 quantity 输入框失焦事件
|
|
|
+const handleQuantityBlur = (event: Event, row: any) => {
|
|
|
+ const inputValue = (event.target as HTMLInputElement).value;
|
|
|
+ let num = parseFloat(inputValue);
|
|
|
+ // 处理无效值
|
|
|
+ if (isNaN(num)) {
|
|
|
+ row.quantity = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 处理小于等于0的情况
|
|
|
+ if (num <= 0) {
|
|
|
+ row.quantity = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 保留两位小数
|
|
|
+ row.quantity = parseFloat(num.toFixed(2));
|
|
|
+ // 实时更新selectedRows
|
|
|
+ updateSelectedRowQuantity(row);
|
|
|
+};
|
|
|
+
|
|
|
+// 处理输入框焦点事件(自动选中当前行)
|
|
|
+const handleInputFocus = (row: MaterialApi.MaterialVO) => {
|
|
|
+ const getRowUniqueKey = (row) => {
|
|
|
+ return `${row.code}_${row.name}`
|
|
|
+ }
|
|
|
+ const currentKey = getRowUniqueKey(row)
|
|
|
+ // 如果未选中则添加到选中列表
|
|
|
+ const exists = selectedRows.value.some(item => getRowUniqueKey(item) === currentKey)
|
|
|
+ if (!exists) {
|
|
|
+ selectedRows.value.push(row)
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
// 确认选择
|
|
|
const handleConfirm = () => {
|
|
|
+ // 同步当前页所有选中行的最新数量
|
|
|
+ list.value.forEach(row => {
|
|
|
+ if (selectedRows.value.some(item => item.id === row.id)) {
|
|
|
+ updateSelectedRowQuantity(row);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
if (selectedRows.value.length === 0) {
|
|
|
ElMessage.warning('请至少选择一个物料')
|
|
|
return
|
|
@@ -243,7 +294,8 @@ const handleConfirm = () => {
|
|
|
// 确保返回必要字段
|
|
|
code: row.code,
|
|
|
name: row.name,
|
|
|
- unit: row.unit
|
|
|
+ unit: row.unit,
|
|
|
+ quantity: row.quantity,
|
|
|
})))
|
|
|
dialogVisible.value = false;
|
|
|
handleClose()
|