强化文件api,添加FilePond

This commit is contained in:
AlanScipio
2024-02-22 11:19:57 +08:00
parent da8d9f2fed
commit 7b71fd28e4
57 changed files with 1798 additions and 1542 deletions

View File

@@ -19,6 +19,10 @@
"echarts": "5.4.3",
"element-plus": "2.4.3",
"file-saver": "2.0.5",
"filepond": "^4.30.6",
"filepond-plugin-file-validate-size": "^2.2.8",
"filepond-plugin-file-validate-type": "^1.2.9",
"filepond-plugin-image-preview": "^4.6.12",
"fuse.js": "6.6.2",
"js-cookie": "3.0.5",
"jsencrypt": "3.3.2",
@@ -26,6 +30,7 @@
"pinia": "2.1.7",
"vue": "3.3.9",
"vue-cropper": "1.1.1",
"vue-filepond": "^7.0.4",
"vue-router": "4.2.5"
},
"devDependencies": {
@@ -33,9 +38,9 @@
"@vue/compiler-sfc": "3.3.9",
"sass": "1.69.5",
"unplugin-auto-import": "0.17.1",
"unplugin-vue-setup-extend-plus": "1.0.0",
"vite": "5.0.4",
"vite-plugin-compression": "0.5.1",
"vite-plugin-svg-icons": "2.0.1",
"unplugin-vue-setup-extend-plus": "1.0.0"
"vite-plugin-svg-icons": "2.0.1"
}
}

View File

@@ -16,3 +16,29 @@ export function getFileRecord(fileId) {
method: 'get'
})
}
// 新增文件存储记录
export function addFileRecord(data) {
return request({
url: '/file/FileRecord',
method: 'post',
data: data
})
}
// 修改文件存储记录
export function updateFileRecord(data) {
return request({
url: '/file/FileRecord',
method: 'put',
data: data
})
}
// 删除文件存储记录
export function delFileRecord(fileId) {
return request({
url: '/file/FileRecord/' + fileId,
method: 'delete'
})
}

View File

@@ -1,4 +1,4 @@
import request from '@/utils/request'
import request, { upload } from '@/utils/request'
// 查询物品基础信息列表
export function listItemInfo(query) {
@@ -18,21 +18,35 @@ export function getItemInfo(itemCd) {
}
// 新增物品基础信息
export function addItemInfo(data) {
return request({
url: '/wms/ItemInfo',
method: 'post',
data: data
})
export function addItemInfo(data, withImage = false, imageFiles = []) {
if (withImage) {
//连着图片文件一起提交
const url = '/wms/ItemInfo/addWithImage'
return upload(url, imageFiles, data)
} else {
//只提交json数据
return request({
url: '/wms/ItemInfo',
method: 'post',
data: data
})
}
}
// 修改物品基础信息
export function updateItemInfo(data) {
return request({
url: '/wms/ItemInfo',
method: 'put',
data: data
})
export function updateItemInfo(data, withImage = false, imageFiles = []) {
if (withImage) {
//连着图片文件一起提交
const url = '/wms/ItemInfo/editWithImage'
return upload(url, imageFiles, data, { method: 'put' })
} else {
//只提交json数据
return request({
url: '/wms/ItemInfo',
method: 'put',
data: data
})
}
}
// 删除物品基础信息

View File

@@ -0,0 +1,169 @@
<template>
<div>
<!--
allowFileSizeValidation: true //开启文件大小检验
allowFileTypeValidation: true //开启文件类型检验
allowImagePreview: true //开启图片预览
allowMultiple: true //启用多文件上传
allowProcess: false //禁用组件自己的上传按钮
allowRevert: false //禁用撤销按钮
instantUpload: false //禁用自动上传
credits: false //隐藏[Powered by PQINA]字样
-->
<file-pond
ref="pond"
@Init="handleInit"
label-idle="拖放文件到这里..."
:max-file-size="fileSize"
:accepted-file-types="fileType"
:max-files="maxFilesLimit"
:image-preview-min-height="imgPreviewMinHeight"
:image-preview-max-height="imgPreviewMaxHeight"
:image-preview-height="imgPreviewFixedHeight"
:allow-file-size-validation="true"
:allow-file-type-validation="true"
:allow-image-preview="true"
:allow-multiple="true"
:allow-process="false"
:allow-revert="false"
:instant-upload="false"
credits="false"
/>
</div>
</template>
<script setup>
// Import FilePond
import vueFilePond from 'vue-filepond';
// Import plugins
import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type';
import FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size';
import FilePondPluginImagePreview from 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview';
// Import styles
import 'filepond/dist/filepond.min.css';
import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.css';
// Create FilePond component
const FilePond = vueFilePond(FilePondPluginFileValidateType, FilePondPluginFileValidateSize, FilePondPluginImagePreview);
const pond = ref(null);
const {proxy} = getCurrentInstance();
const emit = defineEmits();
const props = defineProps({
// 文件数量限制
limit: {
type: Number,
default: 5,
},
// 单个文件大小限制
fileSize: {
type: String,
default: '5MB',
},
// 总体文件大小限制格式同fileSize
totalFileSize: {
type: String,
default: null,
},
// 允许上传的文件类型
fileType: {
type: Array,
default: () => [
//文档
'text/plain', 'application/pdf', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
//图片
'image/jpeg', 'image/png', 'image/webp', 'image/gif',
//压缩包
'application/vnd.rar', 'application/zip', 'application/x-7z-compressed',
],
},
// 允许上传的最大文件数量
maxFilesLimit: {
type: Number,
default: 1,
},
// 图片预览最小高度
imgPreviewMinHeight: {
type: Number,
default: 44,
},
// 图片预览最大高度
imgPreviewMaxHeight: {
type: Number,
default: 256,
},
// 图片预览固定高度
imgPreviewFixedHeight: {
type: Number,
default: null,
},
});
defineExpose({
pond,
getFiles,
getFile,
addFile,
addFiles,
removeFile,
removeFiles,
});
// 初始化
function handleInit() {
// console.info('pond.value', pond.value)
// console.info('FilePond', FilePond)
}
// 获取文件确保一定返回JavaScript File对象的数组
function getFiles() {
const pondFiles = pond.value.getFiles()
if (pondFiles) {
const jsFiles = []
for (let i = 0; i < pondFiles.length; i++) {
jsFiles.push(pondFiles[i].file)
}
return jsFiles
} else {
return []
}
}
// 获取指定索引的文件JavaScript File对象
function getFile(index) {
const pondFile = pond.value.getFile(index)
return pondFile ? pondFile.file : null;
}
// 添加文件
function addFile(source) {
pond.value.addFile(source);
}
function addFiles(source) {
pond.value.addFiles(source);
}
// 移除文件
function removeFile(index) {
pond.value.removeFile(index);
}
// 移除所有文件
function removeFiles() {
pond.value.removeFiles();
}
</script>
<!--
注意如果需要网格布局则需要在没有scoped的style标签里添加式样示例如下
<style>
.filepond--item {
width: calc(20% - 0.5em);
}
</style>
-->

View File

@@ -40,7 +40,7 @@
<img
:src="dialogImageUrl"
style="display: block; max-width: 100%; margin: 0 auto"
/>
alt=""/>
</el-dialog>
</div>
</template>

View File

@@ -43,6 +43,8 @@ import ImagePreview from "@/components/ImagePreview"
import TreeSelect from '@/components/TreeSelect'
// 字典标签组件
import DictTag from '@/components/DictTag'
// FilePond文件上传组件
import FpFileUpload from '@/components/FpFileUpload'
const app = createApp(App)
@@ -65,6 +67,7 @@ app.component('ImageUpload', ImageUpload)
app.component('ImagePreview', ImagePreview)
app.component('RightToolbar', RightToolbar)
app.component('Editor', Editor)
app.component('FpFileUpload', FpFileUpload)
app.use(router)
app.use(store)

View File

@@ -1,152 +1,233 @@
import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
import {ElNotification, ElMessageBox, ElMessage, ElLoading} from 'element-plus'
import {getToken} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from '@/utils/ruoyi'
import {tansParams, blobValidate} from '@/utils/ruoyi'
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import {saveAs} from 'file-saver'
import useUserStore from '@/store/modules/user'
let downloadLoadingInstance;
// 是否显示重新登录
export let isRelogin = { show: false };
export let isRelogin = {show: false};
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 10000
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 60000
})
// request拦截器
/**
* 请求拦截器
*/
service.interceptors.request.use(config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制无法进行防重复提交验证。')
return config;
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params);
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
} else {
cache.session.setJSON('sessionObj', requestObj)
}
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
}
const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
if (requestSize >= limitSize) {
console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制无法进行防重复提交验证。')
return config;
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
} else {
cache.session.setJSON('sessionObj', requestObj)
}
}
}
}
return config
return config
}, error => {
console.log(error)
Promise.reject(error)
})
// 响应拦截器
/**
* 响应拦截器
*/
service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
})
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) {
ElMessage({message: msg, type: 'error'})
return Promise.reject(new Error(msg))
} else if (code === 601) {
ElMessage({message: msg, type: 'warning'})
return Promise.reject(new Error('[WARNING]' + msg))
} else if (code !== 200) {
ElNotification.error({title: msg})
return Promise.reject('error')
} else {
return Promise.resolve(res.data)
}
},
error => {
console.log('err' + error)
let {message} = error;
if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
ElMessage({message: message, type: 'error', duration: 5 * 1000})
return Promise.reject(error)
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true;
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
})
}).catch(() => {
isRelogin.show = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) {
ElMessage({ message: msg, type: 'error' })
return Promise.reject(new Error(msg))
} else if (code === 601) {
ElMessage({ message: msg, type: 'warning' })
return Promise.reject(new Error(msg))
} else if (code !== 200) {
ElNotification.error({ title: msg })
return Promise.reject('error')
} else {
return Promise.resolve(res.data)
}
},
error => {
console.log('err' + error)
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
} else if (message.includes("timeout")) {
message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
return Promise.reject(error)
}
)
// 通用下载方法
export function download(url, params, filename, config) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
...config
}).then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data])
saveAs(blob, filename)
/**
* 通用下载方法
*
* @param url 请求地址
* @param params 请求参数
* @param filename 下载文件名
* @param type 请求类型可选值form、json默认为form
* @param config axios配置
* @returns {Promise<void>}
*/
export function download(url, params, filename, type = 'form', config = {}) {
let headers, finalSubmitData
if (type === 'json') {
//处理json格式
headers = {'Content-Type': 'application/json'}
finalSubmitData = JSON.stringify(params)
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
//处理form格式
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
finalSubmitData = params
if (!config) {
config = {}
}
config.transformRequest = [(params) => {
return tansParams(params)
}]
}
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
downloadLoadingInstance = ElLoading.service({text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)",})
return service.post(url, {
headers: headers,
data: finalSubmitData,
responseType: 'blob',
...config
}).then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data])
saveAs(blob, filename)
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
}
}).catch((error) => {
console.error(error)
if (!error.includes('[WARNING]')) {
ElMessage.error('下载文件出现错误,请联系管理员!')
}
}).finally(() => {
downloadLoadingInstance.close()
})
}
/**
* 通用上传方法
*
* @param url 上传地址
* @param files 要上传的文件数组如果数组中的元素可以直接是File对象此时提交的字段名默认为"files"。否则数组中的元素应该是一个键值对的对象,其中"key"是字段名,"value"是File对象。
* @param otherSubmitData 其他要提交的数据(一个键值对的对象)
* @param config axios配置
* @returns {Promise<void>}
*/
export function upload(url, files, otherSubmitData, config = {}) {
//组装表单数据
const formData = new FormData()
for (let i = 0; i < files.length; i++) {
const fileObj = files[i];
if (fileObj instanceof File) {
formData.append('files', fileObj);
} else {
formData.append(fileObj.key, fileObj.value);
}
}
if (otherSubmitData) {
const keys = Object.keys(otherSubmitData);
for (let i = 0; i < keys.length; i++) {
const key = keys[i]
//只提交非空数据
if (otherSubmitData[key]) {
formData.append(key, otherSubmitData[key])
}
}
}
//上传
const loadingInstance = ElLoading.service({text: "正在上传数据,请稍候", background: "rgba(0, 0, 0, 0.7)",})
return service.request({
url: url,
method: 'post',
headers: {'Content-Type': 'multipart/form-data'},
data: formData,
...config
}).catch((r) => {
console.error('Upload file error:', r)
return Promise.reject(r)
}).finally(() => {
loadingInstance.close()
})
}
export default service

View File

@@ -209,13 +209,13 @@ export function tansParams(params) {
let result = ''
for (const propName of Object.keys(params)) {
const value = params[propName];
var part = encodeURIComponent(propName) + "=";
let part = encodeURIComponent(propName) + "=";
if (value !== null && value !== "" && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']';
var subPart = encodeURIComponent(params) + "=";
let subPart = encodeURIComponent(params) + "=";
result += subPart + encodeURIComponent(value[key]) + "&";
}
}

View File

@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="85px">
<el-form-item label="文件ID" prop="fileId">
<el-input
v-model="queryParams.fileId"
@@ -17,13 +17,27 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="文件后缀" prop="extension">
<el-input
v-model="queryParams.extension"
placeholder="请输入文件后缀"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
@@ -33,26 +47,36 @@
v-hasPermi="['file:FileRecord:export']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['wms:FileRecord:remove']"
>删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="FileRecordList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table v-loading="loading" :data="FileRecordList" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="30" align="center" />
<el-table-column label="文件ID" align="center" prop="fileId" />
<el-table-column label="保存文件名" align="center" prop="savedName" />
<el-table-column label="原始文件名" align="center" prop="originalName" />
<el-table-column label="保存文件名" width="190" align="center" prop="savedName" />
<el-table-column label="原始文件名" width="200" align="center" prop="originalName" />
<el-table-column label="文件路径" align="center" prop="filePath" />
<el-table-column label="文件后缀" align="center" prop="extension" />
<el-table-column label="存储方式" align="center" prop="storageType" />
<el-table-column label="获取文件URL" align="center" prop="requestUrl" />
<el-table-column label="文件URL" align="center" prop="requestUrl" />
<el-table-column label="文件大小(Byte)" align="center" prop="fileSize" />
<el-table-column label="创建者" align="center" prop="createBy" />
<el-table-column label="创建者ID" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column label="更新者ID" align="center" prop="updateBy" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
@@ -71,7 +95,7 @@
</template>
<script setup name="FileRecord">
import { listFileRecord, getFileRecord } from "@/api/file/FileRecord";
import { listFileRecord, delFileRecord } from "@/api/file/FileRecord";
const { proxy } = getCurrentInstance();
@@ -89,10 +113,11 @@ const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
pageSize: 20,
fileId: null,
savedName: null,
originalName: null,
extension: null,
},
rules: {
}
@@ -155,6 +180,24 @@ function handleSelectionChange(selection) {
multiple.value = !selection.length;
}
/** 删除按钮操作 */
function handleDelete(row) {
const _fileIds = row.fileId || ids.value;
proxy.$modal.confirm('是否确认删除文件ID为"' + _fileIds + '"的数据项?').then(function() {
return delFileRecord(_fileIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download('file/FileRecord/export', {
...queryParams.value
}, `FileRecord_${new Date().getTime()}.xlsx`)
}
//页面打开时查询
//getList();
</script>

View File

@@ -65,7 +65,7 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="SeqRuleList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table v-loading="loading" :data="SeqRuleList" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="规则ID" align="center" prop="ruleId" />
<el-table-column label="序列号识别码" align="center" prop="seqDistCd" />
@@ -132,7 +132,7 @@
<el-form-item label="状态" prop="enableFlag">
<el-radio-group v-model="form.enableFlag">
<el-radio
v-for="dict in sys_normal_disable"
v-for="dict in sys_enable_flag"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
@@ -153,7 +153,7 @@
import { listSeqRule, getSeqRule, delSeqRule, addSeqRule, updateSeqRule, changeRuleEnableFlag } from "@/api/system/SeqRule";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const { sys_enable_flag } = proxy.useDict("sys_enable_flag");
const SeqRuleList = ref([]);
const open = ref(false);
@@ -185,10 +185,10 @@ const data = reactive({
{ required: true, message: "前缀不能为空", trigger: "blur" }
],
minDigits: [
{ required: true, message: "序列号数字部分的最小位数不足补0不能为空", trigger: "blur" }
{ required: true, message: "最小位数不能为空", trigger: "blur" }
],
enableFlag: [
{ required: true, message: "是否启用不能为空", trigger: "blur" }
{ required: true, message: "启用状态不能为空", trigger: "blur" }
],
}
});

View File

@@ -3,18 +3,18 @@
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="物品代码" prop="itemCd">
<el-input
v-model="queryParams.itemCd"
placeholder="请输入物品代码"
clearable
@keyup.enter="handleQuery"
v-model="queryParams.itemCd"
placeholder="请输入物品代码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="物品名称" prop="itemName">
<el-input
v-model="queryParams.itemName"
placeholder="请输入物品名称"
clearable
@keyup.enter="handleQuery"
v-model="queryParams.itemName"
placeholder="请输入物品名称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
@@ -26,74 +26,88 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['wms:ItemInfo:add']"
>新增</el-button>
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['wms:ItemInfo:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['wms:ItemInfo:edit']"
>修改</el-button>
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['wms:ItemInfo:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['wms:ItemInfo:remove']"
>删除</el-button>
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['wms:ItemInfo:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['wms:ItemInfo:export']"
>导出</el-button>
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['wms:ItemInfo:export']"
>导出
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="ItemInfoList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="物品代码" align="center" prop="itemCd" />
<el-table-column label="物品名称" align="center" prop="itemName" />
<el-table-column label="默认库位号" align="center" prop="defaultStgBinCd" />
<el-table-column label="启用标志" align="center" prop="enableFlg" />
<el-table-column label="批号管理区分" align="center" prop="lotNoMgmtCls" />
<el-table-column label="物品类型代码" align="center" prop="itemTypeCd" />
<el-table-column label="标准单位代码" align="center" prop="stdUnitCd" />
<el-table-column label="包装单位代码" align="center" prop="pkgUnitCd" />
<el-table-column label="生产商" align="center" prop="manufacturer" />
<el-table-column label="供应商" align="center" prop="supplier" />
<el-table-column label="安全库存量" align="center" prop="safetyStock" />
<el-table-column label="最大库存量" align="center" prop="maxInvQty" />
<el-table-column label="购买阈值" align="center" prop="purchLimitQty" />
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wms:ItemInfo:edit']">修改</el-button>-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['wms:ItemInfo:remove']">删除</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table v-loading="loading" :data="ItemInfoList" @selection-change="handleSelectionChange"
:show-overflow-tooltip="true">
<el-table-column type="selection" width="30" align="center"/>
<el-table-column label="物品代码" align="center" prop="itemCd"/>
<el-table-column label="物品名称" width="120" align="center" prop="itemName"/>
<el-table-column label="启用标志" align="center" prop="enableFlg">
<template #default="scope">
<dict-tag :options="sys_enable_flag" :value="scope.row.enableFlg"/>
</template>
</el-table-column>
<el-table-column label="物品类型" align="center" prop="itemTypeName"/>
<el-table-column label="物品图片" align="center" prop="viewImg">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleViewImage(scope.row)">查看</el-button>
</template>
</el-table-column>
<el-table-column label="标准单位" align="center" prop="stdUnitName"/>
<el-table-column label="包装单位" align="center" prop="pkgUnitName"/>
<el-table-column label="批号管理" align="center" prop="lotNoMgmtCls"/>
<el-table-column label="默认库位号" width="100" align="center" prop="defaultStgBinCd"/>
<el-table-column label="生产商" align="center" prop="manufacturer"/>
<el-table-column label="供应商" align="center" prop="supplier"/>
<el-table-column label="安全库存量" width="90" align="center" prop="safetyStock"/>
<el-table-column label="最大库存量" width="90" align="center" prop="maxInvQty"/>
<el-table-column label="购买阈值" align="center" prop="purchLimitQty"/>
<el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['wms:ItemInfo:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['wms:ItemInfo:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改物品基础信息对话框 -->
@@ -105,67 +119,106 @@
<el-row>
<el-col :span="12">
<el-form-item label="物品代码" prop="itemCd">
<el-input v-model="form.itemCd" placeholder="请输入物品代码" />
<el-input v-model="form.itemCd" placeholder="请输入物品代码"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物品名称" prop="itemName">
<el-input v-model="form.itemName" placeholder="请输入物品名称" />
<el-input v-model="form.itemName" placeholder="请输入物品名称"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="启用标志" prop="enableFlg">
<el-input v-model="form.enableFlg" placeholder="请输入启用标志" />
<el-radio-group v-model="form.enableFlg">
<el-radio
v-for="dict in sys_enable_flag"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物品类型" prop="itemTypeCd">
<el-input v-model="form.itemTypeCd" placeholder="请输入物品类型代码" />
<el-select v-model="form.itemTypeCd" placeholder="请选择物品类型" clearable filterable>
<el-option
v-for="item in itemTypeList"
:key="item.itemTypeCd"
:label="item.itemTypeName"
:value="item.itemTypeCd"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="供应商" prop="supplier">
<el-input v-model="form.supplier" placeholder="请输入供应商" />
<el-input v-model="form.supplier" placeholder="请输入供应商"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产商" prop="manufacturer">
<el-input v-model="form.manufacturer" placeholder="请输入生产商" />
<el-input v-model="form.manufacturer" placeholder="请输入生产商"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="物品区分" prop="goodsCls">
<el-input v-model="form.goodsCls" placeholder="请输入物品区分" />
<el-form-item label="自定物品区分" prop="goodsCls">
<el-input v-model="form.goodsCls" placeholder="请输入自定物品区分"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="批号管理" prop="lotNoMgmtCls">
<el-input v-model="form.lotNoMgmtCls" placeholder="请输入批号管理区分" />
<el-radio-group v-model="form.lotNoMgmtCls">
<el-radio
v-for="dict in sys_enable_flag"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="标准单位" prop="stdUnitCd">
<el-input v-model="form.stdUnitCd" placeholder="请输入标准单位代码" />
<el-select v-model="form.stdUnitCd" placeholder="请选择标准单位" clearable filterable>
<el-option
v-for="item in unitList"
:key="item.unitCode"
:label="item.unitName"
:value="item.unitCode"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="包装单位" prop="pkgUnitCd">
<el-input v-model="form.pkgUnitCd" placeholder="请输入包装单位代码" />
<el-select v-model="form.pkgUnitCd" placeholder="请选择标准单位" clearable filterable>
<el-option
v-for="item in unitList"
:key="item.unitCode"
:label="item.unitName"
:value="item.unitCode"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="物品图片" prop="pictureId">
<el-input v-model="form.pictureId" placeholder="此处需要替换为图片上传的控件" />
<fp-file-upload
ref="fileUpload"
style="width: 100%"
:file-type="['image/jpeg', 'image/png', 'image/webp', 'image/gif',]"
/>
</el-form-item>
</el-col>
</el-row>
@@ -175,12 +228,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="默认库位号" prop="defaultStgBinCd">
<el-input v-model="form.defaultStgBinCd" placeholder="请输入默认库位号" />
<el-input v-model="form.defaultStgBinCd" placeholder="请输入默认库位号"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供货周期" prop="deliveryPeriod">
<el-input v-model="form.deliveryPeriod" placeholder="请输入供货周期" />
<el-input v-model="form.deliveryPeriod" placeholder="请输入供货周期"/>
</el-form-item>
</el-col>
</el-row>
@@ -192,43 +245,43 @@
</el-col>
<el-col :span="12">
<el-form-item label="最大库存量" prop="maxInvQty">
<el-input-number v-model="form.maxInvQty" placeholder="请输入最大库存量" :precision="2" :min="0" />
<el-input-number v-model="form.maxInvQty" placeholder="请输入最大库存量" :precision="2" :min="0"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="购买阈值" prop="purchLimitQty">
<el-input-number v-model="form.purchLimitQty" placeholder="请输入购买阈值" :precision="2" :min="0" />
<el-input-number v-model="form.purchLimitQty" placeholder="请输入购买阈值" :precision="2" :min="0"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最小出库数" prop="outstockReqMinQty">
<el-input-number v-model="form.outstockReqMinQty" placeholder="请输入最小出库数" :precision="2" :min="0"/>
<el-input-number v-model="form.outstockReqMinQty" placeholder="请输入最小出库数" :precision="2"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="入库提前期" prop="instockLeadTime">
<el-input-number v-model="form.instockLeadTime" placeholder="请输入入库提前期" :precision="1" />
<el-input-number v-model="form.instockLeadTime" placeholder="请输入入库提前期" :precision="0"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出库提前期" prop="outstockLeadTime">
<el-input-number v-model="form.outstockLeadTime" placeholder="请输入出库提前期" :precision="1" />
<el-input-number v-model="form.outstockLeadTime" placeholder="请输入出库提前期" :precision="0"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="筹备提前期" prop="prepLeadTime">
<el-input-number v-model="form.prepLeadTime" placeholder="请输入筹备提前期" :precision="1" />
<el-input-number v-model="form.prepLeadTime" placeholder="请输入筹备提前期" :precision="0"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="放置期" prop="restingPeriod">
<el-input-number v-model="form.restingPeriod" placeholder="请输入放置期" :precision="1" />
<el-input-number v-model="form.restingPeriod" placeholder="请输入放置期" :precision="0"/>
</el-form-item>
</el-col>
</el-row>
@@ -238,48 +291,48 @@
<el-row>
<el-col :span="12">
<el-form-item label="单位净重" prop="netWeightPerUnit">
<el-input v-model="form.netWeightPerUnit" placeholder="请输入单位净重" />
<el-input-number v-model="form.netWeightPerUnit" placeholder="请输入单位净重" :precision="6"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="自身体积(M3)" prop="ownVolM3">
<el-input v-model="form.ownVolM3" placeholder="请输入自身体积(M3)" />
<el-input-number v-model="form.ownVolM3" placeholder="请输入自身体积(M3)" :precision="6"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="尺寸(长)" prop="sizeD">
<el-input v-model="form.sizeD" placeholder="请输入尺寸(长)" />
<el-input-number v-model="form.sizeD" placeholder="请输入尺寸(长)" :precision="6"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="尺寸(宽)" prop="sizeW">
<el-input v-model="form.sizeW" placeholder="请输入尺寸(宽)" />
<el-input-number v-model="form.sizeW" placeholder="请输入尺寸(宽)" :precision="6"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="尺寸(高)" prop="sizeH">
<el-input v-model="form.sizeH" placeholder="请输入尺寸(高)" />
<el-input-number v-model="form.sizeH" placeholder="请输入尺寸(高)" :precision="6"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="包装要求描述" prop="pkgRqmtDesc">
<el-input v-model="form.pkgRqmtDesc" placeholder="请输入包装要求描述" />
<el-input v-model="form.pkgRqmtDesc" placeholder="请输入包装要求描述"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="码放要求描述" prop="stackingRqmtDesc">
<el-input v-model="form.stackingRqmtDesc" placeholder="请输入码放要求描述" />
<el-input v-model="form.stackingRqmtDesc" placeholder="请输入码放要求描述"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="储存要求描述" prop="stgRqmtDesc">
<el-input v-model="form.stgRqmtDesc" placeholder="请输入储存要求描述" />
<el-input v-model="form.stgRqmtDesc" placeholder="请输入储存要求描述"/>
</el-form-item>
</el-col>
</el-row>
@@ -289,60 +342,60 @@
<el-row>
<el-col :span="12">
<el-form-item label="规格1" prop="spec1">
<el-input v-model="form.spec1" placeholder="请输入规格1" />
<el-input v-model="form.spec1" placeholder="请输入规格1"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格2" prop="spec2">
<el-input v-model="form.spec2" placeholder="请输入规格2" />
<el-input v-model="form.spec2" placeholder="请输入规格2"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="规格3" prop="spec3">
<el-input v-model="form.spec3" placeholder="请输入规格3" />
<el-input v-model="form.spec3" placeholder="请输入规格3"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格4" prop="spec4">
<el-input v-model="form.spec4" placeholder="请输入规格4" />
<el-input v-model="form.spec4" placeholder="请输入规格4"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="规格5" prop="spec5">
<el-input v-model="form.spec5" placeholder="请输入规格5" />
<el-input v-model="form.spec5" placeholder="请输入规格5"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类1" prop="cls1">
<el-input v-model="form.cls1" placeholder="请输入分类1" />
<el-input v-model="form.cls1" placeholder="请输入分类1"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="分类2" prop="cls2">
<el-input v-model="form.cls2" placeholder="请输入分类2" />
<el-input v-model="form.cls2" placeholder="请输入分类2"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类3" prop="cls3">
<el-input v-model="form.cls3" placeholder="请输入分类3" />
<el-input v-model="form.cls3" placeholder="请输入分类3"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="分类4" prop="cls4">
<el-input v-model="form.cls4" placeholder="请输入分类4" />
<el-input v-model="form.cls4" placeholder="请输入分类4"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类5" prop="cls5">
<el-input v-model="form.cls5" placeholder="请输入分类5" />
<el-input v-model="form.cls5" placeholder="请输入分类5"/>
</el-form-item>
</el-col>
</el-row>
@@ -360,11 +413,16 @@
</template>
<script setup name="ItemInfo">
import { listItemInfo, getItemInfo, delItemInfo, addItemInfo, updateItemInfo } from "@/api/wms/ItemInfo";
import {listItemInfo, getItemInfo, delItemInfo, addItemInfo, updateItemInfo} from "@/api/wms/ItemInfo";
import {listUnitInfo} from "@/api/wms/UnitInfo";
import {listItemType} from "@/api/wms/ItemType";
const { proxy } = getCurrentInstance();
const {proxy} = getCurrentInstance();
const {sys_enable_flag} = proxy.useDict("sys_enable_flag");
const ItemInfoList = ref([]);
const unitList = ref([]);
const itemTypeList = ref([]);
const open = ref(false);
const loading = ref(false);
const showSearch = ref(true);
@@ -373,6 +431,8 @@ const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const submitMode = ref('add');
const fileUpload = ref(null);
const activeName = ref('basicForm');
@@ -380,24 +440,27 @@ const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
pageSize: 20,
itemCd: null,
itemName: null,
},
rules: {
itemCd: [
{ required: true, message: "物品代码不能为空", trigger: "blur" }
{required: true, message: "物品代码不能为空", trigger: "blur"}
],
itemName: [
{ required: true, message: "物品名称不能为空", trigger: "blur" }
{required: true, message: "物品名称不能为空", trigger: "blur"}
],
defaultStgBinCd: [
{ required: true, message: "默认库位号不能为空", trigger: "blur" }
enableFlg: [
{required: true, message: "启用标志不能为空", trigger: "blur"}
],
stdUnitCd: [
{required: true, message: "标准单位不能为空", trigger: "blur"}
],
}
});
const { queryParams, form, rules } = toRefs(data);
const {queryParams, form, rules} = toRefs(data);
/** 查询物品基础信息列表 */
function getList() {
@@ -409,6 +472,19 @@ function getList() {
});
}
/** 查询物品单位列表 */
function getUnitList() {
listUnitInfo({}).then(response => {
unitList.value = response.rows;
});
}
function getItemTypeList() {
listItemType({}).then(response => {
itemTypeList.value = response.rows;
});
}
// 取消按钮
function cancel() {
open.value = false;
@@ -426,28 +502,6 @@ function reset() {
instockLeadTime: 0,
restingPeriod: 0,
outstockLeadTime: 0,
spec1: null,
spec2: null,
spec3: null,
spec4: null,
spec5: null,
cls1: null,
cls2: null,
cls3: null,
cls4: null,
cls5: null,
updateCount: null,
deleteFlag: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
remark1: null,
remark2: null,
remark3: null,
remark4: null,
remark5: null,
deliveryPeriod: null,
defaultStgBinCd: null,
enableFlg: null,
@@ -471,7 +525,29 @@ function reset() {
stgRqmtDesc: null,
manufacturer: null,
pictureId: null,
pictureUrl: null
pictureUrl: null,
spec1: null,
spec2: null,
spec3: null,
spec4: null,
spec5: null,
cls1: null,
cls2: null,
cls3: null,
cls4: null,
cls5: null,
updateCount: null,
deleteFlag: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
remark1: null,
remark2: null,
remark3: null,
remark4: null,
remark5: null,
};
proxy.resetForm("ItemInfoRef");
}
@@ -500,6 +576,7 @@ function handleAdd() {
reset();
open.value = true;
title.value = "添加物品基础信息";
submitMode.value = 'add';
}
/** 修改按钮操作 */
@@ -511,20 +588,31 @@ function handleUpdate(row) {
open.value = true;
title.value = "修改物品基础信息";
});
submitMode.value = 'update';
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["ItemInfoRef"].validate(valid => {
if (valid) {
if (form.value.itemCd != null) {
updateItemInfo(form.value).then(response => {
//准备要提交的文件,如果有的话
const files = fileUpload.value.getFiles();
const submitFiles = [];
for (let i = 0; i < files.length; i++) {
submitFiles.push({
key: 'itemImages',
value: files[i],
})
}
//提交数据
if (submitMode.value === 'update') {
updateItemInfo(form.value, true, submitFiles).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addItemInfo(form.value).then(response => {
addItemInfo(form.value, true, submitFiles).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
@@ -537,12 +625,13 @@ function submitForm() {
/** 删除按钮操作 */
function handleDelete(row) {
const _itemCds = row.itemCd || ids.value;
proxy.$modal.confirm('是否确认删除物品基础信息编号为"' + _itemCds + '"的数据项?').then(function() {
proxy.$modal.confirm('是否确认删除物品基础信息编号为"' + _itemCds + '"的数据项?').then(function () {
return delItemInfo(_itemCds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}).catch(() => {
});
}
/** 导出按钮操作 */
@@ -552,6 +641,27 @@ function handleExport() {
}, `ItemInfo_${new Date().getTime()}.xlsx`)
}
/** 查看图片 */
function handleViewImage(row) {
if (!row.pictureUrl) {
proxy.$modal.msgWarning("该物品没有图片");
return;
}
window.open(row.pictureUrl)
}
//页面打开时查询
//getList();
getUnitList();
getItemTypeList();
</script>
<style scoped>
.el-select,
.el-input-number {
width: 100%;
}
.filepond--item {
width: calc(50% - 0.5em);
}
</style>

View File

@@ -65,8 +65,8 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="ItemTypeList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table v-loading="loading" :data="ItemTypeList" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="30" align="center" />
<el-table-column label="物品类型编码" align="center" prop="itemTypeCd" />
<el-table-column label="物品类型名称" align="center" prop="itemTypeName" />
<el-table-column label="备注" align="center" prop="remark1" />
@@ -125,7 +125,7 @@ const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
pageSize: 20,
itemTypeName: null,
remark1: null,
},

View File

@@ -65,8 +65,8 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="UnitInfoList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table v-loading="loading" :data="UnitInfoList" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="30" align="center" />
<el-table-column label="单位代码" align="center" prop="unitCode" />
<el-table-column label="单位名称" align="center" prop="unitName" />
<el-table-column label="备注" align="center" prop="remark1" />
@@ -125,7 +125,7 @@ const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
pageSize: 20,
unitCode: null,
unitName: null,
},

View File

@@ -65,8 +65,8 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="WarehouseInfoList" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" />
<el-table v-loading="loading" :data="WarehouseInfoList" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="30" align="center" />
<el-table-column label="仓库代码" align="center" prop="whsCd" />
<el-table-column label="仓库名称" align="center" prop="whsName" />
<el-table-column label="仓库类型代码" align="center" prop="whsTypeCd" />
@@ -173,7 +173,7 @@ const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
pageSize: 20,
whsCd: null,
whsName: null,
},