20260518172616

This commit is contained in:
oneao committed 2026-05-18 17:26:17 +08:00
1 parent 2e704bbbb0
commit 5cfc87eee8
8 files changed
+500 -276

No files matched your search

@@ -19,6 +19,9 @@ const form = ref({
ocrNo: '',
})
const subFileListRef = ref()
const subFileListRef2 = ref()
const subFileList = ref([]) // 装货照片
const subFileList2 = ref([]) // 发货单、签收单、过磅单
@@ -114,38 +117,16 @@ function handleDeleteBoxImage() {
resetForm()
}
function onItemClick(fileItem: UploadFileItem) {
console.log(fileItem)
if (!isImageUrl(fileItem.mx_mapfilename) && !isVideoUrl(fileItem.mx_mapfilename)) {
downloadFile(fileItem.mx_mapfilename, fileItem.name)
}
}
function beforeRead(file: UploadFile): boolean | Promise<UploadFile> {
// 非图片直接允许上传
if (!isImage(file.name))
return true
// 图片异步压缩,返回修改后的 UploadFile 对象
return imageCompress(file.path).then((res) => {
file.path = res.path
file.size = res.size
return file
}).catch((err) => {
console.error('图片压缩失败:', err)
return file
})
}
function beforeRemove(_index: number, _fileItem: UploadFileItem): boolean | Promise<void> {
return new Promise((resolve, reject) => {
dialog.confirm({
title: '提示',
message: `确定删除该张图片吗?`,
onConfirm: () => resolve(),
onCancel: () => reject(),
onClose: () => reject(),
})
function handleBeforeRemove({ file, fileList, resolve }) {
dialog.confirm({
title: '提示',
message: '确定删除该文件吗?',
onConfirm: () => {
resolve(true)
},
onCancel: () => {
resolve(false)
},
})
}
@@ -155,7 +136,7 @@ async function handleConfirm() {
return
}
if (form.value.b_container_no === '') {
if (!form.value.b_container_no) {
toast.fail('集装箱号不能为空')
return
}
@@ -170,112 +151,154 @@ async function handleConfirm() {
transparent: false,
})
const mainTable = {
b_id: form.value.b_id,
b_container_no: form.value.b_container_no,
b_container_img: form.value.b_container_img,
b_ocr_no: form.value.ocrNo,
b_ocr_score: form.value.ocrScore || 0.00,
}
const fileInserts = []
try {
const mainTable = {
b_id: form.value.b_id,
b_container_no: form.value.b_container_no,
b_container_img: form.value.b_container_img,
b_ocr_no: form.value.ocrNo,
b_ocr_score: form.value.ocrScore || 0.00,
}
// 主表
await uploadContainerFileApi(boxImage.value.path, {
jobId: form.value.b_id,
containerNo: form.value.b_container_no,
fileName: boxImage.value.name,
}).then((res) => {
if (res.success) {
mainTable.b_container_img = res.data.path
const fileInserts = []
// =========================
// 上传主图
// =========================
const mainRes = await uploadContainerFileApi(
boxImage.value.path,
{
jobId: form.value.b_id,
containerNo: form.value.b_container_no,
fileName: boxImage.value.name,
},
)
if (mainRes.success) {
mainTable.b_container_img = mainRes.data.path
fileInserts.push({
subid: res.data.uid,
subid: mainRes.data.uid,
father: form.value.b_id,
mx_xh: 0,
mx_filename: res.data.fileName,
mx_filename: mainRes.data.fileName,
mx_filesize: boxImage.value.size,
mx_fileext: getFileExtension(boxImage.value.name),
mx_mapfilename: res.data.path,
mx_mapfilename: mainRes.data.path,
mx_moduleid: 'b_container',
mx_cate_id: '0',
})
}
})
const indexMap = {}
// =========================
// 附件排序
// =========================
const indexMap = {}
const getNextIndex = (cate) => {
if (!indexMap[cate]) {
indexMap[cate] = 1
const getNextIndex = (cate) => {
if (!indexMap[cate]) {
indexMap[cate] = 1
}
return indexMap[cate]++
}
return indexMap[cate]++
}
const allFiles = [
...subFileList.value.map(item => ({
...item,
cate: '1',
})),
...subFileList2.value.map(item => ({
...item,
cate: '2',
})),
]
// =========================
// 获取附件
// =========================
const subFiles = subFileListRef.value?.$.setupState.uploadFiles || []
const subFiles2 = subFileListRef2.value?.$.setupState.uploadFiles || []
for (const fileItem of allFiles) {
const res = await uploadContainerFileApi(fileItem.file.path, {
jobId: form.value.b_id,
containerNo: form.value.b_container_no,
fileName: fileItem.name,
})
const allFiles = [
...subFiles.map(item => ({
...item,
cate: '1',
})),
...subFiles2.map(item => ({
...item,
cate: '2',
})),
]
if (!res.success)
continue
// =========================
// 上传附件
// =========================
for (const fileItem of allFiles) {
try {
let uploadPath = fileItem.url
fileInserts.push({
subid: res.data.uid,
father: form.value.b_id,
mx_xh: getNextIndex(fileItem.cate),
mx_filename: res.data.fileName,
mx_filesize: fileItem.file.size,
mx_fileext: getFileExtension(fileItem.file.name),
mx_mapfilename: res.data.path,
mx_moduleid: 'b_container',
mx_cate_id: fileItem.cate,
})
}
// 图片压缩
if (isImage(fileItem.name)) {
const compressRes = await imageCompress(fileItem.url)
uploadPath = compressRes.path
}
const reqData = [
{
tableName: 'b_container',
keyField: 'b_id',
inserts: [mainTable],
updates: [],
deletes: [],
},
{
tableName: 'bf_file',
keyField: 'subid',
inserts: fileInserts,
updates: [],
deletes: [],
},
]
const res = await uploadContainerFileApi(uploadPath, {
jobId: form.value.b_id,
containerNo: form.value.b_container_no,
fileName: fileItem.name,
})
saveObjectApi(reqData).then((res) => {
if (res.success) {
if (!res.success) {
continue
}
fileInserts.push({
subid: res.data.uid,
father: form.value.b_id,
mx_xh: getNextIndex(fileItem.cate),
mx_filename: res.data.fileName,
mx_filesize: fileItem.size,
mx_fileext: getFileExtension(fileItem.name),
mx_mapfilename: res.data.path,
mx_moduleid: 'b_container',
mx_cate_id: fileItem.cate,
})
}
catch (err) {
console.error('附件上传失败:', fileItem, err)
}
}
// =========================
// 保存数据
// =========================
const reqData = [
{
tableName: 'b_container',
keyField: 'b_id',
inserts: [mainTable],
updates: [],
deletes: [],
},
{
tableName: 'bf_file',
keyField: 'subid',
inserts: fileInserts,
updates: [],
deletes: [],
},
]
const saveRes = await saveObjectApi(reqData)
if (saveRes.success) {
toast.success('保存成功')
tipContainerNo.value = form.value.b_container_no
showResult.value = true
}
else {
toast.fail('保存失败')
}
}).catch(() => {
}
catch (err) {
console.error(err)
toast.fail('保存失败')
}).finally(() => {
}
finally {
toast.hide()
})
}
}
// 集装箱号校验
@@ -446,12 +469,14 @@ const templateCollapse = ref<string[]>(['template1'])
</view>
</template>
<view class="step-content">
<sar-upload
v-model="subFileList"
<wd-upload
ref="subFileListRef"
v-model:file-list="subFileList"
:auto-upload="false"
:before-remove="handleBeforeRemove"
multiple
:before-read="beforeRead"
:before-remove="beforeRemove"
@item-click="onItemClick"
accept="all"
:max-size="50 * 1024 * 1024"
/>
</view>
</wd-cell-group>
@@ -465,12 +490,14 @@ const templateCollapse = ref<string[]>(['template1'])
</view>
</template>
<view class="step-content">
<sar-upload
v-model="subFileList2"
<wd-upload
ref="subFileListRef2"
v-model:file-list="subFileList2"
:auto-upload="false"
:before-remove="handleBeforeRemove"
multiple
:before-read="beforeRead"
:before-remove="beforeRemove"
@item-click="onItemClick"
accept="all"
:max-size="50 * 1024 * 1024"
/>
</view>
</wd-cell-group>