强化文件api,添加FilePond
parent
da8d9f2fed
commit
7b71fd28e4
|
|
@ -1,14 +1,16 @@
|
|||
package com.ruoyi.system.api;
|
||||
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.system.api.domain.SysFileInfo;
|
||||
import com.ruoyi.system.api.factory.RemoteFileFallbackFactory;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* 文件服务
|
||||
|
|
@ -25,4 +27,13 @@ public interface RemoteFileService {
|
|||
*/
|
||||
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||
R<SysFileInfo> upload(@RequestPart(value = "file") MultipartFile file);
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param fileIds 文件id
|
||||
* @return 结果
|
||||
*/
|
||||
@DeleteMapping("/deleteFiles/{fileIds}")
|
||||
R<SysFileInfo> deleteFiles(@PathVariable String[] fileIds);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,35 +1,36 @@
|
|||
package com.ruoyi.system.api.factory;
|
||||
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.system.api.RemoteFileService;
|
||||
import com.ruoyi.system.api.domain.SysFileInfo;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.system.api.RemoteFileService;
|
||||
import com.ruoyi.system.api.domain.SysFileInfo;
|
||||
|
||||
/**
|
||||
* 文件服务降级处理
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@Component
|
||||
public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService>
|
||||
{
|
||||
public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService> {
|
||||
private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class);
|
||||
|
||||
@Override
|
||||
public RemoteFileService create(Throwable throwable)
|
||||
{
|
||||
public RemoteFileService create(Throwable throwable) {
|
||||
log.error("文件服务调用失败:{}", throwable.getMessage());
|
||||
return new RemoteFileService()
|
||||
{
|
||||
return new RemoteFileService() {
|
||||
@Override
|
||||
public R<SysFileInfo> upload(MultipartFile file)
|
||||
{
|
||||
public R<SysFileInfo> upload(MultipartFile file) {
|
||||
return R.fail("上传文件失败:" + throwable.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<SysFileInfo> deleteFiles(String[] fileIds) {
|
||||
return R.fail("删除文件失败:" + throwable.getMessage());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,4 +20,9 @@ public class ServiceNameConstants {
|
|||
* 文件服务的serviceId
|
||||
*/
|
||||
public static final String FILE_SERVICE = "ruoyi-file";
|
||||
|
||||
/**
|
||||
* WMS服务的serviceId
|
||||
*/
|
||||
public static final String WMS_SERVICE = "ruoyi-wms";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,20 +10,31 @@ import java.nio.charset.StandardCharsets;
|
|||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class CharsetKit
|
||||
{
|
||||
/** ISO-8859-1 */
|
||||
public class CharsetKit {
|
||||
/**
|
||||
* ISO-8859-1
|
||||
*/
|
||||
public static final String ISO_8859_1 = "ISO-8859-1";
|
||||
/** UTF-8 */
|
||||
/**
|
||||
* UTF-8
|
||||
*/
|
||||
public static final String UTF_8 = "UTF-8";
|
||||
/** GBK */
|
||||
/**
|
||||
* GBK
|
||||
*/
|
||||
public static final String GBK = "GBK";
|
||||
|
||||
/** ISO-8859-1 */
|
||||
/**
|
||||
* ISO-8859-1
|
||||
*/
|
||||
public static final Charset CHARSET_ISO_8859_1 = StandardCharsets.ISO_8859_1;
|
||||
/** UTF-8 */
|
||||
/**
|
||||
* UTF-8
|
||||
*/
|
||||
public static final Charset CHARSET_UTF_8 = StandardCharsets.UTF_8;
|
||||
/** GBK */
|
||||
/**
|
||||
* GBK
|
||||
*/
|
||||
public static final Charset CHARSET_GBK = Charset.forName(GBK);
|
||||
|
||||
/**
|
||||
|
|
@ -32,46 +43,40 @@ public class CharsetKit
|
|||
* @param charset 字符集,为空则返回默认字符集
|
||||
* @return Charset
|
||||
*/
|
||||
public static Charset charset(String charset)
|
||||
{
|
||||
public static Charset charset(String charset) {
|
||||
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换字符串的字符集编码
|
||||
*
|
||||
* @param source 字符串
|
||||
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||
* @param source 字符串
|
||||
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||
* @param destCharset 目标字符集,默认UTF-8
|
||||
* @return 转换后的字符集
|
||||
*/
|
||||
public static String convert(String source, String srcCharset, String destCharset)
|
||||
{
|
||||
public static String convert(String source, String srcCharset, String destCharset) {
|
||||
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换字符串的字符集编码
|
||||
*
|
||||
* @param source 字符串
|
||||
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||
* @param source 字符串
|
||||
* @param srcCharset 源字符集,默认ISO-8859-1
|
||||
* @param destCharset 目标字符集,默认UTF-8
|
||||
* @return 转换后的字符集
|
||||
*/
|
||||
public static String convert(String source, Charset srcCharset, Charset destCharset)
|
||||
{
|
||||
if (null == srcCharset)
|
||||
{
|
||||
public static String convert(String source, Charset srcCharset, Charset destCharset) {
|
||||
if (null == srcCharset) {
|
||||
srcCharset = StandardCharsets.ISO_8859_1;
|
||||
}
|
||||
|
||||
if (null == destCharset)
|
||||
{
|
||||
if (null == destCharset) {
|
||||
destCharset = StandardCharsets.UTF_8;
|
||||
}
|
||||
|
||||
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
|
||||
{
|
||||
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) {
|
||||
return source;
|
||||
}
|
||||
return new String(source.getBytes(srcCharset), destCharset);
|
||||
|
|
@ -80,8 +85,7 @@ public class CharsetKit
|
|||
/**
|
||||
* @return 系统字符集编码
|
||||
*/
|
||||
public static String systemCharset()
|
||||
{
|
||||
public static String systemCharset() {
|
||||
return Charset.defaultCharset().name();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,59 +8,57 @@ import java.util.regex.Pattern;
|
|||
|
||||
/**
|
||||
* Bean 工具类
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class BeanUtils extends org.springframework.beans.BeanUtils
|
||||
{
|
||||
/** Bean方法名中属性名开始的下标 */
|
||||
public class BeanUtils extends org.springframework.beans.BeanUtils {
|
||||
/**
|
||||
* Bean方法名中属性名开始的下标
|
||||
*/
|
||||
private static final int BEAN_METHOD_PROP_INDEX = 3;
|
||||
|
||||
/** * 匹配getter方法的正则表达式 */
|
||||
/**
|
||||
* 匹配getter方法的正则表达式
|
||||
*/
|
||||
private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
|
||||
|
||||
/** * 匹配setter方法的正则表达式 */
|
||||
/**
|
||||
* 匹配setter方法的正则表达式
|
||||
*/
|
||||
private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
|
||||
|
||||
/**
|
||||
* Bean属性复制工具方法。
|
||||
*
|
||||
*
|
||||
* @param dest 目标对象
|
||||
* @param src 源对象
|
||||
* @param src 源对象
|
||||
*/
|
||||
public static void copyBeanProp(Object dest, Object src)
|
||||
{
|
||||
try
|
||||
{
|
||||
public static void copyBeanProp(Object dest, Object src) {
|
||||
try {
|
||||
copyProperties(src, dest);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取对象的setter方法。
|
||||
*
|
||||
*
|
||||
* @param obj 对象
|
||||
* @return 对象的setter方法列表
|
||||
*/
|
||||
public static List<Method> getSetterMethods(Object obj)
|
||||
{
|
||||
public static List<Method> getSetterMethods(Object obj) {
|
||||
// setter方法列表
|
||||
List<Method> setterMethods = new ArrayList<Method>();
|
||||
List<Method> setterMethods = new ArrayList<>();
|
||||
|
||||
// 获取所有方法
|
||||
Method[] methods = obj.getClass().getMethods();
|
||||
|
||||
// 查找setter方法
|
||||
|
||||
for (Method method : methods)
|
||||
{
|
||||
for (Method method : methods) {
|
||||
Matcher m = SET_PATTERN.matcher(method.getName());
|
||||
if (m.matches() && (method.getParameterTypes().length == 1))
|
||||
{
|
||||
if (m.matches() && (method.getParameterTypes().length == 1)) {
|
||||
setterMethods.add(method);
|
||||
}
|
||||
}
|
||||
|
|
@ -70,23 +68,20 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
|
|||
|
||||
/**
|
||||
* 获取对象的getter方法。
|
||||
*
|
||||
*
|
||||
* @param obj 对象
|
||||
* @return 对象的getter方法列表
|
||||
*/
|
||||
|
||||
public static List<Method> getGetterMethods(Object obj)
|
||||
{
|
||||
public static List<Method> getGetterMethods(Object obj) {
|
||||
// getter方法列表
|
||||
List<Method> getterMethods = new ArrayList<Method>();
|
||||
List<Method> getterMethods = new ArrayList<>();
|
||||
// 获取所有方法
|
||||
Method[] methods = obj.getClass().getMethods();
|
||||
// 查找getter方法
|
||||
for (Method method : methods)
|
||||
{
|
||||
for (Method method : methods) {
|
||||
Matcher m = GET_PATTERN.matcher(method.getName());
|
||||
if (m.matches() && (method.getParameterTypes().length == 0))
|
||||
{
|
||||
if (m.matches() && (method.getParameterTypes().length == 0)) {
|
||||
getterMethods.add(method);
|
||||
}
|
||||
}
|
||||
|
|
@ -97,14 +92,13 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
|
|||
/**
|
||||
* 检查Bean方法名中的属性名是否相等。<br>
|
||||
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
|
||||
*
|
||||
*
|
||||
* @param m1 方法名1
|
||||
* @param m2 方法名2
|
||||
* @return 属性名一样返回true,否则返回false
|
||||
*/
|
||||
|
||||
public static boolean isMethodPropEquals(String m1, String m2)
|
||||
{
|
||||
public static boolean isMethodPropEquals(String m1, String m2) {
|
||||
return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,18 +8,17 @@ import java.util.Set;
|
|||
|
||||
/**
|
||||
* bean对象属性验证
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class BeanValidators
|
||||
{
|
||||
public class BeanValidators {
|
||||
|
||||
public static void validateWithException(Validator validator, Object object, Class<?>... groups)
|
||||
throws ConstraintViolationException
|
||||
{
|
||||
throws ConstraintViolationException {
|
||||
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
|
||||
if (!constraintViolations.isEmpty())
|
||||
{
|
||||
if (!constraintViolations.isEmpty()) {
|
||||
throw new ConstraintViolationException(constraintViolations);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,30 +1,28 @@
|
|||
package com.ruoyi.common.core.utils.file;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Objects;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 文件类型工具类
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class FileTypeUtils
|
||||
{
|
||||
public class FileTypeUtils {
|
||||
/**
|
||||
* 获取文件类型
|
||||
* <p>
|
||||
* 例如: ruoyi.txt, 返回: txt
|
||||
*
|
||||
*
|
||||
* @param file 文件名
|
||||
* @return 后缀(不含".")
|
||||
*/
|
||||
public static String getFileType(File file)
|
||||
{
|
||||
if (null == file)
|
||||
{
|
||||
public static String getFileType(File file) {
|
||||
if (null == file) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
return getFileType(file.getName());
|
||||
|
|
@ -38,11 +36,9 @@ public class FileTypeUtils
|
|||
* @param fileName 文件名
|
||||
* @return 后缀(不含".")
|
||||
*/
|
||||
public static String getFileType(String fileName)
|
||||
{
|
||||
public static String getFileType(String fileName) {
|
||||
int separatorIndex = fileName.lastIndexOf(".");
|
||||
if (separatorIndex < 0)
|
||||
{
|
||||
if (separatorIndex < 0) {
|
||||
return "";
|
||||
}
|
||||
return fileName.substring(separatorIndex + 1).toLowerCase();
|
||||
|
|
@ -50,15 +46,13 @@ public class FileTypeUtils
|
|||
|
||||
/**
|
||||
* 获取文件名的后缀
|
||||
*
|
||||
*
|
||||
* @param file 表单文件
|
||||
* @return 后缀名
|
||||
*/
|
||||
public static final String getExtension(MultipartFile file)
|
||||
{
|
||||
public static String getExtension(MultipartFile file) {
|
||||
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
|
||||
if (StringUtils.isEmpty(extension))
|
||||
{
|
||||
if (StringUtils.isEmpty(extension)) {
|
||||
extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
|
||||
}
|
||||
return extension;
|
||||
|
|
@ -66,28 +60,20 @@ public class FileTypeUtils
|
|||
|
||||
/**
|
||||
* 获取文件类型
|
||||
*
|
||||
*
|
||||
* @param photoByte 文件字节码
|
||||
* @return 后缀(不含".")
|
||||
*/
|
||||
public static String getFileExtendName(byte[] photoByte)
|
||||
{
|
||||
public static String getFileExtendName(byte[] photoByte) {
|
||||
String strFileExtendName = "JPG";
|
||||
if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
|
||||
&& ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
|
||||
{
|
||||
&& ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
|
||||
strFileExtendName = "GIF";
|
||||
}
|
||||
else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
|
||||
{
|
||||
} else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
|
||||
strFileExtendName = "JPG";
|
||||
}
|
||||
else if ((photoByte[0] == 66) && (photoByte[1] == 77))
|
||||
{
|
||||
} else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
|
||||
strFileExtendName = "BMP";
|
||||
}
|
||||
else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
|
||||
{
|
||||
} else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
|
||||
strFileExtendName = "PNG";
|
||||
}
|
||||
return strFileExtendName;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
package com.ruoyi.common.core.utils.file;
|
||||
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
|
|
@ -7,10 +11,6 @@ import java.net.URL;
|
|||
import java.net.URLConnection;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* 图片处理工具类
|
||||
*
|
||||
|
|
@ -22,6 +22,7 @@ public class ImageUtils {
|
|||
public static byte[] getImage(String imagePath) {
|
||||
InputStream is = getFile(imagePath);
|
||||
try {
|
||||
assert is != null;
|
||||
return IOUtils.toByteArray(is);
|
||||
} catch (Exception e) {
|
||||
log.error("图片加载异常", e);
|
||||
|
|
@ -34,6 +35,7 @@ public class ImageUtils {
|
|||
public static InputStream getFile(String imagePath) {
|
||||
try {
|
||||
byte[] result = readFile(imagePath);
|
||||
assert result != null;
|
||||
result = Arrays.copyOf(result, result.length);
|
||||
return new ByteArrayInputStream(result);
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
|
|
@ -4,20 +4,17 @@ import com.ruoyi.common.core.utils.StringUtils;
|
|||
|
||||
/**
|
||||
* 转义和反转义工具类
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class EscapeUtil
|
||||
{
|
||||
public class EscapeUtil {
|
||||
public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
|
||||
|
||||
private static final char[][] TEXT = new char[64][];
|
||||
|
||||
static
|
||||
{
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
TEXT[i] = new char[] { (char) i };
|
||||
static {
|
||||
for (int i = 0; i < 64; i++) {
|
||||
TEXT[i] = new char[]{(char) i};
|
||||
}
|
||||
|
||||
// special HTML characters
|
||||
|
|
@ -30,69 +27,58 @@ public class EscapeUtil
|
|||
|
||||
/**
|
||||
* 转义文本中的HTML字符为安全的字符
|
||||
*
|
||||
*
|
||||
* @param text 被转义的文本
|
||||
* @return 转义后的文本
|
||||
*/
|
||||
public static String escape(String text)
|
||||
{
|
||||
public static String escape(String text) {
|
||||
return encode(text);
|
||||
}
|
||||
|
||||
/**
|
||||
* 还原被转义的HTML特殊字符
|
||||
*
|
||||
*
|
||||
* @param content 包含转义符的HTML内容
|
||||
* @return 转换后的字符串
|
||||
*/
|
||||
public static String unescape(String content)
|
||||
{
|
||||
public static String unescape(String content) {
|
||||
return decode(content);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有HTML标签,但是不删除标签内的内容
|
||||
*
|
||||
*
|
||||
* @param content 文本
|
||||
* @return 清除标签后的文本
|
||||
*/
|
||||
public static String clean(String content)
|
||||
{
|
||||
public static String clean(String content) {
|
||||
return new HTMLFilter().filter(content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape编码
|
||||
*
|
||||
*
|
||||
* @param text 被编码的文本
|
||||
* @return 编码后的字符
|
||||
*/
|
||||
private static String encode(String text)
|
||||
{
|
||||
if (StringUtils.isEmpty(text))
|
||||
{
|
||||
private static String encode(String text) {
|
||||
if (StringUtils.isEmpty(text)) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
final StringBuilder tmp = new StringBuilder(text.length() * 6);
|
||||
char c;
|
||||
for (int i = 0; i < text.length(); i++)
|
||||
{
|
||||
for (int i = 0; i < text.length(); i++) {
|
||||
c = text.charAt(i);
|
||||
if (c < 256)
|
||||
{
|
||||
if (c < 256) {
|
||||
tmp.append("%");
|
||||
if (c < 16)
|
||||
{
|
||||
if (c < 16) {
|
||||
tmp.append("0");
|
||||
}
|
||||
tmp.append(Integer.toString(c, 16));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
tmp.append("%u");
|
||||
if (c <= 0xfff)
|
||||
{
|
||||
if (c <= 0xfff) {
|
||||
// issue#I49JU8@Gitee
|
||||
tmp.append("0");
|
||||
}
|
||||
|
|
@ -104,48 +90,36 @@ public class EscapeUtil
|
|||
|
||||
/**
|
||||
* Escape解码
|
||||
*
|
||||
*
|
||||
* @param content 被转义的内容
|
||||
* @return 解码后的字符串
|
||||
*/
|
||||
public static String decode(String content)
|
||||
{
|
||||
if (StringUtils.isEmpty(content))
|
||||
{
|
||||
public static String decode(String content) {
|
||||
if (StringUtils.isEmpty(content)) {
|
||||
return content;
|
||||
}
|
||||
|
||||
StringBuilder tmp = new StringBuilder(content.length());
|
||||
int lastPos = 0, pos = 0;
|
||||
char ch;
|
||||
while (lastPos < content.length())
|
||||
{
|
||||
while (lastPos < content.length()) {
|
||||
pos = content.indexOf("%", lastPos);
|
||||
if (pos == lastPos)
|
||||
{
|
||||
if (content.charAt(pos + 1) == 'u')
|
||||
{
|
||||
if (pos == lastPos) {
|
||||
if (content.charAt(pos + 1) == 'u') {
|
||||
ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
|
||||
tmp.append(ch);
|
||||
lastPos = pos + 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
|
||||
tmp.append(ch);
|
||||
lastPos = pos + 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pos == -1)
|
||||
{
|
||||
} else {
|
||||
if (pos == -1) {
|
||||
tmp.append(content.substring(lastPos));
|
||||
lastPos = content.length();
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp.append(content.substring(lastPos, pos));
|
||||
} else {
|
||||
tmp.append(content, lastPos, pos);
|
||||
lastPos = pos;
|
||||
}
|
||||
}
|
||||
|
|
@ -153,8 +127,7 @@ public class EscapeUtil
|
|||
return tmp.toString();
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
public static void main(String[] args) {
|
||||
String html = "<script>alert(1);</script>";
|
||||
String escape = EscapeUtil.escape(html);
|
||||
// String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
|
||||
|
|
|
|||
|
|
@ -15,8 +15,7 @@ import java.util.regex.Pattern;
|
|||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public final class HTMLFilter
|
||||
{
|
||||
public final class HTMLFilter {
|
||||
/**
|
||||
* regex flag union representing /si modifiers in php
|
||||
**/
|
||||
|
|
@ -100,8 +99,7 @@ public final class HTMLFilter
|
|||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public HTMLFilter()
|
||||
{
|
||||
public HTMLFilter() {
|
||||
vAllowed = new HashMap<>();
|
||||
|
||||
final ArrayList<String> a_atts = new ArrayList<>();
|
||||
|
|
@ -122,13 +120,13 @@ public final class HTMLFilter
|
|||
vAllowed.put("i", no_atts);
|
||||
vAllowed.put("em", no_atts);
|
||||
|
||||
vSelfClosingTags = new String[] { "img" };
|
||||
vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
|
||||
vDisallowed = new String[] {};
|
||||
vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
|
||||
vProtocolAtts = new String[] { "src", "href" };
|
||||
vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
|
||||
vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
|
||||
vSelfClosingTags = new String[]{"img"};
|
||||
vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};
|
||||
vDisallowed = new String[]{};
|
||||
vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.
|
||||
vProtocolAtts = new String[]{"src", "href"};
|
||||
vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};
|
||||
vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};
|
||||
stripComment = true;
|
||||
encodeQuotes = true;
|
||||
alwaysMakeTags = false;
|
||||
|
|
@ -140,8 +138,7 @@ public final class HTMLFilter
|
|||
* @param conf map containing configuration. keys match field names.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public HTMLFilter(final Map<String, Object> conf)
|
||||
{
|
||||
public HTMLFilter(final Map<String, Object> conf) {
|
||||
|
||||
assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
|
||||
assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
|
||||
|
|
@ -165,20 +162,17 @@ public final class HTMLFilter
|
|||
alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
|
||||
}
|
||||
|
||||
private void reset()
|
||||
{
|
||||
private void reset() {
|
||||
vTagCounts.clear();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// my versions of some PHP library functions
|
||||
public static String chr(final int decimal)
|
||||
{
|
||||
public static String chr(final int decimal) {
|
||||
return String.valueOf((char) decimal);
|
||||
}
|
||||
|
||||
public static String htmlSpecialChars(final String s)
|
||||
{
|
||||
public static String htmlSpecialChars(final String s) {
|
||||
String result = s;
|
||||
result = regexReplace(P_AMP, "&", result);
|
||||
result = regexReplace(P_QUOTE, """, result);
|
||||
|
|
@ -195,8 +189,7 @@ public final class HTMLFilter
|
|||
* @param input text (i.e. submitted by a user) than may contain html
|
||||
* @return "clean" version of input, with only valid, whitelisted html elements allowed
|
||||
*/
|
||||
public String filter(final String input)
|
||||
{
|
||||
public String filter(final String input) {
|
||||
reset();
|
||||
String s = input;
|
||||
|
||||
|
|
@ -213,22 +206,18 @@ public final class HTMLFilter
|
|||
return s;
|
||||
}
|
||||
|
||||
public boolean isAlwaysMakeTags()
|
||||
{
|
||||
public boolean isAlwaysMakeTags() {
|
||||
return alwaysMakeTags;
|
||||
}
|
||||
|
||||
public boolean isStripComments()
|
||||
{
|
||||
public boolean isStripComments() {
|
||||
return stripComment;
|
||||
}
|
||||
|
||||
private String escapeComments(final String s)
|
||||
{
|
||||
private String escapeComments(final String s) {
|
||||
final Matcher m = P_COMMENTS.matcher(s);
|
||||
final StringBuffer buf = new StringBuffer();
|
||||
if (m.find())
|
||||
{
|
||||
if (m.find()) {
|
||||
final String match = m.group(1); // (.*?)
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
|
||||
}
|
||||
|
|
@ -237,10 +226,8 @@ public final class HTMLFilter
|
|||
return buf.toString();
|
||||
}
|
||||
|
||||
private String balanceHTML(String s)
|
||||
{
|
||||
if (alwaysMakeTags)
|
||||
{
|
||||
private String balanceHTML(String s) {
|
||||
if (alwaysMakeTags) {
|
||||
//
|
||||
// try and form html
|
||||
//
|
||||
|
|
@ -249,9 +236,7 @@ public final class HTMLFilter
|
|||
s = regexReplace(P_BODY_TO_END, "<$1>", s);
|
||||
s = regexReplace(P_XML_CONTENT, "$1<$2", s);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//
|
||||
// escape stray brackets
|
||||
//
|
||||
|
|
@ -269,13 +254,11 @@ public final class HTMLFilter
|
|||
return s;
|
||||
}
|
||||
|
||||
private String checkTags(String s)
|
||||
{
|
||||
private String checkTags(String s) {
|
||||
Matcher m = P_TAGS.matcher(s);
|
||||
|
||||
final StringBuffer buf = new StringBuffer();
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
String replaceStr = m.group(1);
|
||||
replaceStr = processTag(replaceStr);
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
|
||||
|
|
@ -285,10 +268,8 @@ public final class HTMLFilter
|
|||
// these get tallied in processTag
|
||||
// (remember to reset before subsequent calls to filter method)
|
||||
final StringBuilder sBuilder = new StringBuilder(buf.toString());
|
||||
for (String key : vTagCounts.keySet())
|
||||
{
|
||||
for (int ii = 0; ii < vTagCounts.get(key); ii++)
|
||||
{
|
||||
for (String key : vTagCounts.keySet()) {
|
||||
for (int ii = 0; ii < vTagCounts.get(key); ii++) {
|
||||
sBuilder.append("</").append(key).append(">");
|
||||
}
|
||||
}
|
||||
|
|
@ -297,18 +278,14 @@ public final class HTMLFilter
|
|||
return s;
|
||||
}
|
||||
|
||||
private String processRemoveBlanks(final String s)
|
||||
{
|
||||
private String processRemoveBlanks(final String s) {
|
||||
String result = s;
|
||||
for (String tag : vRemoveBlanks)
|
||||
{
|
||||
if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
|
||||
{
|
||||
for (String tag : vRemoveBlanks) {
|
||||
if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) {
|
||||
P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
|
||||
}
|
||||
result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
|
||||
if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
|
||||
{
|
||||
if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) {
|
||||
P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
|
||||
}
|
||||
result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
|
||||
|
|
@ -317,25 +294,19 @@ public final class HTMLFilter
|
|||
return result;
|
||||
}
|
||||
|
||||
private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
|
||||
{
|
||||
private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {
|
||||
Matcher m = regex_pattern.matcher(s);
|
||||
return m.replaceAll(replacement);
|
||||
}
|
||||
|
||||
private String processTag(final String s)
|
||||
{
|
||||
private String processTag(final String s) {
|
||||
// ending tags
|
||||
Matcher m = P_END_TAG.matcher(s);
|
||||
if (m.find())
|
||||
{
|
||||
if (m.find()) {
|
||||
final String name = m.group(1).toLowerCase();
|
||||
if (allowed(name))
|
||||
{
|
||||
if (!inArray(name, vSelfClosingTags))
|
||||
{
|
||||
if (vTagCounts.containsKey(name))
|
||||
{
|
||||
if (allowed(name)) {
|
||||
if (!inArray(name, vSelfClosingTags)) {
|
||||
if (vTagCounts.containsKey(name)) {
|
||||
vTagCounts.put(name, vTagCounts.get(name) - 1);
|
||||
return "</" + name + ">";
|
||||
}
|
||||
|
|
@ -345,35 +316,30 @@ public final class HTMLFilter
|
|||
|
||||
// starting tags
|
||||
m = P_START_TAG.matcher(s);
|
||||
if (m.find())
|
||||
{
|
||||
if (m.find()) {
|
||||
final String name = m.group(1).toLowerCase();
|
||||
final String body = m.group(2);
|
||||
String ending = m.group(3);
|
||||
|
||||
// debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
|
||||
if (allowed(name))
|
||||
{
|
||||
if (allowed(name)) {
|
||||
final StringBuilder params = new StringBuilder();
|
||||
|
||||
final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
|
||||
final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
|
||||
final List<String> paramNames = new ArrayList<>();
|
||||
final List<String> paramValues = new ArrayList<>();
|
||||
while (m2.find())
|
||||
{
|
||||
while (m2.find()) {
|
||||
paramNames.add(m2.group(1)); // ([a-z0-9]+)
|
||||
paramValues.add(m2.group(3)); // (.*?)
|
||||
}
|
||||
while (m3.find())
|
||||
{
|
||||
while (m3.find()) {
|
||||
paramNames.add(m3.group(1)); // ([a-z0-9]+)
|
||||
paramValues.add(m3.group(3)); // ([^\"\\s']+)
|
||||
}
|
||||
|
||||
String paramName, paramValue;
|
||||
for (int ii = 0; ii < paramNames.size(); ii++)
|
||||
{
|
||||
for (int ii = 0; ii < paramNames.size(); ii++) {
|
||||
paramName = paramNames.get(ii).toLowerCase();
|
||||
paramValue = paramValues.get(ii);
|
||||
|
||||
|
|
@ -381,72 +347,55 @@ public final class HTMLFilter
|
|||
// debug( "paramValue='" + paramValue + "'" );
|
||||
// debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
|
||||
|
||||
if (allowedAttribute(name, paramName))
|
||||
{
|
||||
if (inArray(paramName, vProtocolAtts))
|
||||
{
|
||||
if (allowedAttribute(name, paramName)) {
|
||||
if (inArray(paramName, vProtocolAtts)) {
|
||||
paramValue = processParamProtocol(paramValue);
|
||||
}
|
||||
params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\"");
|
||||
}
|
||||
}
|
||||
|
||||
if (inArray(name, vSelfClosingTags))
|
||||
{
|
||||
if (inArray(name, vSelfClosingTags)) {
|
||||
ending = " /";
|
||||
}
|
||||
|
||||
if (inArray(name, vNeedClosingTags))
|
||||
{
|
||||
if (inArray(name, vNeedClosingTags)) {
|
||||
ending = "";
|
||||
}
|
||||
|
||||
if (ending == null || ending.length() < 1)
|
||||
{
|
||||
if (vTagCounts.containsKey(name))
|
||||
{
|
||||
if (ending == null || ending.length() < 1) {
|
||||
if (vTagCounts.containsKey(name)) {
|
||||
vTagCounts.put(name, vTagCounts.get(name) + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
vTagCounts.put(name, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
ending = " /";
|
||||
}
|
||||
return "<" + name + params + ending + ">";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// comments
|
||||
m = P_COMMENT.matcher(s);
|
||||
if (!stripComment && m.find())
|
||||
{
|
||||
if (!stripComment && m.find()) {
|
||||
return "<" + m.group() + ">";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
private String processParamProtocol(String s)
|
||||
{
|
||||
private String processParamProtocol(String s) {
|
||||
s = decodeEntities(s);
|
||||
final Matcher m = P_PROTOCOL.matcher(s);
|
||||
if (m.find())
|
||||
{
|
||||
if (m.find()) {
|
||||
final String protocol = m.group(1);
|
||||
if (!inArray(protocol, vAllowedProtocols))
|
||||
{
|
||||
if (!inArray(protocol, vAllowedProtocols)) {
|
||||
// bad protocol, turn into local anchor link instead
|
||||
s = "#" + s.substring(protocol.length() + 1);
|
||||
if (s.startsWith("#//"))
|
||||
{
|
||||
if (s.startsWith("#//")) {
|
||||
s = "#" + s.substring(3);
|
||||
}
|
||||
}
|
||||
|
|
@ -455,13 +404,11 @@ public final class HTMLFilter
|
|||
return s;
|
||||
}
|
||||
|
||||
private String decodeEntities(String s)
|
||||
{
|
||||
private String decodeEntities(String s) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
Matcher m = P_ENTITY.matcher(s);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
final String match = m.group(1);
|
||||
final int decimal = Integer.decode(match).intValue();
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
|
||||
|
|
@ -471,8 +418,7 @@ public final class HTMLFilter
|
|||
|
||||
buf = new StringBuffer();
|
||||
m = P_ENTITY_UNICODE.matcher(s);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
final String match = m.group(1);
|
||||
final int decimal = Integer.valueOf(match, 16).intValue();
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
|
||||
|
|
@ -482,8 +428,7 @@ public final class HTMLFilter
|
|||
|
||||
buf = new StringBuffer();
|
||||
m = P_ENCODE.matcher(s);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
final String match = m.group(1);
|
||||
final int decimal = Integer.valueOf(match, 16).intValue();
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
|
||||
|
|
@ -495,14 +440,12 @@ public final class HTMLFilter
|
|||
return s;
|
||||
}
|
||||
|
||||
private String validateEntities(final String s)
|
||||
{
|
||||
private String validateEntities(final String s) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
// validate entities throughout the string
|
||||
Matcher m = P_VALID_ENTITIES.matcher(s);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
final String one = m.group(1); // ([^&;]*)
|
||||
final String two = m.group(2); // (?=(;|&|$))
|
||||
m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
|
||||
|
|
@ -512,14 +455,11 @@ public final class HTMLFilter
|
|||
return encodeQuotes(buf.toString());
|
||||
}
|
||||
|
||||
private String encodeQuotes(final String s)
|
||||
{
|
||||
if (encodeQuotes)
|
||||
{
|
||||
private String encodeQuotes(final String s) {
|
||||
if (encodeQuotes) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
Matcher m = P_VALID_QUOTES.matcher(s);
|
||||
while (m.find())
|
||||
{
|
||||
while (m.find()) {
|
||||
final String one = m.group(1); // (>|^)
|
||||
final String two = m.group(2); // ([^<]+?)
|
||||
final String three = m.group(3); // (<|$)
|
||||
|
|
@ -528,43 +468,34 @@ public final class HTMLFilter
|
|||
}
|
||||
m.appendTail(buf);
|
||||
return buf.toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
private String checkEntity(final String preamble, final String term)
|
||||
{
|
||||
private String checkEntity(final String preamble, final String term) {
|
||||
|
||||
return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble;
|
||||
}
|
||||
|
||||
private boolean isValidEntity(final String entity)
|
||||
{
|
||||
private boolean isValidEntity(final String entity) {
|
||||
return inArray(entity, vAllowedEntities);
|
||||
}
|
||||
|
||||
private static boolean inArray(final String s, final String[] array)
|
||||
{
|
||||
for (String item : array)
|
||||
{
|
||||
if (item != null && item.equals(s))
|
||||
{
|
||||
private static boolean inArray(final String s, final String[] array) {
|
||||
for (String item : array) {
|
||||
if (item != null && item.equals(s)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean allowed(final String name)
|
||||
{
|
||||
private boolean allowed(final String name) {
|
||||
return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
|
||||
}
|
||||
|
||||
private boolean allowedAttribute(final String name, final String paramName)
|
||||
{
|
||||
private boolean allowedAttribute(final String name, final String paramName) {
|
||||
return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,67 +1,59 @@
|
|||
package com.ruoyi.common.core.utils.ip;
|
||||
|
||||
import com.ruoyi.common.core.utils.ServletUtils;
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import com.ruoyi.common.core.utils.ServletUtils;
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* 获取IP方法
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class IpUtils
|
||||
{
|
||||
public class IpUtils {
|
||||
public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
|
||||
// 匹配 ip
|
||||
public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
|
||||
public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
|
||||
// 匹配网段
|
||||
public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
|
||||
public final static String REGX_IP_SEG = "(" + REGX_IP + "-" + REGX_IP + ")";
|
||||
|
||||
/**
|
||||
* 获取客户端IP
|
||||
*
|
||||
*
|
||||
* @return IP地址
|
||||
*/
|
||||
public static String getIpAddr()
|
||||
{
|
||||
public static String getIpAddr() {
|
||||
return getIpAddr(ServletUtils.getRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取客户端IP
|
||||
*
|
||||
*
|
||||
* @param request 请求对象
|
||||
* @return IP地址
|
||||
*/
|
||||
public static String getIpAddr(HttpServletRequest request)
|
||||
{
|
||||
if (request == null)
|
||||
{
|
||||
public static String getIpAddr(HttpServletRequest request) {
|
||||
if (request == null) {
|
||||
return "unknown";
|
||||
}
|
||||
String ip = request.getHeader("x-forwarded-for");
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||
ip = request.getHeader("Proxy-Client-IP");
|
||||
}
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||
ip = request.getHeader("X-Forwarded-For");
|
||||
}
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||
ip = request.getHeader("WL-Proxy-Client-IP");
|
||||
}
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||
ip = request.getHeader("X-Real-IP");
|
||||
}
|
||||
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
|
||||
ip = request.getRemoteAddr();
|
||||
}
|
||||
|
||||
|
|
@ -70,26 +62,23 @@ public class IpUtils
|
|||
|
||||
/**
|
||||
* 检查是否为内部IP地址
|
||||
*
|
||||
*
|
||||
* @param ip IP地址
|
||||
* @return 结果
|
||||
*/
|
||||
public static boolean internalIp(String ip)
|
||||
{
|
||||
public static boolean internalIp(String ip) {
|
||||
byte[] addr = textToNumericFormatV4(ip);
|
||||
return internalIp(addr) || "127.0.0.1".equals(ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为内部IP地址
|
||||
*
|
||||
*
|
||||
* @param addr byte地址
|
||||
* @return 结果
|
||||
*/
|
||||
private static boolean internalIp(byte[] addr)
|
||||
{
|
||||
if (StringUtils.isNull(addr) || addr.length < 2)
|
||||
{
|
||||
private static boolean internalIp(byte[] addr) {
|
||||
if (StringUtils.isNull(addr) || addr.length < 2) {
|
||||
return true;
|
||||
}
|
||||
final byte b0 = addr[0];
|
||||
|
|
@ -103,18 +92,15 @@ public class IpUtils
|
|||
// 192.168.x.x/16
|
||||
final byte SECTION_5 = (byte) 0xC0;
|
||||
final byte SECTION_6 = (byte) 0xA8;
|
||||
switch (b0)
|
||||
{
|
||||
switch (b0) {
|
||||
case SECTION_1:
|
||||
return true;
|
||||
case SECTION_2:
|
||||
if (b1 >= SECTION_3 && b1 <= SECTION_4)
|
||||
{
|
||||
if (b1 >= SECTION_3 && b1 <= SECTION_4) {
|
||||
return true;
|
||||
}
|
||||
case SECTION_5:
|
||||
switch (b1)
|
||||
{
|
||||
switch (b1) {
|
||||
case SECTION_6:
|
||||
return true;
|
||||
}
|
||||
|
|
@ -125,29 +111,24 @@ public class IpUtils
|
|||
|
||||
/**
|
||||
* 将IPv4地址转换成字节
|
||||
*
|
||||
*
|
||||
* @param text IPv4地址
|
||||
* @return byte 字节
|
||||
*/
|
||||
public static byte[] textToNumericFormatV4(String text)
|
||||
{
|
||||
if (text.length() == 0)
|
||||
{
|
||||
public static byte[] textToNumericFormatV4(String text) {
|
||||
if (text.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[4];
|
||||
String[] elements = text.split("\\.", -1);
|
||||
try
|
||||
{
|
||||
try {
|
||||
long l;
|
||||
int i;
|
||||
switch (elements.length)
|
||||
{
|
||||
switch (elements.length) {
|
||||
case 1:
|
||||
l = Long.parseLong(elements[0]);
|
||||
if ((l < 0L) || (l > 4294967295L))
|
||||
{
|
||||
if ((l < 0L) || (l > 4294967295L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[0] = (byte) (int) (l >> 24 & 0xFF);
|
||||
|
|
@ -157,14 +138,12 @@ public class IpUtils
|
|||
break;
|
||||
case 2:
|
||||
l = Integer.parseInt(elements[0]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
if ((l < 0L) || (l > 255L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[0] = (byte) (int) (l & 0xFF);
|
||||
l = Integer.parseInt(elements[1]);
|
||||
if ((l < 0L) || (l > 16777215L))
|
||||
{
|
||||
if ((l < 0L) || (l > 16777215L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[1] = (byte) (int) (l >> 16 & 0xFF);
|
||||
|
|
@ -172,29 +151,24 @@ public class IpUtils
|
|||
bytes[3] = (byte) (int) (l & 0xFF);
|
||||
break;
|
||||
case 3:
|
||||
for (i = 0; i < 2; ++i)
|
||||
{
|
||||
for (i = 0; i < 2; ++i) {
|
||||
l = Integer.parseInt(elements[i]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
if ((l < 0L) || (l > 255L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[i] = (byte) (int) (l & 0xFF);
|
||||
}
|
||||
l = Integer.parseInt(elements[2]);
|
||||
if ((l < 0L) || (l > 65535L))
|
||||
{
|
||||
if ((l < 0L) || (l > 65535L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[2] = (byte) (int) (l >> 8 & 0xFF);
|
||||
bytes[3] = (byte) (int) (l & 0xFF);
|
||||
break;
|
||||
case 4:
|
||||
for (i = 0; i < 4; ++i)
|
||||
{
|
||||
for (i = 0; i < 4; ++i) {
|
||||
l = Integer.parseInt(elements[i]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
if ((l < 0L) || (l > 255L)) {
|
||||
return null;
|
||||
}
|
||||
bytes[i] = (byte) (int) (l & 0xFF);
|
||||
|
|
@ -203,9 +177,7 @@ public class IpUtils
|
|||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
} catch (NumberFormatException e) {
|
||||
return null;
|
||||
}
|
||||
return bytes;
|
||||
|
|
@ -213,34 +185,26 @@ public class IpUtils
|
|||
|
||||
/**
|
||||
* 获取IP地址
|
||||
*
|
||||
*
|
||||
* @return 本地IP地址
|
||||
*/
|
||||
public static String getHostIp()
|
||||
{
|
||||
try
|
||||
{
|
||||
public static String getHostIp() {
|
||||
try {
|
||||
return InetAddress.getLocalHost().getHostAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
} catch (UnknownHostException ignored) {
|
||||
}
|
||||
return "127.0.0.1";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取主机名
|
||||
*
|
||||
*
|
||||
* @return 本地主机名
|
||||
*/
|
||||
public static String getHostName()
|
||||
{
|
||||
try
|
||||
{
|
||||
public static String getHostName() {
|
||||
try {
|
||||
return InetAddress.getLocalHost().getHostName();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
} catch (UnknownHostException ignored) {
|
||||
}
|
||||
return "未知";
|
||||
}
|
||||
|
|
@ -251,16 +215,12 @@ public class IpUtils
|
|||
* @param ip 获得的IP地址
|
||||
* @return 第一个非unknown IP地址
|
||||
*/
|
||||
public static String getMultistageReverseProxyIp(String ip)
|
||||
{
|
||||
public static String getMultistageReverseProxyIp(String ip) {
|
||||
// 多级反向代理检测
|
||||
if (ip != null && ip.indexOf(",") > 0)
|
||||
{
|
||||
if (ip != null && ip.indexOf(",") > 0) {
|
||||
final String[] ips = ip.trim().split(",");
|
||||
for (String subIp : ips)
|
||||
{
|
||||
if (false == isUnknown(subIp))
|
||||
{
|
||||
for (String subIp : ips) {
|
||||
if (!isUnknown(subIp)) {
|
||||
ip = subIp;
|
||||
break;
|
||||
}
|
||||
|
|
@ -275,39 +235,33 @@ public class IpUtils
|
|||
* @param checkString 被检测的字符串
|
||||
* @return 是否未知
|
||||
*/
|
||||
public static boolean isUnknown(String checkString)
|
||||
{
|
||||
public static boolean isUnknown(String checkString) {
|
||||
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为IP
|
||||
*/
|
||||
public static boolean isIP(String ip)
|
||||
{
|
||||
public static boolean isIP(String ip) {
|
||||
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为IP,或 *为间隔的通配符地址
|
||||
*/
|
||||
public static boolean isIpWildCard(String ip)
|
||||
{
|
||||
public static boolean isIpWildCard(String ip) {
|
||||
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测参数是否在ip通配符里
|
||||
*/
|
||||
public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
|
||||
{
|
||||
public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) {
|
||||
String[] s1 = ipWildCard.split("\\.");
|
||||
String[] s2 = ip.split("\\.");
|
||||
boolean isMatchedSeg = true;
|
||||
for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
|
||||
{
|
||||
if (!s1[i].equals(s2[i]))
|
||||
{
|
||||
for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) {
|
||||
if (!s1[i].equals(s2[i])) {
|
||||
isMatchedSeg = false;
|
||||
break;
|
||||
}
|
||||
|
|
@ -318,29 +272,25 @@ public class IpUtils
|
|||
/**
|
||||
* 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
|
||||
*/
|
||||
public static boolean isIPSegment(String ipSeg)
|
||||
{
|
||||
public static boolean isIPSegment(String ipSeg) {
|
||||
return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断ip是否在指定网段中
|
||||
*/
|
||||
public static boolean ipIsInNetNoCheck(String iparea, String ip)
|
||||
{
|
||||
public static boolean ipIsInNetNoCheck(String iparea, String ip) {
|
||||
int idx = iparea.indexOf('-');
|
||||
String[] sips = iparea.substring(0, idx).split("\\.");
|
||||
String[] sipe = iparea.substring(idx + 1).split("\\.");
|
||||
String[] sipt = ip.split("\\.");
|
||||
long ips = 0L, ipe = 0L, ipt = 0L;
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
ips = ips << 8 | Integer.parseInt(sips[i]);
|
||||
ipe = ipe << 8 | Integer.parseInt(sipe[i]);
|
||||
ipt = ipt << 8 | Integer.parseInt(sipt[i]);
|
||||
}
|
||||
if (ips > ipe)
|
||||
{
|
||||
if (ips > ipe) {
|
||||
long t = ips;
|
||||
ips = ipe;
|
||||
ipe = t;
|
||||
|
|
@ -350,30 +300,22 @@ public class IpUtils
|
|||
|
||||
/**
|
||||
* 校验ip是否符合过滤串规则
|
||||
*
|
||||
*
|
||||
* @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
|
||||
* @param ip 校验IP地址
|
||||
* @param ip 校验IP地址
|
||||
* @return boolean 结果
|
||||
*/
|
||||
public static boolean isMatchedIp(String filter, String ip)
|
||||
{
|
||||
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
|
||||
{
|
||||
public static boolean isMatchedIp(String filter, String ip) {
|
||||
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) {
|
||||
return false;
|
||||
}
|
||||
String[] ips = filter.split(";");
|
||||
for (String iStr : ips)
|
||||
{
|
||||
if (isIP(iStr) && iStr.equals(ip))
|
||||
{
|
||||
for (String iStr : ips) {
|
||||
if (isIP(iStr) && iStr.equals(ip)) {
|
||||
return true;
|
||||
}
|
||||
else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
|
||||
{
|
||||
} else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) {
|
||||
return true;
|
||||
}
|
||||
else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
|
||||
{
|
||||
} else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,19 +5,17 @@ import org.apache.poi.ss.usermodel.Workbook;
|
|||
|
||||
/**
|
||||
* Excel数据格式处理适配器
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public interface ExcelHandlerAdapter
|
||||
{
|
||||
public interface ExcelHandlerAdapter {
|
||||
/**
|
||||
* 格式化
|
||||
*
|
||||
* @param value 单元格数据值
|
||||
* @param args excel注解args参数组
|
||||
* @param cell 单元格对象
|
||||
* @param wb 工作簿对象
|
||||
*
|
||||
* @param value 单元格数据值
|
||||
* @param args excel注解args参数组
|
||||
* @param cell 单元格对象
|
||||
* @param wb 工作簿对象
|
||||
* @return 处理后的值
|
||||
*/
|
||||
Object format(Object value, String[] args, Cell cell, Workbook wb);
|
||||
|
|
|
|||
|
|
@ -2,75 +2,63 @@ package com.ruoyi.common.core.utils.sign;
|
|||
|
||||
/**
|
||||
* Base64工具类
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public final class Base64
|
||||
{
|
||||
static private final int BASELENGTH = 128;
|
||||
static private final int LOOKUPLENGTH = 64;
|
||||
static private final int TWENTYFOURBITGROUP = 24;
|
||||
static private final int EIGHTBIT = 8;
|
||||
static private final int SIXTEENBIT = 16;
|
||||
static private final int FOURBYTE = 4;
|
||||
static private final int SIGN = -128;
|
||||
static private final char PAD = '=';
|
||||
static final private byte[] base64Alphabet = new byte[BASELENGTH];
|
||||
static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
|
||||
public final class Base64 {
|
||||
static private final int BASELENGTH = 128;
|
||||
static private final int LOOKUPLENGTH = 64;
|
||||
static private final int TWENTYFOURBITGROUP = 24;
|
||||
static private final int EIGHTBIT = 8;
|
||||
static private final int SIXTEENBIT = 16;
|
||||
static private final int FOURBYTE = 4;
|
||||
static private final int SIGN = -128;
|
||||
static private final char PAD = '=';
|
||||
static final private byte[] base64Alphabet = new byte[BASELENGTH];
|
||||
static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
|
||||
|
||||
static
|
||||
{
|
||||
for (int i = 0; i < BASELENGTH; ++i)
|
||||
{
|
||||
static {
|
||||
for (int i = 0; i < BASELENGTH; ++i) {
|
||||
base64Alphabet[i] = -1;
|
||||
}
|
||||
for (int i = 'Z'; i >= 'A'; i--)
|
||||
{
|
||||
for (int i = 'Z'; i >= 'A'; i--) {
|
||||
base64Alphabet[i] = (byte) (i - 'A');
|
||||
}
|
||||
for (int i = 'z'; i >= 'a'; i--)
|
||||
{
|
||||
for (int i = 'z'; i >= 'a'; i--) {
|
||||
base64Alphabet[i] = (byte) (i - 'a' + 26);
|
||||
}
|
||||
|
||||
for (int i = '9'; i >= '0'; i--)
|
||||
{
|
||||
for (int i = '9'; i >= '0'; i--) {
|
||||
base64Alphabet[i] = (byte) (i - '0' + 52);
|
||||
}
|
||||
|
||||
base64Alphabet['+'] = 62;
|
||||
base64Alphabet['/'] = 63;
|
||||
|
||||
for (int i = 0; i <= 25; i++)
|
||||
{
|
||||
for (int i = 0; i <= 25; i++) {
|
||||
lookUpBase64Alphabet[i] = (char) ('A' + i);
|
||||
}
|
||||
|
||||
for (int i = 26, j = 0; i <= 51; i++, j++)
|
||||
{
|
||||
for (int i = 26, j = 0; i <= 51; i++, j++) {
|
||||
lookUpBase64Alphabet[i] = (char) ('a' + j);
|
||||
}
|
||||
|
||||
for (int i = 52, j = 0; i <= 61; i++, j++)
|
||||
{
|
||||
for (int i = 52, j = 0; i <= 61; i++, j++) {
|
||||
lookUpBase64Alphabet[i] = (char) ('0' + j);
|
||||
}
|
||||
lookUpBase64Alphabet[62] = (char) '+';
|
||||
lookUpBase64Alphabet[63] = (char) '/';
|
||||
}
|
||||
|
||||
private static boolean isWhiteSpace(char octect)
|
||||
{
|
||||
private static boolean isWhiteSpace(char octect) {
|
||||
return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
|
||||
}
|
||||
|
||||
private static boolean isPad(char octect)
|
||||
{
|
||||
private static boolean isPad(char octect) {
|
||||
return (octect == PAD);
|
||||
}
|
||||
|
||||
private static boolean isData(char octect)
|
||||
{
|
||||
private static boolean isData(char octect) {
|
||||
return (octect < BASELENGTH && base64Alphabet[octect] != -1);
|
||||
}
|
||||
|
||||
|
|
@ -80,23 +68,20 @@ public final class Base64
|
|||
* @param binaryData Array containing binaryData
|
||||
* @return Encoded Base64 array
|
||||
*/
|
||||
public static String encode(byte[] binaryData)
|
||||
{
|
||||
if (binaryData == null)
|
||||
{
|
||||
public static String encode(byte[] binaryData) {
|
||||
if (binaryData == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
int lengthDataBits = binaryData.length * EIGHTBIT;
|
||||
if (lengthDataBits == 0)
|
||||
{
|
||||
if (lengthDataBits == 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
|
||||
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
|
||||
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
|
||||
char encodedData[] = null;
|
||||
char[] encodedData;
|
||||
|
||||
encodedData = new char[numberQuartet * 4];
|
||||
|
||||
|
|
@ -105,8 +90,7 @@ public final class Base64
|
|||
int encodedIndex = 0;
|
||||
int dataIndex = 0;
|
||||
|
||||
for (int i = 0; i < numberTriplets; i++)
|
||||
{
|
||||
for (int i = 0; i < numberTriplets; i++) {
|
||||
b1 = binaryData[dataIndex++];
|
||||
b2 = binaryData[dataIndex++];
|
||||
b3 = binaryData[dataIndex++];
|
||||
|
|
@ -125,8 +109,7 @@ public final class Base64
|
|||
}
|
||||
|
||||
// form integral number of 6-bit groups
|
||||
if (fewerThan24bits == EIGHTBIT)
|
||||
{
|
||||
if (fewerThan24bits == EIGHTBIT) {
|
||||
b1 = binaryData[dataIndex];
|
||||
k = (byte) (b1 & 0x03);
|
||||
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
|
||||
|
|
@ -134,9 +117,7 @@ public final class Base64
|
|||
encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
|
||||
encodedData[encodedIndex++] = PAD;
|
||||
encodedData[encodedIndex++] = PAD;
|
||||
}
|
||||
else if (fewerThan24bits == SIXTEENBIT)
|
||||
{
|
||||
} else if (fewerThan24bits == SIXTEENBIT) {
|
||||
b1 = binaryData[dataIndex];
|
||||
b2 = binaryData[dataIndex + 1];
|
||||
l = (byte) (b2 & 0x0f);
|
||||
|
|
@ -159,10 +140,8 @@ public final class Base64
|
|||
* @param encoded string containing Base64 data
|
||||
* @return Array containind decoded data.
|
||||
*/
|
||||
public static byte[] decode(String encoded)
|
||||
{
|
||||
if (encoded == null)
|
||||
{
|
||||
public static byte[] decode(String encoded) {
|
||||
if (encoded == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
@ -170,15 +149,13 @@ public final class Base64
|
|||
// remove white spaces
|
||||
int len = removeWhiteSpace(base64Data);
|
||||
|
||||
if (len % FOURBYTE != 0)
|
||||
{
|
||||
if (len % FOURBYTE != 0) {
|
||||
return null;// should be divisible by four
|
||||
}
|
||||
|
||||
int numberQuadruple = (len / FOURBYTE);
|
||||
|
||||
if (numberQuadruple == 0)
|
||||
{
|
||||
if (numberQuadruple == 0) {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
|
|
@ -191,12 +168,10 @@ public final class Base64
|
|||
int dataIndex = 0;
|
||||
decodedData = new byte[(numberQuadruple) * 3];
|
||||
|
||||
for (; i < numberQuadruple - 1; i++)
|
||||
{
|
||||
for (; i < numberQuadruple - 1; i++) {
|
||||
|
||||
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
|
||||
|| !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++])))
|
||||
{
|
||||
|| !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) {
|
||||
return null;
|
||||
} // if found "no data" just return null
|
||||
|
||||
|
|
@ -210,8 +185,7 @@ public final class Base64
|
|||
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
|
||||
}
|
||||
|
||||
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])))
|
||||
{
|
||||
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
|
||||
return null;// if found "no data" just return null
|
||||
}
|
||||
|
||||
|
|
@ -220,10 +194,8 @@ public final class Base64
|
|||
|
||||
d3 = base64Data[dataIndex++];
|
||||
d4 = base64Data[dataIndex++];
|
||||
if (!isData((d3)) || !isData((d4)))
|
||||
{// Check if they are PAD characters
|
||||
if (isPad(d3) && isPad(d4))
|
||||
{
|
||||
if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
|
||||
if (isPad(d3) && isPad(d4)) {
|
||||
if ((b2 & 0xf) != 0)// last 4 bits should be zero
|
||||
{
|
||||
return null;
|
||||
|
|
@ -232,9 +204,7 @@ public final class Base64
|
|||
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
|
||||
tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
|
||||
return tmp;
|
||||
}
|
||||
else if (!isPad(d3) && isPad(d4))
|
||||
{
|
||||
} else if (!isPad(d3) && isPad(d4)) {
|
||||
b3 = base64Alphabet[d3];
|
||||
if ((b3 & 0x3) != 0)// last 2 bits should be zero
|
||||
{
|
||||
|
|
@ -245,14 +215,10 @@ public final class Base64
|
|||
tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
|
||||
tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
|
||||
return tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // No PAD e.g 3cQl
|
||||
} else { // No PAD e.g 3cQl
|
||||
b3 = base64Alphabet[d3];
|
||||
b4 = base64Alphabet[d4];
|
||||
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
|
||||
|
|
@ -269,20 +235,16 @@ public final class Base64
|
|||
* @param data the byte array of base64 data (with WS)
|
||||
* @return the new length
|
||||
*/
|
||||
private static int removeWhiteSpace(char[] data)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
private static int removeWhiteSpace(char[] data) {
|
||||
if (data == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// count characters that's not whitespace
|
||||
int newSize = 0;
|
||||
int len = data.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
if (!isWhiteSpace(data[i]))
|
||||
{
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (!isWhiteSpace(data[i])) {
|
||||
data[newSize++] = data[i];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,11 +5,10 @@ import com.ruoyi.common.core.utils.StringUtils;
|
|||
|
||||
/**
|
||||
* sql操作工具类
|
||||
*
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class SqlUtil
|
||||
{
|
||||
public class SqlUtil {
|
||||
/**
|
||||
* 定义常用的 sql关键字
|
||||
*/
|
||||
|
|
@ -18,7 +17,7 @@ public class SqlUtil
|
|||
/**
|
||||
* 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
|
||||
*/
|
||||
public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
|
||||
public static String SQL_PATTERN = "[a-zA-Z0-9_ ,.]+";
|
||||
|
||||
/**
|
||||
* 限制orderBy最大长度
|
||||
|
|
@ -28,14 +27,11 @@ public class SqlUtil
|
|||
/**
|
||||
* 检查字符,防止注入绕过
|
||||
*/
|
||||
public static String escapeOrderBySql(String value)
|
||||
{
|
||||
if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
|
||||
{
|
||||
public static String escapeOrderBySql(String value) {
|
||||
if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
|
||||
throw new UtilException("参数不符合规范,不能进行查询");
|
||||
}
|
||||
if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH)
|
||||
{
|
||||
if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) {
|
||||
throw new UtilException("参数已超过最大限制,不能进行查询");
|
||||
}
|
||||
return value;
|
||||
|
|
@ -44,25 +40,20 @@ public class SqlUtil
|
|||
/**
|
||||
* 验证 order by 语法是否符合规范
|
||||
*/
|
||||
public static boolean isValidOrderBySql(String value)
|
||||
{
|
||||
public static boolean isValidOrderBySql(String value) {
|
||||
return value.matches(SQL_PATTERN);
|
||||
}
|
||||
|
||||
/**
|
||||
* SQL关键字检查
|
||||
*/
|
||||
public static void filterKeyword(String value)
|
||||
{
|
||||
if (StringUtils.isEmpty(value))
|
||||
{
|
||||
public static void filterKeyword(String value) {
|
||||
if (StringUtils.isEmpty(value)) {
|
||||
return;
|
||||
}
|
||||
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
|
||||
for (String sqlKeyword : sqlKeywords)
|
||||
{
|
||||
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
|
||||
{
|
||||
for (String sqlKeyword : sqlKeywords) {
|
||||
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) {
|
||||
throw new UtilException("参数存在SQL注入风险");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>ruoyi-common-datascope</artifactId>
|
||||
|
||||
|
||||
<description>
|
||||
ruoyi-common-datascope权限范围
|
||||
</description>
|
||||
|
||||
<dependencies>
|
||||
|
||||
|
||||
<!-- RuoYi Common Security -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
|
|
|
|||
|
|
@ -152,4 +152,12 @@ public class GlobalExceptionHandler {
|
|||
public AjaxResult handleLoginExpiredException(LoginExpiredException e) {
|
||||
return AjaxResult.error(e.getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 参数校验异常
|
||||
*/
|
||||
@ExceptionHandler(IllegalArgumentException.class)
|
||||
public AjaxResult handleIllegalArgumentException(IllegalArgumentException e) {
|
||||
return AjaxResult.error("参数校验失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,10 +16,10 @@
|
|||
</description>
|
||||
|
||||
<dependencies>
|
||||
<!-- RuoYi Common Security -->
|
||||
<!-- RuoYi Common Log -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-security</artifactId>
|
||||
<artifactId>ruoyi-common-log</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
|
|
|||
|
|
@ -10,12 +10,12 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>ruoyi-common-swagger</artifactId>
|
||||
|
||||
|
||||
<description>
|
||||
ruoyi-common-swagger系统接口
|
||||
</description>
|
||||
|
||||
<dependencies>
|
||||
<dependencies>
|
||||
|
||||
<!-- SpringBoot Web -->
|
||||
<dependency>
|
||||
|
|
@ -34,5 +34,5 @@
|
|||
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -59,12 +59,6 @@
|
|||
<artifactId>minio</artifactId>
|
||||
<version>${minio.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- RuoYi Api System -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-api-system</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Mysql Connector -->
|
||||
<dependency>
|
||||
|
|
@ -82,6 +76,12 @@
|
|||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-services</artifactId>
|
||||
<!-- <exclusions>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>com.ruoyi</groupId>-->
|
||||
<!-- <artifactId>ruoyi-common-log</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- </exclusions>-->
|
||||
</dependency>
|
||||
|
||||
<!-- RuoYi Common Datasource-->
|
||||
|
|
@ -89,7 +89,19 @@
|
|||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-datasource</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- RuoYi Common Core -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.ruoyi</groupId>-->
|
||||
<!-- <artifactId>ruoyi-common-security</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!-- <!– 系统接口 –>-->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.ruoyi</groupId>-->
|
||||
<!-- <artifactId>ruoyi-api-system</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.file;
|
||||
|
||||
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
|
|
@ -13,6 +14,7 @@ import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
|
|||
*/
|
||||
@ConditionalOnProperty(name = "spring.cloud.nacos.config.group", havingValue = "DEFAULT_GROUP", matchIfMissing = true)
|
||||
@EnableCustomSwagger2
|
||||
@EnableRyFeignClients
|
||||
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
|
||||
public class RuoYiFileApplication {
|
||||
public static void main(String[] args) {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ import com.ruoyi.common.core.utils.poi.ExcelUtil;
|
|||
import com.ruoyi.common.core.web.controller.BaseController;
|
||||
import com.ruoyi.common.core.web.domain.AjaxResult;
|
||||
import com.ruoyi.common.core.web.page.TableDataInfo;
|
||||
import com.ruoyi.common.log.annotation.Log;
|
||||
import com.ruoyi.common.log.enums.BusinessType;
|
||||
import com.ruoyi.common.security.annotation.RequiresPermissions;
|
||||
import com.ruoyi.file.domain.SysFile;
|
||||
import com.ruoyi.file.service.ISysFileCRUDService;
|
||||
|
|
@ -43,6 +45,10 @@ public class SysFileCRUDController extends BaseController {
|
|||
@PostMapping("/export")
|
||||
public void export(HttpServletResponse response, SysFile sysFile) {
|
||||
List<SysFile> list = crudService.selectSysFileList(sysFile);
|
||||
if (list.isEmpty()) {
|
||||
responseJsonWarn(response, "没有数据可以导出");
|
||||
return;
|
||||
}
|
||||
ExcelUtil<SysFile> util = new ExcelUtil<>(SysFile.class);
|
||||
util.exportExcel(response, list, "文件存储记录数据");
|
||||
}
|
||||
|
|
@ -55,4 +61,34 @@ public class SysFileCRUDController extends BaseController {
|
|||
public AjaxResult getInfo(@PathVariable("fileId") String fileId) {
|
||||
return success(crudService.selectSysFileByFileId(fileId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增文件存储记录
|
||||
*/
|
||||
@RequiresPermissions("wms:FileRecord:add")
|
||||
@Log(title = "文件存储记录", businessType = BusinessType.INSERT)
|
||||
@PostMapping
|
||||
public AjaxResult add(@RequestBody SysFile sysFile) {
|
||||
return toAjax(crudService.insertSysFile(sysFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改文件存储记录
|
||||
*/
|
||||
@RequiresPermissions("wms:FileRecord:edit")
|
||||
@Log(title = "文件存储记录", businessType = BusinessType.UPDATE)
|
||||
@PutMapping
|
||||
public AjaxResult edit(@RequestBody SysFile sysFile) {
|
||||
return toAjax(crudService.updateSysFile(sysFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件存储记录
|
||||
*/
|
||||
@RequiresPermissions("wms:FileRecord:remove")
|
||||
@Log(title = "文件存储记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{fileIds}")
|
||||
public AjaxResult remove(@PathVariable String[] fileIds) throws Exception {
|
||||
return toAjax(crudService.deleteSysFileByFileIds(fileIds));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
package com.ruoyi.file.controller;
|
||||
|
||||
import com.ruoyi.file.domain.FileSaveResult;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
|
@ -32,7 +33,7 @@ public class SysFileController {
|
|||
public R<SysFileInfo> upload(MultipartFile file) {
|
||||
try {
|
||||
// 上传并返回访问地址
|
||||
FileSaveResult saveResult = sysFileService.uploadFile(file);
|
||||
FileResult saveResult = sysFileService.uploadFile(file);
|
||||
String requestUrl = saveResult.getRequestUrl();
|
||||
// 构建返回结果
|
||||
SysFileInfo responseInfo = new SysFileInfo();
|
||||
|
|
@ -45,4 +46,18 @@ public class SysFileController {
|
|||
return R.fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*/
|
||||
@PostMapping("deleteFiles/{fileIds}")
|
||||
public R<SysFileInfo> deleteFiles(@PathVariable String[] fileIds) {
|
||||
try {
|
||||
FileResult fileResult = sysFileService.deleteFiles(fileIds);
|
||||
return fileResult.isSuccess() ? R.ok() : R.fail(fileResult.getMessage("删除文件失败"));
|
||||
} catch (Exception e) {
|
||||
log.error("删除文件失败", e);
|
||||
return R.fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.file.domain;
|
||||
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
|
|
@ -10,7 +11,7 @@ import java.io.Serializable;
|
|||
* created on 2024/2/19
|
||||
*/
|
||||
@Data
|
||||
public class FileSaveResult implements Serializable {
|
||||
public class FileResult implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
|
@ -19,6 +20,8 @@ public class FileSaveResult implements Serializable {
|
|||
|
||||
private String message;
|
||||
|
||||
private int count;
|
||||
|
||||
/**
|
||||
* 文件请求地址
|
||||
*/
|
||||
|
|
@ -33,19 +36,30 @@ public class FileSaveResult implements Serializable {
|
|||
return uploadResult == null ? "" : uploadResult.getFileId();
|
||||
}
|
||||
|
||||
public static FileSaveResult success(String requestUrl, FileUploadResult uploadResult) {
|
||||
FileSaveResult result = new FileSaveResult();
|
||||
public static FileResult success(String requestUrl, FileUploadResult uploadResult) {
|
||||
FileResult result = new FileResult();
|
||||
result.setSuccess(true);
|
||||
result.setRequestUrl(requestUrl);
|
||||
result.setUploadResult(uploadResult);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static FileSaveResult fail(String message) {
|
||||
FileSaveResult result = new FileSaveResult();
|
||||
public static FileResult success(String requestUrl) {
|
||||
return success(requestUrl, null);
|
||||
}
|
||||
|
||||
public static FileResult success() {
|
||||
return success(null, null);
|
||||
}
|
||||
|
||||
public static FileResult fail(String message) {
|
||||
FileResult result = new FileResult();
|
||||
result.setSuccess(false);
|
||||
result.setMessage(message);
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getMessage(String defaultMessage) {
|
||||
return StringUtils.isBlank(message) ? defaultMessage : message;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package com.ruoyi.file.service;
|
||||
|
||||
import com.github.tobato.fastdfs.service.FastFileStorageClient;
|
||||
import com.ruoyi.file.domain.FileSaveResult;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
|
@ -29,12 +29,17 @@ public class FastDfsSysFileServiceImpl implements ISysFileService {
|
|||
* @return 访问地址
|
||||
*/
|
||||
@Override
|
||||
public FileSaveResult uploadFile(MultipartFile file) throws Exception {
|
||||
public FileResult uploadFile(MultipartFile file) throws Exception {
|
||||
// InputStream inputStream = file.getInputStream();
|
||||
// StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
|
||||
// FileTypeUtils.getExtension(file), null);
|
||||
// IoUtils.closeQuietly(inputStream);
|
||||
// return domain + "/" + storePath.getFullPath();
|
||||
return FileSaveResult.fail("Not implemented yet!");
|
||||
return FileResult.fail("Not implemented yet!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileResult deleteFiles(String[] fileIds) throws Exception {
|
||||
return FileResult.fail("Not implemented yet!");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public interface ISysFileCRUDService {
|
|||
* @param fileIds 需要删除的文件存储记录主键集合
|
||||
* @return 结果
|
||||
*/
|
||||
int deleteSysFileByFileIds(String[] fileIds);
|
||||
int deleteSysFileByFileIds(String[] fileIds) throws Exception;
|
||||
|
||||
/**
|
||||
* 删除文件存储记录信息
|
||||
|
|
@ -57,5 +57,5 @@ public interface ISysFileCRUDService {
|
|||
* @param fileId 文件存储记录主键
|
||||
* @return 结果
|
||||
*/
|
||||
int deleteSysFileByFileId(String fileId);
|
||||
int deleteSysFileByFileId(String fileId) throws Exception;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,16 @@
|
|||
package com.ruoyi.file.service;
|
||||
|
||||
import com.ruoyi.file.domain.FileSaveResult;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import com.ruoyi.file.domain.SysFile;
|
||||
import com.ruoyi.file.mapper.SysFileDynamicSqlSupport;
|
||||
import com.ruoyi.file.mapper.SysFileMapper;
|
||||
import org.mybatis.dynamic.sql.SqlBuilder;
|
||||
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
||||
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 文件上传接口
|
||||
*
|
||||
|
|
@ -15,6 +23,26 @@ public interface ISysFileService {
|
|||
* @param file 上传的文件
|
||||
* @return 保存结果
|
||||
*/
|
||||
FileSaveResult uploadFile(MultipartFile file) throws Exception;
|
||||
FileResult uploadFile(MultipartFile file) throws Exception;
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param fileIds 文件id
|
||||
*/
|
||||
FileResult deleteFiles(String[] fileIds) throws Exception;
|
||||
|
||||
default List<SysFile> selectFilesById(SysFileMapper sysFileMapper, String[] fileIds) {
|
||||
if (fileIds == null || fileIds.length == 0) {
|
||||
throw new IllegalArgumentException("file ids is empty");
|
||||
}
|
||||
SelectStatementProvider provider = SqlBuilder.select(SysFileMapper.selectList)
|
||||
.from(SysFileDynamicSqlSupport.sysFile)
|
||||
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isIn(fileIds))
|
||||
.orderBy(SysFileDynamicSqlSupport.fileId)
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return sysFileMapper.selectMany(provider);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
package com.ruoyi.file.service;
|
||||
|
||||
import com.ruoyi.common.core.constant.HttpStatus;
|
||||
import com.ruoyi.common.core.exception.ServiceException;
|
||||
import com.ruoyi.file.constants.FileStorageType;
|
||||
import com.ruoyi.file.domain.FileSaveResult;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import com.ruoyi.file.domain.FileUploadResult;
|
||||
import com.ruoyi.file.domain.SysFile;
|
||||
import com.ruoyi.file.mapper.SysFileMapper;
|
||||
|
|
@ -13,6 +15,10 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 本地文件存储
|
||||
*
|
||||
|
|
@ -50,19 +56,55 @@ public class LocalSysFileServiceImpl implements ISysFileService {
|
|||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public FileSaveResult uploadFile(MultipartFile file) throws Exception {
|
||||
public FileResult uploadFile(MultipartFile file) throws Exception {
|
||||
// 保存文件到本地
|
||||
FileUploadResult uploadResult = FileUploadUtils.upload(localFilePath, file);
|
||||
String savedPathFileName = uploadResult.getSavedPathFileName();
|
||||
String requestUrl = domain + localFilePrefix + savedPathFileName;
|
||||
// 保存文件记录
|
||||
SysFile record = getSysFile(uploadResult, requestUrl);
|
||||
SysFile record = buildRecord(uploadResult, requestUrl);
|
||||
sysFileMapper.insertSelective(record);
|
||||
// 返回访问地址
|
||||
return FileSaveResult.success(requestUrl, uploadResult);
|
||||
return FileResult.success(requestUrl, uploadResult);
|
||||
}
|
||||
|
||||
private SysFile getSysFile(FileUploadResult uploadResult, String requestUrl) {
|
||||
/**
|
||||
* 本地文件删除
|
||||
*
|
||||
* @param fileIds 文件id
|
||||
* @return 删除结果
|
||||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public FileResult deleteFiles(String[] fileIds) {
|
||||
// 查询文件记录
|
||||
List<SysFile> fileList = selectFilesById(sysFileMapper, fileIds);
|
||||
// 删除文件
|
||||
List<String> warningList = new ArrayList<>();
|
||||
for (SysFile sysFile : fileList) {
|
||||
File file = new File(sysFile.getFilePath());
|
||||
if (file.exists()) {
|
||||
if (file.delete()) {
|
||||
sysFileMapper.deleteByPrimaryKey(sysFile.getFileId());
|
||||
} else {
|
||||
throw new ServiceException("Delete file failed: [" + sysFile.getFilePath() + "]", HttpStatus.ERROR);
|
||||
}
|
||||
} else {
|
||||
warningList.add(sysFile.getFilePath());
|
||||
}
|
||||
}
|
||||
// 组装返回结果
|
||||
FileResult result = FileResult.success();
|
||||
if (!warningList.isEmpty()) {
|
||||
result.setMessage("Files not exists: " + warningList);
|
||||
} else {
|
||||
result.setMessage("Delete file success");
|
||||
}
|
||||
result.setCount(fileList.size() - warningList.size());
|
||||
return result;
|
||||
}
|
||||
|
||||
private SysFile buildRecord(FileUploadResult uploadResult, String requestUrl) {
|
||||
SysFile record = new SysFile();
|
||||
record.setFileId(uploadResult.getFileId()); // 文件ID
|
||||
record.setSavedName(uploadResult.getSavedFileName()); // 保存的文件名
|
||||
|
|
|
|||
|
|
@ -1,17 +1,12 @@
|
|||
package com.ruoyi.file.service;
|
||||
|
||||
import com.alibaba.nacos.common.utils.IoUtils;
|
||||
import com.ruoyi.file.domain.FileSaveResult;
|
||||
import com.ruoyi.file.utils.FileUploadUtils;
|
||||
import com.ruoyi.file.config.MinioConfig;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import io.minio.MinioClient;
|
||||
import io.minio.PutObjectArgs;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* TODO 未完成,还需要改造:保存文件记录
|
||||
* Minio 文件存储
|
||||
|
|
@ -33,18 +28,24 @@ public class MinioSysFileServiceImpl implements ISysFileService {
|
|||
* @return 访问地址
|
||||
*/
|
||||
@Override
|
||||
public FileSaveResult uploadFile(MultipartFile file) throws Exception {
|
||||
String fileName = FileUploadUtils.extractFilename(file, null);
|
||||
InputStream inputStream = file.getInputStream();
|
||||
PutObjectArgs args = PutObjectArgs.builder()
|
||||
.bucket(minioConfig.getBucketName())
|
||||
.object(fileName)
|
||||
.stream(inputStream, file.getSize(), -1)
|
||||
.contentType(file.getContentType())
|
||||
.build();
|
||||
client.putObject(args);
|
||||
IoUtils.closeQuietly(inputStream);
|
||||
String requestUrl = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
|
||||
return FileSaveResult.success(requestUrl, null);
|
||||
public FileResult uploadFile(MultipartFile file) throws Exception {
|
||||
// String fileName = FileUploadUtils.extractFilename(file, null);
|
||||
// InputStream inputStream = file.getInputStream();
|
||||
// PutObjectArgs args = PutObjectArgs.builder()
|
||||
// .bucket(minioConfig.getBucketName())
|
||||
// .object(fileName)
|
||||
// .stream(inputStream, file.getSize(), -1)
|
||||
// .contentType(file.getContentType())
|
||||
// .build();
|
||||
// client.putObject(args);
|
||||
// IoUtils.closeQuietly(inputStream);
|
||||
// String requestUrl = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
|
||||
// return FileResult.success(requestUrl, null);
|
||||
return FileResult.fail("Not implemented yet!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileResult deleteFiles(String[] fileIds) throws Exception {
|
||||
return FileResult.fail("Not implemented yet!");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
package com.ruoyi.file.service;
|
||||
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
import com.ruoyi.file.domain.FileResult;
|
||||
import com.ruoyi.file.domain.SysFile;
|
||||
import com.ruoyi.file.mapper.SysFileDynamicSqlSupport;
|
||||
import com.ruoyi.file.mapper.SysFileMapper;
|
||||
import org.mybatis.dynamic.sql.SqlBuilder;
|
||||
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
|
||||
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
||||
import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
|
||||
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
||||
|
|
@ -24,9 +24,13 @@ import java.util.Optional;
|
|||
*/
|
||||
@Service
|
||||
public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
|
||||
|
||||
@Autowired
|
||||
private SysFileMapper sysFileMapper;
|
||||
|
||||
@Autowired
|
||||
private ISysFileService sysFileService;
|
||||
|
||||
/**
|
||||
* 查询文件存储记录
|
||||
*
|
||||
|
|
@ -52,13 +56,15 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
|
|||
SelectStatementProvider provider = SqlBuilder.select(SysFileMapper.selectList)
|
||||
.from(SysFileDynamicSqlSupport.sysFile)
|
||||
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isEqualToWhenPresent(sysFile.getFileId()))
|
||||
.and(SysFileDynamicSqlSupport.savedName, SqlBuilder.isLikeWhenPresent(sysFile.getSavedName() == null ? null : "%" + sysFile.getSavedName() + "%"))
|
||||
.and(SysFileDynamicSqlSupport.originalName, SqlBuilder.isLikeWhenPresent(sysFile.getSavedName() == null ? null : "%" + sysFile.getSavedName() + "%"))
|
||||
.and(SysFileDynamicSqlSupport.extension, SqlBuilder.isEqualToWhenPresent(sysFile.getExtension()))
|
||||
.orderBy(SysFileDynamicSqlSupport.createTime.descending())
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return sysFileMapper.selectMany(provider);
|
||||
} else {
|
||||
//全部查询
|
||||
return sysFileMapper.select(SelectDSLCompleter.allRows());
|
||||
return sysFileMapper.select(SelectDSLCompleter.allRowsOrderedBy(SysFileDynamicSqlSupport.createTime.descending()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -94,12 +100,9 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
|
|||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public int deleteSysFileByFileIds(String[] fileIds) {
|
||||
DeleteStatementProvider provider = SqlBuilder.deleteFrom(SysFileDynamicSqlSupport.sysFile)
|
||||
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isIn(fileIds))
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return sysFileMapper.delete(provider);
|
||||
public int deleteSysFileByFileIds(String[] fileIds) throws Exception {
|
||||
FileResult result = sysFileService.deleteFiles(fileIds);
|
||||
return result.getCount();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -110,7 +113,8 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
|
|||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public int deleteSysFileByFileId(String fileId) {
|
||||
return sysFileMapper.deleteByPrimaryKey(fileId);
|
||||
public int deleteSysFileByFileId(String fileId) throws Exception {
|
||||
String[] fileIds = {fileId};
|
||||
return deleteSysFileByFileIds(fileIds);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
|
|||
#end
|
||||
#end
|
||||
#end
|
||||
.orderBy(${ClassName}DynamicSqlSupport.${pkColumn.javaField})
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return ${className}Mapper.selectMany(provider);
|
||||
|
|
|
|||
|
|
@ -108,8 +108,8 @@
|
|||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange" show-overflow-tooltip="true">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
|
||||
<el-table-column type="selection" width="30" align="center" />
|
||||
#foreach($column in $columns)
|
||||
#set($javaField=$column.javaField)
|
||||
#set($parentheseIndex=$column.columnComment.indexOf("("))
|
||||
|
|
@ -377,7 +377,7 @@ const data = reactive({
|
|||
form: {},
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 20,
|
||||
#foreach ($column in $columns)
|
||||
#if($column.query)
|
||||
$column.javaField: null#if($foreach.count != $columns.size()),#end
|
||||
|
|
|
|||
|
|
@ -76,12 +76,6 @@
|
|||
<artifactId>ruoyi-common-datascope</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- RuoYi Common Log -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-log</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- RuoYi Common Services -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
|
|
|
|||
|
|
@ -70,12 +70,6 @@
|
|||
<artifactId>ruoyi-common-datascope</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- RuoYi Common Log -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-log</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 共通业务 -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
|
|
|
|||
|
|
@ -70,7 +70,17 @@ public class ItemInfoController extends BaseController {
|
|||
@Log(title = "物品基础信息", businessType = BusinessType.INSERT)
|
||||
@PostMapping
|
||||
public AjaxResult add(@RequestBody ItemInfo itemInfo) {
|
||||
return toAjax(itemInfoService.insertItemInfo(itemInfo));
|
||||
return itemInfoService.insertItemInfo(itemInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增物品基础信息(带图片文件一起提交)
|
||||
*/
|
||||
@RequiresPermissions("wms:ItemInfo:add")
|
||||
@Log(title = "物品基础信息", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/addWithImage")
|
||||
public AjaxResult addWithImage(ItemInfo itemInfo) {
|
||||
return itemInfoService.insertItemInfo(itemInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -80,7 +90,17 @@ public class ItemInfoController extends BaseController {
|
|||
@Log(title = "物品基础信息", businessType = BusinessType.UPDATE)
|
||||
@PutMapping
|
||||
public AjaxResult edit(@RequestBody ItemInfo itemInfo) {
|
||||
return toAjax(itemInfoService.updateItemInfo(itemInfo));
|
||||
return itemInfoService.updateItemInfo(itemInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改物品基础信息(带图片文件一起提交)
|
||||
*/
|
||||
@RequiresPermissions("wms:ItemInfo:edit")
|
||||
@Log(title = "物品基础信息", businessType = BusinessType.UPDATE)
|
||||
@PutMapping("/editWithImage")
|
||||
public AjaxResult editWithImage(ItemInfo itemInfo) {
|
||||
return itemInfoService.updateItemInfo(itemInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,11 @@
|
|||
package com.ruoyi.wms.domain;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.ruoyi.common.core.web.domain.ExtBaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
|
@ -11,681 +16,297 @@ import java.math.BigDecimal;
|
|||
*
|
||||
* <ul>
|
||||
* <li> Table: WMS_M_ITEM_INFO </li>
|
||||
* <li> Remarks: 物品基础信息表 </li>
|
||||
* </ul>
|
||||
*
|
||||
* @author ryas
|
||||
* created on 2024-02-20
|
||||
*/
|
||||
@ToString(callSuper = true)
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class ItemInfo extends ExtBaseEntity implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//==================== ↓↓↓↓↓↓ 非表字段 ↓↓↓↓↓↓ ====================
|
||||
|
||||
/**
|
||||
* 物品代码
|
||||
* (非表字段)
|
||||
* 物品类型名称
|
||||
*/
|
||||
private String itemTypeName;
|
||||
|
||||
/**
|
||||
* (非表字段)
|
||||
* 标准单位名称
|
||||
*/
|
||||
private String stdUnitName;
|
||||
|
||||
/**
|
||||
* (非表字段)
|
||||
* 包装单位名称
|
||||
*/
|
||||
private String pkgUnitName;
|
||||
|
||||
/**
|
||||
* (非表字段)
|
||||
* 图片文件
|
||||
*/
|
||||
private MultipartFile[] itemImages;
|
||||
|
||||
//==================== ↓↓↓↓↓↓ 扩展方法 ↓↓↓↓↓↓ ====================
|
||||
|
||||
@JsonIgnore
|
||||
public boolean isEnabled() {
|
||||
return enableFlg != null && enableFlg == 1;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public boolean isLotNoManaged() {
|
||||
return lotNoMgmtCls != null && lotNoMgmtCls == 1;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public MultipartFile getItemImageFirst() {
|
||||
return itemImages != null && itemImages.length > 0 ? itemImages[0] : null;
|
||||
}
|
||||
|
||||
//==================== ↓↓↓↓↓↓ 表字段 ↓↓↓↓↓↓ ====================
|
||||
|
||||
/**
|
||||
* 物品代码
|
||||
*/
|
||||
private String itemCd;
|
||||
|
||||
/**
|
||||
* 从属部门ID
|
||||
* 从属部门ID
|
||||
*/
|
||||
private Integer deptId;
|
||||
|
||||
/**
|
||||
* 物品名称
|
||||
* 物品名称
|
||||
*/
|
||||
private String itemName;
|
||||
|
||||
/**
|
||||
* 供应商
|
||||
* 供应商
|
||||
*/
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 筹备提前期
|
||||
* 筹备提前期
|
||||
*/
|
||||
private BigDecimal prepLeadTime;
|
||||
|
||||
/**
|
||||
* 入库提前期
|
||||
* 入库提前期
|
||||
*/
|
||||
private BigDecimal instockLeadTime;
|
||||
|
||||
/**
|
||||
* 放置期
|
||||
* 放置期
|
||||
*/
|
||||
private BigDecimal restingPeriod;
|
||||
|
||||
/**
|
||||
* 出库提前期
|
||||
* 出库提前期
|
||||
*/
|
||||
private BigDecimal outstockLeadTime;
|
||||
|
||||
/**
|
||||
* 规格1
|
||||
* 规格1
|
||||
*/
|
||||
private String spec1;
|
||||
|
||||
/**
|
||||
* 规格2
|
||||
* 规格2
|
||||
*/
|
||||
private String spec2;
|
||||
|
||||
/**
|
||||
* 规格3
|
||||
* 规格3
|
||||
*/
|
||||
private String spec3;
|
||||
|
||||
/**
|
||||
* 规格4
|
||||
* 规格4
|
||||
*/
|
||||
private String spec4;
|
||||
|
||||
/**
|
||||
* 规格5
|
||||
* 规格5
|
||||
*/
|
||||
private String spec5;
|
||||
|
||||
/**
|
||||
* 分类1
|
||||
* 分类1
|
||||
*/
|
||||
private String cls1;
|
||||
|
||||
/**
|
||||
* 分类2
|
||||
* 分类2
|
||||
*/
|
||||
private String cls2;
|
||||
|
||||
/**
|
||||
* 分类3
|
||||
* 分类3
|
||||
*/
|
||||
private String cls3;
|
||||
|
||||
/**
|
||||
* 分类4
|
||||
* 分类4
|
||||
*/
|
||||
private String cls4;
|
||||
|
||||
/**
|
||||
* 分类5
|
||||
* 分类5
|
||||
*/
|
||||
private String cls5;
|
||||
|
||||
/**
|
||||
* 备注1
|
||||
* 备注1
|
||||
*/
|
||||
private String remark1;
|
||||
|
||||
/**
|
||||
* 备注2
|
||||
* 备注2
|
||||
*/
|
||||
private String remark2;
|
||||
|
||||
/**
|
||||
* 备注3
|
||||
* 备注3
|
||||
*/
|
||||
private String remark3;
|
||||
|
||||
/**
|
||||
* 备注4
|
||||
* 备注4
|
||||
*/
|
||||
private String remark4;
|
||||
|
||||
/**
|
||||
* 备注5
|
||||
* 备注5
|
||||
*/
|
||||
private String remark5;
|
||||
|
||||
/**
|
||||
* 供货周期
|
||||
* 供货周期
|
||||
*/
|
||||
private String deliveryPeriod;
|
||||
|
||||
/**
|
||||
* 默认库位号
|
||||
* 默认库位号
|
||||
*/
|
||||
private String defaultStgBinCd;
|
||||
|
||||
/**
|
||||
* 启用标志
|
||||
* 启用标志
|
||||
*/
|
||||
private Integer enableFlg;
|
||||
|
||||
/**
|
||||
* 安全库存量
|
||||
* 安全库存量
|
||||
*/
|
||||
private BigDecimal safetyStock;
|
||||
|
||||
/**
|
||||
* 最大库存量
|
||||
* 最大库存量
|
||||
*/
|
||||
private BigDecimal maxInvQty;
|
||||
|
||||
/**
|
||||
* 发起购买的阈值
|
||||
* 发起购买的阈值
|
||||
*/
|
||||
private BigDecimal purchLimitQty;
|
||||
|
||||
/**
|
||||
* 物品区分
|
||||
* 物品区分
|
||||
*/
|
||||
private String goodsCls;
|
||||
|
||||
/**
|
||||
* 批号管理区分(0:不管理, 1:管理)
|
||||
* 批号管理区分(0:不管理, 1:管理)
|
||||
*/
|
||||
private Integer lotNoMgmtCls;
|
||||
|
||||
/**
|
||||
* 物品类型代码
|
||||
* 物品类型代码
|
||||
*/
|
||||
private String itemTypeCd;
|
||||
|
||||
/**
|
||||
* 标准单位代码
|
||||
* 标准单位代码
|
||||
*/
|
||||
private String stdUnitCd;
|
||||
|
||||
/**
|
||||
* 包装单位代码
|
||||
* 包装单位代码
|
||||
*/
|
||||
private String pkgUnitCd;
|
||||
|
||||
/**
|
||||
* 出库申请最小数量
|
||||
* 出库申请最小数量
|
||||
*/
|
||||
private BigDecimal outstockReqMinQty;
|
||||
|
||||
/**
|
||||
* 出库单位区分
|
||||
* 出库单位区分
|
||||
*/
|
||||
private String outstockUnitCls;
|
||||
|
||||
/**
|
||||
* 单位净重
|
||||
* 单位净重
|
||||
*/
|
||||
private BigDecimal netWeightPerUnit;
|
||||
|
||||
/**
|
||||
* 自身体积(M3)
|
||||
* 自身体积(M3)
|
||||
*/
|
||||
private BigDecimal ownVolM3;
|
||||
|
||||
/**
|
||||
* 尺寸(长)
|
||||
* 尺寸(长)
|
||||
*/
|
||||
private BigDecimal sizeD;
|
||||
|
||||
/**
|
||||
* 尺寸(宽)
|
||||
* 尺寸(宽)
|
||||
*/
|
||||
private BigDecimal sizeW;
|
||||
|
||||
/**
|
||||
* 尺寸(高)
|
||||
* 尺寸(高)
|
||||
*/
|
||||
private BigDecimal sizeH;
|
||||
|
||||
/**
|
||||
* 包装要求描述
|
||||
* 包装要求描述
|
||||
*/
|
||||
private String pkgRqmtDesc;
|
||||
|
||||
/**
|
||||
* 码放要求描述
|
||||
* 码放要求描述
|
||||
*/
|
||||
private String stackingRqmtDesc;
|
||||
|
||||
/**
|
||||
* 储存要求描述
|
||||
* 储存要求描述
|
||||
*/
|
||||
private String stgRqmtDesc;
|
||||
|
||||
/**
|
||||
* 生产商
|
||||
* 生产商
|
||||
*/
|
||||
private String manufacturer;
|
||||
|
||||
/**
|
||||
* 图片ID
|
||||
* 图片ID
|
||||
*/
|
||||
private String pictureId;
|
||||
|
||||
/**
|
||||
* 图片URL
|
||||
* 图片URL
|
||||
*/
|
||||
private String pictureUrl;
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public String getItemCd() {
|
||||
return itemCd;
|
||||
}
|
||||
|
||||
public void setItemCd(String itemCd) {
|
||||
this.itemCd = itemCd == null ? null : itemCd.trim();
|
||||
}
|
||||
|
||||
public Integer getDeptId() {
|
||||
return deptId;
|
||||
}
|
||||
|
||||
public void setDeptId(Integer deptId) {
|
||||
this.deptId = deptId;
|
||||
}
|
||||
|
||||
public String getItemName() {
|
||||
return itemName;
|
||||
}
|
||||
|
||||
public void setItemName(String itemName) {
|
||||
this.itemName = itemName == null ? null : itemName.trim();
|
||||
}
|
||||
|
||||
public String getSupplier() {
|
||||
return supplier;
|
||||
}
|
||||
|
||||
public void setSupplier(String supplier) {
|
||||
this.supplier = supplier == null ? null : supplier.trim();
|
||||
}
|
||||
|
||||
public BigDecimal getPrepLeadTime() {
|
||||
return prepLeadTime;
|
||||
}
|
||||
|
||||
public void setPrepLeadTime(BigDecimal prepLeadTime) {
|
||||
this.prepLeadTime = prepLeadTime;
|
||||
}
|
||||
|
||||
public BigDecimal getInstockLeadTime() {
|
||||
return instockLeadTime;
|
||||
}
|
||||
|
||||
public void setInstockLeadTime(BigDecimal instockLeadTime) {
|
||||
this.instockLeadTime = instockLeadTime;
|
||||
}
|
||||
|
||||
public BigDecimal getRestingPeriod() {
|
||||
return restingPeriod;
|
||||
}
|
||||
|
||||
public void setRestingPeriod(BigDecimal restingPeriod) {
|
||||
this.restingPeriod = restingPeriod;
|
||||
}
|
||||
|
||||
public BigDecimal getOutstockLeadTime() {
|
||||
return outstockLeadTime;
|
||||
}
|
||||
|
||||
public void setOutstockLeadTime(BigDecimal outstockLeadTime) {
|
||||
this.outstockLeadTime = outstockLeadTime;
|
||||
}
|
||||
|
||||
public String getSpec1() {
|
||||
return spec1;
|
||||
}
|
||||
|
||||
public void setSpec1(String spec1) {
|
||||
this.spec1 = spec1 == null ? null : spec1.trim();
|
||||
}
|
||||
|
||||
public String getSpec2() {
|
||||
return spec2;
|
||||
}
|
||||
|
||||
public void setSpec2(String spec2) {
|
||||
this.spec2 = spec2 == null ? null : spec2.trim();
|
||||
}
|
||||
|
||||
public String getSpec3() {
|
||||
return spec3;
|
||||
}
|
||||
|
||||
public void setSpec3(String spec3) {
|
||||
this.spec3 = spec3 == null ? null : spec3.trim();
|
||||
}
|
||||
|
||||
public String getSpec4() {
|
||||
return spec4;
|
||||
}
|
||||
|
||||
public void setSpec4(String spec4) {
|
||||
this.spec4 = spec4 == null ? null : spec4.trim();
|
||||
}
|
||||
|
||||
public String getSpec5() {
|
||||
return spec5;
|
||||
}
|
||||
|
||||
public void setSpec5(String spec5) {
|
||||
this.spec5 = spec5 == null ? null : spec5.trim();
|
||||
}
|
||||
|
||||
public String getCls1() {
|
||||
return cls1;
|
||||
}
|
||||
|
||||
public void setCls1(String cls1) {
|
||||
this.cls1 = cls1 == null ? null : cls1.trim();
|
||||
}
|
||||
|
||||
public String getCls2() {
|
||||
return cls2;
|
||||
}
|
||||
|
||||
public void setCls2(String cls2) {
|
||||
this.cls2 = cls2 == null ? null : cls2.trim();
|
||||
}
|
||||
|
||||
public String getCls3() {
|
||||
return cls3;
|
||||
}
|
||||
|
||||
public void setCls3(String cls3) {
|
||||
this.cls3 = cls3 == null ? null : cls3.trim();
|
||||
}
|
||||
|
||||
public String getCls4() {
|
||||
return cls4;
|
||||
}
|
||||
|
||||
public void setCls4(String cls4) {
|
||||
this.cls4 = cls4 == null ? null : cls4.trim();
|
||||
}
|
||||
|
||||
public String getCls5() {
|
||||
return cls5;
|
||||
}
|
||||
|
||||
public void setCls5(String cls5) {
|
||||
this.cls5 = cls5 == null ? null : cls5.trim();
|
||||
}
|
||||
|
||||
public String getRemark1() {
|
||||
return remark1;
|
||||
}
|
||||
|
||||
public void setRemark1(String remark1) {
|
||||
this.remark1 = remark1 == null ? null : remark1.trim();
|
||||
}
|
||||
|
||||
public String getRemark2() {
|
||||
return remark2;
|
||||
}
|
||||
|
||||
public void setRemark2(String remark2) {
|
||||
this.remark2 = remark2 == null ? null : remark2.trim();
|
||||
}
|
||||
|
||||
public String getRemark3() {
|
||||
return remark3;
|
||||
}
|
||||
|
||||
public void setRemark3(String remark3) {
|
||||
this.remark3 = remark3 == null ? null : remark3.trim();
|
||||
}
|
||||
|
||||
public String getRemark4() {
|
||||
return remark4;
|
||||
}
|
||||
|
||||
public void setRemark4(String remark4) {
|
||||
this.remark4 = remark4 == null ? null : remark4.trim();
|
||||
}
|
||||
|
||||
public String getRemark5() {
|
||||
return remark5;
|
||||
}
|
||||
|
||||
public void setRemark5(String remark5) {
|
||||
this.remark5 = remark5 == null ? null : remark5.trim();
|
||||
}
|
||||
|
||||
public String getDeliveryPeriod() {
|
||||
return deliveryPeriod;
|
||||
}
|
||||
|
||||
public void setDeliveryPeriod(String deliveryPeriod) {
|
||||
this.deliveryPeriod = deliveryPeriod == null ? null : deliveryPeriod.trim();
|
||||
}
|
||||
|
||||
public String getDefaultStgBinCd() {
|
||||
return defaultStgBinCd;
|
||||
}
|
||||
|
||||
public void setDefaultStgBinCd(String defaultStgBinCd) {
|
||||
this.defaultStgBinCd = defaultStgBinCd == null ? null : defaultStgBinCd.trim();
|
||||
}
|
||||
|
||||
public Integer getEnableFlg() {
|
||||
return enableFlg;
|
||||
}
|
||||
|
||||
public void setEnableFlg(Integer enableFlg) {
|
||||
this.enableFlg = enableFlg;
|
||||
}
|
||||
|
||||
public BigDecimal getSafetyStock() {
|
||||
return safetyStock;
|
||||
}
|
||||
|
||||
public void setSafetyStock(BigDecimal safetyStock) {
|
||||
this.safetyStock = safetyStock;
|
||||
}
|
||||
|
||||
public BigDecimal getMaxInvQty() {
|
||||
return maxInvQty;
|
||||
}
|
||||
|
||||
public void setMaxInvQty(BigDecimal maxInvQty) {
|
||||
this.maxInvQty = maxInvQty;
|
||||
}
|
||||
|
||||
public BigDecimal getPurchLimitQty() {
|
||||
return purchLimitQty;
|
||||
}
|
||||
|
||||
public void setPurchLimitQty(BigDecimal purchLimitQty) {
|
||||
this.purchLimitQty = purchLimitQty;
|
||||
}
|
||||
|
||||
public String getGoodsCls() {
|
||||
return goodsCls;
|
||||
}
|
||||
|
||||
public void setGoodsCls(String goodsCls) {
|
||||
this.goodsCls = goodsCls == null ? null : goodsCls.trim();
|
||||
}
|
||||
|
||||
public Integer getLotNoMgmtCls() {
|
||||
return lotNoMgmtCls;
|
||||
}
|
||||
|
||||
public void setLotNoMgmtCls(Integer lotNoMgmtCls) {
|
||||
this.lotNoMgmtCls = lotNoMgmtCls;
|
||||
}
|
||||
|
||||
public String getItemTypeCd() {
|
||||
return itemTypeCd;
|
||||
}
|
||||
|
||||
public void setItemTypeCd(String itemTypeCd) {
|
||||
this.itemTypeCd = itemTypeCd == null ? null : itemTypeCd.trim();
|
||||
}
|
||||
|
||||
public String getStdUnitCd() {
|
||||
return stdUnitCd;
|
||||
}
|
||||
|
||||
public void setStdUnitCd(String stdUnitCd) {
|
||||
this.stdUnitCd = stdUnitCd == null ? null : stdUnitCd.trim();
|
||||
}
|
||||
|
||||
public String getPkgUnitCd() {
|
||||
return pkgUnitCd;
|
||||
}
|
||||
|
||||
public void setPkgUnitCd(String pkgUnitCd) {
|
||||
this.pkgUnitCd = pkgUnitCd == null ? null : pkgUnitCd.trim();
|
||||
}
|
||||
|
||||
public BigDecimal getOutstockReqMinQty() {
|
||||
return outstockReqMinQty;
|
||||
}
|
||||
|
||||
public void setOutstockReqMinQty(BigDecimal outstockReqMinQty) {
|
||||
this.outstockReqMinQty = outstockReqMinQty;
|
||||
}
|
||||
|
||||
public String getOutstockUnitCls() {
|
||||
return outstockUnitCls;
|
||||
}
|
||||
|
||||
public void setOutstockUnitCls(String outstockUnitCls) {
|
||||
this.outstockUnitCls = outstockUnitCls == null ? null : outstockUnitCls.trim();
|
||||
}
|
||||
|
||||
public BigDecimal getNetWeightPerUnit() {
|
||||
return netWeightPerUnit;
|
||||
}
|
||||
|
||||
public void setNetWeightPerUnit(BigDecimal netWeightPerUnit) {
|
||||
this.netWeightPerUnit = netWeightPerUnit;
|
||||
}
|
||||
|
||||
public BigDecimal getOwnVolM3() {
|
||||
return ownVolM3;
|
||||
}
|
||||
|
||||
public void setOwnVolM3(BigDecimal ownVolM3) {
|
||||
this.ownVolM3 = ownVolM3;
|
||||
}
|
||||
|
||||
public BigDecimal getSizeD() {
|
||||
return sizeD;
|
||||
}
|
||||
|
||||
public void setSizeD(BigDecimal sizeD) {
|
||||
this.sizeD = sizeD;
|
||||
}
|
||||
|
||||
public BigDecimal getSizeW() {
|
||||
return sizeW;
|
||||
}
|
||||
|
||||
public void setSizeW(BigDecimal sizeW) {
|
||||
this.sizeW = sizeW;
|
||||
}
|
||||
|
||||
public BigDecimal getSizeH() {
|
||||
return sizeH;
|
||||
}
|
||||
|
||||
public void setSizeH(BigDecimal sizeH) {
|
||||
this.sizeH = sizeH;
|
||||
}
|
||||
|
||||
public String getPkgRqmtDesc() {
|
||||
return pkgRqmtDesc;
|
||||
}
|
||||
|
||||
public void setPkgRqmtDesc(String pkgRqmtDesc) {
|
||||
this.pkgRqmtDesc = pkgRqmtDesc == null ? null : pkgRqmtDesc.trim();
|
||||
}
|
||||
|
||||
public String getStackingRqmtDesc() {
|
||||
return stackingRqmtDesc;
|
||||
}
|
||||
|
||||
public void setStackingRqmtDesc(String stackingRqmtDesc) {
|
||||
this.stackingRqmtDesc = stackingRqmtDesc == null ? null : stackingRqmtDesc.trim();
|
||||
}
|
||||
|
||||
public String getStgRqmtDesc() {
|
||||
return stgRqmtDesc;
|
||||
}
|
||||
|
||||
public void setStgRqmtDesc(String stgRqmtDesc) {
|
||||
this.stgRqmtDesc = stgRqmtDesc == null ? null : stgRqmtDesc.trim();
|
||||
}
|
||||
|
||||
public String getManufacturer() {
|
||||
return manufacturer;
|
||||
}
|
||||
|
||||
public void setManufacturer(String manufacturer) {
|
||||
this.manufacturer = manufacturer == null ? null : manufacturer.trim();
|
||||
}
|
||||
|
||||
public String getPictureId() {
|
||||
return pictureId;
|
||||
}
|
||||
|
||||
public void setPictureId(String pictureId) {
|
||||
this.pictureId = pictureId == null ? null : pictureId.trim();
|
||||
}
|
||||
|
||||
public String getPictureUrl() {
|
||||
return pictureUrl;
|
||||
}
|
||||
|
||||
public void setPictureUrl(String pictureUrl) {
|
||||
this.pictureUrl = pictureUrl == null ? null : pictureUrl.trim();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(getClass().getSimpleName());
|
||||
sb.append(" [");
|
||||
sb.append("Hash = ").append(hashCode());
|
||||
sb.append(", itemCd=").append(itemCd);
|
||||
sb.append(", deptId=").append(deptId);
|
||||
sb.append(", itemName=").append(itemName);
|
||||
sb.append(", supplier=").append(supplier);
|
||||
sb.append(", prepLeadTime=").append(prepLeadTime);
|
||||
sb.append(", instockLeadTime=").append(instockLeadTime);
|
||||
sb.append(", restingPeriod=").append(restingPeriod);
|
||||
sb.append(", outstockLeadTime=").append(outstockLeadTime);
|
||||
sb.append(", spec1=").append(spec1);
|
||||
sb.append(", spec2=").append(spec2);
|
||||
sb.append(", spec3=").append(spec3);
|
||||
sb.append(", spec4=").append(spec4);
|
||||
sb.append(", spec5=").append(spec5);
|
||||
sb.append(", cls1=").append(cls1);
|
||||
sb.append(", cls2=").append(cls2);
|
||||
sb.append(", cls3=").append(cls3);
|
||||
sb.append(", cls4=").append(cls4);
|
||||
sb.append(", cls5=").append(cls5);
|
||||
sb.append(", remark1=").append(remark1);
|
||||
sb.append(", remark2=").append(remark2);
|
||||
sb.append(", remark3=").append(remark3);
|
||||
sb.append(", remark4=").append(remark4);
|
||||
sb.append(", remark5=").append(remark5);
|
||||
sb.append(", deliveryPeriod=").append(deliveryPeriod);
|
||||
sb.append(", defaultStgBinCd=").append(defaultStgBinCd);
|
||||
sb.append(", enableFlg=").append(enableFlg);
|
||||
sb.append(", safetyStock=").append(safetyStock);
|
||||
sb.append(", maxInvQty=").append(maxInvQty);
|
||||
sb.append(", purchLimitQty=").append(purchLimitQty);
|
||||
sb.append(", goodsCls=").append(goodsCls);
|
||||
sb.append(", lotNoMgmtCls=").append(lotNoMgmtCls);
|
||||
sb.append(", itemTypeCd=").append(itemTypeCd);
|
||||
sb.append(", stdUnitCd=").append(stdUnitCd);
|
||||
sb.append(", pkgUnitCd=").append(pkgUnitCd);
|
||||
sb.append(", outstockReqMinQty=").append(outstockReqMinQty);
|
||||
sb.append(", outstockUnitCls=").append(outstockUnitCls);
|
||||
sb.append(", netWeightPerUnit=").append(netWeightPerUnit);
|
||||
sb.append(", ownVolM3=").append(ownVolM3);
|
||||
sb.append(", sizeD=").append(sizeD);
|
||||
sb.append(", sizeW=").append(sizeW);
|
||||
sb.append(", sizeH=").append(sizeH);
|
||||
sb.append(", pkgRqmtDesc=").append(pkgRqmtDesc);
|
||||
sb.append(", stackingRqmtDesc=").append(stackingRqmtDesc);
|
||||
sb.append(", stgRqmtDesc=").append(stgRqmtDesc);
|
||||
sb.append(", manufacturer=").append(manufacturer);
|
||||
sb.append(", pictureId=").append(pictureId);
|
||||
sb.append(", pictureUrl=").append(pictureUrl);
|
||||
sb.append(", serialVersionUID=").append(serialVersionUID);
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.ruoyi.wms.mapper;
|
||||
|
||||
import com.ruoyi.wms.domain.ItemInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 物品基础信息扩展Mapper
|
||||
*
|
||||
* @author Alan Scipio
|
||||
* created on 2024/2/21
|
||||
*/
|
||||
public interface ItemInfoExtMapper {
|
||||
|
||||
/**
|
||||
* 页面查询
|
||||
*/
|
||||
List<ItemInfo> selectPageList(ItemInfo itemInfo);
|
||||
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.wms.service;
|
||||
|
||||
import com.ruoyi.common.core.web.domain.AjaxResult;
|
||||
import com.ruoyi.wms.domain.ItemInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -33,7 +34,7 @@ public interface IItemInfoService {
|
|||
* @param itemInfo 物品基础信息
|
||||
* @return 结果
|
||||
*/
|
||||
int insertItemInfo(ItemInfo itemInfo);
|
||||
AjaxResult insertItemInfo(ItemInfo itemInfo);
|
||||
|
||||
/**
|
||||
* 修改物品基础信息
|
||||
|
|
@ -41,7 +42,7 @@ public interface IItemInfoService {
|
|||
* @param itemInfo 物品基础信息
|
||||
* @return 结果
|
||||
*/
|
||||
int updateItemInfo(ItemInfo itemInfo);
|
||||
AjaxResult updateItemInfo(ItemInfo itemInfo);
|
||||
|
||||
/**
|
||||
* 批量删除物品基础信息
|
||||
|
|
|
|||
|
|
@ -1,19 +1,25 @@
|
|||
package com.ruoyi.wms.service.impl;
|
||||
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
import com.ruoyi.common.core.web.domain.AjaxResult;
|
||||
import com.ruoyi.common.core.web.domain.ExtBaseEntity;
|
||||
import com.ruoyi.common.security.utils.SecurityUtilsExt;
|
||||
import com.ruoyi.system.api.RemoteFileService;
|
||||
import com.ruoyi.system.api.domain.SysFileInfo;
|
||||
import com.ruoyi.wms.domain.ItemInfo;
|
||||
import com.ruoyi.wms.mapper.ItemInfoDynamicSqlSupport;
|
||||
import com.ruoyi.wms.mapper.ItemInfoExtMapper;
|
||||
import com.ruoyi.wms.mapper.ItemInfoMapper;
|
||||
import com.ruoyi.wms.service.IItemInfoService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.mybatis.dynamic.sql.SqlBuilder;
|
||||
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
||||
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
||||
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
|
@ -26,8 +32,12 @@ import java.util.Optional;
|
|||
*/
|
||||
@Service
|
||||
public class ItemInfoServiceImpl implements IItemInfoService {
|
||||
@Autowired
|
||||
@Resource
|
||||
private ItemInfoMapper itemInfoMapper;
|
||||
@Resource
|
||||
private ItemInfoExtMapper itemInfoExtMapper;
|
||||
@Resource
|
||||
private RemoteFileService remoteFileService;
|
||||
|
||||
/**
|
||||
* 查询物品基础信息
|
||||
|
|
@ -49,38 +59,45 @@ public class ItemInfoServiceImpl implements IItemInfoService {
|
|||
*/
|
||||
@Override
|
||||
public List<ItemInfo> selectItemInfoList(ItemInfo itemInfo) {
|
||||
SelectStatementProvider provider = SqlBuilder.select(ItemInfoMapper.selectList)
|
||||
.from(ItemInfoDynamicSqlSupport.itemInfo)
|
||||
.where(ItemInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
|
||||
.and(ItemInfoDynamicSqlSupport.itemCd, SqlBuilder.isEqualToWhenPresent(itemInfo.getItemCd()))
|
||||
.and(ItemInfoDynamicSqlSupport.itemName, SqlBuilder.isLikeWhenPresent(itemInfo.getItemName() == null ? null : "%" + itemInfo.getItemName() + "%"))
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return itemInfoMapper.selectMany(provider);
|
||||
return itemInfoExtMapper.selectPageList(itemInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增物品基础信息
|
||||
*
|
||||
* @param itemInfo 物品基础信息
|
||||
* @param item 物品基础信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public int insertItemInfo(ItemInfo itemInfo) {
|
||||
return itemInfoMapper.insertSelective(itemInfo);
|
||||
public AjaxResult insertItemInfo(ItemInfo item) {
|
||||
//上传图片文件
|
||||
String uploadErrMsg = uploadItemImage(item);
|
||||
if (StringUtils.isNotBlank(uploadErrMsg)) {
|
||||
return AjaxResult.error(uploadErrMsg);
|
||||
}
|
||||
//存DB
|
||||
int affectedRows = itemInfoMapper.insertSelective(item);
|
||||
return affectedRows > 0 ? AjaxResult.success() : AjaxResult.error();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改物品基础信息
|
||||
*
|
||||
* @param itemInfo 物品基础信息
|
||||
* @param item 物品基础信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public int updateItemInfo(ItemInfo itemInfo) {
|
||||
return itemInfoMapper.updateByPrimaryKeySelective(itemInfo);
|
||||
public AjaxResult updateItemInfo(ItemInfo item) {
|
||||
//上传图片文件
|
||||
String uploadErrMsg = uploadItemImage(item);
|
||||
if (StringUtils.isNotBlank(uploadErrMsg)) {
|
||||
return AjaxResult.error(uploadErrMsg);
|
||||
}
|
||||
//存DB
|
||||
int affectedRows = itemInfoMapper.updateByPrimaryKeySelective(item);
|
||||
return affectedRows > 0 ? AjaxResult.success() : AjaxResult.error();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -118,4 +135,31 @@ public class ItemInfoServiceImpl implements IItemInfoService {
|
|||
record.setUpdateTime(DateUtils.getNowDate());
|
||||
return itemInfoMapper.updateByPrimaryKey(record);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传图片文件
|
||||
*
|
||||
* @return 错误消息,成功返回null
|
||||
*/
|
||||
private String uploadItemImage(ItemInfo item) {
|
||||
if (item.getItemImages() == null){
|
||||
return null;
|
||||
}
|
||||
for (MultipartFile file : item.getItemImages()) {
|
||||
R<SysFileInfo> fileResult = remoteFileService.upload(file);
|
||||
if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
|
||||
//上传失败
|
||||
if (fileResult == null || StringUtils.isBlank(fileResult.getMsg())) {
|
||||
return "文件服务异常,请联系管理员";
|
||||
} else {
|
||||
return "文件服务异常," + fileResult.getMsg();
|
||||
}
|
||||
} else {
|
||||
//上传成功
|
||||
item.setPictureId(fileResult.getData().getFileId());
|
||||
item.setPictureUrl(fileResult.getData().getUrl());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ public class ItemTypeServiceImpl implements IItemTypeService {
|
|||
.where(ItemTypeDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
|
||||
.and(ItemTypeDynamicSqlSupport.itemTypeName, SqlBuilder.isLikeWhenPresent(itemType.getItemTypeName() == null ? null : "%" + itemType.getItemTypeName() + "%"))
|
||||
.and(ItemTypeDynamicSqlSupport.remark1, SqlBuilder.isEqualToWhenPresent(itemType.getRemark1()))
|
||||
.orderBy(ItemTypeDynamicSqlSupport.itemTypeCd)
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return itemTypeMapper.selectMany(provider);
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ public class UnitInfoServiceImpl implements IUnitInfoService {
|
|||
.where(UnitInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
|
||||
.and(UnitInfoDynamicSqlSupport.unitCode, SqlBuilder.isEqualToWhenPresent(unitInfo.getUnitCode()))
|
||||
.and(UnitInfoDynamicSqlSupport.unitName, SqlBuilder.isLikeWhenPresent(unitInfo.getUnitName()))
|
||||
.orderBy(UnitInfoDynamicSqlSupport.unitCode)
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return unitInfoMapper.selectMany(provider);
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ public class WarehouseInfoServiceImpl implements IWarehouseInfoService {
|
|||
.where(WarehouseInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
|
||||
.and(WarehouseInfoDynamicSqlSupport.whsCd, SqlBuilder.isEqualToWhenPresent(warehouseInfo.getWhsCd()))
|
||||
.and(WarehouseInfoDynamicSqlSupport.whsName, SqlBuilder.isLikeWhenPresent(warehouseInfo.getWhsName() == null ? null : "%" + warehouseInfo.getWhsName() + "%"))
|
||||
.orderBy(WarehouseInfoDynamicSqlSupport.whsCd)
|
||||
.build()
|
||||
.render(RenderingStrategies.MYBATIS3);
|
||||
return warehouseInfoMapper.selectMany(provider);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,135 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.wms.mapper.ItemInfoExtMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.wms.domain.ItemInfo" id="ItemInfoResult">
|
||||
<result property="deptId" column="DEPT_ID"/>
|
||||
<result property="itemCd" column="ITEM_CD"/>
|
||||
<result property="itemName" column="ITEM_NAME"/>
|
||||
<result property="supplier" column="SUPPLIER"/>
|
||||
<result property="prepLeadTime" column="PREP_LEAD_TIME"/>
|
||||
<result property="instockLeadTime" column="INSTOCK_LEAD_TIME"/>
|
||||
<result property="restingPeriod" column="RESTING_PERIOD"/>
|
||||
<result property="outstockLeadTime" column="OUTSTOCK_LEAD_TIME"/>
|
||||
<result property="spec1" column="SPEC_1"/>
|
||||
<result property="spec2" column="SPEC_2"/>
|
||||
<result property="spec3" column="SPEC_3"/>
|
||||
<result property="spec4" column="SPEC_4"/>
|
||||
<result property="spec5" column="SPEC_5"/>
|
||||
<result property="cls1" column="CLS_1"/>
|
||||
<result property="cls2" column="CLS_2"/>
|
||||
<result property="cls3" column="CLS_3"/>
|
||||
<result property="cls4" column="CLS_4"/>
|
||||
<result property="cls5" column="CLS_5"/>
|
||||
<result property="deliveryPeriod" column="DELIVERY_PERIOD"/>
|
||||
<result property="defaultStgBinCd" column="DEFAULT_STG_BIN_CD"/>
|
||||
<result property="enableFlg" column="ENABLE_FLG"/>
|
||||
<result property="safetyStock" column="SAFETY_STOCK"/>
|
||||
<result property="maxInvQty" column="MAX_INV_QTY"/>
|
||||
<result property="purchLimitQty" column="PURCH_LIMIT_QTY"/>
|
||||
<result property="goodsCls" column="GOODS_CLS"/>
|
||||
<result property="lotNoMgmtCls" column="LOT_NO_MGMT_CLS"/>
|
||||
<result property="itemTypeCd" column="ITEM_TYPE_CD"/>
|
||||
<result property="stdUnitCd" column="STD_UNIT_CD"/>
|
||||
<result property="pkgUnitCd" column="PKG_UNIT_CD"/>
|
||||
<result property="outstockReqMinQty" column="OUTSTOCK_REQ_MIN_QTY"/>
|
||||
<result property="outstockUnitCls" column="OUTSTOCK_UNIT_CLS"/>
|
||||
<result property="netWeightPerUnit" column="NET_WEIGHT_PER_UNIT"/>
|
||||
<result property="ownVolM3" column="OWN_VOL_M3"/>
|
||||
<result property="sizeD" column="SIZE_D"/>
|
||||
<result property="sizeW" column="SIZE_W"/>
|
||||
<result property="sizeH" column="SIZE_H"/>
|
||||
<result property="pkgRqmtDesc" column="PKG_RQMT_DESC"/>
|
||||
<result property="stackingRqmtDesc" column="STACKING_RQMT_DESC"/>
|
||||
<result property="stgRqmtDesc" column="STG_RQMT_DESC"/>
|
||||
<result property="manufacturer" column="MANUFACTURER"/>
|
||||
<result property="pictureId" column="PICTURE_ID"/>
|
||||
<result property="pictureUrl" column="PICTURE_URL"/>
|
||||
<result property="updateCount" column="UPDATE_COUNT"/>
|
||||
<result property="deleteFlag" column="DELETE_FLAG"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="remark1" column="REMARK_1"/>
|
||||
<result property="remark2" column="REMARK_2"/>
|
||||
<result property="remark3" column="REMARK_3"/>
|
||||
<result property="remark4" column="REMARK_4"/>
|
||||
<result property="remark5" column="REMARK_5"/>
|
||||
<result property="itemTypeName" column="ITEM_TYPE_NAME"/>
|
||||
<result property="stdUnitName" column="stdUnitName"/>
|
||||
<result property="pkgUnitName" column="pkgUnitName"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectPageList" parameterType="com.ruoyi.wms.domain.ItemInfo" resultMap="ItemInfoResult">
|
||||
select
|
||||
t1.DEPT_ID,
|
||||
t1.ITEM_CD,
|
||||
t1.ITEM_NAME,
|
||||
t1.SUPPLIER,
|
||||
t1.PREP_LEAD_TIME,
|
||||
t1.INSTOCK_LEAD_TIME,
|
||||
t1.RESTING_PERIOD,
|
||||
t1.OUTSTOCK_LEAD_TIME,
|
||||
t1.SPEC_1,
|
||||
t1.SPEC_2,
|
||||
t1.SPEC_3,
|
||||
t1.SPEC_4,
|
||||
t1.SPEC_5,
|
||||
t1.CLS_1,
|
||||
t1.CLS_2,
|
||||
t1.CLS_3,
|
||||
t1.CLS_4,
|
||||
t1.CLS_5,
|
||||
t1.DELIVERY_PERIOD,
|
||||
t1.DEFAULT_STG_BIN_CD,
|
||||
t1.ENABLE_FLG,
|
||||
t1.SAFETY_STOCK,
|
||||
t1.MAX_INV_QTY,
|
||||
t1.PURCH_LIMIT_QTY,
|
||||
t1.GOODS_CLS,
|
||||
t1.LOT_NO_MGMT_CLS,
|
||||
t1.ITEM_TYPE_CD,
|
||||
t1.STD_UNIT_CD,
|
||||
t1.PKG_UNIT_CD,
|
||||
t1.OUTSTOCK_REQ_MIN_QTY,
|
||||
t1.OUTSTOCK_UNIT_CLS,
|
||||
t1.NET_WEIGHT_PER_UNIT,
|
||||
t1.OWN_VOL_M3,
|
||||
t1.SIZE_D,
|
||||
t1.SIZE_W,
|
||||
t1.SIZE_H,
|
||||
t1.PKG_RQMT_DESC,
|
||||
t1.STACKING_RQMT_DESC,
|
||||
t1.STG_RQMT_DESC,
|
||||
t1.MANUFACTURER,
|
||||
t1.PICTURE_ID,
|
||||
t1.PICTURE_URL,
|
||||
t1.UPDATE_COUNT,
|
||||
t1.DELETE_FLAG,
|
||||
t1.create_by,
|
||||
t1.create_time,
|
||||
t1.update_by,
|
||||
t1.update_time,
|
||||
t1.remark,
|
||||
itemType.ITEM_TYPE_NAME,
|
||||
stdUnit.UNIT_NAME as stdUnitName,
|
||||
pkgUnit.UNIT_NAME as pkgUnitName
|
||||
from WMS_M_ITEM_INFO t1
|
||||
left join WMS_M_ITEM_TYPE itemType on t1.ITEM_TYPE_CD = itemType.ITEM_TYPE_CD and itemType.DELETE_FLAG = 0
|
||||
left join WMS_M_UNIT_INFO stdUnit on t1.STD_UNIT_CD = stdUnit.UNIT_CODE and stdUnit.DELETE_FLAG = 0
|
||||
left join WMS_M_UNIT_INFO pkgUnit on t1.PKG_UNIT_CD = pkgUnit.UNIT_CODE and pkgUnit.DELETE_FLAG = 0
|
||||
<where>
|
||||
and t1.DELETE_FLAG = 0
|
||||
<if test="itemCd != null and itemCd != ''">
|
||||
and t1.ITEM_CD = #{itemCd}
|
||||
</if>
|
||||
<if test="itemName != null and itemName != ''">
|
||||
and t1.ITEM_NAME like concat('%', #{itemName}, '%')
|
||||
</if>
|
||||
</where>
|
||||
order by t1.ITEM_CD
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 删除物品基础信息
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
-->
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
<img
|
||||
:src="dialogImageUrl"
|
||||
style="display: block; max-width: 100%; margin: 0 auto"
|
||||
/>
|
||||
alt=""/>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]) + "&";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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" }
|
||||
],
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
Target Server Version : 80200 (8.2.0)
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 20/02/2024 16:42:04
|
||||
Date: 22/02/2024 11:11:32
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
|
@ -25,11 +25,15 @@ CREATE TABLE `WMS_M_ITEM_INFO` (
|
|||
`DEPT_ID` int NOT NULL DEFAULT 100 COMMENT '从属部门ID',
|
||||
`ITEM_CD` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '物品代码',
|
||||
`ITEM_NAME` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '物品名称',
|
||||
`ENABLE_FLG` int NOT NULL DEFAULT 1 COMMENT '启用标志',
|
||||
`DEFAULT_STG_BIN_CD` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '默认库位号',
|
||||
`ITEM_TYPE_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '物品类型代码',
|
||||
`STD_UNIT_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标准单位代码',
|
||||
`PKG_UNIT_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '包装单位代码',
|
||||
`GOODS_CLS` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '物品区分',
|
||||
`LOT_NO_MGMT_CLS` int NOT NULL DEFAULT 0 COMMENT '批号管理区分(0:不管理, 1:管理)',
|
||||
`MANUFACTURER` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生产商',
|
||||
`SUPPLIER` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '供应商',
|
||||
`PREP_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '筹备提前期',
|
||||
`INSTOCK_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '入库提前期',
|
||||
`RESTING_PERIOD` decimal(18, 6) NULL DEFAULT NULL COMMENT '放置期',
|
||||
`OUTSTOCK_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '出库提前期',
|
||||
`SPEC_1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '规格1',
|
||||
`SPEC_2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '规格2',
|
||||
`SPEC_3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '规格3',
|
||||
|
|
@ -40,29 +44,14 @@ CREATE TABLE `WMS_M_ITEM_INFO` (
|
|||
`CLS_3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类3',
|
||||
`CLS_4` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类4',
|
||||
`CLS_5` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类5',
|
||||
`UPDATE_COUNT` int NOT NULL DEFAULT 0 COMMENT '更新次数',
|
||||
`DELETE_FLAG` int NOT NULL DEFAULT 0 COMMENT '删除标志',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
|
||||
`REMARK_1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注1',
|
||||
`REMARK_2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注2',
|
||||
`REMARK_3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注3',
|
||||
`REMARK_4` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注4',
|
||||
`REMARK_5` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注5',
|
||||
`DELIVERY_PERIOD` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '供货周期',
|
||||
`DEFAULT_STG_BIN_CD` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '默认库位号',
|
||||
`ENABLE_FLG` int NOT NULL DEFAULT 1 COMMENT '启用标志',
|
||||
`PREP_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '筹备提前期',
|
||||
`INSTOCK_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '入库提前期',
|
||||
`RESTING_PERIOD` decimal(18, 6) NULL DEFAULT NULL COMMENT '放置期',
|
||||
`OUTSTOCK_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '出库提前期',
|
||||
`SAFETY_STOCK` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT '安全库存量',
|
||||
`MAX_INV_QTY` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT '最大库存量',
|
||||
`PURCH_LIMIT_QTY` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT '发起购买的阈值',
|
||||
`GOODS_CLS` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '物品区分',
|
||||
`LOT_NO_MGMT_CLS` int NOT NULL DEFAULT 0 COMMENT '批号管理区分(0:不管理, 1:管理)',
|
||||
`ITEM_TYPE_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '物品类型代码',
|
||||
`STD_UNIT_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标准单位代码',
|
||||
`PKG_UNIT_CD` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '包装单位代码',
|
||||
`OUTSTOCK_REQ_MIN_QTY` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT '出库申请最小数量',
|
||||
`OUTSTOCK_UNIT_CLS` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '出库单位区分',
|
||||
`NET_WEIGHT_PER_UNIT` decimal(18, 6) NULL DEFAULT NULL COMMENT '单位净重',
|
||||
|
|
@ -73,15 +62,27 @@ CREATE TABLE `WMS_M_ITEM_INFO` (
|
|||
`PKG_RQMT_DESC` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '包装要求描述',
|
||||
`STACKING_RQMT_DESC` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '码放要求描述',
|
||||
`STG_RQMT_DESC` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '储存要求描述',
|
||||
`MANUFACTURER` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生产商',
|
||||
`PICTURE_ID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片ID',
|
||||
`PICTURE_URL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片URL',
|
||||
`REMARK_1` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注1',
|
||||
`REMARK_2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注2',
|
||||
`REMARK_3` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注3',
|
||||
`REMARK_4` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注4',
|
||||
`REMARK_5` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注5',
|
||||
`UPDATE_COUNT` int NOT NULL DEFAULT 0 COMMENT '更新次数',
|
||||
`DELETE_FLAG` int NOT NULL DEFAULT 0 COMMENT '删除标志',
|
||||
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`ITEM_CD`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '物品基础信息表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '物品基础信息表' ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of WMS_M_ITEM_INFO
|
||||
-- ----------------------------
|
||||
INSERT INTO `WMS_M_ITEM_INFO` VALUES (100, 'G00001', '测试产品1', 1, NULL, 'ITYPE00003', 'UNIT00001', 'UNIT00003', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0.000000, 0.000000, 0.000000, 0.000000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '20240221172017A002', 'http://127.0.0.1:9300/statics/2024/02/21/20240221172017A002.jpg', NULL, NULL, NULL, NULL, NULL, 0, 0, '1', '2024-02-21 17:15:47', '1', '2024-02-21 17:20:17', NULL);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for WMS_M_ITEM_TYPE
|
||||
|
|
@ -228,7 +229,7 @@ INSERT INTO `gen_table` VALUES (12, 'WMS_M_WAREHOUSE_INFO', '仓库基础信息
|
|||
INSERT INTO `gen_table` VALUES (13, 'sys_file', '文件存储记录表', NULL, NULL, 'SysFile', 'crud', 'element-plus', 'mybatis-dynamic', 'com.ruoyi.file', 'file', 'FileRecord', '文件存储记录', 'ryas', '0', '/', '{\"parentMenuId\":\"1\"}', 'admin', '2024-02-19 10:01:22', '', '2024-02-19 10:08:14', NULL);
|
||||
INSERT INTO `gen_table` VALUES (14, 'sys_seq_rule', '序列号生成规则表', NULL, NULL, 'SysSeqRule', 'crud', 'element-plus', 'mybatis-dynamic', 'com.ruoyi.system', 'system', 'SeqRule', '序列号生成规则', 'ryas', '0', '/', '{\"parentMenuId\":1}', 'admin', '2024-02-19 10:01:22', '', '2024-02-20 02:07:26', NULL);
|
||||
INSERT INTO `gen_table` VALUES (15, 'WMS_M_ITEM_TYPE', '物品类型表', NULL, NULL, 'ItemType', 'crud', 'element-plus', 'mybatis-dynamic', 'com.ruoyi.wms', 'wms', 'ItemType', '物品类型', 'ryas', '0', '/', '{\"parentMenuId\":2000}', 'admin', '2024-02-20 07:11:35', '', '2024-02-20 07:13:11', NULL);
|
||||
INSERT INTO `gen_table` VALUES (16, 'WMS_M_ITEM_INFO', '物品基础信息表', NULL, NULL, 'ItemInfo', 'crud', 'element-plus', 'mybatis-dynamic', 'com.ruoyi.wms', 'wms', 'ItemInfo', '物品基础信息', 'ryas', '0', '/', '{\"parentMenuId\":2000}', 'admin', '2024-02-20 08:25:28', '', '2024-02-20 08:30:03', NULL);
|
||||
INSERT INTO `gen_table` VALUES (16, 'WMS_M_ITEM_INFO', '物品基础信息表', NULL, NULL, 'ItemInfo', 'crud', 'element-plus', 'normal', 'com.ruoyi.wms', 'wms', 'ItemInfo', '物品基础信息', 'ryas', '0', '/', '{\"parentMenuId\":\"2000\"}', 'admin', '2024-02-20 08:25:28', '', '2024-02-21 02:00:27', NULL);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for gen_table_column
|
||||
|
|
@ -354,60 +355,60 @@ INSERT INTO `gen_table_column` VALUES (270, 15, 'create_time', '创建时间', '
|
|||
INSERT INTO `gen_table_column` VALUES (271, 15, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 'admin', '2024-02-20 07:11:35', '', '2024-02-20 07:13:11');
|
||||
INSERT INTO `gen_table_column` VALUES (272, 15, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 14, 'admin', '2024-02-20 07:11:35', '', '2024-02-20 07:13:11');
|
||||
INSERT INTO `gen_table_column` VALUES (273, 15, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'textarea', '', 15, 'admin', '2024-02-20 07:11:35', '', '2024-02-20 07:13:11');
|
||||
INSERT INTO `gen_table_column` VALUES (274, 16, 'DEPT_ID', '从属部门ID', 'int', 'Long', 'deptId', '0', '0', '1', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (275, 16, 'ITEM_CD', '物品代码', 'varchar(50)', 'String', 'itemCd', '1', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (276, 16, 'ITEM_NAME', '物品名称', 'varchar(100)', 'String', 'itemName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (277, 16, 'SUPPLIER', '供应商', 'varchar(100)', 'String', 'supplier', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 4, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (278, 16, 'PREP_LEAD_TIME', '筹备提前期', 'decimal(18,6)', 'BigDecimal', 'prepLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 5, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (279, 16, 'INSTOCK_LEAD_TIME', '入库提前期', 'decimal(18,6)', 'BigDecimal', 'instockLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 6, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (280, 16, 'RESTING_PERIOD', '放置期', 'decimal(18,6)', 'BigDecimal', 'restingPeriod', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 7, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (281, 16, 'OUTSTOCK_LEAD_TIME', '出库提前期', 'decimal(18,6)', 'BigDecimal', 'outstockLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 8, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (282, 16, 'SPEC_1', '规格1', 'varchar(100)', 'String', 'spec1', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 9, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (283, 16, 'SPEC_2', '规格2', 'varchar(100)', 'String', 'spec2', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 10, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (284, 16, 'SPEC_3', '规格3', 'varchar(100)', 'String', 'spec3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 11, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (285, 16, 'SPEC_4', '规格4', 'varchar(100)', 'String', 'spec4', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 12, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (286, 16, 'SPEC_5', '规格5', 'varchar(100)', 'String', 'spec5', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 13, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (287, 16, 'CLS_1', '分类1', 'varchar(100)', 'String', 'cls1', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 14, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (288, 16, 'CLS_2', '分类2', 'varchar(100)', 'String', 'cls2', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 15, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (289, 16, 'CLS_3', '分类3', 'varchar(100)', 'String', 'cls3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 16, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (290, 16, 'CLS_4', '分类4', 'varchar(100)', 'String', 'cls4', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 17, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (291, 16, 'CLS_5', '分类5', 'varchar(100)', 'String', 'cls5', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 18, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (292, 16, 'UPDATE_COUNT', '更新次数', 'int', 'Long', 'updateCount', '0', '0', '0', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 19, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (293, 16, 'DELETE_FLAG', '删除标志', 'int', 'Long', 'deleteFlag', '0', '0', '0', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 20, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (294, 16, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 21, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (295, 16, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 22, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (296, 16, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 23, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (297, 16, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 24, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (298, 16, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'textarea', '', 25, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:03');
|
||||
INSERT INTO `gen_table_column` VALUES (299, 16, 'REMARK_1', '备注1', 'varchar(100)', 'String', 'remark1', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 26, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (300, 16, 'REMARK_2', '备注2', 'varchar(100)', 'String', 'remark2', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 27, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (301, 16, 'REMARK_3', '备注3', 'varchar(100)', 'String', 'remark3', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 28, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (302, 16, 'REMARK_4', '备注4', 'varchar(100)', 'String', 'remark4', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 29, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (303, 16, 'REMARK_5', '备注5', 'varchar(100)', 'String', 'remark5', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 30, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (304, 16, 'DELIVERY_PERIOD', '供货周期', 'varchar(50)', 'String', 'deliveryPeriod', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 31, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (305, 16, 'DEFAULT_STG_BIN_CD', '默认库位号', 'varchar(25)', 'String', 'defaultStgBinCd', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 32, 'admin', '2024-02-20 08:25:29', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (306, 16, 'ENABLE_FLG', '启用标志', 'int', 'Long', 'enableFlg', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 33, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (307, 16, 'SAFETY_STOCK', '安全库存量', 'decimal(18,6)', 'BigDecimal', 'safetyStock', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 34, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (308, 16, 'MAX_INV_QTY', '最大库存量', 'decimal(18,6)', 'BigDecimal', 'maxInvQty', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 35, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (309, 16, 'PURCH_LIMIT_QTY', '购买阈值', 'decimal(18,6)', 'BigDecimal', 'purchLimitQty', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 36, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (310, 16, 'GOODS_CLS', '物品区分', 'varchar(10)', 'String', 'goodsCls', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 37, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (311, 16, 'LOT_NO_MGMT_CLS', '批号管理区分(0:不管理, 1:管理)', 'int', 'Long', 'lotNoMgmtCls', '0', '0', '1', '1', '1', '1', '0', 'EQ', 'input', '', 38, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (312, 16, 'ITEM_TYPE_CD', '物品类型代码', 'varchar(30)', 'String', 'itemTypeCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 39, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (313, 16, 'STD_UNIT_CD', '标准单位代码', 'varchar(30)', 'String', 'stdUnitCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 40, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (314, 16, 'PKG_UNIT_CD', '包装单位代码', 'varchar(30)', 'String', 'pkgUnitCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 41, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (315, 16, 'OUTSTOCK_REQ_MIN_QTY', '出库申请最小数量', 'decimal(18,6)', 'BigDecimal', 'outstockReqMinQty', '0', '0', '1', '1', '1', '0', '0', 'EQ', 'input', '', 42, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (316, 16, 'OUTSTOCK_UNIT_CLS', '出库单位区分', 'varchar(30)', 'String', 'outstockUnitCls', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 43, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (317, 16, 'NET_WEIGHT_PER_UNIT', '单位净重', 'decimal(18,6)', 'BigDecimal', 'netWeightPerUnit', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 44, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (318, 16, 'OWN_VOL_M3', '自身体积(M3)', 'decimal(18,6)', 'BigDecimal', 'ownVolM3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 45, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (319, 16, 'SIZE_D', '尺寸(长)', 'decimal(18,6)', 'BigDecimal', 'sizeD', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 46, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (320, 16, 'SIZE_W', '尺寸(宽)', 'decimal(18,6)', 'BigDecimal', 'sizeW', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 47, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (321, 16, 'SIZE_H', '尺寸(高)', 'decimal(18,6)', 'BigDecimal', 'sizeH', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 48, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (322, 16, 'PKG_RQMT_DESC', '包装要求描述', 'varchar(255)', 'String', 'pkgRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 49, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (323, 16, 'STACKING_RQMT_DESC', '码放要求描述', 'varchar(255)', 'String', 'stackingRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 50, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (324, 16, 'STG_RQMT_DESC', '储存要求描述', 'varchar(255)', 'String', 'stgRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 51, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (325, 16, 'MANUFACTURER', '生产商', 'varchar(100)', 'String', 'manufacturer', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 52, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (326, 16, 'PICTURE_ID', '图片ID', 'varchar(50)', 'String', 'pictureId', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 53, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (327, 16, 'PICTURE_URL', '图片URL', 'varchar(255)', 'String', 'pictureUrl', '0', '0', NULL, '0', '0', '0', '0', 'EQ', 'input', '', 54, 'admin', '2024-02-20 08:25:30', '', '2024-02-20 08:30:04');
|
||||
INSERT INTO `gen_table_column` VALUES (274, 16, 'DEPT_ID', '从属部门ID', 'int', 'Long', 'deptId', '0', '0', '0', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 1, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (275, 16, 'ITEM_CD', '物品代码', 'varchar(50)', 'String', 'itemCd', '1', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (276, 16, 'ITEM_NAME', '物品名称', 'varchar(100)', 'String', 'itemName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (277, 16, 'SUPPLIER', '供应商', 'varchar(100)', 'String', 'supplier', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 4, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (278, 16, 'PREP_LEAD_TIME', '筹备提前期', 'decimal(18,6)', 'BigDecimal', 'prepLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 5, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (279, 16, 'INSTOCK_LEAD_TIME', '入库提前期', 'decimal(18,6)', 'BigDecimal', 'instockLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 6, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (280, 16, 'RESTING_PERIOD', '放置期', 'decimal(18,6)', 'BigDecimal', 'restingPeriod', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 7, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (281, 16, 'OUTSTOCK_LEAD_TIME', '出库提前期', 'decimal(18,6)', 'BigDecimal', 'outstockLeadTime', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 8, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (282, 16, 'SPEC_1', '规格1', 'varchar(100)', 'String', 'spec1', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 9, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (283, 16, 'SPEC_2', '规格2', 'varchar(100)', 'String', 'spec2', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 10, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (284, 16, 'SPEC_3', '规格3', 'varchar(100)', 'String', 'spec3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 11, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (285, 16, 'SPEC_4', '规格4', 'varchar(100)', 'String', 'spec4', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 12, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (286, 16, 'SPEC_5', '规格5', 'varchar(100)', 'String', 'spec5', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 13, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (287, 16, 'CLS_1', '分类1', 'varchar(100)', 'String', 'cls1', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 14, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (288, 16, 'CLS_2', '分类2', 'varchar(100)', 'String', 'cls2', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 15, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (289, 16, 'CLS_3', '分类3', 'varchar(100)', 'String', 'cls3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 16, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (290, 16, 'CLS_4', '分类4', 'varchar(100)', 'String', 'cls4', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 17, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (291, 16, 'CLS_5', '分类5', 'varchar(100)', 'String', 'cls5', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 18, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (292, 16, 'UPDATE_COUNT', '更新次数', 'int', 'Long', 'updateCount', '0', '0', '0', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 19, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (293, 16, 'DELETE_FLAG', '删除标志', 'int', 'Long', 'deleteFlag', '0', '0', '0', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 20, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (294, 16, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 21, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (295, 16, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 22, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (296, 16, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 23, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (297, 16, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 24, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (298, 16, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'textarea', '', 25, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:27');
|
||||
INSERT INTO `gen_table_column` VALUES (299, 16, 'REMARK_1', '备注1', 'varchar(100)', 'String', 'remark1', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 26, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (300, 16, 'REMARK_2', '备注2', 'varchar(100)', 'String', 'remark2', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 27, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (301, 16, 'REMARK_3', '备注3', 'varchar(100)', 'String', 'remark3', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 28, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (302, 16, 'REMARK_4', '备注4', 'varchar(100)', 'String', 'remark4', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 29, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (303, 16, 'REMARK_5', '备注5', 'varchar(100)', 'String', 'remark5', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 30, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (304, 16, 'DELIVERY_PERIOD', '供货周期', 'varchar(50)', 'String', 'deliveryPeriod', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 31, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (305, 16, 'DEFAULT_STG_BIN_CD', '默认库位号', 'varchar(25)', 'String', 'defaultStgBinCd', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 32, 'admin', '2024-02-20 08:25:29', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (306, 16, 'ENABLE_FLG', '启用标志', 'int', 'Long', 'enableFlg', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 33, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (307, 16, 'SAFETY_STOCK', '安全库存量', 'decimal(18,6)', 'BigDecimal', 'safetyStock', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 34, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (308, 16, 'MAX_INV_QTY', '最大库存量', 'decimal(18,6)', 'BigDecimal', 'maxInvQty', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 35, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (309, 16, 'PURCH_LIMIT_QTY', '购买阈值', 'decimal(18,6)', 'BigDecimal', 'purchLimitQty', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 36, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (310, 16, 'GOODS_CLS', '物品区分', 'varchar(10)', 'String', 'goodsCls', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 37, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (311, 16, 'LOT_NO_MGMT_CLS', '批号管理区分(0:不管理, 1:管理)', 'int', 'Long', 'lotNoMgmtCls', '0', '0', '0', '1', '1', '1', '0', 'EQ', 'input', '', 38, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (312, 16, 'ITEM_TYPE_CD', '物品类型代码', 'varchar(30)', 'String', 'itemTypeCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 39, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (313, 16, 'STD_UNIT_CD', '标准单位代码', 'varchar(30)', 'String', 'stdUnitCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 40, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (314, 16, 'PKG_UNIT_CD', '包装单位代码', 'varchar(30)', 'String', 'pkgUnitCd', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 41, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (315, 16, 'OUTSTOCK_REQ_MIN_QTY', '出库申请最小数量', 'decimal(18,6)', 'BigDecimal', 'outstockReqMinQty', '0', '0', '0', '1', '1', '0', '0', 'EQ', 'input', '', 42, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (316, 16, 'OUTSTOCK_UNIT_CLS', '出库单位区分', 'varchar(30)', 'String', 'outstockUnitCls', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 43, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (317, 16, 'NET_WEIGHT_PER_UNIT', '单位净重', 'decimal(18,6)', 'BigDecimal', 'netWeightPerUnit', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 44, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (318, 16, 'OWN_VOL_M3', '自身体积(M3)', 'decimal(18,6)', 'BigDecimal', 'ownVolM3', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 45, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (319, 16, 'SIZE_D', '尺寸(长)', 'decimal(18,6)', 'BigDecimal', 'sizeD', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 46, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (320, 16, 'SIZE_W', '尺寸(宽)', 'decimal(18,6)', 'BigDecimal', 'sizeW', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 47, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (321, 16, 'SIZE_H', '尺寸(高)', 'decimal(18,6)', 'BigDecimal', 'sizeH', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 48, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (322, 16, 'PKG_RQMT_DESC', '包装要求描述', 'varchar(255)', 'String', 'pkgRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 49, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (323, 16, 'STACKING_RQMT_DESC', '码放要求描述', 'varchar(255)', 'String', 'stackingRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 50, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (324, 16, 'STG_RQMT_DESC', '储存要求描述', 'varchar(255)', 'String', 'stgRqmtDesc', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 51, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (325, 16, 'MANUFACTURER', '生产商', 'varchar(100)', 'String', 'manufacturer', '0', '0', NULL, '1', '1', '1', '0', 'EQ', 'input', '', 52, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (326, 16, 'PICTURE_ID', '图片ID', 'varchar(50)', 'String', 'pictureId', '0', '0', NULL, '1', '1', '0', '0', 'EQ', 'input', '', 53, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
INSERT INTO `gen_table_column` VALUES (327, 16, 'PICTURE_URL', '图片URL', 'varchar(255)', 'String', 'pictureUrl', '0', '0', NULL, '0', '0', '0', '0', 'EQ', 'input', '', 54, 'admin', '2024-02-20 08:25:30', '', '2024-02-21 02:00:28');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_config
|
||||
|
|
@ -492,7 +493,7 @@ CREATE TABLE `sys_dict_data` (
|
|||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`dict_code`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_dict_data
|
||||
|
|
@ -526,6 +527,8 @@ INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type',
|
|||
INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '清空操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '正常状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '停用状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (100, 1, '启用', '1', 'sys_enable_flag', NULL, 'primary', 'N', '0', '1', '2024-02-21 03:02:48', '', NULL, NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (101, 2, '禁用', '0', 'sys_enable_flag', NULL, 'danger', 'N', '0', '1', '2024-02-21 03:03:08', '', NULL, NULL);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_dict_type
|
||||
|
|
@ -543,7 +546,7 @@ CREATE TABLE `sys_dict_type` (
|
|||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`dict_id`) USING BTREE,
|
||||
UNIQUE INDEX `dict_type`(`dict_type` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 101 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_dict_type
|
||||
|
|
@ -558,6 +561,7 @@ INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', '
|
|||
INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '通知状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '操作类型列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2024-01-30 05:05:41', '', NULL, '登录状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (100, '启用标志', 'sys_enable_flag', '0', '1', '2024-02-21 03:02:06', '', NULL, NULL);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_file
|
||||
|
|
@ -583,7 +587,6 @@ CREATE TABLE `sys_file` (
|
|||
-- ----------------------------
|
||||
-- Records of sys_file
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_file` VALUES ('20240219155008A001', '20240219155008A001.png', 'AGVCar02.png', 'D:\\temp\\RYAS\\uploadPath\\2024\\02\\19\\20240219155008A001.png', 'png', 'LOCAL', 'http://127.0.0.1:9300/statics/2024/02/19/20240219155008A001.png', 330857, '1', '2024-02-19 15:50:17', '1', '2024-02-19 15:50:17', '示例数据');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_job
|
||||
|
|
@ -633,7 +636,7 @@ CREATE TABLE `sys_job_data_log` (
|
|||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注信息',
|
||||
PRIMARY KEY (`log_id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '定时任务数据日志表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '定时任务数据日志表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_job_data_log
|
||||
|
|
@ -673,7 +676,7 @@ CREATE TABLE `sys_logininfor` (
|
|||
PRIMARY KEY (`info_id`) USING BTREE,
|
||||
INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE,
|
||||
INDEX `idx_sys_logininfor_lt`(`access_time` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 148 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_logininfor
|
||||
|
|
@ -704,7 +707,7 @@ CREATE TABLE `sys_menu` (
|
|||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注',
|
||||
PRIMARY KEY (`menu_id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2040 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2043 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_menu
|
||||
|
|
@ -805,7 +808,7 @@ INSERT INTO `sys_menu` VALUES (2015, '物品类型新增', 2013, 2, '#', '', NUL
|
|||
INSERT INTO `sys_menu` VALUES (2016, '物品类型修改', 2013, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemType:edit', '#', 'admin', '2024-02-20 07:21:07', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2017, '物品类型删除', 2013, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemType:remove', '#', 'admin', '2024-02-20 07:21:07', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2018, '物品类型导出', 2013, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemType:export', '#', 'admin', '2024-02-20 07:21:07', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2019, '仓库基础信息', 2000, 3, 'WarehouseInfo', 'wms/WarehouseInfo/index', NULL, 1, 0, 'C', '0', '0', 'wms:WarehouseInfo:list', 'tab', 'admin', '2024-02-18 08:34:10', '1', '2024-02-20 08:36:32', '仓库基础信息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2019, '仓库基础信息', 2000, 3, 'WarehouseInfo', 'wms/WarehouseInfo/index', NULL, 1, 0, 'C', '0', '0', 'wms:WarehouseInfo:list', 'warehouse', 'admin', '2024-02-18 08:34:10', '1', '2024-02-20 09:19:41', '仓库基础信息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2020, '仓库基础信息查询', 2019, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:WarehouseInfo:query', '#', 'admin', '2024-02-18 08:34:10', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2021, '仓库基础信息新增', 2019, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:WarehouseInfo:add', '#', 'admin', '2024-02-18 08:34:10', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2022, '仓库基础信息修改', 2019, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:WarehouseInfo:edit', '#', 'admin', '2024-02-18 08:34:10', '', NULL, '');
|
||||
|
|
@ -813,19 +816,22 @@ INSERT INTO `sys_menu` VALUES (2023, '仓库基础信息删除', 2019, 4, '#', '
|
|||
INSERT INTO `sys_menu` VALUES (2024, '仓库基础信息导出', 2019, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:WarehouseInfo:export', '#', 'admin', '2024-02-18 08:34:10', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2025, '文件存储记录', 1, 10, 'FileRecord', 'file/FileRecord/index', NULL, 1, 0, 'C', '0', '0', 'file:FileRecord:list', 'documentation', 'admin', '2024-02-19 10:19:23', '1', '2024-02-19 10:25:26', '文件存储记录菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2026, '文件存储记录查询', 2025, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:query', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2027, '文件存储记录导出', 2025, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:export', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2028, '序列号生成规则', 1, 11, 'SeqRule', 'system/SeqRule/index', NULL, 1, 0, 'C', '0', '0', 'system:SeqRule:list', 'number', 'admin', '2024-02-20 02:05:15', '1', '2024-02-20 02:08:58', '序列号生成规则菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2029, '序列号生成规则查询', 2028, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:query', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2030, '序列号生成规则新增', 2028, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:add', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2031, '序列号生成规则修改', 2028, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:edit', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2032, '序列号生成规则删除', 2028, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:remove', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2033, '序列号生成规则导出', 2028, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:export', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2034, '物品基础信息', 2000, 4, 'ItemInfo', 'wms/ItemInfo/index', NULL, 1, 0, 'C', '0', '0', 'wms:ItemInfo:list', 'build', 'admin', '2024-02-20 08:34:17', '1', '2024-02-20 08:35:07', '物品基础信息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2035, '物品基础信息查询', 2034, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:query', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2036, '物品基础信息新增', 2034, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:add', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2037, '物品基础信息修改', 2034, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:edit', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2038, '物品基础信息删除', 2034, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:remove', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2039, '物品基础信息导出', 2034, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:export', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2027, '文件存储记录新增', 2025, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:add', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2028, '文件存储记录修改', 2025, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:edit', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2029, '文件存储记录删除', 2025, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:remove', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2030, '文件存储记录导出', 2025, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'file:FileRecord:export', '#', 'admin', '2024-02-19 10:19:23', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2031, '序列号生成规则', 1, 11, 'SeqRule', 'system/SeqRule/index', NULL, 1, 0, 'C', '0', '0', 'system:SeqRule:list', 'number', 'admin', '2024-02-20 02:05:15', '1', '2024-02-20 02:08:58', '序列号生成规则菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2032, '序列号生成规则查询', 2031, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:query', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2033, '序列号生成规则新增', 2031, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:add', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2034, '序列号生成规则修改', 2031, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:edit', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2035, '序列号生成规则删除', 2031, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:remove', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2036, '序列号生成规则导出', 2031, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:export', '#', 'admin', '2024-02-20 02:05:15', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2037, '物品基础信息', 2000, 4, 'ItemInfo', 'wms/ItemInfo/index', NULL, 1, 0, 'C', '0', '0', 'wms:ItemInfo:list', 'cubes', 'admin', '2024-02-20 08:34:17', '1', '2024-02-20 09:21:44', '物品基础信息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (2038, '物品基础信息查询', 2037, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:query', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2039, '物品基础信息新增', 2037, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:add', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2040, '物品基础信息修改', 2037, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:edit', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2041, '物品基础信息删除', 2037, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:remove', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2042, '物品基础信息导出', 2037, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:export', '#', 'admin', '2024-02-20 08:34:17', '', NULL, '');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_notice
|
||||
|
|
@ -877,7 +883,7 @@ CREATE TABLE `sys_oper_log` (
|
|||
INDEX `idx_sys_oper_log_bt`(`business_type` ASC) USING BTREE,
|
||||
INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE,
|
||||
INDEX `idx_sys_oper_log_ot`(`oper_time` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 247 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 267 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_oper_log
|
||||
|
|
|
|||
Loading…
Reference in New Issue