fix: 审计日志跳过向量字段,修复 numpy 数组比较异常;补全三大入库单更新向量提取,统一删除确认弹窗
This commit is contained in:
@ -142,6 +142,7 @@ def before_update_listener(mapper, connection, target):
|
|||||||
changes = {}
|
changes = {}
|
||||||
for attr in state.attrs:
|
for attr in state.attrs:
|
||||||
if attr.key in IGNORE_FIELDS: continue
|
if attr.key in IGNORE_FIELDS: continue
|
||||||
|
if 'embedding' in attr.key: continue
|
||||||
if attr.history.has_changes():
|
if attr.history.has_changes():
|
||||||
old_val = attr.history.deleted[0] if attr.history.deleted else None
|
old_val = attr.history.deleted[0] if attr.history.deleted else None
|
||||||
new_val = attr.history.added[0] if attr.history.added else None
|
new_val = attr.history.added[0] if attr.history.added else None
|
||||||
@ -164,6 +165,8 @@ def before_delete_listener(mapper, connection, target):
|
|||||||
state = inspect(target)
|
state = inspect(target)
|
||||||
snap = {}
|
snap = {}
|
||||||
for attr in state.attrs:
|
for attr in state.attrs:
|
||||||
|
if attr.key in IGNORE_FIELDS: continue
|
||||||
|
if 'embedding' in attr.key: continue
|
||||||
val = getattr(target, attr.key, None)
|
val = getattr(target, attr.key, None)
|
||||||
snap[attr.key] = _serialize_value(val)
|
snap[attr.key] = _serialize_value(val)
|
||||||
_create_audit_log(connection, mapper, target, 'delete', {'deleted_snapshot': snap})
|
_create_audit_log(connection, mapper, target, 'delete', {'deleted_snapshot': snap})
|
||||||
@ -180,6 +183,8 @@ def after_insert_listener(mapper, connection, target):
|
|||||||
state = inspect(target)
|
state = inspect(target)
|
||||||
snap = {}
|
snap = {}
|
||||||
for attr in state.attrs:
|
for attr in state.attrs:
|
||||||
|
if attr.key in IGNORE_FIELDS: continue
|
||||||
|
if 'embedding' in attr.key: continue
|
||||||
val = getattr(target, attr.key, None)
|
val = getattr(target, attr.key, None)
|
||||||
snap[attr.key] = _serialize_value(val)
|
snap[attr.key] = _serialize_value(val)
|
||||||
_create_audit_log(connection, mapper, target, 'insert', {'created': snap})
|
_create_audit_log(connection, mapper, target, 'insert', {'created': snap})
|
||||||
|
|||||||
@ -245,6 +245,8 @@ class BuyInboundService:
|
|||||||
if k in data: setattr(stock, v, data[k])
|
if k in data: setattr(stock, v, data[k])
|
||||||
|
|
||||||
if 'arrival_photo' in data: stock.arrival_photo = json.dumps(data['arrival_photo'])
|
if 'arrival_photo' in data: stock.arrival_photo = json.dumps(data['arrival_photo'])
|
||||||
|
if 'arrival_photo' in data and stock.arrival_photo:
|
||||||
|
stock.arrival_image_embedding = extract_and_embed(stock.arrival_photo)
|
||||||
if 'inspection_report' in data: stock.inspection_report = json.dumps(data['inspection_report'])
|
if 'inspection_report' in data: stock.inspection_report = json.dumps(data['inspection_report'])
|
||||||
|
|
||||||
# 更新税率
|
# 更新税率
|
||||||
|
|||||||
@ -219,6 +219,8 @@ class ProductInboundService:
|
|||||||
if 'product_photo' in data:
|
if 'product_photo' in data:
|
||||||
imgs = data['product_photo']
|
imgs = data['product_photo']
|
||||||
if isinstance(imgs, list): stock.product_photo = json.dumps(imgs)
|
if isinstance(imgs, list): stock.product_photo = json.dumps(imgs)
|
||||||
|
if stock.product_photo:
|
||||||
|
stock.arrival_image_embedding = extract_and_embed(stock.product_photo)
|
||||||
if 'quality_report_link' in data:
|
if 'quality_report_link' in data:
|
||||||
imgs = data['quality_report_link']
|
imgs = data['quality_report_link']
|
||||||
if isinstance(imgs, list): stock.quality_report_link = json.dumps(imgs)
|
if isinstance(imgs, list): stock.quality_report_link = json.dumps(imgs)
|
||||||
|
|||||||
@ -275,6 +275,8 @@ class SemiInboundService:
|
|||||||
imgs = data['arrival_photo']
|
imgs = data['arrival_photo']
|
||||||
if isinstance(imgs, list):
|
if isinstance(imgs, list):
|
||||||
stock.arrival_photo = json.dumps(imgs)
|
stock.arrival_photo = json.dumps(imgs)
|
||||||
|
if stock.arrival_photo:
|
||||||
|
stock.arrival_image_embedding = extract_and_embed(stock.arrival_photo)
|
||||||
if 'quality_report_link' in data:
|
if 'quality_report_link' in data:
|
||||||
imgs = data['quality_report_link']
|
imgs = data['quality_report_link']
|
||||||
if isinstance(imgs, list):
|
if isinstance(imgs, list):
|
||||||
|
|||||||
@ -226,11 +226,7 @@
|
|||||||
<el-icon><Printer/></el-icon> 打印
|
<el-icon><Printer/></el-icon> 打印
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button link type="primary" size="default" @click="handleUpdate(row)">编辑</el-button>
|
<el-button link type="primary" size="default" @click="handleUpdate(row)">编辑</el-button>
|
||||||
<el-popconfirm title="确定删除该条记录吗?不可恢复。" @confirm="handleDelete(row)" width="220">
|
<el-button link type="danger" size="default" @click="handleDelete(row)">删除</el-button>
|
||||||
<template #reference>
|
|
||||||
<el-button link type="danger" size="default" v-permission="'inbound_buy:delete'">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-popconfirm>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -1631,7 +1627,22 @@ const handleSortChange = ({ column, prop, order }: any) => {
|
|||||||
fetchData()
|
fetchData()
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDelete = async (row: any) => { try { await deleteBuyInbound(row.id); ElMessage.success('删除成功'); fetchData() } catch (e) { ElMessage.error('删除失败') } }
|
const handleDelete = (row: any) => {
|
||||||
|
const recordName = row.sku || row.barcode || '此项';
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`是否确认删除采购入库记录 "${recordName}" ?`,
|
||||||
|
"警告",
|
||||||
|
{ confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }
|
||||||
|
).then(async () => {
|
||||||
|
try {
|
||||||
|
await deleteBuyInbound(row.id);
|
||||||
|
ElMessage.success('删除成功');
|
||||||
|
fetchData();
|
||||||
|
} catch (e) {
|
||||||
|
ElMessage.error('删除失败');
|
||||||
|
}
|
||||||
|
}).catch(() => {});
|
||||||
|
};
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// 打印逻辑
|
// 打印逻辑
|
||||||
|
|||||||
@ -227,7 +227,7 @@
|
|||||||
<el-icon><Printer/></el-icon>
|
<el-icon><Printer/></el-icon>
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button link type="primary" @click="handleUpdate(row)">编辑</el-button>
|
<el-button link type="primary" @click="handleUpdate(row)">编辑</el-button>
|
||||||
<el-popconfirm title="确定删除?" @confirm="handleDelete(row)"><template #reference><el-button link type="danger">删除</el-button></template></el-popconfirm>
|
<el-button link type="danger" @click="handleDelete(row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -572,7 +572,7 @@
|
|||||||
import { ref, reactive, onMounted, watch, computed } from 'vue'
|
import { ref, reactive, onMounted, watch, computed } from 'vue'
|
||||||
import { Plus, Setting, Refresh, Search, Box, House, Link, InfoFilled, Printer, Camera, Picture, EditPen } from '@element-plus/icons-vue'
|
import { Plus, Setting, Refresh, Search, Box, House, Link, InfoFilled, Printer, Camera, Picture, EditPen } from '@element-plus/icons-vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import { ElMessage, ElLoading } from 'element-plus'
|
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
import {
|
import {
|
||||||
@ -1358,7 +1358,22 @@ const submitForm = async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDelete = async (row: any) => { try { await deleteProductInbound(row.id); ElMessage.success('删除成功'); fetchData() } catch(e) { ElMessage.error('删除失败') } }
|
const handleDelete = (row: any) => {
|
||||||
|
const recordName = row.sku || row.barcode || '此项';
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`是否确认删除成品入库记录 "${recordName}" ?`,
|
||||||
|
"警告",
|
||||||
|
{ confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }
|
||||||
|
).then(async () => {
|
||||||
|
try {
|
||||||
|
await deleteProductInbound(row.id);
|
||||||
|
ElMessage.success('删除成功');
|
||||||
|
fetchData();
|
||||||
|
} catch (e) {
|
||||||
|
ElMessage.error('删除失败');
|
||||||
|
}
|
||||||
|
}).catch(() => {});
|
||||||
|
};
|
||||||
const handlePrint = async (row: any) => {
|
const handlePrint = async (row: any) => {
|
||||||
printVisible.value = true; printLoading.value = true; previewUrl.value = ''
|
printVisible.value = true; printLoading.value = true; previewUrl.value = ''
|
||||||
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, sku: row.sku }
|
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, sku: row.sku }
|
||||||
|
|||||||
@ -250,11 +250,7 @@
|
|||||||
<el-icon><Printer/></el-icon> 打印
|
<el-icon><Printer/></el-icon> 打印
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button link type="primary" size="default" @click="handleUpdate(row)">编辑</el-button>
|
<el-button link type="primary" size="default" @click="handleUpdate(row)">编辑</el-button>
|
||||||
<el-popconfirm title="确定删除该条记录吗?不可恢复。" @confirm="handleDelete(row)" width="220">
|
<el-button link type="danger" size="default" @click="handleDelete(row)">删除</el-button>
|
||||||
<template #reference>
|
|
||||||
<el-button link type="danger" size="default">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-popconfirm>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -627,7 +623,7 @@
|
|||||||
import {ref, reactive, onMounted, watch, computed} from 'vue'
|
import {ref, reactive, onMounted, watch, computed} from 'vue'
|
||||||
import {Plus, Setting, Refresh, Search, Lock, Box, House, InfoFilled, Link, Printer, Camera, Picture, EditPen} from '@element-plus/icons-vue'
|
import {Plus, Setting, Refresh, Search, Lock, Box, House, InfoFilled, Link, Printer, Camera, Picture, EditPen} from '@element-plus/icons-vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import {ElMessage, ElLoading} from 'element-plus'
|
import {ElMessage, ElMessageBox, ElLoading} from 'element-plus'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
import {
|
import {
|
||||||
@ -1438,7 +1434,22 @@ const submitForm = async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDelete = async (row: any) => { try { await deleteSemiInbound(row.id); ElMessage.success('删除成功'); fetchData() } catch (e) { ElMessage.error('删除失败') } }
|
const handleDelete = (row: any) => {
|
||||||
|
const recordName = row.sku || row.barcode || '此项';
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`是否确认删除半成品入库记录 "${recordName}" ?`,
|
||||||
|
"警告",
|
||||||
|
{ confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }
|
||||||
|
).then(async () => {
|
||||||
|
try {
|
||||||
|
await deleteSemiInbound(row.id);
|
||||||
|
ElMessage.success('删除成功');
|
||||||
|
fetchData();
|
||||||
|
} catch (e) {
|
||||||
|
ElMessage.error('删除失败');
|
||||||
|
}
|
||||||
|
}).catch(() => {});
|
||||||
|
};
|
||||||
const handlePrint = async (row: any) => {
|
const handlePrint = async (row: any) => {
|
||||||
printVisible.value = true; printLoading.value = true; previewUrl.value = ''
|
printVisible.value = true; printLoading.value = true; previewUrl.value = ''
|
||||||
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, batch_number: row.batch_number, sku: row.sku }
|
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, batch_number: row.batch_number, sku: row.sku }
|
||||||
|
|||||||
Reference in New Issue
Block a user