强化文件api,添加FilePond

pull/362/head
AlanScipio 2 years ago
parent da8d9f2fed
commit 7b71fd28e4

@ -1,14 +1,16 @@
package com.ruoyi.system.api; 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.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile; 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) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R<SysFileInfo> upload(@RequestPart(value = "file") MultipartFile file); R<SysFileInfo> upload(@RequestPart(value = "file") MultipartFile file);
/**
*
*
* @param fileIds id
* @return
*/
@DeleteMapping("/deleteFiles/{fileIds}")
R<SysFileInfo> deleteFiles(@PathVariable String[] fileIds);
} }

@ -1,13 +1,13 @@
package com.ruoyi.system.api.factory; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; 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;
/** /**
* *
@ -15,21 +15,22 @@ import com.ruoyi.system.api.domain.SysFileInfo;
* @author ruoyi * @author ruoyi
*/ */
@Component @Component
public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService> public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService> {
{
private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class); private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class);
@Override @Override
public RemoteFileService create(Throwable throwable) public RemoteFileService create(Throwable throwable) {
{
log.error("文件服务调用失败:{}", throwable.getMessage()); log.error("文件服务调用失败:{}", throwable.getMessage());
return new RemoteFileService() return new RemoteFileService() {
{
@Override @Override
public R<SysFileInfo> upload(MultipartFile file) public R<SysFileInfo> upload(MultipartFile file) {
{
return R.fail("上传文件失败:" + throwable.getMessage()); return R.fail("上传文件失败:" + throwable.getMessage());
} }
@Override
public R<SysFileInfo> deleteFiles(String[] fileIds) {
return R.fail("删除文件失败:" + throwable.getMessage());
}
}; };
} }
} }

@ -20,4 +20,9 @@ public class ServiceNameConstants {
* serviceId * serviceId
*/ */
public static final String FILE_SERVICE = "ruoyi-file"; public static final String FILE_SERVICE = "ruoyi-file";
/**
* WMSserviceId
*/
public static final String WMS_SERVICE = "ruoyi-wms";
} }

@ -10,20 +10,31 @@ import java.nio.charset.StandardCharsets;
* *
* @author ruoyi * @author ruoyi
*/ */
public class CharsetKit public class CharsetKit {
{ /**
/** ISO-8859-1 */ * ISO-8859-1
*/
public static final String ISO_8859_1 = "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"; public static final String UTF_8 = "UTF-8";
/** GBK */ /**
* GBK
*/
public static final String 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; 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; public static final Charset CHARSET_UTF_8 = StandardCharsets.UTF_8;
/** GBK */ /**
* GBK
*/
public static final Charset CHARSET_GBK = Charset.forName(GBK); public static final Charset CHARSET_GBK = Charset.forName(GBK);
/** /**
@ -32,8 +43,7 @@ public class CharsetKit
* @param charset * @param charset
* @return Charset * @return Charset
*/ */
public static Charset charset(String charset) public static Charset charset(String charset) {
{
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
} }
@ -45,8 +55,7 @@ public class CharsetKit
* @param destCharset UTF-8 * @param destCharset UTF-8
* @return * @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)); return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
} }
@ -58,20 +67,16 @@ public class CharsetKit
* @param destCharset UTF-8 * @param destCharset UTF-8
* @return * @return
*/ */
public static String convert(String source, Charset srcCharset, Charset destCharset) public static String convert(String source, Charset srcCharset, Charset destCharset) {
{ if (null == srcCharset) {
if (null == srcCharset)
{
srcCharset = StandardCharsets.ISO_8859_1; srcCharset = StandardCharsets.ISO_8859_1;
} }
if (null == destCharset) if (null == destCharset) {
{
destCharset = StandardCharsets.UTF_8; destCharset = StandardCharsets.UTF_8;
} }
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) {
{
return source; return source;
} }
return new String(source.getBytes(srcCharset), destCharset); return new String(source.getBytes(srcCharset), destCharset);
@ -80,8 +85,7 @@ public class CharsetKit
/** /**
* @return * @return
*/ */
public static String systemCharset() public static String systemCharset() {
{
return Charset.defaultCharset().name(); return Charset.defaultCharset().name();
} }
} }

@ -11,15 +11,20 @@ import java.util.regex.Pattern;
* *
* @author ruoyi * @author ruoyi
*/ */
public class BeanUtils extends org.springframework.beans.BeanUtils public class BeanUtils extends org.springframework.beans.BeanUtils {
{ /**
/** Bean方法名中属性名开始的下标 */ * Bean
*/
private static final int BEAN_METHOD_PROP_INDEX = 3; private static final int BEAN_METHOD_PROP_INDEX = 3;
/** * 匹配getter方法的正则表达式 */ /**
* getter
*/
private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); 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*)"); private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
/** /**
@ -28,14 +33,10 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
* @param dest * @param dest
* @param src * @param src
*/ */
public static void copyBeanProp(Object dest, Object src) public static void copyBeanProp(Object dest, Object src) {
{ try {
try
{
copyProperties(src, dest); copyProperties(src, dest);
} } catch (Exception e) {
catch (Exception e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -46,21 +47,18 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
* @param obj * @param obj
* @return setter * @return setter
*/ */
public static List<Method> getSetterMethods(Object obj) public static List<Method> getSetterMethods(Object obj) {
{
// setter方法列表 // setter方法列表
List<Method> setterMethods = new ArrayList<Method>(); List<Method> setterMethods = new ArrayList<>();
// 获取所有方法 // 获取所有方法
Method[] methods = obj.getClass().getMethods(); Method[] methods = obj.getClass().getMethods();
// 查找setter方法 // 查找setter方法
for (Method method : methods) for (Method method : methods) {
{
Matcher m = SET_PATTERN.matcher(method.getName()); Matcher m = SET_PATTERN.matcher(method.getName());
if (m.matches() && (method.getParameterTypes().length == 1)) if (m.matches() && (method.getParameterTypes().length == 1)) {
{
setterMethods.add(method); setterMethods.add(method);
} }
} }
@ -75,18 +73,15 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
* @return getter * @return getter
*/ */
public static List<Method> getGetterMethods(Object obj) public static List<Method> getGetterMethods(Object obj) {
{
// getter方法列表 // getter方法列表
List<Method> getterMethods = new ArrayList<Method>(); List<Method> getterMethods = new ArrayList<>();
// 获取所有方法 // 获取所有方法
Method[] methods = obj.getClass().getMethods(); Method[] methods = obj.getClass().getMethods();
// 查找getter方法 // 查找getter方法
for (Method method : methods) for (Method method : methods) {
{
Matcher m = GET_PATTERN.matcher(method.getName()); Matcher m = GET_PATTERN.matcher(method.getName());
if (m.matches() && (method.getParameterTypes().length == 0)) if (m.matches() && (method.getParameterTypes().length == 0)) {
{
getterMethods.add(method); getterMethods.add(method);
} }
} }
@ -103,8 +98,7 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
* @return truefalse * @return truefalse
*/ */
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)); return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
} }
} }

@ -11,15 +11,14 @@ import java.util.Set;
* *
* @author ruoyi * @author ruoyi
*/ */
public class BeanValidators public class BeanValidators {
{
public static void validateWithException(Validator validator, Object object, Class<?>... groups) public static void validateWithException(Validator validator, Object object, Class<?>... groups)
throws ConstraintViolationException throws ConstraintViolationException {
{
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups); Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) if (!constraintViolations.isEmpty()) {
{
throw new ConstraintViolationException(constraintViolations); throw new ConstraintViolationException(constraintViolations);
} }
} }
} }

@ -1,18 +1,18 @@
package com.ruoyi.common.core.utils.file; 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.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.Objects;
/** /**
* *
* *
* @author ruoyi * @author ruoyi
*/ */
public class FileTypeUtils public class FileTypeUtils {
{
/** /**
* *
* <p> * <p>
@ -21,10 +21,8 @@ public class FileTypeUtils
* @param file * @param file
* @return ".") * @return ".")
*/ */
public static String getFileType(File file) public static String getFileType(File file) {
{ if (null == file) {
if (null == file)
{
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
return getFileType(file.getName()); return getFileType(file.getName());
@ -38,11 +36,9 @@ public class FileTypeUtils
* @param fileName * @param fileName
* @return ".") * @return ".")
*/ */
public static String getFileType(String fileName) public static String getFileType(String fileName) {
{
int separatorIndex = fileName.lastIndexOf("."); int separatorIndex = fileName.lastIndexOf(".");
if (separatorIndex < 0) if (separatorIndex < 0) {
{
return ""; return "";
} }
return fileName.substring(separatorIndex + 1).toLowerCase(); return fileName.substring(separatorIndex + 1).toLowerCase();
@ -54,11 +50,9 @@ public class FileTypeUtils
* @param file * @param file
* @return * @return
*/ */
public static final String getExtension(MultipartFile file) public static String getExtension(MultipartFile file) {
{
String extension = FilenameUtils.getExtension(file.getOriginalFilename()); String extension = FilenameUtils.getExtension(file.getOriginalFilename());
if (StringUtils.isEmpty(extension)) if (StringUtils.isEmpty(extension)) {
{
extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
} }
return extension; return extension;
@ -70,24 +64,16 @@ public class FileTypeUtils
* @param photoByte * @param photoByte
* @return ".") * @return ".")
*/ */
public static String getFileExtendName(byte[] photoByte) public static String getFileExtendName(byte[] photoByte) {
{
String strFileExtendName = "JPG"; String strFileExtendName = "JPG";
if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) 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"; 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"; strFileExtendName = "JPG";
} } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
else if ((photoByte[0] == 66) && (photoByte[1] == 77))
{
strFileExtendName = "BMP"; 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"; strFileExtendName = "PNG";
} }
return strFileExtendName; return strFileExtendName;

@ -1,5 +1,9 @@
package com.ruoyi.common.core.utils.file; 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.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.net.URI; import java.net.URI;
@ -7,10 +11,6 @@ import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.Arrays; 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) { public static byte[] getImage(String imagePath) {
InputStream is = getFile(imagePath); InputStream is = getFile(imagePath);
try { try {
assert is != null;
return IOUtils.toByteArray(is); return IOUtils.toByteArray(is);
} catch (Exception e) { } catch (Exception e) {
log.error("图片加载异常", e); log.error("图片加载异常", e);
@ -34,6 +35,7 @@ public class ImageUtils {
public static InputStream getFile(String imagePath) { public static InputStream getFile(String imagePath) {
try { try {
byte[] result = readFile(imagePath); byte[] result = readFile(imagePath);
assert result != null;
result = Arrays.copyOf(result, result.length); result = Arrays.copyOf(result, result.length);
return new ByteArrayInputStream(result); return new ByteArrayInputStream(result);
} catch (Exception e) { } catch (Exception e) {

@ -7,17 +7,14 @@ import com.ruoyi.common.core.utils.StringUtils;
* *
* @author ruoyi * @author ruoyi
*/ */
public class EscapeUtil public class EscapeUtil {
{
public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
private static final char[][] TEXT = new char[64][]; private static final char[][] TEXT = new char[64][];
static static {
{ for (int i = 0; i < 64; i++) {
for (int i = 0; i < 64; i++) TEXT[i] = new char[]{(char) i};
{
TEXT[i] = new char[] { (char) i };
} }
// special HTML characters // special HTML characters
@ -34,8 +31,7 @@ public class EscapeUtil
* @param text * @param text
* @return * @return
*/ */
public static String escape(String text) public static String escape(String text) {
{
return encode(text); return encode(text);
} }
@ -45,8 +41,7 @@ public class EscapeUtil
* @param content HTML * @param content HTML
* @return * @return
*/ */
public static String unescape(String content) public static String unescape(String content) {
{
return decode(content); return decode(content);
} }
@ -56,8 +51,7 @@ public class EscapeUtil
* @param content * @param content
* @return * @return
*/ */
public static String clean(String content) public static String clean(String content) {
{
return new HTMLFilter().filter(content); return new HTMLFilter().filter(content);
} }
@ -67,32 +61,24 @@ public class EscapeUtil
* @param text * @param text
* @return * @return
*/ */
private static String encode(String text) private static String encode(String text) {
{ if (StringUtils.isEmpty(text)) {
if (StringUtils.isEmpty(text))
{
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
final StringBuilder tmp = new StringBuilder(text.length() * 6); final StringBuilder tmp = new StringBuilder(text.length() * 6);
char c; char c;
for (int i = 0; i < text.length(); i++) for (int i = 0; i < text.length(); i++) {
{
c = text.charAt(i); c = text.charAt(i);
if (c < 256) if (c < 256) {
{
tmp.append("%"); tmp.append("%");
if (c < 16) if (c < 16) {
{
tmp.append("0"); tmp.append("0");
} }
tmp.append(Integer.toString(c, 16)); tmp.append(Integer.toString(c, 16));
} } else {
else
{
tmp.append("%u"); tmp.append("%u");
if (c <= 0xfff) if (c <= 0xfff) {
{
// issue#I49JU8@Gitee // issue#I49JU8@Gitee
tmp.append("0"); tmp.append("0");
} }
@ -108,44 +94,32 @@ public class EscapeUtil
* @param content * @param content
* @return * @return
*/ */
public static String decode(String content) public static String decode(String content) {
{ if (StringUtils.isEmpty(content)) {
if (StringUtils.isEmpty(content))
{
return content; return content;
} }
StringBuilder tmp = new StringBuilder(content.length()); StringBuilder tmp = new StringBuilder(content.length());
int lastPos = 0, pos = 0; int lastPos = 0, pos = 0;
char ch; char ch;
while (lastPos < content.length()) while (lastPos < content.length()) {
{
pos = content.indexOf("%", lastPos); pos = content.indexOf("%", lastPos);
if (pos == lastPos) if (pos == lastPos) {
{ if (content.charAt(pos + 1) == 'u') {
if (content.charAt(pos + 1) == 'u')
{
ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
tmp.append(ch); tmp.append(ch);
lastPos = pos + 6; lastPos = pos + 6;
} } else {
else
{
ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
tmp.append(ch); tmp.append(ch);
lastPos = pos + 3; lastPos = pos + 3;
} }
} } else {
else if (pos == -1) {
{
if (pos == -1)
{
tmp.append(content.substring(lastPos)); tmp.append(content.substring(lastPos));
lastPos = content.length(); lastPos = content.length();
} } else {
else tmp.append(content, lastPos, pos);
{
tmp.append(content.substring(lastPos, pos));
lastPos = pos; lastPos = pos;
} }
} }
@ -153,8 +127,7 @@ public class EscapeUtil
return tmp.toString(); return tmp.toString();
} }
public static void main(String[] args) public static void main(String[] args) {
{
String html = "<script>alert(1);</script>"; String html = "<script>alert(1);</script>";
String escape = EscapeUtil.escape(html); String escape = EscapeUtil.escape(html);
// String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>"; // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";

@ -15,8 +15,7 @@ import java.util.regex.Pattern;
* *
* @author ruoyi * @author ruoyi
*/ */
public final class HTMLFilter public final class HTMLFilter {
{
/** /**
* regex flag union representing /si modifiers in php * regex flag union representing /si modifiers in php
**/ **/
@ -100,8 +99,7 @@ public final class HTMLFilter
/** /**
* Default constructor. * Default constructor.
*/ */
public HTMLFilter() public HTMLFilter() {
{
vAllowed = new HashMap<>(); vAllowed = new HashMap<>();
final ArrayList<String> a_atts = new ArrayList<>(); final ArrayList<String> a_atts = new ArrayList<>();
@ -122,13 +120,13 @@ public final class HTMLFilter
vAllowed.put("i", no_atts); vAllowed.put("i", no_atts);
vAllowed.put("em", no_atts); vAllowed.put("em", no_atts);
vSelfClosingTags = new String[] { "img" }; vSelfClosingTags = new String[]{"img"};
vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};
vDisallowed = new String[] {}; vDisallowed = new String[]{};
vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.
vProtocolAtts = new String[] { "src", "href" }; vProtocolAtts = new String[]{"src", "href"};
vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};
vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};
stripComment = true; stripComment = true;
encodeQuotes = true; encodeQuotes = true;
alwaysMakeTags = false; alwaysMakeTags = false;
@ -140,8 +138,7 @@ public final class HTMLFilter
* @param conf map containing configuration. keys match field names. * @param conf map containing configuration. keys match field names.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public HTMLFilter(final Map<String, Object> conf) public HTMLFilter(final Map<String, Object> conf) {
{
assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
@ -165,20 +162,17 @@ public final class HTMLFilter
alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
} }
private void reset() private void reset() {
{
vTagCounts.clear(); vTagCounts.clear();
} }
// --------------------------------------------------------------- // ---------------------------------------------------------------
// my versions of some PHP library functions // 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); return String.valueOf((char) decimal);
} }
public static String htmlSpecialChars(final String s) public static String htmlSpecialChars(final String s) {
{
String result = s; String result = s;
result = regexReplace(P_AMP, "&amp;", result); result = regexReplace(P_AMP, "&amp;", result);
result = regexReplace(P_QUOTE, "&quot;", result); result = regexReplace(P_QUOTE, "&quot;", result);
@ -195,8 +189,7 @@ public final class HTMLFilter
* @param input text (i.e. submitted by a user) than may contain html * @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 * @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(); reset();
String s = input; String s = input;
@ -213,22 +206,18 @@ public final class HTMLFilter
return s; return s;
} }
public boolean isAlwaysMakeTags() public boolean isAlwaysMakeTags() {
{
return alwaysMakeTags; return alwaysMakeTags;
} }
public boolean isStripComments() public boolean isStripComments() {
{
return stripComment; return stripComment;
} }
private String escapeComments(final String s) private String escapeComments(final String s) {
{
final Matcher m = P_COMMENTS.matcher(s); final Matcher m = P_COMMENTS.matcher(s);
final StringBuffer buf = new StringBuffer(); final StringBuffer buf = new StringBuffer();
if (m.find()) if (m.find()) {
{
final String match = m.group(1); // (.*?) final String match = m.group(1); // (.*?)
m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->")); m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
} }
@ -237,10 +226,8 @@ public final class HTMLFilter
return buf.toString(); return buf.toString();
} }
private String balanceHTML(String s) private String balanceHTML(String s) {
{ if (alwaysMakeTags) {
if (alwaysMakeTags)
{
// //
// try and form html // try and form html
// //
@ -249,9 +236,7 @@ public final class HTMLFilter
s = regexReplace(P_BODY_TO_END, "<$1>", s); s = regexReplace(P_BODY_TO_END, "<$1>", s);
s = regexReplace(P_XML_CONTENT, "$1<$2", s); s = regexReplace(P_XML_CONTENT, "$1<$2", s);
} } else {
else
{
// //
// escape stray brackets // escape stray brackets
// //
@ -269,13 +254,11 @@ public final class HTMLFilter
return s; return s;
} }
private String checkTags(String s) private String checkTags(String s) {
{
Matcher m = P_TAGS.matcher(s); Matcher m = P_TAGS.matcher(s);
final StringBuffer buf = new StringBuffer(); final StringBuffer buf = new StringBuffer();
while (m.find()) while (m.find()) {
{
String replaceStr = m.group(1); String replaceStr = m.group(1);
replaceStr = processTag(replaceStr); replaceStr = processTag(replaceStr);
m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
@ -285,10 +268,8 @@ public final class HTMLFilter
// these get tallied in processTag // these get tallied in processTag
// (remember to reset before subsequent calls to filter method) // (remember to reset before subsequent calls to filter method)
final StringBuilder sBuilder = new StringBuilder(buf.toString()); final StringBuilder sBuilder = new StringBuilder(buf.toString());
for (String key : vTagCounts.keySet()) for (String key : vTagCounts.keySet()) {
{ for (int ii = 0; ii < vTagCounts.get(key); ii++) {
for (int ii = 0; ii < vTagCounts.get(key); ii++)
{
sBuilder.append("</").append(key).append(">"); sBuilder.append("</").append(key).append(">");
} }
} }
@ -297,18 +278,14 @@ public final class HTMLFilter
return s; return s;
} }
private String processRemoveBlanks(final String s) private String processRemoveBlanks(final String s) {
{
String result = s; String result = s;
for (String tag : vRemoveBlanks) for (String tag : vRemoveBlanks) {
{ if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) {
if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
{
P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">")); P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
} }
result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); 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[^>]*)?/>")); P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
} }
result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
@ -317,25 +294,19 @@ public final class HTMLFilter
return result; 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); Matcher m = regex_pattern.matcher(s);
return m.replaceAll(replacement); return m.replaceAll(replacement);
} }
private String processTag(final String s) private String processTag(final String s) {
{
// ending tags // ending tags
Matcher m = P_END_TAG.matcher(s); Matcher m = P_END_TAG.matcher(s);
if (m.find()) if (m.find()) {
{
final String name = m.group(1).toLowerCase(); final String name = m.group(1).toLowerCase();
if (allowed(name)) if (allowed(name)) {
{ if (!inArray(name, vSelfClosingTags)) {
if (!inArray(name, vSelfClosingTags)) if (vTagCounts.containsKey(name)) {
{
if (vTagCounts.containsKey(name))
{
vTagCounts.put(name, vTagCounts.get(name) - 1); vTagCounts.put(name, vTagCounts.get(name) - 1);
return "</" + name + ">"; return "</" + name + ">";
} }
@ -345,35 +316,30 @@ public final class HTMLFilter
// starting tags // starting tags
m = P_START_TAG.matcher(s); m = P_START_TAG.matcher(s);
if (m.find()) if (m.find()) {
{
final String name = m.group(1).toLowerCase(); final String name = m.group(1).toLowerCase();
final String body = m.group(2); final String body = m.group(2);
String ending = m.group(3); String ending = m.group(3);
// debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
if (allowed(name)) if (allowed(name)) {
{
final StringBuilder params = new StringBuilder(); final StringBuilder params = new StringBuilder();
final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
final List<String> paramNames = new ArrayList<>(); final List<String> paramNames = new ArrayList<>();
final List<String> paramValues = new ArrayList<>(); final List<String> paramValues = new ArrayList<>();
while (m2.find()) while (m2.find()) {
{
paramNames.add(m2.group(1)); // ([a-z0-9]+) paramNames.add(m2.group(1)); // ([a-z0-9]+)
paramValues.add(m2.group(3)); // (.*?) paramValues.add(m2.group(3)); // (.*?)
} }
while (m3.find()) while (m3.find()) {
{
paramNames.add(m3.group(1)); // ([a-z0-9]+) paramNames.add(m3.group(1)); // ([a-z0-9]+)
paramValues.add(m3.group(3)); // ([^\"\\s']+) paramValues.add(m3.group(3)); // ([^\"\\s']+)
} }
String paramName, paramValue; String paramName, paramValue;
for (int ii = 0; ii < paramNames.size(); ii++) for (int ii = 0; ii < paramNames.size(); ii++) {
{
paramName = paramNames.get(ii).toLowerCase(); paramName = paramNames.get(ii).toLowerCase();
paramValue = paramValues.get(ii); paramValue = paramValues.get(ii);
@ -381,72 +347,55 @@ public final class HTMLFilter
// debug( "paramValue='" + paramValue + "'" ); // debug( "paramValue='" + paramValue + "'" );
// debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
if (allowedAttribute(name, paramName)) if (allowedAttribute(name, paramName)) {
{ if (inArray(paramName, vProtocolAtts)) {
if (inArray(paramName, vProtocolAtts))
{
paramValue = processParamProtocol(paramValue); paramValue = processParamProtocol(paramValue);
} }
params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\"");
} }
} }
if (inArray(name, vSelfClosingTags)) if (inArray(name, vSelfClosingTags)) {
{
ending = " /"; ending = " /";
} }
if (inArray(name, vNeedClosingTags)) if (inArray(name, vNeedClosingTags)) {
{
ending = ""; ending = "";
} }
if (ending == null || ending.length() < 1) if (ending == null || ending.length() < 1) {
{ if (vTagCounts.containsKey(name)) {
if (vTagCounts.containsKey(name))
{
vTagCounts.put(name, vTagCounts.get(name) + 1); vTagCounts.put(name, vTagCounts.get(name) + 1);
} } else {
else
{
vTagCounts.put(name, 1); vTagCounts.put(name, 1);
} }
} } else {
else
{
ending = " /"; ending = " /";
} }
return "<" + name + params + ending + ">"; return "<" + name + params + ending + ">";
} } else {
else
{
return ""; return "";
} }
} }
// comments // comments
m = P_COMMENT.matcher(s); m = P_COMMENT.matcher(s);
if (!stripComment && m.find()) if (!stripComment && m.find()) {
{
return "<" + m.group() + ">"; return "<" + m.group() + ">";
} }
return ""; return "";
} }
private String processParamProtocol(String s) private String processParamProtocol(String s) {
{
s = decodeEntities(s); s = decodeEntities(s);
final Matcher m = P_PROTOCOL.matcher(s); final Matcher m = P_PROTOCOL.matcher(s);
if (m.find()) if (m.find()) {
{
final String protocol = m.group(1); final String protocol = m.group(1);
if (!inArray(protocol, vAllowedProtocols)) if (!inArray(protocol, vAllowedProtocols)) {
{
// bad protocol, turn into local anchor link instead // bad protocol, turn into local anchor link instead
s = "#" + s.substring(protocol.length() + 1); s = "#" + s.substring(protocol.length() + 1);
if (s.startsWith("#//")) if (s.startsWith("#//")) {
{
s = "#" + s.substring(3); s = "#" + s.substring(3);
} }
} }
@ -455,13 +404,11 @@ public final class HTMLFilter
return s; return s;
} }
private String decodeEntities(String s) private String decodeEntities(String s) {
{
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
Matcher m = P_ENTITY.matcher(s); Matcher m = P_ENTITY.matcher(s);
while (m.find()) while (m.find()) {
{
final String match = m.group(1); final String match = m.group(1);
final int decimal = Integer.decode(match).intValue(); final int decimal = Integer.decode(match).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
@ -471,8 +418,7 @@ public final class HTMLFilter
buf = new StringBuffer(); buf = new StringBuffer();
m = P_ENTITY_UNICODE.matcher(s); m = P_ENTITY_UNICODE.matcher(s);
while (m.find()) while (m.find()) {
{
final String match = m.group(1); final String match = m.group(1);
final int decimal = Integer.valueOf(match, 16).intValue(); final int decimal = Integer.valueOf(match, 16).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
@ -482,8 +428,7 @@ public final class HTMLFilter
buf = new StringBuffer(); buf = new StringBuffer();
m = P_ENCODE.matcher(s); m = P_ENCODE.matcher(s);
while (m.find()) while (m.find()) {
{
final String match = m.group(1); final String match = m.group(1);
final int decimal = Integer.valueOf(match, 16).intValue(); final int decimal = Integer.valueOf(match, 16).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
@ -495,14 +440,12 @@ public final class HTMLFilter
return s; return s;
} }
private String validateEntities(final String s) private String validateEntities(final String s) {
{
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
// validate entities throughout the string // validate entities throughout the string
Matcher m = P_VALID_ENTITIES.matcher(s); Matcher m = P_VALID_ENTITIES.matcher(s);
while (m.find()) while (m.find()) {
{
final String one = m.group(1); // ([^&;]*) final String one = m.group(1); // ([^&;]*)
final String two = m.group(2); // (?=(;|&|$)) final String two = m.group(2); // (?=(;|&|$))
m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
@ -512,14 +455,11 @@ public final class HTMLFilter
return encodeQuotes(buf.toString()); return encodeQuotes(buf.toString());
} }
private String encodeQuotes(final String s) private String encodeQuotes(final String s) {
{ if (encodeQuotes) {
if (encodeQuotes)
{
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
Matcher m = P_VALID_QUOTES.matcher(s); Matcher m = P_VALID_QUOTES.matcher(s);
while (m.find()) while (m.find()) {
{
final String one = m.group(1); // (>|^) final String one = m.group(1); // (>|^)
final String two = m.group(2); // ([^<]+?) final String two = m.group(2); // ([^<]+?)
final String three = m.group(3); // (<|$) final String three = m.group(3); // (<|$)
@ -528,43 +468,34 @@ public final class HTMLFilter
} }
m.appendTail(buf); m.appendTail(buf);
return buf.toString(); return buf.toString();
} } else {
else
{
return s; 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 : "&amp;" + preamble; return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&amp;" + preamble;
} }
private boolean isValidEntity(final String entity) private boolean isValidEntity(final String entity) {
{
return inArray(entity, vAllowedEntities); return inArray(entity, vAllowedEntities);
} }
private static boolean inArray(final String s, final String[] array) private static boolean inArray(final String s, final String[] array) {
{ for (String item : array) {
for (String item : array) if (item != null && item.equals(s)) {
{
if (item != null && item.equals(s))
{
return true; return true;
} }
} }
return false; return false;
} }
private boolean allowed(final String name) private boolean allowed(final String name) {
{
return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); 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)); return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
} }
} }

@ -1,32 +1,31 @@
package com.ruoyi.common.core.utils.ip; 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.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.StringUtils;
import jakarta.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/** /**
* IP * IP
* *
* @author ruoyi * @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)"; public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
// 匹配 ip // 匹配 ip
public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; 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_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 * IP
* *
* @return IP * @return IP
*/ */
public static String getIpAddr() public static String getIpAddr() {
{
return getIpAddr(ServletUtils.getRequest()); return getIpAddr(ServletUtils.getRequest());
} }
@ -36,32 +35,25 @@ public class IpUtils
* @param request * @param request
* @return IP * @return IP
*/ */
public static String getIpAddr(HttpServletRequest request) public static String getIpAddr(HttpServletRequest request) {
{ if (request == null) {
if (request == null)
{
return "unknown"; return "unknown";
} }
String ip = request.getHeader("x-forwarded-for"); 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"); 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"); 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"); 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"); 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(); ip = request.getRemoteAddr();
} }
@ -74,8 +66,7 @@ public class IpUtils
* @param ip IP * @param ip IP
* @return * @return
*/ */
public static boolean internalIp(String ip) public static boolean internalIp(String ip) {
{
byte[] addr = textToNumericFormatV4(ip); byte[] addr = textToNumericFormatV4(ip);
return internalIp(addr) || "127.0.0.1".equals(ip); return internalIp(addr) || "127.0.0.1".equals(ip);
} }
@ -86,10 +77,8 @@ public class IpUtils
* @param addr byte * @param addr byte
* @return * @return
*/ */
private static boolean internalIp(byte[] addr) private static boolean internalIp(byte[] addr) {
{ if (StringUtils.isNull(addr) || addr.length < 2) {
if (StringUtils.isNull(addr) || addr.length < 2)
{
return true; return true;
} }
final byte b0 = addr[0]; final byte b0 = addr[0];
@ -103,18 +92,15 @@ public class IpUtils
// 192.168.x.x/16 // 192.168.x.x/16
final byte SECTION_5 = (byte) 0xC0; final byte SECTION_5 = (byte) 0xC0;
final byte SECTION_6 = (byte) 0xA8; final byte SECTION_6 = (byte) 0xA8;
switch (b0) switch (b0) {
{
case SECTION_1: case SECTION_1:
return true; return true;
case SECTION_2: case SECTION_2:
if (b1 >= SECTION_3 && b1 <= SECTION_4) if (b1 >= SECTION_3 && b1 <= SECTION_4) {
{
return true; return true;
} }
case SECTION_5: case SECTION_5:
switch (b1) switch (b1) {
{
case SECTION_6: case SECTION_6:
return true; return true;
} }
@ -129,25 +115,20 @@ public class IpUtils
* @param text IPv4 * @param text IPv4
* @return byte * @return byte
*/ */
public static byte[] textToNumericFormatV4(String text) public static byte[] textToNumericFormatV4(String text) {
{ if (text.isEmpty()) {
if (text.length() == 0)
{
return null; return null;
} }
byte[] bytes = new byte[4]; byte[] bytes = new byte[4];
String[] elements = text.split("\\.", -1); String[] elements = text.split("\\.", -1);
try try {
{
long l; long l;
int i; int i;
switch (elements.length) switch (elements.length) {
{
case 1: case 1:
l = Long.parseLong(elements[0]); l = Long.parseLong(elements[0]);
if ((l < 0L) || (l > 4294967295L)) if ((l < 0L) || (l > 4294967295L)) {
{
return null; return null;
} }
bytes[0] = (byte) (int) (l >> 24 & 0xFF); bytes[0] = (byte) (int) (l >> 24 & 0xFF);
@ -157,14 +138,12 @@ public class IpUtils
break; break;
case 2: case 2:
l = Integer.parseInt(elements[0]); l = Integer.parseInt(elements[0]);
if ((l < 0L) || (l > 255L)) if ((l < 0L) || (l > 255L)) {
{
return null; return null;
} }
bytes[0] = (byte) (int) (l & 0xFF); bytes[0] = (byte) (int) (l & 0xFF);
l = Integer.parseInt(elements[1]); l = Integer.parseInt(elements[1]);
if ((l < 0L) || (l > 16777215L)) if ((l < 0L) || (l > 16777215L)) {
{
return null; return null;
} }
bytes[1] = (byte) (int) (l >> 16 & 0xFF); bytes[1] = (byte) (int) (l >> 16 & 0xFF);
@ -172,29 +151,24 @@ public class IpUtils
bytes[3] = (byte) (int) (l & 0xFF); bytes[3] = (byte) (int) (l & 0xFF);
break; break;
case 3: case 3:
for (i = 0; i < 2; ++i) for (i = 0; i < 2; ++i) {
{
l = Integer.parseInt(elements[i]); l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) if ((l < 0L) || (l > 255L)) {
{
return null; return null;
} }
bytes[i] = (byte) (int) (l & 0xFF); bytes[i] = (byte) (int) (l & 0xFF);
} }
l = Integer.parseInt(elements[2]); l = Integer.parseInt(elements[2]);
if ((l < 0L) || (l > 65535L)) if ((l < 0L) || (l > 65535L)) {
{
return null; return null;
} }
bytes[2] = (byte) (int) (l >> 8 & 0xFF); bytes[2] = (byte) (int) (l >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF); bytes[3] = (byte) (int) (l & 0xFF);
break; break;
case 4: case 4:
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i) {
{
l = Integer.parseInt(elements[i]); l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) if ((l < 0L) || (l > 255L)) {
{
return null; return null;
} }
bytes[i] = (byte) (int) (l & 0xFF); bytes[i] = (byte) (int) (l & 0xFF);
@ -203,9 +177,7 @@ public class IpUtils
default: default:
return null; return null;
} }
} } catch (NumberFormatException e) {
catch (NumberFormatException e)
{
return null; return null;
} }
return bytes; return bytes;
@ -216,14 +188,10 @@ public class IpUtils
* *
* @return IP * @return IP
*/ */
public static String getHostIp() public static String getHostIp() {
{ try {
try
{
return InetAddress.getLocalHost().getHostAddress(); return InetAddress.getLocalHost().getHostAddress();
} } catch (UnknownHostException ignored) {
catch (UnknownHostException e)
{
} }
return "127.0.0.1"; return "127.0.0.1";
} }
@ -233,14 +201,10 @@ public class IpUtils
* *
* @return * @return
*/ */
public static String getHostName() public static String getHostName() {
{ try {
try
{
return InetAddress.getLocalHost().getHostName(); return InetAddress.getLocalHost().getHostName();
} } catch (UnknownHostException ignored) {
catch (UnknownHostException e)
{
} }
return "未知"; return "未知";
} }
@ -251,16 +215,12 @@ public class IpUtils
* @param ip IP * @param ip IP
* @return unknown 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(","); final String[] ips = ip.trim().split(",");
for (String subIp : ips) for (String subIp : ips) {
{ if (!isUnknown(subIp)) {
if (false == isUnknown(subIp))
{
ip = subIp; ip = subIp;
break; break;
} }
@ -275,39 +235,33 @@ public class IpUtils
* @param checkString * @param checkString
* @return * @return
*/ */
public static boolean isUnknown(String checkString) public static boolean isUnknown(String checkString) {
{
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
} }
/** /**
* IP * IP
*/ */
public static boolean isIP(String ip) public static boolean isIP(String ip) {
{
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
} }
/** /**
* IP * * IP *
*/ */
public static boolean isIpWildCard(String ip) public static boolean isIpWildCard(String ip) {
{
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
} }
/** /**
* ip * ip
*/ */
public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) {
{
String[] s1 = ipWildCard.split("\\."); String[] s1 = ipWildCard.split("\\.");
String[] s2 = ip.split("\\."); String[] s2 = ip.split("\\.");
boolean isMatchedSeg = true; boolean isMatchedSeg = true;
for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) {
{ if (!s1[i].equals(s2[i])) {
if (!s1[i].equals(s2[i]))
{
isMatchedSeg = false; isMatchedSeg = false;
break; break;
} }
@ -318,29 +272,25 @@ public class IpUtils
/** /**
* :10.10.10.1-10.10.10.99ip * :10.10.10.1-10.10.10.99ip
*/ */
public static boolean isIPSegment(String ipSeg) public static boolean isIPSegment(String ipSeg) {
{
return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
} }
/** /**
* ip * ip
*/ */
public static boolean ipIsInNetNoCheck(String iparea, String ip) public static boolean ipIsInNetNoCheck(String iparea, String ip) {
{
int idx = iparea.indexOf('-'); int idx = iparea.indexOf('-');
String[] sips = iparea.substring(0, idx).split("\\."); String[] sips = iparea.substring(0, idx).split("\\.");
String[] sipe = iparea.substring(idx + 1).split("\\."); String[] sipe = iparea.substring(idx + 1).split("\\.");
String[] sipt = ip.split("\\."); String[] sipt = ip.split("\\.");
long ips = 0L, ipe = 0L, ipt = 0L; 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]); ips = ips << 8 | Integer.parseInt(sips[i]);
ipe = ipe << 8 | Integer.parseInt(sipe[i]); ipe = ipe << 8 | Integer.parseInt(sipe[i]);
ipt = ipt << 8 | Integer.parseInt(sipt[i]); ipt = ipt << 8 | Integer.parseInt(sipt[i]);
} }
if (ips > ipe) if (ips > ipe) {
{
long t = ips; long t = ips;
ips = ipe; ips = ipe;
ipe = t; ipe = t;
@ -355,25 +305,17 @@ public class IpUtils
* @param ip IP * @param ip IP
* @return boolean * @return boolean
*/ */
public static boolean isMatchedIp(String filter, String ip) public static boolean isMatchedIp(String filter, String ip) {
{ if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) {
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
{
return false; return false;
} }
String[] ips = filter.split(";"); String[] ips = filter.split(";");
for (String iStr : ips) for (String iStr : ips) {
{ if (isIP(iStr) && iStr.equals(ip)) {
if (isIP(iStr) && iStr.equals(ip))
{
return true; return true;
} } else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) {
else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
{
return true; return true;
} } else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) {
else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
{
return true; return true;
} }
} }

@ -8,8 +8,7 @@ import org.apache.poi.ss.usermodel.Workbook;
* *
* @author ruoyi * @author ruoyi
*/ */
public interface ExcelHandlerAdapter public interface ExcelHandlerAdapter {
{
/** /**
* *
* *
@ -17,7 +16,6 @@ public interface ExcelHandlerAdapter
* @param args excelargs * @param args excelargs
* @param cell * @param cell
* @param wb 簿 * @param wb 簿
*
* @return * @return
*/ */
Object format(Object value, String[] args, Cell cell, Workbook wb); Object format(Object value, String[] args, Cell cell, Workbook wb);

@ -5,8 +5,7 @@ package com.ruoyi.common.core.utils.sign;
* *
* @author ruoyi * @author ruoyi
*/ */
public final class Base64 public final class Base64 {
{
static private final int BASELENGTH = 128; static private final int BASELENGTH = 128;
static private final int LOOKUPLENGTH = 64; static private final int LOOKUPLENGTH = 64;
static private final int TWENTYFOURBITGROUP = 24; static private final int TWENTYFOURBITGROUP = 24;
@ -18,59 +17,48 @@ public final class Base64
static final private byte[] base64Alphabet = new byte[BASELENGTH]; static final private byte[] base64Alphabet = new byte[BASELENGTH];
static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
static static {
{ for (int i = 0; i < BASELENGTH; ++i) {
for (int i = 0; i < BASELENGTH; ++i)
{
base64Alphabet[i] = -1; base64Alphabet[i] = -1;
} }
for (int i = 'Z'; i >= 'A'; i--) for (int i = 'Z'; i >= 'A'; i--) {
{
base64Alphabet[i] = (byte) (i - 'A'); 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); 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[i] = (byte) (i - '0' + 52);
} }
base64Alphabet['+'] = 62; base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63; base64Alphabet['/'] = 63;
for (int i = 0; i <= 25; i++) for (int i = 0; i <= 25; i++) {
{
lookUpBase64Alphabet[i] = (char) ('A' + 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); 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[i] = (char) ('0' + j);
} }
lookUpBase64Alphabet[62] = (char) '+'; lookUpBase64Alphabet[62] = (char) '+';
lookUpBase64Alphabet[63] = (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); return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
} }
private static boolean isPad(char octect) private static boolean isPad(char octect) {
{
return (octect == PAD); return (octect == PAD);
} }
private static boolean isData(char octect) private static boolean isData(char octect) {
{
return (octect < BASELENGTH && base64Alphabet[octect] != -1); return (octect < BASELENGTH && base64Alphabet[octect] != -1);
} }
@ -80,23 +68,20 @@ public final class Base64
* @param binaryData Array containing binaryData * @param binaryData Array containing binaryData
* @return Encoded Base64 array * @return Encoded Base64 array
*/ */
public static String encode(byte[] binaryData) public static String encode(byte[] binaryData) {
{ if (binaryData == null) {
if (binaryData == null)
{
return null; return null;
} }
int lengthDataBits = binaryData.length * EIGHTBIT; int lengthDataBits = binaryData.length * EIGHTBIT;
if (lengthDataBits == 0) if (lengthDataBits == 0) {
{
return ""; return "";
} }
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
char encodedData[] = null; char[] encodedData;
encodedData = new char[numberQuartet * 4]; encodedData = new char[numberQuartet * 4];
@ -105,8 +90,7 @@ public final class Base64
int encodedIndex = 0; int encodedIndex = 0;
int dataIndex = 0; int dataIndex = 0;
for (int i = 0; i < numberTriplets; i++) for (int i = 0; i < numberTriplets; i++) {
{
b1 = binaryData[dataIndex++]; b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++];
@ -125,8 +109,7 @@ public final class Base64
} }
// form integral number of 6-bit groups // form integral number of 6-bit groups
if (fewerThan24bits == EIGHTBIT) if (fewerThan24bits == EIGHTBIT) {
{
b1 = binaryData[dataIndex]; b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03); k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); 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++] = lookUpBase64Alphabet[k << 4];
encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD;
encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD;
} } else if (fewerThan24bits == SIXTEENBIT) {
else if (fewerThan24bits == SIXTEENBIT)
{
b1 = binaryData[dataIndex]; b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1]; b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f); l = (byte) (b2 & 0x0f);
@ -159,10 +140,8 @@ public final class Base64
* @param encoded string containing Base64 data * @param encoded string containing Base64 data
* @return Array containind decoded data. * @return Array containind decoded data.
*/ */
public static byte[] decode(String encoded) public static byte[] decode(String encoded) {
{ if (encoded == null) {
if (encoded == null)
{
return null; return null;
} }
@ -170,15 +149,13 @@ public final class Base64
// remove white spaces // remove white spaces
int len = removeWhiteSpace(base64Data); int len = removeWhiteSpace(base64Data);
if (len % FOURBYTE != 0) if (len % FOURBYTE != 0) {
{
return null;// should be divisible by four return null;// should be divisible by four
} }
int numberQuadruple = (len / FOURBYTE); int numberQuadruple = (len / FOURBYTE);
if (numberQuadruple == 0) if (numberQuadruple == 0) {
{
return new byte[0]; return new byte[0];
} }
@ -191,12 +168,10 @@ public final class Base64
int dataIndex = 0; int dataIndex = 0;
decodedData = new byte[(numberQuadruple) * 3]; decodedData = new byte[(numberQuadruple) * 3];
for (; i < numberQuadruple - 1; i++) for (; i < numberQuadruple - 1; i++) {
{
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) 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; return null;
} // if found "no data" just return null } // if found "no data" just return null
@ -210,8 +185,7 @@ public final class Base64
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); 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 return null;// if found "no data" just return null
} }
@ -220,10 +194,8 @@ public final class Base64
d3 = base64Data[dataIndex++]; d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++]; d4 = base64Data[dataIndex++];
if (!isData((d3)) || !isData((d4))) if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
{// Check if they are PAD characters if (isPad(d3) && isPad(d4)) {
if (isPad(d3) && isPad(d4))
{
if ((b2 & 0xf) != 0)// last 4 bits should be zero if ((b2 & 0xf) != 0)// last 4 bits should be zero
{ {
return null; return null;
@ -232,9 +204,7 @@ public final class Base64
System.arraycopy(decodedData, 0, tmp, 0, i * 3); System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
return tmp; return tmp;
} } else if (!isPad(d3) && isPad(d4)) {
else if (!isPad(d3) && isPad(d4))
{
b3 = base64Alphabet[d3]; b3 = base64Alphabet[d3];
if ((b3 & 0x3) != 0)// last 2 bits should be zero 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) (b1 << 2 | b2 >> 4);
tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
return tmp; return tmp;
} } else {
else
{
return null; return null;
} }
} } else { // No PAD e.g 3cQl
else
{ // No PAD e.g 3cQl
b3 = base64Alphabet[d3]; b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4]; b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 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) * @param data the byte array of base64 data (with WS)
* @return the new length * @return the new length
*/ */
private static int removeWhiteSpace(char[] data) private static int removeWhiteSpace(char[] data) {
{ if (data == null) {
if (data == null)
{
return 0; return 0;
} }
// count characters that's not whitespace // count characters that's not whitespace
int newSize = 0; int newSize = 0;
int len = data.length; int len = data.length;
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++) {
{ if (!isWhiteSpace(data[i])) {
if (!isWhiteSpace(data[i]))
{
data[newSize++] = data[i]; data[newSize++] = data[i];
} }
} }

@ -8,8 +8,7 @@ import com.ruoyi.common.core.utils.StringUtils;
* *
* @author ruoyi * @author ruoyi
*/ */
public class SqlUtil public class SqlUtil {
{
/** /**
* sql * 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 * orderBy
@ -28,14 +27,11 @@ public class SqlUtil
/** /**
* *
*/ */
public static String escapeOrderBySql(String value) public static String escapeOrderBySql(String value) {
{ if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
{
throw new UtilException("参数不符合规范,不能进行查询"); throw new UtilException("参数不符合规范,不能进行查询");
} }
if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) {
{
throw new UtilException("参数已超过最大限制,不能进行查询"); throw new UtilException("参数已超过最大限制,不能进行查询");
} }
return value; return value;
@ -44,25 +40,20 @@ public class SqlUtil
/** /**
* order by * order by
*/ */
public static boolean isValidOrderBySql(String value) public static boolean isValidOrderBySql(String value) {
{
return value.matches(SQL_PATTERN); return value.matches(SQL_PATTERN);
} }
/** /**
* SQL * SQL
*/ */
public static void filterKeyword(String value) public static void filterKeyword(String value) {
{ if (StringUtils.isEmpty(value)) {
if (StringUtils.isEmpty(value))
{
return; return;
} }
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords) for (String sqlKeyword : sqlKeywords) {
{ if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) {
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险"); throw new UtilException("参数存在SQL注入风险");
} }
} }

@ -152,4 +152,12 @@ public class GlobalExceptionHandler {
public AjaxResult handleLoginExpiredException(LoginExpiredException e) { public AjaxResult handleLoginExpiredException(LoginExpiredException e) {
return AjaxResult.error(e.getMessage()); return AjaxResult.error(e.getMessage());
} }
/**
*
*/
@ExceptionHandler(IllegalArgumentException.class)
public AjaxResult handleIllegalArgumentException(IllegalArgumentException e) {
return AjaxResult.error("参数校验失败: " + e.getMessage());
}
} }

@ -16,10 +16,10 @@
</description> </description>
<dependencies> <dependencies>
<!-- RuoYi Common Security --> <!-- RuoYi Common Log -->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-security</artifactId> <artifactId>ruoyi-common-log</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>

@ -60,12 +60,6 @@
<version>${minio.version}</version> <version>${minio.version}</version>
</dependency> </dependency>
<!-- RuoYi Api System -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-system</artifactId>
</dependency>
<!-- Mysql Connector --> <!-- Mysql Connector -->
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>
@ -82,6 +76,12 @@
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-services</artifactId> <artifactId>ruoyi-common-services</artifactId>
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>com.ruoyi</groupId>-->
<!-- <artifactId>ruoyi-common-log</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency> </dependency>
<!-- RuoYi Common Datasource--> <!-- RuoYi Common Datasource-->
@ -90,6 +90,18 @@
<artifactId>ruoyi-common-datasource</artifactId> <artifactId>ruoyi-common-datasource</artifactId>
</dependency> </dependency>
<!-- RuoYi Common Core -->
<!-- <dependency>-->
<!-- <groupId>com.ruoyi</groupId>-->
<!-- <artifactId>ruoyi-common-security</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; 系统接口 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.ruoyi</groupId>-->
<!-- <artifactId>ruoyi-api-system</artifactId>-->
<!-- </dependency>-->
</dependencies> </dependencies>
<build> <build>

@ -1,5 +1,6 @@
package com.ruoyi.file; package com.ruoyi.file;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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) @ConditionalOnProperty(name = "spring.cloud.nacos.config.group", havingValue = "DEFAULT_GROUP", matchIfMissing = true)
@EnableCustomSwagger2 @EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class RuoYiFileApplication { public class RuoYiFileApplication {
public static void main(String[] args) { public static void main(String[] args) {

@ -4,6 +4,8 @@ import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.TableDataInfo; 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.common.security.annotation.RequiresPermissions;
import com.ruoyi.file.domain.SysFile; import com.ruoyi.file.domain.SysFile;
import com.ruoyi.file.service.ISysFileCRUDService; import com.ruoyi.file.service.ISysFileCRUDService;
@ -43,6 +45,10 @@ public class SysFileCRUDController extends BaseController {
@PostMapping("/export") @PostMapping("/export")
public void export(HttpServletResponse response, SysFile sysFile) { public void export(HttpServletResponse response, SysFile sysFile) {
List<SysFile> list = crudService.selectSysFileList(sysFile); List<SysFile> list = crudService.selectSysFileList(sysFile);
if (list.isEmpty()) {
responseJsonWarn(response, "没有数据可以导出");
return;
}
ExcelUtil<SysFile> util = new ExcelUtil<>(SysFile.class); ExcelUtil<SysFile> util = new ExcelUtil<>(SysFile.class);
util.exportExcel(response, list, "文件存储记录数据"); util.exportExcel(response, list, "文件存储记录数据");
} }
@ -55,4 +61,34 @@ public class SysFileCRUDController extends BaseController {
public AjaxResult getInfo(@PathVariable("fileId") String fileId) { public AjaxResult getInfo(@PathVariable("fileId") String fileId) {
return success(crudService.selectSysFileByFileId(fileId)); return success(crudService.selectSysFileByFileId(fileId));
} }
/**
*
*/
@RequiresPermissions("wms:FileRecord:add")
@Log(title = "文件存储记录", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SysFile sysFile) {
return toAjax(crudService.insertSysFile(sysFile));
}
/**
*
*/
@RequiresPermissions("wms:FileRecord:edit")
@Log(title = "文件存储记录", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SysFile sysFile) {
return toAjax(crudService.updateSysFile(sysFile));
}
/**
*
*/
@RequiresPermissions("wms:FileRecord:remove")
@Log(title = "文件存储记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{fileIds}")
public AjaxResult remove(@PathVariable String[] fileIds) throws Exception {
return toAjax(crudService.deleteSysFileByFileIds(fileIds));
}
} }

@ -1,9 +1,10 @@
package com.ruoyi.file.controller; package com.ruoyi.file.controller;
import com.ruoyi.file.domain.FileSaveResult; import com.ruoyi.file.domain.FileResult;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.PostMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -32,7 +33,7 @@ public class SysFileController {
public R<SysFileInfo> upload(MultipartFile file) { public R<SysFileInfo> upload(MultipartFile file) {
try { try {
// 上传并返回访问地址 // 上传并返回访问地址
FileSaveResult saveResult = sysFileService.uploadFile(file); FileResult saveResult = sysFileService.uploadFile(file);
String requestUrl = saveResult.getRequestUrl(); String requestUrl = saveResult.getRequestUrl();
// 构建返回结果 // 构建返回结果
SysFileInfo responseInfo = new SysFileInfo(); SysFileInfo responseInfo = new SysFileInfo();
@ -45,4 +46,18 @@ public class SysFileController {
return R.fail(e.getMessage()); return R.fail(e.getMessage());
} }
} }
/**
*
*/
@PostMapping("deleteFiles/{fileIds}")
public R<SysFileInfo> deleteFiles(@PathVariable String[] fileIds) {
try {
FileResult fileResult = sysFileService.deleteFiles(fileIds);
return fileResult.isSuccess() ? R.ok() : R.fail(fileResult.getMessage("删除文件失败"));
} catch (Exception e) {
log.error("删除文件失败", e);
return R.fail(e.getMessage());
}
}
} }

@ -1,5 +1,6 @@
package com.ruoyi.file.domain; package com.ruoyi.file.domain;
import com.ruoyi.common.core.utils.StringUtils;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
@ -10,7 +11,7 @@ import java.io.Serializable;
* created on 2024/2/19 * created on 2024/2/19
*/ */
@Data @Data
public class FileSaveResult implements Serializable { public class FileResult implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -19,6 +20,8 @@ public class FileSaveResult implements Serializable {
private String message; private String message;
private int count;
/** /**
* *
*/ */
@ -33,19 +36,30 @@ public class FileSaveResult implements Serializable {
return uploadResult == null ? "" : uploadResult.getFileId(); return uploadResult == null ? "" : uploadResult.getFileId();
} }
public static FileSaveResult success(String requestUrl, FileUploadResult uploadResult) { public static FileResult success(String requestUrl, FileUploadResult uploadResult) {
FileSaveResult result = new FileSaveResult(); FileResult result = new FileResult();
result.setSuccess(true); result.setSuccess(true);
result.setRequestUrl(requestUrl); result.setRequestUrl(requestUrl);
result.setUploadResult(uploadResult); result.setUploadResult(uploadResult);
return result; return result;
} }
public static FileSaveResult fail(String message) { public static FileResult success(String requestUrl) {
FileSaveResult result = new FileSaveResult(); 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.setSuccess(false);
result.setMessage(message); result.setMessage(message);
return result; return result;
} }
public String getMessage(String defaultMessage) {
return StringUtils.isBlank(message) ? defaultMessage : message;
}
} }

@ -1,7 +1,7 @@
package com.ruoyi.file.service; package com.ruoyi.file.service;
import com.github.tobato.fastdfs.service.FastFileStorageClient; 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.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -29,12 +29,17 @@ public class FastDfsSysFileServiceImpl implements ISysFileService {
* @return 访 * @return 访
*/ */
@Override @Override
public FileSaveResult uploadFile(MultipartFile file) throws Exception { public FileResult uploadFile(MultipartFile file) throws Exception {
// InputStream inputStream = file.getInputStream(); // InputStream inputStream = file.getInputStream();
// StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(), // StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
// FileTypeUtils.getExtension(file), null); // FileTypeUtils.getExtension(file), null);
// IoUtils.closeQuietly(inputStream); // IoUtils.closeQuietly(inputStream);
// return domain + "/" + storePath.getFullPath(); // return domain + "/" + storePath.getFullPath();
return FileSaveResult.fail("Not implemented yet!"); return FileResult.fail("Not implemented yet!");
}
@Override
public FileResult deleteFiles(String[] fileIds) throws Exception {
return FileResult.fail("Not implemented yet!");
} }
} }

@ -49,7 +49,7 @@ public interface ISysFileCRUDService {
* @param fileIds * @param fileIds
* @return * @return
*/ */
int deleteSysFileByFileIds(String[] fileIds); int deleteSysFileByFileIds(String[] fileIds) throws Exception;
/** /**
* *
@ -57,5 +57,5 @@ public interface ISysFileCRUDService {
* @param fileId * @param fileId
* @return * @return
*/ */
int deleteSysFileByFileId(String fileId); int deleteSysFileByFileId(String fileId) throws Exception;
} }

@ -1,8 +1,16 @@
package com.ruoyi.file.service; 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 org.springframework.web.multipart.MultipartFile;
import java.util.List;
/** /**
* *
* *
@ -15,6 +23,26 @@ public interface ISysFileService {
* @param file * @param file
* @return * @return
*/ */
FileSaveResult uploadFile(MultipartFile file) throws Exception; FileResult uploadFile(MultipartFile file) throws Exception;
/**
*
*
* @param fileIds id
*/
FileResult deleteFiles(String[] fileIds) throws Exception;
default List<SysFile> selectFilesById(SysFileMapper sysFileMapper, String[] fileIds) {
if (fileIds == null || fileIds.length == 0) {
throw new IllegalArgumentException("file ids is empty");
}
SelectStatementProvider provider = SqlBuilder.select(SysFileMapper.selectList)
.from(SysFileDynamicSqlSupport.sysFile)
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isIn(fileIds))
.orderBy(SysFileDynamicSqlSupport.fileId)
.build()
.render(RenderingStrategies.MYBATIS3);
return sysFileMapper.selectMany(provider);
}
} }

@ -1,7 +1,9 @@
package com.ruoyi.file.service; 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.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.FileUploadResult;
import com.ruoyi.file.domain.SysFile; import com.ruoyi.file.domain.SysFile;
import com.ruoyi.file.mapper.SysFileMapper; import com.ruoyi.file.mapper.SysFileMapper;
@ -13,6 +15,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; 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 @Transactional
@Override @Override
public FileSaveResult uploadFile(MultipartFile file) throws Exception { public FileResult uploadFile(MultipartFile file) throws Exception {
// 保存文件到本地 // 保存文件到本地
FileUploadResult uploadResult = FileUploadUtils.upload(localFilePath, file); FileUploadResult uploadResult = FileUploadUtils.upload(localFilePath, file);
String savedPathFileName = uploadResult.getSavedPathFileName(); String savedPathFileName = uploadResult.getSavedPathFileName();
String requestUrl = domain + localFilePrefix + savedPathFileName; String requestUrl = domain + localFilePrefix + savedPathFileName;
// 保存文件记录 // 保存文件记录
SysFile record = getSysFile(uploadResult, requestUrl); SysFile record = buildRecord(uploadResult, requestUrl);
sysFileMapper.insertSelective(record); 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<SysFile> fileList = selectFilesById(sysFileMapper, fileIds);
// 删除文件
List<String> warningList = new ArrayList<>();
for (SysFile sysFile : fileList) {
File file = new File(sysFile.getFilePath());
if (file.exists()) {
if (file.delete()) {
sysFileMapper.deleteByPrimaryKey(sysFile.getFileId());
} else {
throw new ServiceException("Delete file failed: [" + sysFile.getFilePath() + "]", HttpStatus.ERROR);
}
} else {
warningList.add(sysFile.getFilePath());
}
}
// 组装返回结果
FileResult result = FileResult.success();
if (!warningList.isEmpty()) {
result.setMessage("Files not exists: " + warningList);
} else {
result.setMessage("Delete file success");
}
result.setCount(fileList.size() - warningList.size());
return result;
} }
private SysFile getSysFile(FileUploadResult uploadResult, String requestUrl) { private SysFile buildRecord(FileUploadResult uploadResult, String requestUrl) {
SysFile record = new SysFile(); SysFile record = new SysFile();
record.setFileId(uploadResult.getFileId()); // 文件ID record.setFileId(uploadResult.getFileId()); // 文件ID
record.setSavedName(uploadResult.getSavedFileName()); // 保存的文件名 record.setSavedName(uploadResult.getSavedFileName()); // 保存的文件名

@ -1,17 +1,12 @@
package com.ruoyi.file.service; 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.config.MinioConfig;
import com.ruoyi.file.domain.FileResult;
import io.minio.MinioClient; import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
/** /**
* TODO * TODO
* Minio * Minio
@ -33,18 +28,24 @@ public class MinioSysFileServiceImpl implements ISysFileService {
* @return 访 * @return 访
*/ */
@Override @Override
public FileSaveResult uploadFile(MultipartFile file) throws Exception { public FileResult uploadFile(MultipartFile file) throws Exception {
String fileName = FileUploadUtils.extractFilename(file, null); // String fileName = FileUploadUtils.extractFilename(file, null);
InputStream inputStream = file.getInputStream(); // InputStream inputStream = file.getInputStream();
PutObjectArgs args = PutObjectArgs.builder() // PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName()) // .bucket(minioConfig.getBucketName())
.object(fileName) // .object(fileName)
.stream(inputStream, file.getSize(), -1) // .stream(inputStream, file.getSize(), -1)
.contentType(file.getContentType()) // .contentType(file.getContentType())
.build(); // .build();
client.putObject(args); // client.putObject(args);
IoUtils.closeQuietly(inputStream); // IoUtils.closeQuietly(inputStream);
String requestUrl = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName; // String requestUrl = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
return FileSaveResult.success(requestUrl, null); // return FileResult.success(requestUrl, null);
return FileResult.fail("Not implemented yet!");
}
@Override
public FileResult deleteFiles(String[] fileIds) throws Exception {
return FileResult.fail("Not implemented yet!");
} }
} }

@ -1,11 +1,11 @@
package com.ruoyi.file.service; package com.ruoyi.file.service;
import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.file.domain.FileResult;
import com.ruoyi.file.domain.SysFile; import com.ruoyi.file.domain.SysFile;
import com.ruoyi.file.mapper.SysFileDynamicSqlSupport; import com.ruoyi.file.mapper.SysFileDynamicSqlSupport;
import com.ruoyi.file.mapper.SysFileMapper; import com.ruoyi.file.mapper.SysFileMapper;
import org.mybatis.dynamic.sql.SqlBuilder; 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.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.SelectDSLCompleter; import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
@ -24,9 +24,13 @@ import java.util.Optional;
*/ */
@Service @Service
public class SysFileCRUDServiceImpl implements ISysFileCRUDService { public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
@Autowired @Autowired
private SysFileMapper sysFileMapper; private SysFileMapper sysFileMapper;
@Autowired
private ISysFileService sysFileService;
/** /**
* *
* *
@ -52,13 +56,15 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
SelectStatementProvider provider = SqlBuilder.select(SysFileMapper.selectList) SelectStatementProvider provider = SqlBuilder.select(SysFileMapper.selectList)
.from(SysFileDynamicSqlSupport.sysFile) .from(SysFileDynamicSqlSupport.sysFile)
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isEqualToWhenPresent(sysFile.getFileId())) .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() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return sysFileMapper.selectMany(provider); return sysFileMapper.selectMany(provider);
} else { } else {
//全部查询 //全部查询
return sysFileMapper.select(SelectDSLCompleter.allRows()); return sysFileMapper.select(SelectDSLCompleter.allRowsOrderedBy(SysFileDynamicSqlSupport.createTime.descending()));
} }
} }
@ -94,12 +100,9 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
*/ */
@Transactional @Transactional
@Override @Override
public int deleteSysFileByFileIds(String[] fileIds) { public int deleteSysFileByFileIds(String[] fileIds) throws Exception {
DeleteStatementProvider provider = SqlBuilder.deleteFrom(SysFileDynamicSqlSupport.sysFile) FileResult result = sysFileService.deleteFiles(fileIds);
.where(SysFileDynamicSqlSupport.fileId, SqlBuilder.isIn(fileIds)) return result.getCount();
.build()
.render(RenderingStrategies.MYBATIS3);
return sysFileMapper.delete(provider);
} }
/** /**
@ -110,7 +113,8 @@ public class SysFileCRUDServiceImpl implements ISysFileCRUDService {
*/ */
@Transactional @Transactional
@Override @Override
public int deleteSysFileByFileId(String fileId) { public int deleteSysFileByFileId(String fileId) throws Exception {
return sysFileMapper.deleteByPrimaryKey(fileId); String[] fileIds = {fileId};
return deleteSysFileByFileIds(fileIds);
} }
} }

@ -97,6 +97,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
#end #end
#end #end
#end #end
.orderBy(${ClassName}DynamicSqlSupport.${pkColumn.javaField})
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return ${className}Mapper.selectMany(provider); return ${className}Mapper.selectMany(provider);

@ -108,8 +108,8 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange" show-overflow-tooltip="true"> <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange" :show-overflow-tooltip="true">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="30" align="center" />
#foreach($column in $columns) #foreach($column in $columns)
#set($javaField=$column.javaField) #set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("")) #set($parentheseIndex=$column.columnComment.indexOf(""))
@ -377,7 +377,7 @@ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 20,
#foreach ($column in $columns) #foreach ($column in $columns)
#if($column.query) #if($column.query)
$column.javaField: null#if($foreach.count != $columns.size()),#end $column.javaField: null#if($foreach.count != $columns.size()),#end

@ -76,12 +76,6 @@
<artifactId>ruoyi-common-datascope</artifactId> <artifactId>ruoyi-common-datascope</artifactId>
</dependency> </dependency>
<!-- RuoYi Common Log -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<!-- RuoYi Common Services --> <!-- RuoYi Common Services -->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>

@ -70,12 +70,6 @@
<artifactId>ruoyi-common-datascope</artifactId> <artifactId>ruoyi-common-datascope</artifactId>
</dependency> </dependency>
<!-- RuoYi Common Log -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<!-- 共通业务 --> <!-- 共通业务 -->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>

@ -70,7 +70,17 @@ public class ItemInfoController extends BaseController {
@Log(title = "物品基础信息", businessType = BusinessType.INSERT) @Log(title = "物品基础信息", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody ItemInfo itemInfo) { 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) @Log(title = "物品基础信息", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@RequestBody ItemInfo itemInfo) { public AjaxResult edit(@RequestBody ItemInfo itemInfo) {
return toAjax(itemInfoService.updateItemInfo(itemInfo)); return itemInfoService.updateItemInfo(itemInfo);
}
/**
*
*/
@RequiresPermissions("wms:ItemInfo:edit")
@Log(title = "物品基础信息", businessType = BusinessType.UPDATE)
@PutMapping("/editWithImage")
public AjaxResult editWithImage(ItemInfo itemInfo) {
return itemInfoService.updateItemInfo(itemInfo);
} }
/** /**

@ -1,6 +1,11 @@
package com.ruoyi.wms.domain; package com.ruoyi.wms.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.core.web.domain.ExtBaseEntity; 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.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -11,12 +16,64 @@ import java.math.BigDecimal;
* *
* <ul> * <ul>
* <li> Table: WMS_M_ITEM_INFO </li> * <li> Table: WMS_M_ITEM_INFO </li>
* <li> Remarks: </li>
* </ul> * </ul>
* *
* @author ryas * @author ryas
* created on 2024-02-20 * created on 2024-02-20
*/ */
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Data
public class ItemInfo extends ExtBaseEntity implements Serializable { 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;
}
//==================== ↓↓↓↓↓↓ 表字段 ↓↓↓↓↓↓ ====================
/** /**
* *
*/ */
@ -252,440 +309,4 @@ public class ItemInfo extends ExtBaseEntity implements Serializable {
*/ */
private String pictureUrl; private String pictureUrl;
@Serial
private static final long serialVersionUID = 1L;
public String getItemCd() {
return itemCd;
}
public void setItemCd(String itemCd) {
this.itemCd = itemCd == null ? null : itemCd.trim();
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName == null ? null : itemName.trim();
}
public String getSupplier() {
return supplier;
}
public void setSupplier(String supplier) {
this.supplier = supplier == null ? null : supplier.trim();
}
public BigDecimal getPrepLeadTime() {
return prepLeadTime;
}
public void setPrepLeadTime(BigDecimal prepLeadTime) {
this.prepLeadTime = prepLeadTime;
}
public BigDecimal getInstockLeadTime() {
return instockLeadTime;
}
public void setInstockLeadTime(BigDecimal instockLeadTime) {
this.instockLeadTime = instockLeadTime;
}
public BigDecimal getRestingPeriod() {
return restingPeriod;
}
public void setRestingPeriod(BigDecimal restingPeriod) {
this.restingPeriod = restingPeriod;
}
public BigDecimal getOutstockLeadTime() {
return outstockLeadTime;
}
public void setOutstockLeadTime(BigDecimal outstockLeadTime) {
this.outstockLeadTime = outstockLeadTime;
}
public String getSpec1() {
return spec1;
}
public void setSpec1(String spec1) {
this.spec1 = spec1 == null ? null : spec1.trim();
}
public String getSpec2() {
return spec2;
}
public void setSpec2(String spec2) {
this.spec2 = spec2 == null ? null : spec2.trim();
}
public String getSpec3() {
return spec3;
}
public void setSpec3(String spec3) {
this.spec3 = spec3 == null ? null : spec3.trim();
}
public String getSpec4() {
return spec4;
}
public void setSpec4(String spec4) {
this.spec4 = spec4 == null ? null : spec4.trim();
}
public String getSpec5() {
return spec5;
}
public void setSpec5(String spec5) {
this.spec5 = spec5 == null ? null : spec5.trim();
}
public String getCls1() {
return cls1;
}
public void setCls1(String cls1) {
this.cls1 = cls1 == null ? null : cls1.trim();
}
public String getCls2() {
return cls2;
}
public void setCls2(String cls2) {
this.cls2 = cls2 == null ? null : cls2.trim();
}
public String getCls3() {
return cls3;
}
public void setCls3(String cls3) {
this.cls3 = cls3 == null ? null : cls3.trim();
}
public String getCls4() {
return cls4;
}
public void setCls4(String cls4) {
this.cls4 = cls4 == null ? null : cls4.trim();
}
public String getCls5() {
return cls5;
}
public void setCls5(String cls5) {
this.cls5 = cls5 == null ? null : cls5.trim();
}
public String getRemark1() {
return remark1;
}
public void setRemark1(String remark1) {
this.remark1 = remark1 == null ? null : remark1.trim();
}
public String getRemark2() {
return remark2;
}
public void setRemark2(String remark2) {
this.remark2 = remark2 == null ? null : remark2.trim();
}
public String getRemark3() {
return remark3;
}
public void setRemark3(String remark3) {
this.remark3 = remark3 == null ? null : remark3.trim();
}
public String getRemark4() {
return remark4;
}
public void setRemark4(String remark4) {
this.remark4 = remark4 == null ? null : remark4.trim();
}
public String getRemark5() {
return remark5;
}
public void setRemark5(String remark5) {
this.remark5 = remark5 == null ? null : remark5.trim();
}
public String getDeliveryPeriod() {
return deliveryPeriod;
}
public void setDeliveryPeriod(String deliveryPeriod) {
this.deliveryPeriod = deliveryPeriod == null ? null : deliveryPeriod.trim();
}
public String getDefaultStgBinCd() {
return defaultStgBinCd;
}
public void setDefaultStgBinCd(String defaultStgBinCd) {
this.defaultStgBinCd = defaultStgBinCd == null ? null : defaultStgBinCd.trim();
}
public Integer getEnableFlg() {
return enableFlg;
}
public void setEnableFlg(Integer enableFlg) {
this.enableFlg = enableFlg;
}
public BigDecimal getSafetyStock() {
return safetyStock;
}
public void setSafetyStock(BigDecimal safetyStock) {
this.safetyStock = safetyStock;
}
public BigDecimal getMaxInvQty() {
return maxInvQty;
}
public void setMaxInvQty(BigDecimal maxInvQty) {
this.maxInvQty = maxInvQty;
}
public BigDecimal getPurchLimitQty() {
return purchLimitQty;
}
public void setPurchLimitQty(BigDecimal purchLimitQty) {
this.purchLimitQty = purchLimitQty;
}
public String getGoodsCls() {
return goodsCls;
}
public void setGoodsCls(String goodsCls) {
this.goodsCls = goodsCls == null ? null : goodsCls.trim();
}
public Integer getLotNoMgmtCls() {
return lotNoMgmtCls;
}
public void setLotNoMgmtCls(Integer lotNoMgmtCls) {
this.lotNoMgmtCls = lotNoMgmtCls;
}
public String getItemTypeCd() {
return itemTypeCd;
}
public void setItemTypeCd(String itemTypeCd) {
this.itemTypeCd = itemTypeCd == null ? null : itemTypeCd.trim();
}
public String getStdUnitCd() {
return stdUnitCd;
}
public void setStdUnitCd(String stdUnitCd) {
this.stdUnitCd = stdUnitCd == null ? null : stdUnitCd.trim();
}
public String getPkgUnitCd() {
return pkgUnitCd;
}
public void setPkgUnitCd(String pkgUnitCd) {
this.pkgUnitCd = pkgUnitCd == null ? null : pkgUnitCd.trim();
}
public BigDecimal getOutstockReqMinQty() {
return outstockReqMinQty;
}
public void setOutstockReqMinQty(BigDecimal outstockReqMinQty) {
this.outstockReqMinQty = outstockReqMinQty;
}
public String getOutstockUnitCls() {
return outstockUnitCls;
}
public void setOutstockUnitCls(String outstockUnitCls) {
this.outstockUnitCls = outstockUnitCls == null ? null : outstockUnitCls.trim();
}
public BigDecimal getNetWeightPerUnit() {
return netWeightPerUnit;
}
public void setNetWeightPerUnit(BigDecimal netWeightPerUnit) {
this.netWeightPerUnit = netWeightPerUnit;
}
public BigDecimal getOwnVolM3() {
return ownVolM3;
}
public void setOwnVolM3(BigDecimal ownVolM3) {
this.ownVolM3 = ownVolM3;
}
public BigDecimal getSizeD() {
return sizeD;
}
public void setSizeD(BigDecimal sizeD) {
this.sizeD = sizeD;
}
public BigDecimal getSizeW() {
return sizeW;
}
public void setSizeW(BigDecimal sizeW) {
this.sizeW = sizeW;
}
public BigDecimal getSizeH() {
return sizeH;
}
public void setSizeH(BigDecimal sizeH) {
this.sizeH = sizeH;
}
public String getPkgRqmtDesc() {
return pkgRqmtDesc;
}
public void setPkgRqmtDesc(String pkgRqmtDesc) {
this.pkgRqmtDesc = pkgRqmtDesc == null ? null : pkgRqmtDesc.trim();
}
public String getStackingRqmtDesc() {
return stackingRqmtDesc;
}
public void setStackingRqmtDesc(String stackingRqmtDesc) {
this.stackingRqmtDesc = stackingRqmtDesc == null ? null : stackingRqmtDesc.trim();
}
public String getStgRqmtDesc() {
return stgRqmtDesc;
}
public void setStgRqmtDesc(String stgRqmtDesc) {
this.stgRqmtDesc = stgRqmtDesc == null ? null : stgRqmtDesc.trim();
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer == null ? null : manufacturer.trim();
}
public String getPictureId() {
return pictureId;
}
public void setPictureId(String pictureId) {
this.pictureId = pictureId == null ? null : pictureId.trim();
}
public String getPictureUrl() {
return pictureUrl;
}
public void setPictureUrl(String pictureUrl) {
this.pictureUrl = pictureUrl == null ? null : pictureUrl.trim();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", itemCd=").append(itemCd);
sb.append(", deptId=").append(deptId);
sb.append(", itemName=").append(itemName);
sb.append(", supplier=").append(supplier);
sb.append(", prepLeadTime=").append(prepLeadTime);
sb.append(", instockLeadTime=").append(instockLeadTime);
sb.append(", restingPeriod=").append(restingPeriod);
sb.append(", outstockLeadTime=").append(outstockLeadTime);
sb.append(", spec1=").append(spec1);
sb.append(", spec2=").append(spec2);
sb.append(", spec3=").append(spec3);
sb.append(", spec4=").append(spec4);
sb.append(", spec5=").append(spec5);
sb.append(", cls1=").append(cls1);
sb.append(", cls2=").append(cls2);
sb.append(", cls3=").append(cls3);
sb.append(", cls4=").append(cls4);
sb.append(", cls5=").append(cls5);
sb.append(", remark1=").append(remark1);
sb.append(", remark2=").append(remark2);
sb.append(", remark3=").append(remark3);
sb.append(", remark4=").append(remark4);
sb.append(", remark5=").append(remark5);
sb.append(", deliveryPeriod=").append(deliveryPeriod);
sb.append(", defaultStgBinCd=").append(defaultStgBinCd);
sb.append(", enableFlg=").append(enableFlg);
sb.append(", safetyStock=").append(safetyStock);
sb.append(", maxInvQty=").append(maxInvQty);
sb.append(", purchLimitQty=").append(purchLimitQty);
sb.append(", goodsCls=").append(goodsCls);
sb.append(", lotNoMgmtCls=").append(lotNoMgmtCls);
sb.append(", itemTypeCd=").append(itemTypeCd);
sb.append(", stdUnitCd=").append(stdUnitCd);
sb.append(", pkgUnitCd=").append(pkgUnitCd);
sb.append(", outstockReqMinQty=").append(outstockReqMinQty);
sb.append(", outstockUnitCls=").append(outstockUnitCls);
sb.append(", netWeightPerUnit=").append(netWeightPerUnit);
sb.append(", ownVolM3=").append(ownVolM3);
sb.append(", sizeD=").append(sizeD);
sb.append(", sizeW=").append(sizeW);
sb.append(", sizeH=").append(sizeH);
sb.append(", pkgRqmtDesc=").append(pkgRqmtDesc);
sb.append(", stackingRqmtDesc=").append(stackingRqmtDesc);
sb.append(", stgRqmtDesc=").append(stgRqmtDesc);
sb.append(", manufacturer=").append(manufacturer);
sb.append(", pictureId=").append(pictureId);
sb.append(", pictureUrl=").append(pictureUrl);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
} }

@ -0,0 +1,20 @@
package com.ruoyi.wms.mapper;
import com.ruoyi.wms.domain.ItemInfo;
import java.util.List;
/**
* Mapper
*
* @author Alan Scipio
* created on 2024/2/21
*/
public interface ItemInfoExtMapper {
/**
*
*/
List<ItemInfo> selectPageList(ItemInfo itemInfo);
}

@ -1,5 +1,6 @@
package com.ruoyi.wms.service; package com.ruoyi.wms.service;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.wms.domain.ItemInfo; import com.ruoyi.wms.domain.ItemInfo;
import java.util.List; import java.util.List;
@ -33,7 +34,7 @@ public interface IItemInfoService {
* @param itemInfo * @param itemInfo
* @return * @return
*/ */
int insertItemInfo(ItemInfo itemInfo); AjaxResult insertItemInfo(ItemInfo itemInfo);
/** /**
* *
@ -41,7 +42,7 @@ public interface IItemInfoService {
* @param itemInfo * @param itemInfo
* @return * @return
*/ */
int updateItemInfo(ItemInfo itemInfo); AjaxResult updateItemInfo(ItemInfo itemInfo);
/** /**
* *

@ -1,19 +1,25 @@
package com.ruoyi.wms.service.impl; 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.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.core.web.domain.ExtBaseEntity;
import com.ruoyi.common.security.utils.SecurityUtilsExt; 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.domain.ItemInfo;
import com.ruoyi.wms.mapper.ItemInfoDynamicSqlSupport; import com.ruoyi.wms.mapper.ItemInfoDynamicSqlSupport;
import com.ruoyi.wms.mapper.ItemInfoExtMapper;
import com.ruoyi.wms.mapper.ItemInfoMapper; import com.ruoyi.wms.mapper.ItemInfoMapper;
import com.ruoyi.wms.service.IItemInfoService; import com.ruoyi.wms.service.IItemInfoService;
import jakarta.annotation.Resource;
import org.mybatis.dynamic.sql.SqlBuilder; import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.render.RenderingStrategies; 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.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -26,8 +32,12 @@ import java.util.Optional;
*/ */
@Service @Service
public class ItemInfoServiceImpl implements IItemInfoService { public class ItemInfoServiceImpl implements IItemInfoService {
@Autowired @Resource
private ItemInfoMapper itemInfoMapper; private ItemInfoMapper itemInfoMapper;
@Resource
private ItemInfoExtMapper itemInfoExtMapper;
@Resource
private RemoteFileService remoteFileService;
/** /**
* *
@ -49,38 +59,45 @@ public class ItemInfoServiceImpl implements IItemInfoService {
*/ */
@Override @Override
public List<ItemInfo> selectItemInfoList(ItemInfo itemInfo) { public List<ItemInfo> selectItemInfoList(ItemInfo itemInfo) {
SelectStatementProvider provider = SqlBuilder.select(ItemInfoMapper.selectList) return itemInfoExtMapper.selectPageList(itemInfo);
.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);
} }
/** /**
* *
* *
* @param itemInfo * @param item
* @return * @return
*/ */
@Transactional @Transactional
@Override @Override
public int insertItemInfo(ItemInfo itemInfo) { public AjaxResult insertItemInfo(ItemInfo item) {
return itemInfoMapper.insertSelective(itemInfo); //上传图片文件
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 * @return
*/ */
@Transactional @Transactional
@Override @Override
public int updateItemInfo(ItemInfo itemInfo) { public AjaxResult updateItemInfo(ItemInfo item) {
return itemInfoMapper.updateByPrimaryKeySelective(itemInfo); //上传图片文件
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()); record.setUpdateTime(DateUtils.getNowDate());
return itemInfoMapper.updateByPrimaryKey(record); return itemInfoMapper.updateByPrimaryKey(record);
} }
/**
*
*
* @return null
*/
private String uploadItemImage(ItemInfo item) {
if (item.getItemImages() == null){
return null;
}
for (MultipartFile file : item.getItemImages()) {
R<SysFileInfo> fileResult = remoteFileService.upload(file);
if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
//上传失败
if (fileResult == null || StringUtils.isBlank(fileResult.getMsg())) {
return "文件服务异常,请联系管理员";
} else {
return "文件服务异常," + fileResult.getMsg();
}
} else {
//上传成功
item.setPictureId(fileResult.getData().getFileId());
item.setPictureUrl(fileResult.getData().getUrl());
}
}
return null;
}
} }

@ -60,6 +60,7 @@ public class ItemTypeServiceImpl implements IItemTypeService {
.where(ItemTypeDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE)) .where(ItemTypeDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
.and(ItemTypeDynamicSqlSupport.itemTypeName, SqlBuilder.isLikeWhenPresent(itemType.getItemTypeName() == null ? null : "%" + itemType.getItemTypeName() + "%")) .and(ItemTypeDynamicSqlSupport.itemTypeName, SqlBuilder.isLikeWhenPresent(itemType.getItemTypeName() == null ? null : "%" + itemType.getItemTypeName() + "%"))
.and(ItemTypeDynamicSqlSupport.remark1, SqlBuilder.isEqualToWhenPresent(itemType.getRemark1())) .and(ItemTypeDynamicSqlSupport.remark1, SqlBuilder.isEqualToWhenPresent(itemType.getRemark1()))
.orderBy(ItemTypeDynamicSqlSupport.itemTypeCd)
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return itemTypeMapper.selectMany(provider); return itemTypeMapper.selectMany(provider);

@ -59,6 +59,7 @@ public class UnitInfoServiceImpl implements IUnitInfoService {
.where(UnitInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE)) .where(UnitInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
.and(UnitInfoDynamicSqlSupport.unitCode, SqlBuilder.isEqualToWhenPresent(unitInfo.getUnitCode())) .and(UnitInfoDynamicSqlSupport.unitCode, SqlBuilder.isEqualToWhenPresent(unitInfo.getUnitCode()))
.and(UnitInfoDynamicSqlSupport.unitName, SqlBuilder.isLikeWhenPresent(unitInfo.getUnitName())) .and(UnitInfoDynamicSqlSupport.unitName, SqlBuilder.isLikeWhenPresent(unitInfo.getUnitName()))
.orderBy(UnitInfoDynamicSqlSupport.unitCode)
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return unitInfoMapper.selectMany(provider); return unitInfoMapper.selectMany(provider);

@ -59,6 +59,7 @@ public class WarehouseInfoServiceImpl implements IWarehouseInfoService {
.where(WarehouseInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE)) .where(WarehouseInfoDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE))
.and(WarehouseInfoDynamicSqlSupport.whsCd, SqlBuilder.isEqualToWhenPresent(warehouseInfo.getWhsCd())) .and(WarehouseInfoDynamicSqlSupport.whsCd, SqlBuilder.isEqualToWhenPresent(warehouseInfo.getWhsCd()))
.and(WarehouseInfoDynamicSqlSupport.whsName, SqlBuilder.isLikeWhenPresent(warehouseInfo.getWhsName() == null ? null : "%" + warehouseInfo.getWhsName() + "%")) .and(WarehouseInfoDynamicSqlSupport.whsName, SqlBuilder.isLikeWhenPresent(warehouseInfo.getWhsName() == null ? null : "%" + warehouseInfo.getWhsName() + "%"))
.orderBy(WarehouseInfoDynamicSqlSupport.whsCd)
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return warehouseInfoMapper.selectMany(provider); return warehouseInfoMapper.selectMany(provider);

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.wms.mapper.ItemInfoExtMapper">
<resultMap type="com.ruoyi.wms.domain.ItemInfo" id="ItemInfoResult">
<result property="deptId" column="DEPT_ID"/>
<result property="itemCd" column="ITEM_CD"/>
<result property="itemName" column="ITEM_NAME"/>
<result property="supplier" column="SUPPLIER"/>
<result property="prepLeadTime" column="PREP_LEAD_TIME"/>
<result property="instockLeadTime" column="INSTOCK_LEAD_TIME"/>
<result property="restingPeriod" column="RESTING_PERIOD"/>
<result property="outstockLeadTime" column="OUTSTOCK_LEAD_TIME"/>
<result property="spec1" column="SPEC_1"/>
<result property="spec2" column="SPEC_2"/>
<result property="spec3" column="SPEC_3"/>
<result property="spec4" column="SPEC_4"/>
<result property="spec5" column="SPEC_5"/>
<result property="cls1" column="CLS_1"/>
<result property="cls2" column="CLS_2"/>
<result property="cls3" column="CLS_3"/>
<result property="cls4" column="CLS_4"/>
<result property="cls5" column="CLS_5"/>
<result property="deliveryPeriod" column="DELIVERY_PERIOD"/>
<result property="defaultStgBinCd" column="DEFAULT_STG_BIN_CD"/>
<result property="enableFlg" column="ENABLE_FLG"/>
<result property="safetyStock" column="SAFETY_STOCK"/>
<result property="maxInvQty" column="MAX_INV_QTY"/>
<result property="purchLimitQty" column="PURCH_LIMIT_QTY"/>
<result property="goodsCls" column="GOODS_CLS"/>
<result property="lotNoMgmtCls" column="LOT_NO_MGMT_CLS"/>
<result property="itemTypeCd" column="ITEM_TYPE_CD"/>
<result property="stdUnitCd" column="STD_UNIT_CD"/>
<result property="pkgUnitCd" column="PKG_UNIT_CD"/>
<result property="outstockReqMinQty" column="OUTSTOCK_REQ_MIN_QTY"/>
<result property="outstockUnitCls" column="OUTSTOCK_UNIT_CLS"/>
<result property="netWeightPerUnit" column="NET_WEIGHT_PER_UNIT"/>
<result property="ownVolM3" column="OWN_VOL_M3"/>
<result property="sizeD" column="SIZE_D"/>
<result property="sizeW" column="SIZE_W"/>
<result property="sizeH" column="SIZE_H"/>
<result property="pkgRqmtDesc" column="PKG_RQMT_DESC"/>
<result property="stackingRqmtDesc" column="STACKING_RQMT_DESC"/>
<result property="stgRqmtDesc" column="STG_RQMT_DESC"/>
<result property="manufacturer" column="MANUFACTURER"/>
<result property="pictureId" column="PICTURE_ID"/>
<result property="pictureUrl" column="PICTURE_URL"/>
<result property="updateCount" column="UPDATE_COUNT"/>
<result property="deleteFlag" column="DELETE_FLAG"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
<result property="remark1" column="REMARK_1"/>
<result property="remark2" column="REMARK_2"/>
<result property="remark3" column="REMARK_3"/>
<result property="remark4" column="REMARK_4"/>
<result property="remark5" column="REMARK_5"/>
<result property="itemTypeName" column="ITEM_TYPE_NAME"/>
<result property="stdUnitName" column="stdUnitName"/>
<result property="pkgUnitName" column="pkgUnitName"/>
</resultMap>
<select id="selectPageList" parameterType="com.ruoyi.wms.domain.ItemInfo" resultMap="ItemInfoResult">
select
t1.DEPT_ID,
t1.ITEM_CD,
t1.ITEM_NAME,
t1.SUPPLIER,
t1.PREP_LEAD_TIME,
t1.INSTOCK_LEAD_TIME,
t1.RESTING_PERIOD,
t1.OUTSTOCK_LEAD_TIME,
t1.SPEC_1,
t1.SPEC_2,
t1.SPEC_3,
t1.SPEC_4,
t1.SPEC_5,
t1.CLS_1,
t1.CLS_2,
t1.CLS_3,
t1.CLS_4,
t1.CLS_5,
t1.DELIVERY_PERIOD,
t1.DEFAULT_STG_BIN_CD,
t1.ENABLE_FLG,
t1.SAFETY_STOCK,
t1.MAX_INV_QTY,
t1.PURCH_LIMIT_QTY,
t1.GOODS_CLS,
t1.LOT_NO_MGMT_CLS,
t1.ITEM_TYPE_CD,
t1.STD_UNIT_CD,
t1.PKG_UNIT_CD,
t1.OUTSTOCK_REQ_MIN_QTY,
t1.OUTSTOCK_UNIT_CLS,
t1.NET_WEIGHT_PER_UNIT,
t1.OWN_VOL_M3,
t1.SIZE_D,
t1.SIZE_W,
t1.SIZE_H,
t1.PKG_RQMT_DESC,
t1.STACKING_RQMT_DESC,
t1.STG_RQMT_DESC,
t1.MANUFACTURER,
t1.PICTURE_ID,
t1.PICTURE_URL,
t1.UPDATE_COUNT,
t1.DELETE_FLAG,
t1.create_by,
t1.create_time,
t1.update_by,
t1.update_time,
t1.remark,
itemType.ITEM_TYPE_NAME,
stdUnit.UNIT_NAME as stdUnitName,
pkgUnit.UNIT_NAME as pkgUnitName
from WMS_M_ITEM_INFO t1
left join WMS_M_ITEM_TYPE itemType on t1.ITEM_TYPE_CD = itemType.ITEM_TYPE_CD and itemType.DELETE_FLAG = 0
left join WMS_M_UNIT_INFO stdUnit on t1.STD_UNIT_CD = stdUnit.UNIT_CODE and stdUnit.DELETE_FLAG = 0
left join WMS_M_UNIT_INFO pkgUnit on t1.PKG_UNIT_CD = pkgUnit.UNIT_CODE and pkgUnit.DELETE_FLAG = 0
<where>
and t1.DELETE_FLAG = 0
<if test="itemCd != null and itemCd != ''">
and t1.ITEM_CD = #{itemCd}
</if>
<if test="itemName != null and itemName != ''">
and t1.ITEM_NAME like concat('%', #{itemName}, '%')
</if>
</where>
order by t1.ITEM_CD
</select>
</mapper>

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

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

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

@ -0,0 +1,169 @@
<template>
<div>
<!--
allowFileSizeValidation: true //
allowFileTypeValidation: true //
allowImagePreview: true //
allowMultiple: true //
allowProcess: false //
allowRevert: false //
instantUpload: false //
credits: false //[Powered by PQINA]
-->
<file-pond
ref="pond"
@Init="handleInit"
label-idle="拖放文件到这里..."
:max-file-size="fileSize"
:accepted-file-types="fileType"
:max-files="maxFilesLimit"
:image-preview-min-height="imgPreviewMinHeight"
:image-preview-max-height="imgPreviewMaxHeight"
:image-preview-height="imgPreviewFixedHeight"
:allow-file-size-validation="true"
:allow-file-type-validation="true"
:allow-image-preview="true"
:allow-multiple="true"
:allow-process="false"
:allow-revert="false"
:instant-upload="false"
credits="false"
/>
</div>
</template>
<script setup>
// Import FilePond
import vueFilePond from 'vue-filepond';
// Import plugins
import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type';
import FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size';
import FilePondPluginImagePreview from 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview';
// Import styles
import 'filepond/dist/filepond.min.css';
import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.css';
// Create FilePond component
const FilePond = vueFilePond(FilePondPluginFileValidateType, FilePondPluginFileValidateSize, FilePondPluginImagePreview);
const pond = ref(null);
const {proxy} = getCurrentInstance();
const emit = defineEmits();
const props = defineProps({
//
limit: {
type: Number,
default: 5,
},
//
fileSize: {
type: String,
default: '5MB',
},
// fileSize
totalFileSize: {
type: String,
default: null,
},
//
fileType: {
type: Array,
default: () => [
//
'text/plain', 'application/pdf', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
//
'image/jpeg', 'image/png', 'image/webp', 'image/gif',
//
'application/vnd.rar', 'application/zip', 'application/x-7z-compressed',
],
},
//
maxFilesLimit: {
type: Number,
default: 1,
},
//
imgPreviewMinHeight: {
type: Number,
default: 44,
},
//
imgPreviewMaxHeight: {
type: Number,
default: 256,
},
//
imgPreviewFixedHeight: {
type: Number,
default: null,
},
});
defineExpose({
pond,
getFiles,
getFile,
addFile,
addFiles,
removeFile,
removeFiles,
});
//
function handleInit() {
// console.info('pond.value', pond.value)
// console.info('FilePond', FilePond)
}
// JavaScript File
function getFiles() {
const pondFiles = pond.value.getFiles()
if (pondFiles) {
const jsFiles = []
for (let i = 0; i < pondFiles.length; i++) {
jsFiles.push(pondFiles[i].file)
}
return jsFiles
} else {
return []
}
}
// JavaScript File
function getFile(index) {
const pondFile = pond.value.getFile(index)
return pondFile ? pondFile.file : null;
}
//
function addFile(source) {
pond.value.addFile(source);
}
function addFiles(source) {
pond.value.addFiles(source);
}
//
function removeFile(index) {
pond.value.removeFile(index);
}
//
function removeFiles() {
pond.value.removeFiles();
}
</script>
<!--
注意如果需要网格布局则需要在没有scoped的style标签里添加式样示例如下
<style>
.filepond--item {
width: calc(20% - 0.5em);
}
</style>
-->

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

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

@ -1,15 +1,15 @@
import axios from 'axios' import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' import {ElNotification, ElMessageBox, ElMessage, ElLoading} from 'element-plus'
import { getToken } from '@/utils/auth' import {getToken} from '@/utils/auth'
import errorCode from '@/utils/errorCode' import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from '@/utils/ruoyi' import {tansParams, blobValidate} from '@/utils/ruoyi'
import cache from '@/plugins/cache' import cache from '@/plugins/cache'
import { saveAs } from 'file-saver' import {saveAs} from 'file-saver'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
let downloadLoadingInstance; let downloadLoadingInstance;
// 是否显示重新登录 // 是否显示重新登录
export let isRelogin = { show: false }; export let isRelogin = {show: false};
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例 // 创建axios实例
@ -17,10 +17,12 @@ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分 // axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API, baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时 // 超时
timeout: 10000 timeout: 60000
}) })
// request拦截器 /**
* 请求拦截器
*/
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
// 是否需要设置 token // 是否需要设置 token
const isToken = (config.headers || {}).isToken === false const isToken = (config.headers || {}).isToken === false
@ -71,7 +73,9 @@ service.interceptors.request.use(config => {
Promise.reject(error) Promise.reject(error)
}) })
// 响应拦截器 /**
* 响应拦截器
*/
service.interceptors.response.use(res => { service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态 // 未设置状态码则默认成功状态
const code = res.data.code || 200; const code = res.data.code || 200;
@ -84,7 +88,11 @@ service.interceptors.response.use(res => {
if (code === 401) { if (code === 401) {
if (!isRelogin.show) { if (!isRelogin.show) {
isRelogin.show = true; isRelogin.show = true;
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
isRelogin.show = false; isRelogin.show = false;
useUserStore().logOut().then(() => { useUserStore().logOut().then(() => {
location.href = '/index'; location.href = '/index';
@ -95,13 +103,13 @@ service.interceptors.response.use(res => {
} }
return Promise.reject('无效的会话,或者会话已过期,请重新登录。') return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) { } else if (code === 500) {
ElMessage({ message: msg, type: 'error' }) ElMessage({message: msg, type: 'error'})
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg))
} else if (code === 601) { } else if (code === 601) {
ElMessage({ message: msg, type: 'warning' }) ElMessage({message: msg, type: 'warning'})
return Promise.reject(new Error(msg)) return Promise.reject(new Error('[WARNING]' + msg))
} else if (code !== 200) { } else if (code !== 200) {
ElNotification.error({ title: msg }) ElNotification.error({title: msg})
return Promise.reject('error') return Promise.reject('error')
} else { } else {
return Promise.resolve(res.data) return Promise.resolve(res.data)
@ -109,7 +117,7 @@ service.interceptors.response.use(res => {
}, },
error => { error => {
console.log('err' + error) console.log('err' + error)
let { message } = error; let {message} = error;
if (message == "Network Error") { if (message == "Network Error") {
message = "后端接口连接异常"; message = "后端接口连接异常";
} else if (message.includes("timeout")) { } else if (message.includes("timeout")) {
@ -117,17 +125,42 @@ service.interceptors.response.use(res => {
} else if (message.includes("Request failed with status code")) { } else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) ElMessage({message: message, type: 'error', duration: 5 * 1000})
return Promise.reject(error) 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, { * @param url 请求地址
transformRequest: [(params) => { return tansParams(params) }], * @param params 请求参数
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, * @param filename 下载文件名
* @param type 请求类型可选值formjson默认为form
* @param config axios配置
* @returns {Promise<void>}
*/
export function download(url, params, filename, type = 'form', config = {}) {
let headers, finalSubmitData
if (type === 'json') {
//处理json格式
headers = {'Content-Type': 'application/json'}
finalSubmitData = JSON.stringify(params)
} else {
//处理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', responseType: 'blob',
...config ...config
}).then(async (data) => { }).then(async (data) => {
@ -141,11 +174,59 @@ export function download(url, params, filename, config) {
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg); ElMessage.error(errMsg);
} }
downloadLoadingInstance.close(); }).catch((error) => {
}).catch((r) => { console.error(error)
console.error(r) if (!error.includes('[WARNING]')) {
ElMessage.error('下载文件出现错误,请联系管理员!') ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close(); }
}).finally(() => {
downloadLoadingInstance.close()
})
}
/**
* 通用上传方法
*
* @param url 上传地址
* @param files 要上传的文件数组如果数组中的元素可以直接是File对象此时提交的字段名默认为"files"否则数组中的元素应该是一个键值对的对象其中"key"是字段名"value"是File对象
* @param otherSubmitData 其他要提交的数据一个键值对的对象
* @param config axios配置
* @returns {Promise<void>}
*/
export function upload(url, files, otherSubmitData, config = {}) {
//组装表单数据
const formData = new FormData()
for (let i = 0; i < files.length; i++) {
const fileObj = files[i];
if (fileObj instanceof File) {
formData.append('files', fileObj);
} else {
formData.append(fileObj.key, fileObj.value);
}
}
if (otherSubmitData) {
const keys = Object.keys(otherSubmitData);
for (let i = 0; i < keys.length; i++) {
const key = keys[i]
//只提交非空数据
if (otherSubmitData[key]) {
formData.append(key, otherSubmitData[key])
}
}
}
//上传
const loadingInstance = ElLoading.service({text: "正在上传数据,请稍候", background: "rgba(0, 0, 0, 0.7)",})
return service.request({
url: url,
method: 'post',
headers: {'Content-Type': 'multipart/form-data'},
data: formData,
...config
}).catch((r) => {
console.error('Upload file error:', r)
return Promise.reject(r)
}).finally(() => {
loadingInstance.close()
}) })
} }

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

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

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

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

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

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

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

@ -11,7 +11,7 @@
Target Server Version : 80200 (8.2.0) Target Server Version : 80200 (8.2.0)
File Encoding : 65001 File Encoding : 65001
Date: 20/02/2024 16:42:04 Date: 22/02/2024 11:11:32
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
@ -25,11 +25,15 @@ CREATE TABLE `WMS_M_ITEM_INFO` (
`DEPT_ID` int NOT NULL DEFAULT 100 COMMENT '从属部门ID', `DEPT_ID` int NOT NULL DEFAULT 100 COMMENT '从属部门ID',
`ITEM_CD` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '物品代码', `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 '物品名称', `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 '供应商', `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_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_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', `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_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_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', `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 '供货周期', `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 '默认库位号', `PREP_LEAD_TIME` decimal(18, 6) NULL DEFAULT NULL COMMENT '筹备提前期',
`ENABLE_FLG` int NOT NULL DEFAULT 1 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 '安全库存量', `SAFETY_STOCK` decimal(18, 6) NOT NULL DEFAULT 0.000000 COMMENT '安全库存量',
`MAX_INV_QTY` 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 '发起购买的阈值', `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_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 '出库单位区分', `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 '单位净重', `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 '包装要求描述', `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 '码放要求描述', `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 '储存要求描述', `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_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', `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 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 -- 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 -- 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 (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 (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 (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 -- 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 (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 (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 (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 (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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 08:30:04'); 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-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-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-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-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-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-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-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-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-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-21 02:00:28');
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 (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', '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 (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', '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 (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', '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 (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', '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 (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-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-21 02:00:28');
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 (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-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-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-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-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-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-21 02:00:28');
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 (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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-21 02:00:28');
-- ---------------------------- -- ----------------------------
-- Table structure for sys_config -- Table structure for sys_config
@ -492,7 +493,7 @@ CREATE TABLE `sys_dict_data` (
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`dict_code`) USING BTREE 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 -- 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 (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 (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 (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 -- 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 '备注', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`dict_id`) USING BTREE, PRIMARY KEY (`dict_id`) USING BTREE,
UNIQUE INDEX `dict_type`(`dict_type` ASC) 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 -- 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 (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 (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 (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 -- Table structure for sys_file
@ -583,7 +587,6 @@ CREATE TABLE `sys_file` (
-- ---------------------------- -- ----------------------------
-- Records of 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 -- Table structure for sys_job
@ -633,7 +636,7 @@ CREATE TABLE `sys_job_data_log` (
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注信息', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注信息',
PRIMARY KEY (`log_id`) USING BTREE 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 -- Records of sys_job_data_log
@ -673,7 +676,7 @@ CREATE TABLE `sys_logininfor` (
PRIMARY KEY (`info_id`) USING BTREE, PRIMARY KEY (`info_id`) USING BTREE,
INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE, INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE,
INDEX `idx_sys_logininfor_lt`(`access_time` 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 -- Records of sys_logininfor
@ -704,7 +707,7 @@ CREATE TABLE `sys_menu` (
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注',
PRIMARY KEY (`menu_id`) USING BTREE 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 -- 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 (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 (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 (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 (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 (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, ''); 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 (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 (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 (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 (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, '序列号生成规则', 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 (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, '序列号生成规则查询', 2028, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:query', '#', 'admin', '2024-02-20 02:05:15', '', 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, '序列号生成规则新增', 2028, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:add', '#', 'admin', '2024-02-20 02:05:15', '', 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, '序列号生成规则修改', 2028, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:edit', '#', 'admin', '2024-02-20 02:05:15', '', 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, '序列号生成规则删除', 2028, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:remove', '#', 'admin', '2024-02-20 02:05:15', '', NULL, ''); 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, '序列号生成规则导出', 2028, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:SeqRule:export', '#', '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, '物品基础信息', 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 (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, '物品基础信息查询', 2034, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:query', '#', 'admin', '2024-02-20 08:34:17', '', 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, '物品基础信息新增', 2034, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:add', '#', 'admin', '2024-02-20 08:34:17', '', 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, '物品基础信息修改', 2034, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:edit', '#', 'admin', '2024-02-20 08:34:17', '', 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, '物品基础信息删除', 2034, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:remove', '#', 'admin', '2024-02-20 08:34:17', '', NULL, ''); 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, '物品基础信息导出', 2034, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'wms:ItemInfo:export', '#', '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 -- 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_bt`(`business_type` ASC) USING BTREE,
INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE, INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE,
INDEX `idx_sys_oper_log_ot`(`oper_time` 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 -- Records of sys_oper_log

Loading…
Cancel
Save