diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java index 295ac56d..ef075df9 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java @@ -1,14 +1,16 @@ package com.ruoyi.system.api; +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; -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; /** * 文件服务 @@ -25,4 +27,13 @@ public interface RemoteFileService { */ @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) R upload(@RequestPart(value = "file") MultipartFile file); + + /** + * 删除文件 + * + * @param fileIds 文件id + * @return 结果 + */ + @DeleteMapping("/deleteFiles/{fileIds}") + R deleteFiles(@PathVariable String[] fileIds); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java index 2e2bc093..a4557af5 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java @@ -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 -{ +public class RemoteFileFallbackFactory implements FallbackFactory { 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 upload(MultipartFile file) - { + public R upload(MultipartFile file) { return R.fail("上传文件失败:" + throwable.getMessage()); } + + @Override + public R deleteFiles(String[] fileIds) { + return R.fail("删除文件失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java index 6f025fbe..eec9e8f5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java @@ -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"; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java index 83faffa2..70dceaa5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -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(); } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java index d027ceff..1f2d8ff1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java @@ -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 getSetterMethods(Object obj) - { + public static List getSetterMethods(Object obj) { // setter方法列表 - List setterMethods = new ArrayList(); + List 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 getGetterMethods(Object obj) - { + public static List getGetterMethods(Object obj) { // getter方法列表 - List getterMethods = new ArrayList(); + List 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方法名中的属性名是否相等。
* 如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)); } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java index 1ee73c27..89f36e33 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java @@ -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> constraintViolations = validator.validate(object, groups); - if (!constraintViolations.isEmpty()) - { + if (!constraintViolations.isEmpty()) { throw new ConstraintViolationException(constraintViolations); } } + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java index fa494b50..01e0981c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java @@ -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 { /** * 获取文件类型 *

* 例如: 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; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java index e929b0e7..9867d195 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java @@ -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) { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java index 2f5a8721..5858e40e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java @@ -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 = ""; String escape = EscapeUtil.escape(html); // String html = "ipt>alert(\"XSS\")ipt>"; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java index ba53dc93..d38cb46e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java @@ -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 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 conf) - { + public HTMLFilter(final Map 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("")); } @@ -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(""); } } @@ -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[^>]*)?>")); } 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 ""; } @@ -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 paramNames = new ArrayList<>(); final List 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)); } } \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java index 878ed91c..c09a3e02 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java @@ -1,67 +1,59 @@ package com.ruoyi.common.core.utils.ip; -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; +import jakarta.servlet.http.HttpServletRequest; + +import java.net.InetAddress; +import java.net.UnknownHostException; /** * 获取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; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java index f8f863e0..9e4a147f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java @@ -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); diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java index 6f6e8d3d..625b365b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java @@ -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]; - - static - { - for (int i = 0; i < BASELENGTH; ++i) - { +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) { 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]; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java index 37e578e9..4b88ca4a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java @@ -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注入风险"); } } diff --git a/ruoyi-common/ruoyi-common-datascope/pom.xml b/ruoyi-common/ruoyi-common-datascope/pom.xml index 7f29e570..d5377dce 100644 --- a/ruoyi-common/ruoyi-common-datascope/pom.xml +++ b/ruoyi-common/ruoyi-common-datascope/pom.xml @@ -10,13 +10,13 @@ 4.0.0 ruoyi-common-datascope - + ruoyi-common-datascope权限范围 - + com.ruoyi diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java index 9672296d..64f46c2b 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java @@ -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()); + } } diff --git a/ruoyi-common/ruoyi-common-services/pom.xml b/ruoyi-common/ruoyi-common-services/pom.xml index f8ad6b55..8c8b0601 100644 --- a/ruoyi-common/ruoyi-common-services/pom.xml +++ b/ruoyi-common/ruoyi-common-services/pom.xml @@ -16,10 +16,10 @@ - + com.ruoyi - ruoyi-common-security + ruoyi-common-log diff --git a/ruoyi-common/ruoyi-common-swagger/pom.xml b/ruoyi-common/ruoyi-common-swagger/pom.xml index 5a0bd5a2..1d40896a 100644 --- a/ruoyi-common/ruoyi-common-swagger/pom.xml +++ b/ruoyi-common/ruoyi-common-swagger/pom.xml @@ -10,12 +10,12 @@ 4.0.0 ruoyi-common-swagger - + ruoyi-common-swagger系统接口 - + @@ -34,5 +34,5 @@ springdoc-openapi-starter-webmvc-ui - + diff --git a/ruoyi-modules/ruoyi-file/pom.xml b/ruoyi-modules/ruoyi-file/pom.xml index d1f92c60..9418c638 100644 --- a/ruoyi-modules/ruoyi-file/pom.xml +++ b/ruoyi-modules/ruoyi-file/pom.xml @@ -59,12 +59,6 @@ minio ${minio.version} - - - - com.ruoyi - ruoyi-api-system - @@ -82,6 +76,12 @@ com.ruoyi ruoyi-common-services + + + + + + @@ -89,7 +89,19 @@ com.ruoyi ruoyi-common-datasource - + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java index c70bff9d..53773602 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java @@ -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) { diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileCRUDController.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileCRUDController.java index 9c0f7d79..14897fdb 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileCRUDController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileCRUDController.java @@ -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 list = crudService.selectSysFileList(sysFile); + if (list.isEmpty()) { + responseJsonWarn(response, "没有数据可以导出"); + return; + } ExcelUtil 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)); + } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java index 6cbd05e0..67f095e3 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java @@ -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 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 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()); + } + } } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveResult.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileResult.java similarity index 54% rename from ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveResult.java rename to ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileResult.java index 144407d6..ccf34918 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileSaveResult.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/domain/FileResult.java @@ -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; + } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java index 55c399c9..91182848 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java @@ -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!"); } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileCRUDService.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileCRUDService.java index 6bad3d5e..300866f4 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileCRUDService.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileCRUDService.java @@ -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; } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java index 9c3c363b..0e7565b0 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java @@ -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 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); + } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java index 0870344f..6d30a923 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java @@ -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); + } + + /** + * 本地文件删除 + * + * @param fileIds 文件id + * @return 删除结果 + */ + @Transactional + @Override + public FileResult deleteFiles(String[] fileIds) { + // 查询文件记录 + List fileList = selectFilesById(sysFileMapper, fileIds); + // 删除文件 + List 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 getSysFile(FileUploadResult uploadResult, String requestUrl) { + private SysFile buildRecord(FileUploadResult uploadResult, String requestUrl) { SysFile record = new SysFile(); record.setFileId(uploadResult.getFileId()); // 文件ID record.setSavedName(uploadResult.getSavedFileName()); // 保存的文件名 diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java index 2be338e6..658e9364 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java @@ -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!"); } } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/SysFileCRUDServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/SysFileCRUDServiceImpl.java index 3ca6c126..82b47110 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/SysFileCRUDServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/SysFileCRUDServiceImpl.java @@ -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); } } diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl-dynamic.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl-dynamic.java.vm index afcd1e78..0f0be503 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl-dynamic.java.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl-dynamic.java.vm @@ -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); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm index f05695c5..7155c0c9 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm @@ -108,8 +108,8 @@ - - + + #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 diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index a0fe74e8..6fb84408 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -76,12 +76,6 @@ ruoyi-common-datascope - - - com.ruoyi - ruoyi-common-log - - com.ruoyi diff --git a/ruoyi-modules/ruoyi-wms/pom.xml b/ruoyi-modules/ruoyi-wms/pom.xml index 5fbe9bc3..0a8c96fe 100644 --- a/ruoyi-modules/ruoyi-wms/pom.xml +++ b/ruoyi-modules/ruoyi-wms/pom.xml @@ -70,12 +70,6 @@ ruoyi-common-datascope - - - com.ruoyi - ruoyi-common-log - - com.ruoyi diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/controller/ItemInfoController.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/controller/ItemInfoController.java index 9ab2d307..1c6de06e 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/controller/ItemInfoController.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/controller/ItemInfoController.java @@ -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); } /** diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/ItemInfo.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/ItemInfo.java index a8ad0b10..3ea024c0 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/ItemInfo.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/ItemInfo.java @@ -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; * *

    *
  • Table: WMS_M_ITEM_INFO
  • + *
  • Remarks: 物品基础信息表
  • *
* * @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(); - } } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/mapper/ItemInfoExtMapper.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/mapper/ItemInfoExtMapper.java new file mode 100644 index 00000000..f2f8b59d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/mapper/ItemInfoExtMapper.java @@ -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 selectPageList(ItemInfo itemInfo); + +} diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/IItemInfoService.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/IItemInfoService.java index 661ba1b6..056d319f 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/IItemInfoService.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/IItemInfoService.java @@ -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); /** * 批量删除物品基础信息 diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemInfoServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemInfoServiceImpl.java index 881745f7..4575b513 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemInfoServiceImpl.java @@ -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 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 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; + } } diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemTypeServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemTypeServiceImpl.java index 677fd599..61f1c788 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/ItemTypeServiceImpl.java @@ -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); diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/UnitInfoServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/UnitInfoServiceImpl.java index e992a5fb..57245ec3 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/UnitInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/UnitInfoServiceImpl.java @@ -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); diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/WarehouseInfoServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/WarehouseInfoServiceImpl.java index 285ff2c0..67c14f09 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/WarehouseInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/impl/WarehouseInfoServiceImpl.java @@ -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); diff --git a/ruoyi-modules/ruoyi-wms/src/main/resources/com/ruoyi/wms/mapper/ItemInfoExtMapper.xml b/ruoyi-modules/ruoyi-wms/src/main/resources/com/ruoyi/wms/mapper/ItemInfoExtMapper.xml new file mode 100644 index 00000000..178e79f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms/src/main/resources/com/ruoyi/wms/mapper/ItemInfoExtMapper.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index a92c5ba6..ee8781ff 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -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" } } diff --git a/ruoyi-ui/src/api/file/FileRecord.js b/ruoyi-ui/src/api/file/FileRecord.js index 4e7d61c0..6867e616 100644 --- a/ruoyi-ui/src/api/file/FileRecord.js +++ b/ruoyi-ui/src/api/file/FileRecord.js @@ -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' + }) +} diff --git a/ruoyi-ui/src/api/wms/ItemInfo.js b/ruoyi-ui/src/api/wms/ItemInfo.js index 13b62f9a..88a8cac4 100644 --- a/ruoyi-ui/src/api/wms/ItemInfo.js +++ b/ruoyi-ui/src/api/wms/ItemInfo.js @@ -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 + }) + } } // 删除物品基础信息 diff --git a/ruoyi-ui/src/components/FpFileUpload/index.vue b/ruoyi-ui/src/components/FpFileUpload/index.vue new file mode 100644 index 00000000..8afc10ad --- /dev/null +++ b/ruoyi-ui/src/components/FpFileUpload/index.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/ruoyi-ui/src/components/ImageUpload/index.vue b/ruoyi-ui/src/components/ImageUpload/index.vue index 3d4fb6f8..2a2e1687 100644 --- a/ruoyi-ui/src/components/ImageUpload/index.vue +++ b/ruoyi-ui/src/components/ImageUpload/index.vue @@ -40,7 +40,7 @@ + alt=""/> diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 04b6801a..8c335fd6 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -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) diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 00b910f3..38a809b1 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -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 - } - 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) + "异常"; + // 未设置状态码则默认成功状态 + 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) } - 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} + */ +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 = 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} + */ +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]) + } + } } - downloadLoadingInstance.close(); - }).catch((r) => { - console.error(r) - ElMessage.error('下载文件出现错误,请联系管理员!') - downloadLoadingInstance.close(); - }) + //上传 + 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 diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index 4efca08f..7e2dc79b 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -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]) + "&"; } } diff --git a/ruoyi-ui/src/views/file/FileRecord/index.vue b/ruoyi-ui/src/views/file/FileRecord/index.vue index 93bbd742..a1f7e072 100644 --- a/ruoyi-ui/src/views/file/FileRecord/index.vue +++ b/ruoyi-ui/src/views/file/FileRecord/index.vue @@ -1,6 +1,6 @@ + diff --git a/ruoyi-ui/src/views/wms/ItemType/index.vue b/ruoyi-ui/src/views/wms/ItemType/index.vue index b87b74c0..201bdcc5 100644 --- a/ruoyi-ui/src/views/wms/ItemType/index.vue +++ b/ruoyi-ui/src/views/wms/ItemType/index.vue @@ -65,8 +65,8 @@ - - + + @@ -125,7 +125,7 @@ const data = reactive({ form: {}, queryParams: { pageNum: 1, - pageSize: 10, + pageSize: 20, itemTypeName: null, remark1: null, }, diff --git a/ruoyi-ui/src/views/wms/UnitInfo/index.vue b/ruoyi-ui/src/views/wms/UnitInfo/index.vue index 6a262b12..731a897e 100644 --- a/ruoyi-ui/src/views/wms/UnitInfo/index.vue +++ b/ruoyi-ui/src/views/wms/UnitInfo/index.vue @@ -65,8 +65,8 @@ - - + + @@ -125,7 +125,7 @@ const data = reactive({ form: {}, queryParams: { pageNum: 1, - pageSize: 10, + pageSize: 20, unitCode: null, unitName: null, }, diff --git a/ruoyi-ui/src/views/wms/WarehouseInfo/index.vue b/ruoyi-ui/src/views/wms/WarehouseInfo/index.vue index a21da716..bc10e754 100644 --- a/ruoyi-ui/src/views/wms/WarehouseInfo/index.vue +++ b/ruoyi-ui/src/views/wms/WarehouseInfo/index.vue @@ -65,8 +65,8 @@ - - + + @@ -173,7 +173,7 @@ const data = reactive({ form: {}, queryParams: { pageNum: 1, - pageSize: 10, + pageSize: 20, whsCd: null, whsName: null, }, diff --git a/sql/ry-cloud-ryas.sql b/sql/ry-cloud-ryas.sql index 6ae63a86..3258dd0f 100644 --- a/sql/ry-cloud-ryas.sql +++ b/sql/ry-cloud-ryas.sql @@ -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