diff --git a/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/FuncUtil.java b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/FuncUtil.java index 1f48451..3448110 100644 --- a/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/FuncUtil.java +++ b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/FuncUtil.java @@ -367,6 +367,26 @@ public class FuncUtil extends StringUtils { public static List toStrList(String str) { return Arrays.asList(toStrArray(str)); } + public static List toStrListByArray(Object[] objects) { + if(isEmpty(objects)){ + return null; + } + List list = new ArrayList<>(); + for (Object o : objects) { + list.add(toStr(o,null)); + } + return list; + } + public static List toStrListByCollection(Collection objects) { + if(isEmpty(objects)){ + return null; + } + List list = new ArrayList<>(); + for (Object o : objects) { + list.add(toStr(o,null)); + } + return list; + } public static List toStrList(String split, String str) { return Arrays.asList(toStrArray(split, str)); diff --git a/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/SafeUseUtil.java b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/SafeUseUtil.java new file mode 100644 index 0000000..aa7b105 --- /dev/null +++ b/hangtag-framework/hangtag-common/src/main/java/cn/hangtag/framework/common/util/SafeUseUtil.java @@ -0,0 +1,118 @@ +package cn.hangtag.framework.common.util; + + +import cn.hutool.core.bean.BeanUtil; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.Function; + +/** + * 安全使用值 + * + * @author YuanFeng + * @date 2024/5/16 + */ +public class SafeUseUtil extends BeanUtil { + // 缓存结果的 Map + private static final Map cache = new HashMap<>(); + private static final int CACHE_LIMIT = 1000; // 设置缓存大小限制 + + /** + * Optional 的简单版 + * 安全使用值 对象中能取值则使用对象的值,否则返回默认值 + * + * @param obj obj + * @param extractor 提取器 + * @return {@link R } + */ + public static R use(T obj, Function extractor) { + return use(obj, extractor, null); + } + + /** + * 安全使用值 对象中能取值则使用对象的值,否则返回默认值 + * + * @param obj obj + * @param extractor 提取器 + * @param defaultValue 默认值 + * @return {@link R } + */ + public static R use(T obj, Function extractor, R defaultValue) { + if (obj == null) return defaultValue; + // 使用简单键,例如 obj 的哈希值 + Object key = generateCacheKey(obj, extractor,defaultValue); + if (cache.containsKey(key)) { + return (R) cache.get(key); // 从缓存中获取结果 + } + R result = defaultValue; + try { + result = extractor.apply(obj); + } catch (Exception e) { + e.printStackTrace(); + } + putCacheKey(key, result); + return result; + } + + private static void putCacheKey(Object key, R result) { + if (cache.size() >= CACHE_LIMIT) { + // 进行简单的缓存清理 + cache.clear(); + } + cache.put(key, result); // 缓存结果 + } + + /** + * 安全使用值 对象不为空 能取值并且不为空时 使用对象的中值, + * + * @param obj obj + * @param extractor 提取器 + * @param defaultValue 默认值 + * @return {@link R } + */ + public static R useNotEmpty(T obj, Function extractor, R defaultValue) { + if (isEmpty(obj)) return defaultValue; + R result = use(obj, extractor, defaultValue); + if (!isEmpty(result)) { + return result; + } + return defaultValue; // 如果结果为空,返回默认值 + } + public static boolean isEmpty(final Object object) { + if (object == null) return true; + if (object instanceof Collection) { + return ((Collection) object).isEmpty(); + } else if (object instanceof Map) { + return ((Map) object).isEmpty(); + } else if (object instanceof CharSequence) { + return ((CharSequence) object).length() == 0; + } else if (object.getClass().isArray()) { + return Array.getLength(object) == 0; + } + return false; + } + + // 生成缓存键 + private static Object generateCacheKey(Object obj, Function extractor,Object val) { + return Objects.hash(obj, extractor, val); + } + +// public static void main(String[] args) { +// User2 user2 = new User2(); +// +// user2.setName("yuanfeng"); +// Dept2 dept3 = new Dept2(); +// dept3.setName("parent"); +// Dept2 dept2 = new Dept2(); +// dept2.setParent(dept3); +// dept2.setName("dept"); +// user2.setDept(dept2); +// String name = use(use(use(user2, User2::getDept), Dept2::getParent),Dept2::getName); +// +// System.out.println(name); + +// } +} + + diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItem.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItem.java new file mode 100644 index 0000000..9dd177f --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItem.java @@ -0,0 +1,23 @@ +package cn.hangtag.framework.mybatis.build; + + +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class FilterItem implements Serializable { + + /** + * 类型 = > >= < <= != in notIn like likeLef likeRight keyword + * {@link QueryFilterTypeEnum} + */ + private String type = QueryFilterTypeEnum.EQ.getValue(); + + /** + * 条件为 或关系 + */ + private boolean or; + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItemConfig.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItemConfig.java new file mode 100644 index 0000000..8dff2a3 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/FilterItemConfig.java @@ -0,0 +1,85 @@ +package cn.hangtag.framework.mybatis.build; + +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * 过滤条件配置 + * + * @author YuanFeng + */ +@Data +public class FilterItemConfig implements Serializable { + + // 排序字段 多个使用逗号分隔 name asc,createTime desc + private String orderBy = ""; // 排序规则 name,createTime desc 这个默认使用 asc + private String groupBy = ""; // 分组 name,createTime desc 这个默认使用 asc + private Set ignoreFields = new HashSet<>(); // 忽略字段 多个使用逗号分隔 如: userName,age + private String dateFields = ""; //声明哪些是 日期字段 避免搜索错误 多个使用逗号分隔 如: createTime,updateTime + private String defaultFilterType = QueryFilterTypeEnum.EQ.getValue(); + // 关键字搜索值,多个使用空格间隔 查询条件 where (name like %张% or name or like %李%) or (code like %张% or code or like %李%) + private String keywordSearch; // 关键字搜索值,多个使用空格间隔 如: 张 李 + private String keywordFields; // 关键字段多个使用逗号 name,code + private String easyOption = ""; // 简单配置 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + private Map options; // 条件过滤配置 + + + + public Set getIgnoreFieldsKeys() { + if(ignoreFields == null){ + ignoreFields = new HashSet<>(); + } + return ignoreFields; + } + public void setIgnoreFields(String config) { + if(QueryConfigUtils.isNotEmpty(config)){ + List strList = QueryConfigUtils.toStrList(config); + getIgnoreFieldsKeys().addAll(strList); + } + } + public String getIgnoreFields(){ + if(getIgnoreFieldsKeys().isEmpty()){ + return ""; + } + return String.join(QueryConfigUtils.SPLIT_CHAR, getIgnoreFieldsKeys()); + } + + public Map getOptions() { + if(options == null){ + options = new HashMap<>(); + } + return options; + } + + // @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + public void setEasyOption(String options){ + if (QueryConfigUtils.isNotEmpty(options)) { + String[] split = options.split(QueryConfigUtils.SPLIT_CHAR); + for (String s : split) { + if(QueryConfigUtils.isNotEmpty(s.trim())){ + String[] split1 = s.trim().split(QueryConfigUtils.SPLIT_CONDITIONS); + FilterItem item = new FilterItem(); + // 简单模式设置条件为都为 and 模式 + item.setOr(false); + item.setType(getDefaultFilterType()); + if(split1.length == 2){ + // 获取条件类型 + QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(split1[1]); + if(byValue != null){ + item.setType(byValue.getValue()); + } + } + if(QueryConfigUtils.isEmpty(getOptions().get(split1[0].trim()))){ + //没有配置时候才将 简单条件添加到配置中 + getOptions().put(split1[0].trim(), item); + } + + } + + } + } + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/HighPerformanceOrderedMap.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/HighPerformanceOrderedMap.java new file mode 100644 index 0000000..dd92dad --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/HighPerformanceOrderedMap.java @@ -0,0 +1,105 @@ +package cn.hangtag.framework.mybatis.build; + +import java.util.*; + +/** + * 高性能有序Map + * + * @author YuanFeng + * @date 2020/9/14 + */ +public class HighPerformanceOrderedMap extends AbstractMap { + private final Map map; // 存储数据的 HashMap + private final List order; // 维护插入顺序的 List + + // 构造函数 + public HighPerformanceOrderedMap() { + this.map = new HashMap<>(); + this.order = new ArrayList<>(); + } + + + @Override + public Set> entrySet() { + Set> entrySet = new LinkedHashSet<>(); + for (K key : order) { + entrySet.add(new SimpleEntry<>(key, map.get(key))); + } + return entrySet; + } + + /** + * 移除第一 + * + * @return {@link K } + */ + public K removeFirst(){ + if(!isEmpty()){ + K k = this.order.get(0); + remove(k); + return k; + } + return null; + } + public List keyList(){ + return order; + } + @Override + public Set keySet(){ + return new LinkedHashSet<>(order); + } + @Override + public List values(){ + return new ArrayList<>(map.values()); + } + + @Override + public V put(K key, V value) { + if (!map.containsKey(key)) { + order.add(key); // 只在新插入时添加顺序 + } + return map.put(key, value); + } + + @Override + public V get(Object key) { + return map.get(key); + } + + @Override + public V remove(Object key) { + if (map.containsKey(key)) { + order.remove(key); // 移除顺序中的键 + } + return map.remove(key); + } + + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + @Override + public int size() { + return map.size(); + } + + @Override + public void clear() { + map.clear(); + order.clear(); + } + + // 打印所有键值对 + public void printEntries() { + for (K key : order) { + System.out.println(key + ": " + map.get(key)); + } + } + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/MybatisPlusUtil.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/MybatisPlusUtil.java new file mode 100644 index 0000000..9ca4e3d --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/MybatisPlusUtil.java @@ -0,0 +1,446 @@ +package cn.hangtag.framework.mybatis.build; + +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.lang.reflect.Field; +import java.util.*; + +/** + * mybatisPlus 查询条件构建工具 + * + * @author YuanFeng + * @date 2023/5/14 + */ +public class MybatisPlusUtil { + + public static String[] defaultIgnoreFilters = {"pageNo", "pageSize", "PAGE_NO", "PAGE_SIZE", "PAGE_SIZE_NONE"}; + /** + * 弱类型 生成非空值查询 指定转成的实体类型 + * + * @param entity 实体 + * @param clazz clazz 返回QueryWrapper泛型的类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQueryFor(Object entity, + Class clazz, + String... ignoreField) { + return buildQueryFor(null, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField); + } + + /** + * 弱类型 生成非空值查询 指定转成的实体类型 + * + * @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + * @param entity 实体 + * @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型 + * @param clazz clazz 返回QueryWrapper泛型的类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQueryFor(String conditions, + Object entity, + QueryFilterTypeEnum typeEnum, + Class clazz, + String... ignoreField) { + QueryFilterInfo queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField); + return parseQuery(queryFilterInfo, true, ignoreField); + } + + /** + * 弱类型 实体转成查询条件 + * 实体可能是vo 但是查询 为 Db实体的时候使用 + * + * @param conditions 条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + * @param entity 实体 + * @param clazz clazz 返回QueryWrapper泛型的类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQueryFor(String conditions, + Object entity, + Class clazz, + String... ignoreField) { + return buildQueryFor(conditions, entity, QueryFilterTypeEnum.EQ, clazz, ignoreField); + } + + + /** + * 弱类型 实体转成查询条件 + * 实体可能是vo 但是查询 为 Db 实体的时候使用 + * + * @param entity 实体 + * @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型 + * @param clazz clazz 返回QueryWrapper泛型的类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQueryFor(Object entity, + QueryFilterTypeEnum typeEnum, + Class clazz, + String... ignoreField) { + return buildQueryFor(null, entity, typeEnum, clazz, ignoreField); + } + + /** + * 实体转成查询条件 + * + * @param entity 实体 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQuery(T entity, String... ignoreField) { + return buildQuery(null, entity, QueryFilterTypeEnum.EQ, ignoreField); + } + + /** + * 实体转成查询条件 + * + * @param conditions 条件 + * @param entity 实体 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQuery(String conditions, T entity, String... ignoreField) { + return buildQuery(conditions, entity, QueryFilterTypeEnum.EQ, ignoreField); + } + + /** + * 生成非空值查询 + * + * @param entity 实体 + * @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQuery(T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) { + return buildQuery(null, entity, typeEnum, ignoreField); + } + + /** + * 生成非空值查询 根据泛型返回类型 + * + * @param conditions 简单条件 @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + * @param entity 实体 + * @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型 + * @param ignoreField ignore字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper buildQuery(String conditions, T entity, QueryFilterTypeEnum typeEnum, String... ignoreField) { + QueryFilterInfo queryFilterInfo = toFilter(conditions, entity, typeEnum, ignoreField); + QueryWrapper queryWrapper = parseQuery(queryFilterInfo, true, ignoreField); + return queryWrapper; + } + + + public static QueryFilterInfo toFilter(E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) { + return toFilter(null, entity, typeEnum, ignoreField); + } + + /** + * 实体转成 过滤信息对象 + * + * @param conditions 条件 name@like,age@>,code@= 简单配置 字段名称@条件 + * @param entity 实体 + * @param typeEnum 类型列举 没有指定过滤类型时候的默认条件类型 + * @param ignoreField ignore字段 + * @return {@link QueryFilterInfo }<{@link E }> + */ + public static QueryFilterInfo toFilter(String conditions, E entity, QueryFilterTypeEnum typeEnum, String... ignoreField) { + Set ignoreList = new HashSet<>(); + if (QueryConfigUtils.isNotEmpty(ignoreField)) { + for (String ignoreColumn : ignoreField) { + // 忽略字段 类中的字段转成下划线命名 + ignoreList.add(QueryConfigUtils.humpToLine(ignoreColumn)); + } + } + QueryFilterInfo queryFilterInfo = new QueryFilterInfo(); + queryFilterInfo.easyOptions(conditions); + queryFilterInfo.setDefaultFilterType(typeEnum); + queryFilterInfo.appendIgnoreFields(ignoreList); + handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(entity.getClass())); + // 处理父类 + Class superclass = entity.getClass().getSuperclass(); + while (superclass != null) { + handlerEntityField(entity, queryFilterInfo, QueryConfigUtils.getDeclaredFields(superclass)); + superclass = superclass.getSuperclass(); + } + return queryFilterInfo; + } + + /** + * 处理实体字段 将 字段转成 查询条件 + * + * @param entity 实体 + * @param queryFilterInfo 查询过滤器信息 + * @param declaredFields 声明字段 + */ + private static void handlerEntityField(T entity, QueryFilterInfo queryFilterInfo, Field[] declaredFields) { + + // 字段过滤条件类型 + Map filterMap = new HashMap<>(); + // 取出过滤条件类型 + Map options = queryFilterInfo.getOptions(); + // 或者关系条件的字段集合 + Set orKeys = new HashSet<>(); + if (QueryConfigUtils.isNotEmpty(options)) { + Set keySet = options.keySet(); + for (String s : keySet) { + FilterItem item = options.get(s); + + String type = item.getType(); + QueryFilterTypeEnum queryFilterTypeEnum = QueryFilterTypeEnum.getByValue(type); + // 类中的字段转成下划线命名 + String field = QueryConfigUtils.humpToLine(s); + if (queryFilterTypeEnum != null) { + filterMap.put(field, queryFilterTypeEnum); + } else { + filterMap.put(field, QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType())); + } + if (item.isOr()) { + orKeys.add(field); + } + } + } + Set ignoreList = queryFilterInfo.getIgnoreFieldsKeys(); + for (Field field : declaredFields) { + field.setAccessible(true); + try { + //序列化 字段 属性为空不查询 + if (QueryConfigUtils.shouldSkipField(field, ignoreList)) { + queryFilterInfo.appendIgnoreFields(ignoreList); + continue; + } + String column = QueryConfigUtils.humpToLine(field.getName()); + //主键 注解TableId + TableId tableId = field.getAnnotation(TableId.class); + if (tableId != null && field.get(entity) != null) { + //主键 + if (QueryConfigUtils.isNotEmpty(tableId.value())) { + column = tableId.value(); + } + } else { + //数据库中字段名和实体类属性不一致 注解TableField + TableField tableField = field.getAnnotation(TableField.class); + if (tableField != null && !tableField.exist()) { + // @TableField(exist = false) 不是表中内容 不形成查询条件 + if (QueryConfigUtils.isNotEmpty(tableField.value())) { + column = tableField.value(); + } + ignoreList.add(column); + queryFilterInfo.appendIgnoreFields(ignoreList); + continue; + } + } + // 属性不为null 或 值在过滤条件中 + if (field.get(entity) != null) { + Object inputVal = field.get(entity); + Class type = field.getType(); + Object val; + + // 是否有指定的过滤条件 + QueryFilterTypeEnum filterTypeEnum = filterMap.get(column); + if (filterTypeEnum == null) { + filterTypeEnum = QueryFilterTypeEnum.getByValue(queryFilterInfo.getDefaultFilterType()); + } + + if (QueryConfigUtils.isArr(inputVal)) { + val = QueryConfigUtils.objToArray(inputVal, Object.class); + } else if (QueryConfigUtils.isList(inputVal)) { + val = QueryConfigUtils.objToArray(inputVal, Object.class); + } else { + val = TypeConverter.convertValue(inputVal, type); + if (val == null) { + // 没有转换成功 + val = inputVal.toString(); + } + } + queryFilterInfo.build(column, val, filterTypeEnum, orKeys.contains(column)); + } + + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + } + + + /** + * 解析为查询条件 + * + * @param queryFilterInfo 查询过滤器信息 + * @param isToLine 是否转成 下划线命名 + * @param clazz clazz 返回QueryWrapper泛型的类型 + * @param ignoreField 忽略字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper parseQuery(QueryFilterInfo queryFilterInfo, boolean isToLine, Class clazz, String... ignoreField) { + QueryWrapper queryWrapper = parseQuery(queryFilterInfo, isToLine, ignoreField); + return queryWrapper; + } + /** + * 解析为查询条件 + * + * @param filterInfo 查询过滤器信息 + * @param isToLine 是否转成 下划线命名 + * @param ignoreField 忽略字段 + * @return {@link QueryWrapper }<{@link T }> + */ + public static QueryWrapper parseQuery(QueryFilterInfo filterInfo, boolean isToLine, String... ignoreField) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.and((q) -> { + q.eq("1", 1); + }); + String keywordFields = filterInfo.getConfig().getKeywordFields(); + String keywordSearch = filterInfo.getConfig().getKeywordSearch(); + if (QueryConfigUtils.isEmpty(filterInfo)) { + return queryWrapper; + } + Map filter = filterInfo.getFilter(); + Map options = filterInfo.getOptions(); + String str = filterInfo.getConfig().getOrderBy(); + Set ignoreFieldsKeys = filterInfo.getIgnoreFieldsKeys(); + if(QueryConfigUtils.isNotEmpty(ignoreField)){ + ignoreFieldsKeys.addAll(Arrays.asList(ignoreField)); + } + Set ignoreKeys = new HashSet<>(); + + for (String ignoreFieldsKey : ignoreFieldsKeys) { + ignoreKeys.add(isToLine ? QueryConfigUtils.humpToLine(ignoreFieldsKey) : ignoreFieldsKey); + } + if (QueryConfigUtils.isNotEmpty(str)) { + String[] split = str.split(QueryConfigUtils.SPLIT_CHAR); + for (String s1 : split) { + String[] s2 = s1.split(" "); + String orderField = s2[0]; + if (isToLine) { + orderField = QueryConfigUtils.humpToLine(orderField); + } + + // 说明字段不存在 或者不参与排序 + if (ignoreKeys.contains(orderField)) { + continue; + } + + if ("desc".equalsIgnoreCase(QueryConfigUtils.toStr(s2[1],""))) { + queryWrapper.orderByDesc(orderField); + } else { + queryWrapper.orderByAsc(orderField); + } + } + } + // 处理关键字查询 + if (QueryConfigUtils.isNotEmpty(keywordSearch) && QueryConfigUtils.isNotEmpty(keywordFields)) { + String finalKeywordSearch = keywordSearch.trim(); + if (QueryConfigUtils.isNotEmpty(finalKeywordSearch)) { + String[] split = keywordFields.split(QueryConfigUtils.SPLIT_CHAR); + queryWrapper.and((c) -> { + for (String s : split) { + s = isToLine ? QueryConfigUtils.humpToLine(s) : s; + // 说明字段不存在 或者不参与搜索 + if (ignoreKeys.contains(s)) { + continue; + } + // name like '%张%' or name like '%李%' or name like '%王%' + // 多个关键字空格间隔 + String[] keyList = finalKeywordSearch.split(" "); + for (String key : keyList) { + c.or(); + // 关键字过滤 key + c.like(s, key.trim()); + } + c.or(); + } + }); + + } + + } + + // 条件查询 + if (QueryConfigUtils.isNotEmpty(filter)) { + Set keySet = options.keySet(); + Map filterMap = new HashMap<>(); + for (String s : keySet) { + // 处理驼峰字段 + filterMap.put(isToLine ? QueryConfigUtils.humpToLine(s) : s, options.get(s)); + } + // 日期字段 + Set dateSet = new HashSet<>(); + String dateFields = filterInfo.getConfig().getDateFields(); + if (QueryConfigUtils.isNotEmpty(dateFields)) { + String[] split = dateFields.split(QueryConfigUtils.SPLIT_CHAR); + for (String s : split) { + if (QueryConfigUtils.isNotEmpty(s.trim())) { + dateSet.add(isToLine ? QueryConfigUtils.humpToLine(s.trim()) : s.trim()); + } + } + } + // 遍历过滤条件 + Set fieldKey = filter.keySet(); + for (String objKey : fieldKey) { + // 取出过滤的值 + Object value = filter.get(objKey); + + if (QueryConfigUtils.skipData(value)) { + // 跳过数据 + continue; + } + String field = isToLine ? QueryConfigUtils.humpToLine(objKey) : objKey; + // 说明字段不存在 或者不参与条件查询 + if (ignoreKeys.contains(field)) { + continue; + } + + FilterItem item = filterMap.get(field); + if (item == null) { + //找不到指定的过滤类型 默认过滤类型 + item = new FilterItem(); + // 默认过滤类型 + item.setType(filterInfo.getDefaultFilterType()); + // 判断是否是数组 + if (QueryConfigUtils.isArr(value) || QueryConfigUtils.isList(value)) { + item.setType(QueryFilterTypeEnum.BETWEEN.getValue()); + } + item.setOr(false); + } + + // 判断是否是or + if (item.isOr()) { + queryWrapper.or(); + } + QueryFilterTypeEnum byValue = QueryFilterTypeEnum.getByValue(item.getType()); + if(byValue == null){ + byValue = QueryFilterTypeEnum.EQ; + } + // 条件处理器 + queryWrapper = QueryConfigUtils.whereHandler(queryWrapper, byValue, dateSet, field, value); + + } + } + + // 分组 + List strList = QueryConfigUtils.toStrList(filterInfo.getConfig().getGroupBy()); + if (QueryConfigUtils.isNotEmpty(strList)) { + List strSet = new ArrayList<>(); + for (String s : strList) { + String s1 = isToLine ? QueryConfigUtils.humpToLine(s) : s; + if (ignoreKeys.contains(s1)) { + continue; + } + strSet.add(s1); + } + if (QueryConfigUtils.isNotEmpty(strSet)) { + queryWrapper.groupBy(strSet); + } + } + return queryWrapper; + } + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryConfigUtils.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryConfigUtils.java new file mode 100644 index 0000000..b2977f4 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryConfigUtils.java @@ -0,0 +1,474 @@ +package cn.hangtag.framework.mybatis.build; + +import cn.hangtag.framework.mybatis.build.enums.DbTypeEnum; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.handler.*; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class QueryConfigUtils { + + private static final Map> SKIP_HANDLER = new HashMap<>(); + + public static int MAX_LINE_CACHE = 100000; + /** + * 分隔符 + */ + public static final String SPLIT_CHAR = ","; + /** + * 分裂条件 + */ + public static final String SPLIT_CONDITIONS = "@"; + private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]"); + private static DbTypeEnum currentType = DbTypeEnum.MYSQL; + + public static DbTypeEnum getDbType() { + return currentType; + } + + public static void setDbType(String dbType) { + currentType = DbTypeEnum.getDbType(dbType); + } + + + private static final ThreadLocal LOCAL_HANDLER = new ThreadLocal<>(); + + /** + * 注册一个跳过数据处理方法,名称为key + * + * @param name 名称 + * @param handler 处理程序 + */ + public static void registerSkipHandler(String name, Function handler) { + SKIP_HANDLER.put(name, handler); + } + + + + static { + // 默认 + registerSkipHandler("null", (obj) -> { + return obj == null || obj.equals("null"); + }); + + resetWrapperHandler(); + } + + public static void resetWrapperHandler(){ + + registerWrapperHandler(new Between2Handler<>()); + registerWrapperHandler(new BetweenHandler<>()); + registerWrapperHandler(new EqHandler<>()); + registerWrapperHandler(new GeHandler<>()); + registerWrapperHandler(new InHandler<>()); + registerWrapperHandler(new InSetHandler<>()); + registerWrapperHandler(new KeywordHandler<>()); + registerWrapperHandler(new LeHandler<>()); + registerWrapperHandler(new LikeHandler<>()); + registerWrapperHandler(new LikeLeftHandler<>()); + registerWrapperHandler(new LikeRightHandler<>()); + registerWrapperHandler(new LtHandler<>()); + registerWrapperHandler(new NeHandler<>()); + registerWrapperHandler(new NotInHandler<>()); + registerWrapperHandler(new NotLikeHandler<>()); + + } + + public static void registerWrapperHandler(WhereWrapper whereWrapper) { + WrapperHandler.registerWrapperHandler(whereWrapper); + } + /** + * 使用跳过逻辑处理方法名称 + * + * @param name 名称 + */ + public static void useSkipHandler(String name) { + // 线程绑定 + LOCAL_HANDLER.set(name); + } + + + + + private static Function getSkipHandler(String name) { + Function function = null; + if (name != null) { + function = SKIP_HANDLER.get(name); + } + if (function == null) { + // 使用默认 + return QueryConfigUtils::isEmpty; + } + return function; + } + + /** + * 获取 sql 如 字段为 id1,id2,id3 , 条件如 为 id1 + * 使用 方法 queryWrapper.apply(MybatisPlusUtil.getIdsToApply(“user_ids"),id) + * + * @param columnName 列名 + * @return {@link String } + */ + public static String getIdsToApply(String columnName) { + return getIdsToApply(getDbType(), columnName); + } + + /** + * 获取身份证申请 + * + * @param dbType db类型 + * @param columnName 列名 + * @return {@link String } + */ + public static String getIdsToApply(DbTypeEnum dbType, String columnName) { + switch (dbType) { + case MYSQL: + return "FIND_IN_SET ({0}, " + columnName + ")"; + case POSTGRE_SQL: + return "'{0}' = ANY (string_to_array(" + columnName + ", ','))"; + default: + return "FIND_IN_SET ({0}, " + columnName + ")"; + } + } + + /** + * 转成下线缓存 + */ + private static final HighPerformanceOrderedMap TO_LINE_CACHE = new HighPerformanceOrderedMap<>(); + + /** + * 驼峰转下划线 + * + * @param str str + * @return {@link String} + */ + public static String humpToLine(String str) { + if (isNotEmpty(str)) { + String s = TO_LINE_CACHE.get(str); + if (isNotEmpty(s)) { + return s; + } + + str = str.substring(0, 1).toLowerCase() + str.substring(1); + Matcher matcher = HUMP_PATTERN.matcher(str); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase()); + } + matcher.appendTail(sb); + String string = sb.toString(); + TO_LINE_CACHE.put(str, string); + if (TO_LINE_CACHE.size() > MAX_LINE_CACHE) { + TO_LINE_CACHE.removeFirst(); + } + return string; + } + return str; + } + + /** + * 转为骆驼 + * + * @param s S + * @return {@link String } + */ + public static String toCamelCase(String s) { + if (isEmpty(s) || !s.contains("_")) { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == '_') { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + public static boolean shouldSkipField(Field field, Set ignoreList) { + + if ("serialVersionUID".equals(field.getName())) return true; + if (ignoreList.contains(humpToLine(field.getName()))) return true; + + // 过滤字段 只写字段 + if (field.getAnnotation(JsonProperty.class) != null + && field.getAnnotation(JsonProperty.class).access() == JsonProperty.Access.WRITE_ONLY) { + ignoreList.add(humpToLine(field.getName())); + return true; + } + // 在序列化和反序列化时忽略的属性 + if (field.getAnnotation(JsonIgnore.class) != null) { + ignoreList.add(humpToLine(field.getName())); + return true; + } + return false; + } + + private static final Map, Field[]> fieldCache = new HashMap<>(); + + public static Field[] getDeclaredFields(Class clazz) { + return fieldCache.computeIfAbsent(clazz, Class::getDeclaredFields); + } + + // 去除空白 + public static List toStrList(String str) { + if (isEmpty(str)) { + return new ArrayList<>(); + } + String[] split = str.split(QueryConfigUtils.SPLIT_CHAR); + return Arrays.stream(split).filter(s -> !isEmpty(s)).collect(Collectors.toList()); + } + + public static String[] toStrArr(String str) { + List strList = toStrList(str); + if (isEmpty(strList)) { + return null; + } + return strList.toArray(new String[strList.size()]); + } + + public static boolean isNotEmpty(final Object object) { + return !isEmpty(object); + } + + public static boolean isEmpty(final Object object) { + if (object == null) { + return true; + } + if (object instanceof CharSequence) { + return ((CharSequence) object).length() == 0; + } + if (object.getClass().isArray()) { + return Array.getLength(object) == 0; + } + if (object instanceof Collection) { + return ((Collection) object).isEmpty(); + } + if (object instanceof Map) { + return ((Map) object).isEmpty(); + } + return false; + } + + /** + * 是否支持日期搜索的类型 的关键字 + * + * @param input 输入 + * @return boolean + */ + public static boolean isDateValue(String input) { + try { + LocalDate.parse(input, DateTimeFormatter.ISO_LOCAL_DATE); + return true; + } catch (Exception e) { + try { + Long.valueOf(input); + return true; + } catch (Exception e2) { + + } + } + return false; + } + + public static String toStr(Object str) { + return toStr(str, ""); + } + + public static String toStr(Object str, String defaultValue) { + return null != str ? str.toString() : defaultValue; + } + + + /** + * 对象到数组 + * + * @param obj obj + * @param clazz clazz + * @return {@link T[] } + */ + public static T[] objToArray(Object obj, Class clazz) { + if (obj == null) { + return (T[]) Array.newInstance(clazz, 0); // 返回空数组 + } + + if (obj.getClass().isArray()) { + return (T[]) obj; // 已经是数组,直接转换 + } + + if (obj instanceof List) { + List list = (List) obj; + // 使用传入的类型创建数组 + return list.toArray((T[]) Array.newInstance(clazz, list.size())); + } + + // 单个对象,转换为包含该对象的数组 + T[] array = (T[]) Array.newInstance(clazz, 1); + array[0] = (T) obj; + return array; + } + + /** + * 日期格式 + * + * @param localDateTime 当地日期时间 + * @return {@link String } + */ + public static String dateFormat(LocalDateTime localDateTime) { + return DateUtil.format(localDateTime, "yyyy-MM-dd HH:mm:ss"); + } + + /** + * // 将对象转换为 List,支持泛型 + * + * @param obj obj + * @param clazz clazz + * @return {@link List }<{@link T }> + */ + public static List objToList(Object obj, Class clazz) { + if (obj == null) { + return new ArrayList<>(); // 返回空 List + } + + if (obj.getClass().isArray()) { + // 数组转换为 List + int length = Array.getLength(obj); + List list = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + list.add((T) Array.get(obj, i)); + } + return list; + } + + if (obj instanceof List) { + return new ArrayList<>((List) obj); // 已经是 List,直接转换 + } + + // 单个对象,转换为包含该对象的 List + return new ArrayList<>(Collections.singletonList((T) obj)); + } + + /** + * 对象是否为数组类型 + * + * @param obj obj + * @return boolean + */ + public static boolean isArr(Object obj) { + if (obj == null) { + return false; + } + // 检查是否为数组 + if (obj.getClass().isArray()) { + return true; + } + return false; + } + + /** + * 是否为List 类型的数据 + * + * @param obj obj + * @return boolean + */ + public static boolean isList(Object obj) { + if (obj == null) { + return false; + } + // 检查是否为 List + if (obj instanceof List) { + return true; + } + return false; + } + + /** + * 字符串添加 + * + * @param str str + * @param field 领域 + * @return {@link String } + */ + public static String strAdd(String str, String... field) { + if (QueryConfigUtils.isNotEmpty(field)) { + for (String s : field) { + if (QueryConfigUtils.isNotEmpty(s.trim())) { + str += (s.trim() + QueryConfigUtils.SPLIT_CHAR); + } + } + } + return str; + } + + /** + * 字符串删除 + * + * @param str str + * @param keys 键 + * @return {@link String } + */ + public static String strRemove(String str, String... keys) { + if (QueryConfigUtils.isNotEmpty(keys)) { + String[] split = str.split(QueryConfigUtils.SPLIT_CHAR); + StringBuilder builder = new StringBuilder(); + List strList = QueryConfigUtils.toStrList(String.join(QueryConfigUtils.SPLIT_CHAR, keys)); + for (int i = 0; i < split.length; i++) { + if (strList.contains(split[i])) { + continue; + } + builder.append(split[i]).append(QueryConfigUtils.SPLIT_CHAR); + } + str = builder.toString(); + } + return str; + } + + /** + * 跳过数据 + * + * @param str str + * @return boolean + */ + public static boolean skipData(Object str) { + return getSkipHandler(LOCAL_HANDLER.get()).apply(str); + } + + /** + * where 条件处理 + * + * @param value str + * @return boolean + */ + public static QueryWrapper whereHandler(QueryWrapper queryWrapper, + QueryFilterTypeEnum type, + Set dateField, + String filed, + Object value) { + return WrapperHandler.exeWrapperHandler(queryWrapper, type,dateField, filed, value); + } + + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryFilterInfo.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryFilterInfo.java new file mode 100644 index 0000000..e3d79be --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/QueryFilterInfo.java @@ -0,0 +1,216 @@ +package cn.hangtag.framework.mybatis.build; + + +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; + +import java.io.Serializable; +import java.util.*; +/* + +前端条件 条件 +where + (userName like '%周%' or nickname like '%周%') +and (age > 18) +and (userName in ('陈海瑶', '冯雨馨') +or nickname like '%杰%') +{ + "pager": { + "current": 1, + "size": 10 + }, + "config": { + "keywordSearch": "周", + "keywordFields": "userName,nickname", + "orderBy": "age desc;name asc", + "options": { + "age": { + "type": ">", + "or": false + }, + "userName": { + "type": "in", + "or": false + }, + "nickname": { + "type": "like", + "or": true + } + } + }, + "filter": { + "age": 18, + "userName": [ + "陈海瑶", + "冯雨馨" + ], + "nickname": "杰" + } +} + +*/ + +@Data +public class QueryFilterInfo implements Serializable { + + private FilterItemConfig config; // 配置 + private PageParam pager = new PageParam(); // 分页 + // 查询条件 + private Map filter = new HighPerformanceOrderedMap<>(); + + + public FilterItemConfig getConfig() { + if(config == null){ + config = new FilterItemConfig(); + } + return config; + } + + public String getDefaultFilterType() { + return getConfig().getDefaultFilterType(); + } + public Map getFilter() { + if (filter == null) { + filter = new HighPerformanceOrderedMap<>(); + } + return filter; + } +// @条件(QueryFilterTypeEnum) 多个使用逗号号间隔; 如 name@like,age@> 条件 where like '%?%' and age > ? + public void easyOptions(String options){ + this.getConfig().setEasyOption(options); + } + public Map getOptions() { + return this.getConfig().getOptions(); + } + + /** + * 建立或 + * + * @param field 字段 + * @param value 值 + * @param type 类型 + * @return {@link FilterItem } + */ + public FilterItem buildOr(String field, Object value, QueryFilterTypeEnum type) { + return buildFilter(field, value, type, true); + } + public void appendKeywordFields(String ...field){ + QueryConfigUtils.strAdd(this.getConfig().getKeywordFields(),field); + } + + public void delKeywordFields(String... keys){ + QueryConfigUtils.strRemove(this.getConfig().getKeywordFields(), keys); + } + + public void appendDateFields(String ...field){ + QueryConfigUtils.strAdd(this.getConfig().getDateFields(),field); + } + + public void delDateFields(String... keys){ + QueryConfigUtils.strRemove(this.getConfig().getDateFields(),keys); + } + + public void appendGroupBy(String ...field){ + QueryConfigUtils.strAdd(this.getConfig().getGroupBy(),field); + } + + public void delGroupBy(String... keys){ + QueryConfigUtils.strRemove(this.getConfig().getGroupBy(),keys); + } + + public boolean containsIgnoredKeys(String key) { + return this.getConfig().getIgnoreFields().contains(key); + } + + public Set getIgnoreFieldsKeys(){ + return this.getConfig().getIgnoreFieldsKeys(); + } + public void appendIgnoreFields(String ...field){ + Set set = new HashSet<>(); + if(QueryConfigUtils.isNotEmpty(field)){ + set.addAll(Arrays.asList(field)); + } + appendIgnoreFields(set); + } + public void setDefaultFilterType(QueryFilterTypeEnum type){ + this.getConfig().setDefaultFilterType(type.getValue()); + } + public void appendIgnoreFields(Set field){ + if(QueryConfigUtils.isNotEmpty(field)){ + for (String s : field) { + if(QueryConfigUtils.isNotEmpty(s.trim())){ + this.getConfig().getIgnoreFieldsKeys().add(s.trim()); + } + } + } + } + public void delIgnoreFields(String... keys){ + if(QueryConfigUtils.isNotEmpty(keys)){ + for (String key : keys) { + this.getConfig().getIgnoreFieldsKeys().remove(key); + } + } + } + + public void appendOrderByDesc(String ...field){ + appendOrderBy("DESC",field); + } + + private void appendOrderBy(String type,String ...field){ + if(QueryConfigUtils.isNotEmpty(field)){ + StringBuilder builder = new StringBuilder(); + List strList = QueryConfigUtils.toStrList(this.getConfig().getOrderBy()); + for (String s : field) { + if (QueryConfigUtils.isNotEmpty(s.trim())) { + String key = s.trim() + " "+type; + if(strList.contains(key)){ + strList.remove(key); + } + builder.append(s.trim()).append(" ").append(type).append(","); + } + } + // 移除重复的排序 + StringBuilder res = new StringBuilder(); + for (String s : strList) { + res.append(s).append(","); + } + String tmp = res.toString(); + tmp += builder.toString(); + this.getConfig().setOrderBy(tmp); + } + } + + public void appendOrderByAsc(String ...field){ + appendOrderBy("ASC",field); + } + public void delOrderBy(String... keys){ + QueryConfigUtils.strRemove(this.getConfig().getOrderBy(), keys); + } + /** + * 构建 + * + * @param field 字段 + * @param value 值 + * @param type 类型 + * @return {@link FilterItem } + */ + public FilterItem build(String field, Object value, QueryFilterTypeEnum type) { + return build(field, value, type, false); + } + public FilterItem build(String field, Object value, QueryFilterTypeEnum type, boolean isOr) { + return buildFilter(field, value, type, isOr); + } + + private FilterItem buildFilter(String field, Object value, QueryFilterTypeEnum type, boolean isOr) { + filter.put(field, value); + FilterItem item = new FilterItem(); + item.setOr(isOr); + item.setType(type.getValue()); + this.getConfig().getOptions().put(field, item); + return item; + } + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/TypeConverter.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/TypeConverter.java new file mode 100644 index 0000000..9c939f5 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/TypeConverter.java @@ -0,0 +1,113 @@ +package cn.hangtag.framework.mybatis.build; + +import cn.hutool.core.date.DateUtil; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +/** + * 类型 取值转换器 + * + * @author YuanFeng + * @date 2024/10/16 + */ +public class TypeConverter { + + // 用于存储类型和其对应的转换逻辑 + private static final Map, Function> converters = new HashMap<>(); + + // 注册类型转换器 + public static void registerConverter(Class type, Function converter) { + converters.put(type, (Function) converter); + } + + // 根据类型进行转换 + public static Object convertValue(Object inputVal, Class targetType) { + Function converter = converters.get(targetType); + if (converter == null) { + // 如果没有注册转换器,返回原始值 + return null; + } + // 如果有对应类型的转换器,执行转换 + return converter.apply(inputVal); + } + + static { + rest(); + } + public static void rest(){ + restLocalDateTime(); + restDate(); + restString(); + restLong(); + restDouble(); + restInteger(); + restBoolean(); + restBigDecimal(); + restBigInteger(); + } + public static void restLocalDateTime(){ + // 注册LocalDate的转换器 + TypeConverter.registerConverter(LocalDateTime.class, inputVal -> { + if (inputVal != null) { + return QueryConfigUtils.dateFormat(inputVal); + } + return null; + }); + } + public static void restDate(){ + // 注册Date的转换器 + TypeConverter.registerConverter(Date.class, inputVal -> { + if (inputVal != null) { + return DateUtil.formatDate(inputVal); + } + return null; + }); + } + public static void restString(){ + // 注册字符的转换器 + TypeConverter.registerConverter(String.class, inputVal -> { + return inputVal; + }); + } + public static void restLong(){ + TypeConverter.registerConverter(Long.class, inputVal -> { + return inputVal; + }); + }public static void restDouble(){ + TypeConverter.registerConverter(Double.class, inputVal -> { + return inputVal; + }); + } + public static void restInteger(){ + TypeConverter.registerConverter(Integer.class, inputVal -> { + return inputVal; + }); + }public static void restBoolean(){ + TypeConverter.registerConverter(Boolean.class, inputVal -> { + return inputVal; + }); + } + public static void restBigDecimal() { + TypeConverter.registerConverter(BigDecimal.class, inputVal -> { + if (inputVal != null) { + return new BigDecimal(inputVal.toString()).toString(); + } + return null; + }); + } + + public static void restBigInteger() { + TypeConverter.registerConverter(BigInteger.class, inputVal -> { + if (inputVal != null) { + return new BigInteger(inputVal.toString()); + } + return null; + }); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperHandler.java new file mode 100644 index 0000000..f5f4d0e --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperHandler.java @@ -0,0 +1,52 @@ +package cn.hangtag.framework.mybatis.build; + +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class WrapperHandler { + + private static final Map> QUERY_WRAPPER_HANDLER = new HashMap<>(); + + public static void registerWrapperHandler(WhereWrapper whereWrapper) { + if(whereWrapper != null){ + QUERY_WRAPPER_HANDLER.put(whereWrapper.getType(), whereWrapper); + } + } + + public static QueryWrapper exeWrapperHandler(QueryWrapper queryWrapper, + QueryFilterTypeEnum type, + Set dateField, + String field, Object value) { + if (queryWrapper == null) { + queryWrapper = new QueryWrapper<>(); + } + WhereWrapper whereWrapper = QUERY_WRAPPER_HANDLER.get(type); + WrapperInfo wrapperInfo = new WrapperInfo<>(queryWrapper, field, value,dateField); + if (whereWrapper == null) { + //没有找到处理器 使用默认 + if (QueryConfigUtils.isArr(value)) { + Object[] strings = QueryConfigUtils.objToArray(value, Object.class); + if (QueryConfigUtils.isNotEmpty(strings)) { + return queryWrapper.between(field, strings[0], strings[strings.length - 1]); + } + + } + if (QueryConfigUtils.isList(value)) { + List list = QueryConfigUtils.objToList(value, Object.class); + if (QueryConfigUtils.isNotEmpty(list)) { + return queryWrapper.between(field, list.get(0), list.get(list.size() - 1)); + } + } + return queryWrapper.eq(field, value); + } + // 执行 + return ((WhereWrapper)whereWrapper).handler(wrapperInfo); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperInfo.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperInfo.java new file mode 100644 index 0000000..23e22c5 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/WrapperInfo.java @@ -0,0 +1,37 @@ +package cn.hangtag.framework.mybatis.build; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.HashSet; +import java.util.Set; + +/** + * 包装信息 + * + * @author YuanFeng + */ +@Data +@AllArgsConstructor +public class WrapperInfo { + + private QueryWrapper queryWrapper; + private String field; + private Object value; + private Set dateFields; + + public Set getDateFields() { + if (dateFields == null) { + dateFields = new HashSet<>(); + } + return dateFields; + } + + public QueryWrapper getQueryWrapper() { + if (queryWrapper == null) { + queryWrapper = new QueryWrapper<>(); + } + return queryWrapper; + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/DbTypeEnum.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/DbTypeEnum.java new file mode 100644 index 0000000..016b05f --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/DbTypeEnum.java @@ -0,0 +1,70 @@ +package cn.hangtag.framework.mybatis.build.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DbTypeEnum { + + MYSQL("mysql", "MySql数据库"), + MARIADB("mariadb", "MariaDB数据库"), + ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"), + ORACLE_12C("oracle12c", "Oracle12c+数据库"), + DB2("db2", "DB2数据库"), + H2("h2", "H2数据库"), + HSQL("hsql", "HSQL数据库"), + SQLITE("sqlite", "SQLite数据库"), + POSTGRE_SQL("postgresql", "Postgre数据库"), + SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"), + SQL_SERVER("sqlserver", "SQLServer数据库"), + DM("dm", "达梦数据库"), + XU_GU("xugu", "虚谷数据库"), + KINGBASE_ES("kingbasees", "人大金仓数据库"), + PHOENIX("phoenix", "Phoenix HBase数据库"), + GAUSS("zenith", "Gauss 数据库"), + CLICK_HOUSE("clickhouse", "clickhouse 数据库"), + GBASE("gbase", "南大通用(华库)数据库"), + GBASE_8S("gbase-8s", "南大通用数据库 GBase 8s"), + GBASE8S_PG("gbase8s-pg", "南大通用数据库 GBase 8s兼容pg"), + GBASE_8C("gbase8c", "南大通用数据库 GBase 8c"), + SINODB("sinodb", "星瑞格数据库"), + OSCAR("oscar", "神通数据库"), + SYBASE("sybase", "Sybase ASE 数据库"), + OCEAN_BASE("oceanbase", "OceanBase 数据库"), + FIREBIRD("Firebird", "Firebird 数据库"), + HIGH_GO("highgo", "瀚高数据库"), + CUBRID("cubrid", "CUBRID数据库"), + SUNDB("sundb", "SUNDB数据库"), + SAP_HANA("hana", "SAP_HANA数据库"), + IMPALA("impala", "impala数据库"), + VERTICA("vertica", "vertica数据库"), + XCloud("xcloud", "行云数据库"), + REDSHIFT("redshift", "亚马逊redshift数据库"), + OPENGAUSS("openGauss", "华为 opengauss 数据库"), + TDENGINE("TDengine", "TDengine数据库"), + INFORMIX("informix", "Informix数据库"), + UXDB("uxdb", "优炫数据库"), + LEALONE("lealone", "Lealone数据库"), + TRINO("trino", "Trino数据库"), + PRESTO("presto", "Presto数据库"), + OTHER("other", "其他数据库"); + + private final String db; + private final String desc; + + public static DbTypeEnum getDbType(String dbType) { + DbTypeEnum[] var1 = values(); + int var2 = var1.length; + + for (int var3 = 0; var3 < var2; ++var3) { + DbTypeEnum type = var1[var3]; + if (type.db.equalsIgnoreCase(dbType)) { + return type; + } + } + + return OTHER; + } + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/QueryFilterTypeEnum.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/QueryFilterTypeEnum.java new file mode 100644 index 0000000..ffecece --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/enums/QueryFilterTypeEnum.java @@ -0,0 +1,50 @@ +package cn.hangtag.framework.mybatis.build.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +@AllArgsConstructor +@Getter +public enum QueryFilterTypeEnum { + + GT("大于", ">"), + GE("大于等于", ">="), + LT("小于", "<"), + LE("小于等于", "<="), + NE("不等于", "!="), + EQ("等于", "="), + IN("在...之内", "in"), + NOTIN("不在...之内", "notIn"), + BETWEEN("之间", "between"), + BETWEEN2("之间", "><"), + LIKE("模糊匹配", "like"), + NOT_LIKE("模糊匹配", "notLike"), + LIKE_LEFT("左模糊匹配", "likeLeft"), + LIKE_RIGHT("右模糊匹配", "likeRight"), + /** + * 查询以逗号分隔的组合字段数据。 + * 使用条件:FIND_IN_SET({0}, columnName) 进行查询。 + * 示例: + * - 字段值为:数据1: 123,234,345;数据2: 23,456;数据3: 123,567 + * - 当条件为 23 时,仅匹配包含 23 的数据,即数据2。 + */ + IN_SET("查询以逗号分隔的组合字段数据", "inSet"), + KEYWORD("关键字", "keyword") + + ; + private final String msg; + private final String value; + public static QueryFilterTypeEnum getByValue(String value){ + if(value != null && !value.isEmpty()){ + for( QueryFilterTypeEnum enumItem: QueryFilterTypeEnum.values()) { + if (enumItem.getValue().equalsIgnoreCase(value)) { + return enumItem; + } + } + } + return null; + } + + +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/WhereWrapper.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/WhereWrapper.java new file mode 100644 index 0000000..0fa63ea --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/WhereWrapper.java @@ -0,0 +1,11 @@ +package cn.hangtag.framework.mybatis.build.where; + + +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +public interface WhereWrapper { + QueryFilterTypeEnum getType(); + QueryWrapper handler(WrapperInfo wrapperInfo); +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/Between2Handler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/Between2Handler.java new file mode 100644 index 0000000..07c89d3 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/Between2Handler.java @@ -0,0 +1,29 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class Between2Handler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.BETWEEN2; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (QueryConfigUtils.isArr(wrapperInfo.getValue())) { + Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class); + wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]); + } else if (QueryConfigUtils.isList(wrapperInfo.getValue())) { + List list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class); + wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1)); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/BetweenHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/BetweenHandler.java new file mode 100644 index 0000000..fb8836d --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/BetweenHandler.java @@ -0,0 +1,28 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class BetweenHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.BETWEEN; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (QueryConfigUtils.isArr(wrapperInfo.getValue())) { + Object[] strings = QueryConfigUtils.objToArray(wrapperInfo.getValue(), Object.class); + wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), strings[0], strings[strings.length - 1]); + } else if (QueryConfigUtils.isList(wrapperInfo.getValue())) { + List list = QueryConfigUtils.objToList(wrapperInfo.getValue(), Object.class); + wrapperInfo.getQueryWrapper().between(wrapperInfo.getField(), list.get(0), list.get(list.size() - 1)); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/EqHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/EqHandler.java new file mode 100644 index 0000000..c4d2cc0 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/EqHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class EqHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.EQ; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().eq(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/GeHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/GeHandler.java new file mode 100644 index 0000000..13d1b93 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/GeHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class GeHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.GE; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().ge(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InHandler.java new file mode 100644 index 0000000..b8d05aa --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class InHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.IN; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().in(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InSetHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InSetHandler.java new file mode 100644 index 0000000..c5b5491 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/InSetHandler.java @@ -0,0 +1,33 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class InSetHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.IN_SET; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + // 查询逗号组合数据 + String str2 = QueryConfigUtils.toStr(wrapperInfo.getValue()); + String[] arr = str2.split(QueryConfigUtils.SPLIT_CHAR); + wrapperInfo.getQueryWrapper().and(w -> { + for (int i = 0; i < arr.length; i++) { + String s = arr[i]; + w.apply(QueryConfigUtils.getIdsToApply(wrapperInfo.getField()), s); + if (i < arr.length - 1) { + wrapperInfo.getQueryWrapper().or(); + } + } + }); + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/KeywordHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/KeywordHandler.java new file mode 100644 index 0000000..afb1203 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/KeywordHandler.java @@ -0,0 +1,33 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class KeywordHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.KEYWORD; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + String str1 = QueryConfigUtils.toStr(wrapperInfo.getValue()); + // 多个关键字 空格间隔 如 张三 李 条件 where (name like '%张%' or name like '%李%' ) + String[] arr2 = str1.split(" "); + wrapperInfo.getQueryWrapper().and(w -> { + for (int i = 0; i < arr2.length; i++) { + String s = arr2[i]; + w.like(wrapperInfo.getField(), s); + if (i < arr2.length - 1) { + w.or(); + } + } + }); + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LeHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LeHandler.java new file mode 100644 index 0000000..40b0863 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LeHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class LeHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.LE; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().le(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeHandler.java new file mode 100644 index 0000000..bc70b1a --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeHandler.java @@ -0,0 +1,28 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class LikeHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.LIKE; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (wrapperInfo.getDateFields().contains(wrapperInfo.getField()) && !QueryConfigUtils.isDateValue(QueryConfigUtils.toStr(wrapperInfo.getValue()))) { + //字段为日期 但是关键字的值 又不能支持 like 跳过条件 + // 设置一个不能的匹配的条件 + wrapperInfo.getQueryWrapper().eq("1", "2"); + } else { + wrapperInfo.getQueryWrapper().like(wrapperInfo.getField(), wrapperInfo.getValue()); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeLeftHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeLeftHandler.java new file mode 100644 index 0000000..4b52d2c --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeLeftHandler.java @@ -0,0 +1,28 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class LikeLeftHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.LIKE_LEFT; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (wrapperInfo.getDateFields().contains(wrapperInfo.getField()) && !QueryConfigUtils.isDateValue(QueryConfigUtils.toStr(wrapperInfo.getValue()))) { + //字段为日期 但是关键字的值 又不能支持 like 跳过条件 + // 设置一个不能的匹配的条件 + wrapperInfo.getQueryWrapper().eq("1", "2"); + } else { + wrapperInfo.getQueryWrapper().likeLeft(wrapperInfo.getField(), wrapperInfo.getValue()); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeRightHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeRightHandler.java new file mode 100644 index 0000000..dc9beb5 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LikeRightHandler.java @@ -0,0 +1,28 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class LikeRightHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.LIKE_RIGHT; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (wrapperInfo.getDateFields().contains(wrapperInfo.getField()) && !QueryConfigUtils.isDateValue(QueryConfigUtils.toStr(wrapperInfo.getValue()))) { + //字段为日期 但是关键字的值 又不能支持 like 跳过条件 + // 设置一个不能的匹配的条件 + wrapperInfo.getQueryWrapper().eq("1", "2"); + } else { + wrapperInfo.getQueryWrapper().likeRight(wrapperInfo.getField(), wrapperInfo.getValue()); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LtHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LtHandler.java new file mode 100644 index 0000000..71942be --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/LtHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class LtHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.LT; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().lt(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NeHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NeHandler.java new file mode 100644 index 0000000..730b6a6 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NeHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; +public class NeHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.NE; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().ne(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotInHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotInHandler.java new file mode 100644 index 0000000..c303390 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotInHandler.java @@ -0,0 +1,21 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class NotInHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.NOTIN; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + return wrapperInfo.getQueryWrapper().notIn(wrapperInfo.getField(), wrapperInfo.getValue()); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotLikeHandler.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotLikeHandler.java new file mode 100644 index 0000000..1c71b59 --- /dev/null +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/build/where/handler/NotLikeHandler.java @@ -0,0 +1,28 @@ +package cn.hangtag.framework.mybatis.build.where.handler; + +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; +import cn.hangtag.framework.mybatis.build.WrapperInfo; +import cn.hangtag.framework.mybatis.build.enums.QueryFilterTypeEnum; +import cn.hangtag.framework.mybatis.build.where.WhereWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.List; + +public class NotLikeHandler implements WhereWrapper { + @Override + public QueryFilterTypeEnum getType() { + return QueryFilterTypeEnum.NOT_LIKE; + } + + @Override + public QueryWrapper handler(WrapperInfo wrapperInfo) { + if (wrapperInfo.getDateFields().contains(wrapperInfo.getField()) && !QueryConfigUtils.isDateValue(QueryConfigUtils.toStr(wrapperInfo.getValue()))) { + //字段为日期 但是关键字的值 又不能支持 like 跳过条件 + // 设置一个不能的匹配的条件 + wrapperInfo.getQueryWrapper().eq("1", "2"); + } else { + wrapperInfo.getQueryWrapper().notLike(wrapperInfo.getField(), wrapperInfo.getValue()); + } + return wrapperInfo.getQueryWrapper(); + } +} diff --git a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/config/HangtagMybatisAutoConfiguration.java b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/config/HangtagMybatisAutoConfiguration.java index 4915376..e1749ee 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/config/HangtagMybatisAutoConfiguration.java +++ b/hangtag-framework/hangtag-spring-boot-starter-mybatis/src/main/java/cn/hangtag/framework/mybatis/config/HangtagMybatisAutoConfiguration.java @@ -1,5 +1,6 @@ package cn.hangtag.framework.mybatis.config; +import cn.hangtag.framework.mybatis.build.QueryConfigUtils; import cn.hutool.core.util.StrUtil; import cn.hangtag.framework.mybatis.core.handler.DefaultDBFieldHandler; import com.baomidou.mybatisplus.annotation.DbType; @@ -26,6 +27,7 @@ import org.springframework.core.env.ConfigurableEnvironment; lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 public class HangtagMybatisAutoConfiguration { + @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); @@ -43,6 +45,7 @@ public class HangtagMybatisAutoConfiguration { public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { DbType dbType = IdTypeEnvironmentPostProcessor.getDbType(environment); if (dbType != null) { + QueryConfigUtils.setDbType(dbType.getDb()); switch (dbType) { case POSTGRE_SQL: return new PostgreKeyGenerator(); diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java index 1a34068..fd245a0 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java @@ -8,6 +8,8 @@ public interface ErrorCodeConstants extends cn.hangtag.module.system.enums.Erro ErrorCode PRODUCT_INFO_NOT_EXISTS = new ErrorCode(3200, "产品资料 不存在"); ErrorCode PRODUCT_PROCESS_NOT_EXISTS = new ErrorCode(3201, "产品工艺 不存在"); ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(3300, "客户不存在"); + ErrorCode CUSTOMER_LOGIN_STATUS_DISABLE = new ErrorCode(3301, "客户已被禁用!请联系管理员"); + ErrorCode CUSTOMER_ADDRESS_NOT_EXISTS = new ErrorCode(3302, "地址信息数据 不存在"); ErrorCode SHAPE_TEMPLATE_NOT_EXISTS = new ErrorCode(3400, "图形模板管理 不存在"); ErrorCode DRAFT_DESIGN_DATA_NOT_EXISTS = new ErrorCode(3500, "稿件模板数据 不存在"); ErrorCode SALE_ORDER_NOT_EXISTS = new ErrorCode(3600, "OMS销售订单不存在"); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/brand/vo/BrandRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/brand/vo/BrandRespVO.java index 3ee518a..d5e7aad 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/brand/vo/BrandRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/brand/vo/BrandRespVO.java @@ -39,6 +39,11 @@ public class BrandRespVO { @ExcelProperty("官网") private String website; + + @Schema(description = "品牌数量") + @ExcelProperty("品牌数量") + private Integer productCount; + @Schema(description = "语言标识 字典-language_locale") @ExcelProperty("语言标识 字典-language_locale") private String locale; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/AddressFrontController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/AddressFrontController.java new file mode 100644 index 0000000..1e4b09f --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/AddressFrontController.java @@ -0,0 +1,84 @@ +package cn.hangtag.module.oms.controller.admin.customer.front; + +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.ip.core.Area; +import cn.hangtag.framework.ip.core.utils.AreaUtils; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoVO; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoValidate; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressReqVO; +import cn.hangtag.module.oms.service.customer.CustomerAddressService; +import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.system.controller.app.ip.vo.AppAreaNodeRespVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +import java.util.List; + +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +@Tag(name = "前台 - 客户") +@RestController +@RequestMapping("/front/oms/address") +@Validated +@AllArgsConstructor +public class AddressFrontController { + private final CustomerService customerService; + private final CustomerAddressService addressService; + + @PostMapping("/submit") + @Operation(summary = "更新品牌管理 ") + // todo 权限 + public CommonResult submit(@Valid @RequestBody AddressInfoValidate info) { + Long id = addressService.submit(info); + return success(id); + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除 ") + @Parameter(name = "id", description = "主键id", required = true) + public CommonResult delete(@PathVariable("id") Long id) { + addressService.delById(id); + return success(true); + } + + @GetMapping("/{id}") + @Operation(summary = "获取明细 ") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getBrand(@PathVariable("id") Long id) { + AddressInfoVO vo = addressService.getAddressInfo(id); + return success(vo); + } + @PutMapping("/default/{id}") + @Operation(summary = "获取明细 ") + @Parameter(name = "id", description = "编号") + public CommonResult setDefaultAddress(@PathVariable("id") Long id) { + addressService.setDefaultAddress(id); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得品牌管理 分页") + public CommonResult> getBrandPage(@Valid AddressReqVO vo) { + PageResult pageResult = addressService.queryPage(vo); + return success(pageResult); + } + + @GetMapping("/area-tree/{type}") + public CommonResult> getAreaTree(@PathVariable Integer type) { + int anInt = FuncUtil.toInt(type, 0); + Area area = AreaUtils.getArea(anInt == 1 ? 1 : 0); + return success(BeanUtils.toBean(area.getChildren(), AppAreaNodeRespVO.class)); + } + + + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/CustomerFrontController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/CustomerFrontController.java new file mode 100644 index 0000000..7442d1a --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/CustomerFrontController.java @@ -0,0 +1,38 @@ +package cn.hangtag.module.oms.controller.admin.customer.front; + +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.security.core.LoginUser; +import cn.hangtag.framework.security.core.util.SecurityFrameworkUtils; + +import cn.hangtag.module.oms.controller.admin.customer.front.vo.CustomerInfoVO; +import cn.hangtag.module.oms.service.customer.CustomerService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +@Tag(name = "前台 - 客户") +@RestController +@RequestMapping("/front/oms/customer") +@Validated +@AllArgsConstructor +public class CustomerFrontController { + private final CustomerService customerService; + + @GetMapping("/info") + @Operation(summary = "获得客户") + public CommonResult getCustomer() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + CustomerInfoVO vo = customerService.queryLoginCustomerInfo(loginUser.getId()); + return success(vo); + } + + + + + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoVO.java new file mode 100644 index 0000000..141e42e --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoVO.java @@ -0,0 +1,48 @@ +package cn.hangtag.module.oms.controller.admin.customer.front.vo; + +import cn.hangtag.framework.common.util.SafeUseUtil; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerAddressDO; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +public class AddressInfoVO implements Serializable { + + /** + * ID + */ + @TableId + private Long id; + /** + * 关联到客户的ID,外键指向客户表 + */ + private Long customerId; + /** + * 收货人姓名 + */ + private String name; + /** + * 联系电话 + */ + private String phone; + /** + * 区/县 + */ + private Integer areaId; + /** + * 详细地址 + */ + private String address; + /** + * 是否为默认地址,0表示否,1表示是 + */ + private Boolean isDefault; + + public AddressInfoVO(CustomerAddressDO addressDO) { + SafeUseUtil.copyProperties(addressDO,this); + } +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoValidate.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoValidate.java new file mode 100644 index 0000000..df08762 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressInfoValidate.java @@ -0,0 +1,64 @@ +package cn.hangtag.module.oms.controller.admin.customer.front.vo; + +import cn.hangtag.framework.common.util.SafeUseUtil; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerAddressDO; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 地址信息验证 + * + * @author YuanFeng + * @date 2024/10/15 + */ +@Data +@NoArgsConstructor +public class AddressInfoValidate implements Serializable { + + /** + * ID + */ + @TableId + private Long id; + + private Long customerId; + + @NotEmpty(message = "名称不能为空") + @Length(min = 1, max = 64, message = "名称 name不能大于64个字符") + private String name; + + @NotEmpty(message = "联系电话 phone不能为空") + private String phone; + /** + * 区/县 + */ + @NotNull(message = "areaId 地区不能为空") + private Integer areaId; + /** + * 详细地址 + */ + @NotEmpty(message = "详细地址 不能为空") + @Length(min = 1, max = 512, message = "详细地址 name不能大于512个字符") + private String address; + /** + * 是否为默认地址,0表示否,1表示是 + */ + private Boolean isDefault; + + public Boolean getIsDefault() { + if(this.isDefault == null){ + isDefault = false; + } + return isDefault; + } + + public AddressInfoValidate(CustomerAddressDO addressDO) { + SafeUseUtil.copyProperties(addressDO,this); + } +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressReqVO.java new file mode 100644 index 0000000..6375346 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/AddressReqVO.java @@ -0,0 +1,46 @@ +package cn.hangtag.module.oms.controller.admin.customer.front.vo; + +import cn.hangtag.framework.common.pojo.PageParam; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "前台 - 客户地址分页 ") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AddressReqVO extends PageParam { + + /** + * ID + */ + @TableId + private Long id; + /** + * 关联到客户的ID,外键指向客户表 + */ + private Long customerId; + /** + * 收货人姓名 + */ + private String name; + /** + * 联系电话 + */ + private String phone; + /** + * 区/县 + */ + private Integer areaId; + /** + * 详细地址 + */ + private String address; + /** + * 是否为默认地址,0表示否,1表示是 + */ + private Boolean isDefault; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/CustomerInfoVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/CustomerInfoVO.java new file mode 100644 index 0000000..f2c2e09 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/front/vo/CustomerInfoVO.java @@ -0,0 +1,74 @@ +package cn.hangtag.module.oms.controller.admin.customer.front.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.io.Serializable; +import java.util.List; + +@Schema(description = "客户信息 VO") +@Data +@ToString(callSuper = true) +public class CustomerInfoVO implements Serializable { + + @Schema(description = "ID") + private Long id; + + @Schema(description = "编码") + private String number; + + @Schema(description = "名称") + private String name; + + @Schema(description = "公司") + private String company; + + @Schema(description = "类型") + private String type; + + @Schema(description = "数据状态") + private String status; + /** + * 公司地址 + */ + private String companyAddress; + /** + * 邮箱 + */ + private String email; + /** + * 联系人 + */ + private String contacts; + /** + * 联系人手机号 + */ + private String phone; + /** + * 跟单员 + */ + private String gdperson; + /** + * 销售员 + */ + private String saleperson; + + private String invoiceCode; + + private String invoiceName; + + private String invoiceAddress; + + /** + * 所属地区 + */ + private List addressList; + + /** + * 备注 + */ + private String remarks; + + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/draftdesigndata/vo/DraftDesignDataRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/draftdesigndata/vo/DraftDesignDataRespVO.java index 615bd14..b4bf329 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/draftdesigndata/vo/DraftDesignDataRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/draftdesigndata/vo/DraftDesignDataRespVO.java @@ -59,4 +59,9 @@ public class DraftDesignDataRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + + @Schema(description = "产品计数") + @ExcelProperty("产品计数") + private Integer productCount; + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/ProductInfoController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/ProductInfoController.java index 6ad878f..3646dbd 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/ProductInfoController.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/productinfo/ProductInfoController.java @@ -1,5 +1,6 @@ package cn.hangtag.module.oms.controller.admin.productinfo; +import cn.hangtag.framework.mybatis.build.QueryFilterInfo; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -8,7 +9,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; -import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; import java.util.*; @@ -79,6 +79,15 @@ public class ProductInfoController { return success(BeanUtils.toBean(pageResult, ProductInfoRespVO.class)); } + + @PostMapping("/query") + @Operation(summary = "获得产品资料 分页") + @PreAuthorize("@ss.hasPermission('oms:product-info:query')") + public CommonResult> queryPage(@RequestBody QueryFilterInfo queryFilterInfo) { + PageResult pageResult = productInfoService.queryPage(queryFilterInfo); + return success(BeanUtils.toBean(pageResult, ProductInfoRespVO.class)); + } + @GetMapping("/export-excel") @Operation(summary = "导出产品资料 Excel") @PreAuthorize("@ss.hasPermission('oms:product-info:export')") diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderFrontController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderFrontController.java deleted file mode 100644 index 4be26d9..0000000 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderFrontController.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.hangtag.module.oms.controller.admin.saleorder; - -import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; -import cn.hangtag.framework.common.pojo.CommonResult; -import cn.hangtag.framework.common.pojo.PageParam; -import cn.hangtag.framework.common.pojo.PageResult; -import cn.hangtag.framework.common.util.number.NumberUtils; -import cn.hangtag.framework.common.util.object.BeanUtils; -import cn.hangtag.framework.excel.core.util.ExcelUtils; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.CreateSaleOrderDTO; -import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO; -import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderRemarkReqVO; -import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderRespVO; -import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderSaveReqVO; -import cn.hangtag.module.oms.convert.saleorder.SaleOrderConvert; -import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; -import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; -import cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO; -import cn.hangtag.module.oms.service.customer.CustomerService; -import cn.hangtag.module.oms.service.saleorder.SaleOrderService; -import cn.hangtag.module.system.api.user.AdminUserApi; -import cn.hangtag.module.system.api.user.dto.AdminUserRespDTO; -import cn.hutool.core.map.MapUtil; -import com.alibaba.fastjson.JSONObject; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.annotation.security.PermitAll; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.EXPORT; -import static cn.hangtag.framework.common.pojo.CommonResult.success; - -@Tag(name = "销售订单") -@RestController -@RequestMapping("/front/oms/sale-order") -@Validated -public class SaleOrderFrontController { - - @Resource - private SaleOrderService saleOrderService; - @Resource - private CustomerService customerService; - @Resource - private AdminUserApi adminUserApi; - - - @PostMapping("/placeOrder") - @Operation(summary = "下单") - public CommonResult placeOrder(@Valid @RequestBody CreateSaleOrderDTO dto) { - return success(saleOrderService.placeOrder(dto)); - } - -} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/SaleOrderFrontController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/SaleOrderFrontController.java new file mode 100644 index 0000000..c7b875d --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/SaleOrderFrontController.java @@ -0,0 +1,38 @@ +package cn.hangtag.module.oms.controller.admin.saleorder.front; + +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.CreateSaleOrderDTO; +import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.oms.service.saleorder.SaleOrderService; +import cn.hangtag.module.system.api.user.AdminUserApi; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +@Tag(name = "销售订单") +@RestController +@RequestMapping("/front/oms/sale-order") +@Validated +public class SaleOrderFrontController { + + @Resource + private SaleOrderService saleOrderService; + @Resource + private CustomerService customerService; + @Resource + private AdminUserApi adminUserApi; + + + @PostMapping("/placeOrder") + @Operation(summary = "下单") + public CommonResult placeOrder(@Valid @RequestBody CreateSaleOrderDTO dto) { + return success(saleOrderService.placeOrder(dto)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/CreateSaleOrderDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java similarity index 89% rename from hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/CreateSaleOrderDTO.java rename to hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java index 2836cbb..42762fa 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/CreateSaleOrderDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/CreateSaleOrderDTO.java @@ -1,10 +1,9 @@ -package cn.hangtag.module.oms.controller.admin.saleorder.dto; +package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; -import java.util.ArrayList; import java.util.List; @Data @@ -80,11 +79,24 @@ public class CreateSaleOrderDTO implements Serializable { */ private Long plansenddate; + /** + * 交货地址 + */ + private String deliveryAddress; + + /** + * 交货备注 + */ + private String deliveryRemark; + + /** * 是否分批交货 */ private Boolean isBatch; + + private List saleOrderEntry; } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/PropSortInfo.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/PropSortInfo.java similarity index 86% rename from hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/PropSortInfo.java rename to hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/PropSortInfo.java index 085edfd..16602fb 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/PropSortInfo.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/PropSortInfo.java @@ -1,4 +1,4 @@ -package cn.hangtag.module.oms.controller.admin.saleorder.dto; +package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; import lombok.Data; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderEntryItemDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderEntryItemDTO.java similarity index 92% rename from hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderEntryItemDTO.java rename to hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderEntryItemDTO.java index 236e4b3..c3d50a7 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderEntryItemDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderEntryItemDTO.java @@ -1,4 +1,4 @@ -package cn.hangtag.module.oms.controller.admin.saleorder.dto; +package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; import lombok.Data; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderSkuDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderSkuDTO.java similarity index 93% rename from hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderSkuDTO.java rename to hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderSkuDTO.java index 6490b08..465db36 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SaleOrderSkuDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SaleOrderSkuDTO.java @@ -1,4 +1,4 @@ -package cn.hangtag.module.oms.controller.admin.saleorder.dto; +package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; import lombok.Data; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SpecInfoDTO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SpecInfoDTO.java similarity index 88% rename from hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SpecInfoDTO.java rename to hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SpecInfoDTO.java index 5ffafb4..900e6e6 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/dto/SpecInfoDTO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/front/dto/SpecInfoDTO.java @@ -1,4 +1,4 @@ -package cn.hangtag.module.oms.controller.admin.saleorder.dto; +package cn.hangtag.module.oms.controller.admin.saleorder.front.dto; import lombok.Data; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/brand/BrandDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/brand/BrandDO.java index 0fca4de..e8242a7 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/brand/BrandDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/brand/BrandDO.java @@ -1,5 +1,8 @@ package cn.hangtag.module.oms.dal.dataobject.brand; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.*; import java.util.*; import java.time.LocalDateTime; @@ -62,4 +65,10 @@ public class BrandDO extends BaseDO { */ private String remark; + /** + * 产品计数 + */ + private Integer productCount; + + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/draftdesigndata/DraftDesignDataDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/draftdesigndata/DraftDesignDataDO.java index 764ba5e..e9ece33 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/draftdesigndata/DraftDesignDataDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/draftdesigndata/DraftDesignDataDO.java @@ -66,4 +66,10 @@ public class DraftDesignDataDO extends BaseDO { */ private String propDefault; + + /** + * 产品计数 + */ + private Integer productCount; + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java index 561b5f5..d5c1d6a 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java @@ -1,16 +1,10 @@ package cn.hangtag.module.oms.dal.dataobject.saleorder; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.CreateSaleOrderDTO; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.CreateSaleOrderDTO; import cn.hutool.core.bean.BeanUtil; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.math.BigDecimal; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.time.LocalDateTime; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; @@ -100,6 +94,17 @@ public class SaleOrderDO extends BaseDO { * 发票名称 */ private String invoiceName; + + /** + * 发票地址 + */ + private String invoiceAddress; + + /** + * 发票备注 + */ + private String invoiceRemarks; + /** * 地址 */ @@ -108,10 +113,7 @@ public class SaleOrderDO extends BaseDO { * 货币 */ private String currency; - /** - * 发票备注 - */ - private String invoiceRemarks; + /** * 驳回原因 */ @@ -145,10 +147,7 @@ public class SaleOrderDO extends BaseDO { * 零售商单号 */ private String retailerCode; - /** - * 发票地址 - */ - private String invoiceAddress; + /** @@ -161,7 +160,15 @@ public class SaleOrderDO extends BaseDO { */ private Boolean isBatch; + /** + * 交货地址 + */ + private String deliveryAddress; + /** + * 交货备注 + */ + private String deliveryRemark; public SaleOrderDO(CreateSaleOrderDTO dto) { BeanUtil.copyProperties(dto, this,"bizdate","plansenddate"); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/customer/CustomerAddressMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/customer/CustomerAddressMapper.java index b607425..6f92ded 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/customer/CustomerAddressMapper.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/customer/CustomerAddressMapper.java @@ -25,4 +25,5 @@ public interface CustomerAddressMapper extends BaseMapperX { return delete(CustomerAddressDO::getCustomerId, customerId); } + int restDefaultAddress(Long customerId); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/productinfo/ProductInfoMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/productinfo/ProductInfoMapper.java index 8077d96..c3275ee 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/productinfo/ProductInfoMapper.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/productinfo/ProductInfoMapper.java @@ -2,10 +2,16 @@ package cn.hangtag.module.oms.dal.mysql.productinfo; import java.util.*; +import cn.hangtag.framework.common.pojo.PageParam; import cn.hangtag.framework.common.pojo.PageResult; + +import cn.hangtag.framework.mybatis.build.MybatisPlusUtil; +import cn.hangtag.framework.mybatis.build.QueryFilterInfo; import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import cn.hangtag.module.oms.controller.admin.productinfo.vo.*; @@ -33,4 +39,16 @@ public interface ProductInfoMapper extends BaseMapperX { .orderByDesc(ProductInfoDO::getId)); } + default PageResult selectPagePlus(QueryFilterInfo queryFilterInfo) { + PageParam pager = queryFilterInfo.getPager(); + QueryWrapper queryWrapper = MybatisPlusUtil + .parseQuery(queryFilterInfo, true,ProductInfoDO.class, + "pageNo", "pageSize", "PAGE_NO", "PAGE_SIZE", "PAGE_SIZE_NONE"); + queryWrapper.orderByDesc("id"); + PageResult productInfoDOPageResult = selectPage(pager, queryWrapper); + + return productInfoDOPageResult; + } + + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandService.java index 3573b91..facba3f 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandService.java @@ -69,4 +69,13 @@ public interface BrandService { * @return 品牌编号集合 */ Set getCustomerBrandListByCustomerId(Collection customerIds); + + + /** + * 更新产品计数 + * + * @param id ID 品牌id + * @return {@link Integer } + */ + Integer updateProductCount(Long id); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandServiceImpl.java index 7866e0d..d89bac3 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/brand/BrandServiceImpl.java @@ -6,7 +6,9 @@ import cn.hangtag.framework.common.util.FuncUtil; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; import cn.hangtag.module.oms.base.dal.dataobject.producttype.ProductTypeDO; import cn.hangtag.module.oms.dal.dataobject.customerbrand.CustomerBrandDO; +import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; import cn.hangtag.module.oms.dal.mysql.customerbrand.CustomerBrandMapper; +import cn.hangtag.module.oms.dal.mysql.productinfo.ProductInfoMapper; import cn.hangtag.module.oms.enums.BrandErrorCodeConstants; import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; import cn.hangtag.module.system.dal.dataobject.permission.MenuDO; @@ -14,15 +16,19 @@ import cn.hangtag.module.system.dal.dataobject.permission.RoleMenuDO; import cn.hangtag.module.system.dal.mysql.permission.RoleMenuMapper; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; + import javax.annotation.Resource; + import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.util.*; + import cn.hangtag.module.oms.controller.admin.brand.vo.*; import cn.hangtag.module.oms.dal.dataobject.brand.BrandDO; import cn.hangtag.framework.common.pojo.PageResult; @@ -43,21 +49,21 @@ import static java.util.Collections.singleton; @Service @Validated @Slf4j +@AllArgsConstructor public class BrandServiceImpl implements BrandService { - @Resource - private BrandMapper brandMapper; - @Resource - private CustomerBrandMapper customerBrandMapper; + private final BrandMapper brandMapper; + private final ProductInfoMapper productInfoMapper; + private final CustomerBrandMapper customerBrandMapper; @Override public Long createBrand(BrandSaveReqVO createReqVO) { // 插入 BrandDO brand = BeanUtils.toBean(createReqVO, BrandDO.class); String code = brand.getCode(); - if(FuncUtil.isNotEmpty(code)){ - checkCode(brand.getId(),code); - }else { + if (FuncUtil.isNotEmpty(code)) { + checkCode(brand.getId(), code); + } else { brand.setCode(getNewCode()); } brandMapper.insert(brand); @@ -72,15 +78,30 @@ public class BrandServiceImpl implements BrandService { // 更新 BrandDO updateObj = BeanUtils.toBean(updateReqVO, BrandDO.class); String code = updateObj.getCode(); - if(FuncUtil.isNotEmpty(code)){ - checkCode(updateObj.getId(),code); - }else { + if (FuncUtil.isNotEmpty(code)) { + checkCode(updateObj.getId(), code); + } else { updateObj.setCode(getNewCode()); } brandMapper.updateById(updateObj); } + @Override + public Integer updateProductCount(Long id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductInfoDO::getBrandId, id); + queryWrapper.eq(ProductInfoDO::getDeleted, 0); + Long l = productInfoMapper.selectCount(queryWrapper); + int count = FuncUtil.toInt(l, 0); + // 更新数量 + BrandDO brandDO = new BrandDO(); + brandDO.setId(id); + brandDO.setProductCount(count); + brandMapper.updateById(brandDO); + return count; + } + @Override public void deleteBrand(Long id) { // 校验存在 @@ -109,15 +130,15 @@ public class BrandServiceImpl implements BrandService { public String getNewCode() { String s = ""; int count = 10; - while (true){ - count --; + while (true) { + count--; try { - s = CodingRulesUtils.generateCode(2L, false); - checkCode(null,s); - return s; - }catch (ServiceException e){ + s = CodingRulesUtils.generateCode(2L, false); + checkCode(null, s); + return s; + } catch (ServiceException e) { log.warn("重复或者下一个编码"); - if(count < 0){ + if (count < 0) { log.error("编码获取失败"); return ""; } @@ -140,20 +161,20 @@ public class BrandServiceImpl implements BrandService { } - private void checkCode(Long id,String code){ - if(FuncUtil.isNotEmpty(code)){ + private void checkCode(Long id, String code) { + if (FuncUtil.isNotEmpty(code)) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.select(BrandDO::getId,BrandDO::getCode, BaseDO::getDeleted); + lambdaQueryWrapper.select(BrandDO::getId, BrandDO::getCode, BaseDO::getDeleted); lambdaQueryWrapper.eq(BrandDO::getCode, code); - lambdaQueryWrapper.eq(BrandDO::getDeleted,false); + lambdaQueryWrapper.eq(BrandDO::getDeleted, false); List dos = brandMapper.selectList(lambdaQueryWrapper); - if(FuncUtil.isEmpty(id) && FuncUtil.isNotEmpty(dos)){ + if (FuncUtil.isEmpty(id) && FuncUtil.isNotEmpty(dos)) { throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); } if (FuncUtil.isNotEmpty(id) && FuncUtil.isNotEmpty(dos)) { for (BrandDO aDo : dos) { // 出现重复并当前id 不一致 - if(!FuncUtil.equals(aDo.getId(), id)){ + if (!FuncUtil.equals(aDo.getId(), id)) { throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); } } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressService.java new file mode 100644 index 0000000..830916d --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressService.java @@ -0,0 +1,35 @@ +package cn.hangtag.module.oms.service.customer; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoVO; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoValidate; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressReqVO; + +/** + * 客户 Service 接口 + * + * @author wwb + */ +public interface CustomerAddressService { + + Long submit(AddressInfoValidate addressInfo); + + void delById(Long id); + + AddressInfoVO getAddressInfo(Long id); + + /** + * 查询页 + * + * @param vo vo + * @return {@link PageResult }<{@link AddressInfoVO }> + */ + PageResult queryPage(AddressReqVO vo); + + /** + * 设置默认地址 + * + * @param id ID + */ + void setDefaultAddress(Long id); +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressServiceImpl.java new file mode 100644 index 0000000..813f7ed --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerAddressServiceImpl.java @@ -0,0 +1,144 @@ +package cn.hangtag.module.oms.service.customer; + +import cn.hangtag.framework.common.exception.ServiceException; +import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.SafeUseUtil; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.common.util.validation.AssertUtil; +import cn.hangtag.framework.mybatis.build.MybatisPlusUtil; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; +import cn.hangtag.framework.security.core.LoginUser; +import cn.hangtag.framework.security.core.util.SecurityFrameworkUtils; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoVO; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoValidate; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressReqVO; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.CustomerInfoVO; +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerPageReqVO; +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerSaveReqVO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerAddressDO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.mysql.customer.CustomerAddressMapper; +import cn.hangtag.module.oms.dal.mysql.customer.CustomerMapper; +import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; +import cn.hangtag.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import cn.hangtag.module.system.service.permission.PermissionService; +import cn.hangtag.module.system.service.user.AdminUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; + +/** + * 客户 Service 实现类 + * + * @author wwb + */ +@Service +@Validated +@AllArgsConstructor +@Slf4j +public class CustomerAddressServiceImpl implements CustomerAddressService { + + private CustomerAddressMapper customerAddressMapper; + private CustomerMapper customerMapper; + private CustomerService customerService; + + @Override + public Long submit(AddressInfoValidate addressInfo) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + CustomerDO customerDO = customerService.getCanUseCustomer(loginUser.getId()); + // 客户档案可用 + CustomerAddressDO addressDO = new CustomerAddressDO(); + Long id = addressInfo.getId(); + SafeUseUtil.copyProperties(addressInfo, addressDO); + addressDO.setCustomerId(customerDO.getId()); + if(FuncUtil.isEmpty(id)){ + customerAddressMapper.insert(addressDO); + id = addressDO.getId(); + }else { + customerAddressMapper.updateById(addressDO); + } + if(addressDO.getIsDefault()){ + setDefaultAddress(id); + } + return id; + } + + @Override + public void delById(Long id) { + CustomerAddressDO addressDO = customerAddressMapper.selectById(id); + AssertUtil.isEmpty(addressDO, CUSTOMER_ADDRESS_NOT_EXISTS.getMsg()); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + CustomerDO customerDO = customerService.getCanUseCustomer(loginUser.getId()); + Long customerId = addressDO.getCustomerId(); + if(!FuncUtil.equals(customerDO, customerId)){ + // 删除非本客户档案 + throw exception(AUTH_USER_NOT_PERMISSION); + } + // 删除客户地址 + customerAddressMapper.deleteById(id); + } + + @Override + public AddressInfoVO getAddressInfo(Long id) { + CustomerAddressDO addressDO = customerAddressMapper.selectById(id); + AssertUtil.isEmpty(addressDO, CUSTOMER_ADDRESS_NOT_EXISTS.getMsg()); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + CustomerDO customerDO = customerService.getCanUseCustomer(loginUser.getId()); + Long customerId = addressDO.getCustomerId(); + if(!FuncUtil.equals(customerDO.getId(), customerId)){ + // 非本客户档案 + throw exception(AUTH_USER_NOT_PERMISSION); + } + return new AddressInfoVO(addressDO); + } + + @Override + public PageResult queryPage(AddressReqVO vo) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + CustomerDO customerDO = customerService.getCanUseCustomer(loginUser.getId()); + PageParam pageParam = new PageParam(); + pageParam.setPageNo(vo.getPageNo()); + pageParam.setPageSize(vo.getPageSize()); + vo.setCustomerId(customerDO.getId()); + QueryWrapper queryWrapper = MybatisPlusUtil.buildQueryFor("customerId@=,name@like,address@like,phone@like", + vo, + CustomerAddressDO.class, MybatisPlusUtil.defaultIgnoreFilters); + + PageResult result = customerAddressMapper.selectPage(pageParam, queryWrapper); + List list = result.getList(); + List addressInfos = new ArrayList<>(); + for (CustomerAddressDO addressDO : list) { + addressInfos.add(new AddressInfoVO(addressDO)); + } + PageResult result2 = new PageResult<>(addressInfos, result.getTotal()); + return result2; + } + + @Override + public void setDefaultAddress(Long id) { + CustomerAddressDO addressDO = customerAddressMapper.selectById(id); + AssertUtil.isEmpty(addressDO, CUSTOMER_ADDRESS_NOT_EXISTS.getMsg()); + Long customerId = addressDO.getCustomerId(); + customerAddressMapper.restDefaultAddress(customerId); + CustomerAddressDO addressDO1 = new CustomerAddressDO(); + addressDO1.setId(id); + addressDO1.setIsDefault(true); + customerAddressMapper.updateById(addressDO1); + + } +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerService.java index 514a0f3..799f475 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerService.java @@ -3,10 +3,10 @@ package cn.hangtag.module.oms.service.customer; import java.util.*; import javax.validation.*; import cn.hangtag.module.oms.controller.admin.customer.vo.*; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.CustomerInfoVO; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerAddressDO; import cn.hangtag.framework.common.pojo.PageResult; -import cn.hangtag.framework.common.pojo.PageParam; /** * 客户 Service 接口 @@ -65,4 +65,19 @@ public interface CustomerService { CustomerDO getCustomerByUserId(Long userId); + /** + * 前台 带出查询登录客户信息 包含地址 + * + * @param userId 用户id + * @return {@link CustomerInfoVO } + */ + CustomerInfoVO queryLoginCustomerInfo(Long userId); + + /** + * 获取可以使用客户 + * + * @param userId 用户id + * @return {@link CustomerDO } + */ + CustomerDO getCanUseCustomer(Long userId); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerServiceImpl.java index dd5da09..73c8c8d 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/customer/CustomerServiceImpl.java @@ -3,13 +3,20 @@ package cn.hangtag.module.oms.service.customer; import cn.hangtag.framework.common.exception.ServiceException; import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.SafeUseUtil; +import cn.hangtag.framework.common.util.validation.AssertUtil; +import cn.hangtag.framework.mybatis.build.MybatisPlusUtil; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; -import cn.hangtag.module.oms.dal.dataobject.produceorder.ProduceOrderDO; +import cn.hangtag.framework.security.core.LoginUser; +import cn.hangtag.framework.security.core.util.SecurityFrameworkUtils; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.AddressInfoVO; +import cn.hangtag.module.oms.controller.admin.customer.front.vo.CustomerInfoVO; import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; import cn.hangtag.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.hangtag.module.system.service.permission.PermissionService; import cn.hangtag.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; @@ -23,7 +30,6 @@ import cn.hangtag.module.oms.controller.admin.customer.vo.*; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerAddressDO; import cn.hangtag.framework.common.pojo.PageResult; -import cn.hangtag.framework.common.pojo.PageParam; import cn.hangtag.framework.common.util.object.BeanUtils; import cn.hangtag.module.oms.dal.mysql.customer.CustomerMapper; @@ -172,6 +178,31 @@ public class CustomerServiceImpl implements CustomerService { return customerDO; } + @Override + public CustomerInfoVO queryLoginCustomerInfo(Long userId) { + CustomerDO customerDO = customerMapper.selectOne(CustomerDO::getUserId, userId); + String status = customerDO.getStatus(); + if("0".equals(status)){ + throw exception(CUSTOMER_LOGIN_STATUS_DISABLE); + } + CustomerInfoVO infoVO = new CustomerInfoVO(); + SafeUseUtil.copyProperties(customerDO,infoVO); + CustomerAddressDO addressDO = new CustomerAddressDO(); + addressDO.setCustomerId(customerDO.getId()); + addressDO.setDeleted(false); + QueryWrapper queryWrapper = MybatisPlusUtil.buildQuery(addressDO); + queryWrapper.orderByDesc("is_default"); + List list = customerAddressMapper.selectList(queryWrapper); + List addressInfos = new ArrayList<>(); + for (CustomerAddressDO aDo : list) { + AddressInfoVO infoVO1 = new AddressInfoVO(aDo); + addressInfos.add(infoVO1); + } + infoVO.setAddressList(addressInfos); + + return infoVO; + } + private void createCustomerAddressList(Long customerId, List list) { list.forEach(o -> o.setCustomerId(customerId)); customerAddressMapper.insertBatch(list); @@ -230,4 +261,23 @@ public class CustomerServiceImpl implements CustomerService { } } + /** + * 获取可以使用客户 + * + * @param userId 用户id + * @return {@link CustomerDO } + */ + @Override + public CustomerDO getCanUseCustomer(Long userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CustomerDO::getUserId, userId); + queryWrapper.eq(CustomerDO::getDeleted, false); + queryWrapper.orderByDesc(BaseDO::getCreateTime); + CustomerDO customerDO = customerMapper.selectOne(queryWrapper,false); + AssertUtil.isEmpty(customerDO,CUSTOMER_NOT_EXISTS.getMsg()); + String status = customerDO.getStatus(); + AssertUtil.isFalse(status.equals("1"), CUSTOMER_LOGIN_STATUS_DISABLE.getMsg()); + return customerDO; + } + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataService.java index 17a6167..7023183 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataService.java @@ -53,4 +53,12 @@ public interface DraftDesignDataService { PageResult getDraftDesignDataPage(DraftDesignDataPageReqVO pageReqVO); String getNewCode(); + + /** + * 更新产品计数 + * + * @param id ID + * @return {@link Integer } + */ + Boolean updateProductCount(String id); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataServiceImpl.java index f2bc9e9..033fb7d 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/draftdesigndata/DraftDesignDataServiceImpl.java @@ -3,21 +3,23 @@ package cn.hangtag.module.oms.service.draftdesigndata; import cn.hangtag.framework.common.exception.ServiceException; import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.hangtag.framework.common.util.FuncUtil; + +import cn.hangtag.framework.mybatis.build.MybatisPlusUtil; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; -import cn.hangtag.module.oms.dal.dataobject.brand.BrandDO; +import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; +import cn.hangtag.module.oms.dal.mysql.productinfo.ProductInfoMapper; import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; import java.util.*; import cn.hangtag.module.oms.controller.admin.draftdesigndata.vo.*; import cn.hangtag.module.oms.dal.dataobject.draftdesigndata.DraftDesignDataDO; import cn.hangtag.framework.common.pojo.PageResult; -import cn.hangtag.framework.common.pojo.PageParam; import cn.hangtag.framework.common.util.object.BeanUtils; import cn.hangtag.module.oms.dal.mysql.draftdesigndata.DraftDesignDataMapper; @@ -33,10 +35,11 @@ import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; @Service @Validated @Slf4j +@AllArgsConstructor public class DraftDesignDataServiceImpl implements DraftDesignDataService { - @Resource - private DraftDesignDataMapper draftDesignDataMapper; + private final DraftDesignDataMapper draftDesignDataMapper; + private final ProductInfoMapper productInfoMapper; @Override public Long createDraftDesignData(DraftDesignDataSaveReqVO createReqVO) { @@ -98,6 +101,27 @@ public class DraftDesignDataServiceImpl implements DraftDesignDataService { return draftDesignDataMapper.selectPage(pageReqVO); } + @Override + public Boolean updateProductCount(String id) { + + List list = FuncUtil.toLongList(",", id); + for (Long draftId : list) { + ProductInfoDO productInfoDO = new ProductInfoDO(); + productInfoDO.setDraftDesignDataId(draftId.toString()); + QueryWrapper queryWrapper = MybatisPlusUtil.buildQuery("draft_design_data_id@inSet", productInfoDO); + + + Long l = productInfoMapper.selectCount(queryWrapper); + int count = FuncUtil.toInt(l, 0); + // 更新数量 + DraftDesignDataDO designDataDO = new DraftDesignDataDO(); + designDataDO.setId(draftId); + designDataDO.setProductCount(count); + draftDesignDataMapper.updateById(designDataDO); + } + + return true; + } @Override public String getNewCode() { String s = ""; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java index bec5194..010f9ed 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoService.java @@ -1,11 +1,12 @@ package cn.hangtag.module.oms.service.productinfo; -import java.util.*; import javax.validation.*; + + +import cn.hangtag.framework.mybatis.build.QueryFilterInfo; import cn.hangtag.module.oms.controller.admin.productinfo.vo.*; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; import cn.hangtag.framework.common.pojo.PageResult; -import cn.hangtag.framework.common.pojo.PageParam; /** * 产品资料 Service 接口 @@ -52,6 +53,8 @@ public interface ProductInfoService { */ PageResult getProductInfoPage(ProductInfoPageReqVO pageReqVO); + PageResult queryPage(QueryFilterInfo queryFilterInfo); + /** * 获取编码 * diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java index 0faf156..29a9efb 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/productinfo/ProductInfoServiceImpl.java @@ -3,6 +3,8 @@ package cn.hangtag.module.oms.service.productinfo; import cn.hangtag.framework.common.exception.ServiceException; import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; import cn.hangtag.framework.common.util.FuncUtil; + +import cn.hangtag.framework.mybatis.build.QueryFilterInfo; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; import cn.hangtag.module.oms.base.dal.dataobject.producttype.ProductTypeDO; import cn.hangtag.module.oms.base.dal.mysql.producttype.ProductTypeMapper; @@ -14,7 +16,11 @@ import cn.hangtag.module.oms.dal.dataobject.productprocess.ProductProcessDO; import cn.hangtag.module.oms.dal.mysql.brand.BrandMapper; import cn.hangtag.module.oms.dal.mysql.productprocess.ProductProcessMapper; import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; +import cn.hangtag.module.oms.service.brand.BrandService; +import cn.hangtag.module.oms.service.draftdesigndata.DraftDesignDataService; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -51,8 +57,11 @@ public class ProductInfoServiceImpl implements ProductInfoService { private final BrandMapper brandMapper; private final ProductTypeMapper productTypeMapper; private final ProductProcessMapper productProcessMapper; + private final BrandService brandService; + private final DraftDesignDataService draftDesignDataService; @Override + @Transactional(rollbackFor = Exception.class) public Long createProductInfo(ProductInfoSaveReqVO createReqVO) { // 插入 ProductInfoDO productInfo = BeanUtils.toBean(createReqVO, ProductInfoDO.class); @@ -77,13 +86,17 @@ public class ProductInfoServiceImpl implements ProductInfoService { } productProcessMapper.insertBatch(subList); } + brandService.updateProductCount(productInfo.getBrandId()); + draftDesignDataService.updateProductCount(productInfo.getDraftDesignDataId()); return productInfo.getId(); } + @Override + @Transactional(rollbackFor = Exception.class) public void updateProductInfo(ProductInfoSaveReqVO updateReqVO) { // 校验存在 - validateProductInfoExists(updateReqVO.getId()); + ProductInfoDO productInfoDO = validateProductInfoExists(updateReqVO.getId()); String code = updateReqVO.getCode(); if(FuncUtil.isNotEmpty(code)){ @@ -118,20 +131,35 @@ public class ProductInfoServiceImpl implements ProductInfoService { // 更新 ProductInfoDO updateObj = BeanUtils.toBean(updateReqVO, ProductInfoDO.class); productInfoMapper.updateById(updateObj); + if (!FuncUtil.equals(productInfoDO.getBrandId(),updateReqVO.getBrandId())) { + // 产品的品牌发生变化时 + brandService.updateProductCount(updateReqVO.getBrandId()); + brandService.updateProductCount(productInfoDO.getBrandId()); + } + if (!FuncUtil.equals(productInfoDO.getDraftDesignDataId(),updateReqVO.getDraftDesignDataId())) { + // 产品的品牌发生变化时 + draftDesignDataService.updateProductCount(productInfoDO.getDraftDesignDataId()); + draftDesignDataService.updateProductCount(updateReqVO.getDraftDesignDataId()); + } + } @Override public void deleteProductInfo(Long id) { // 校验存在 - validateProductInfoExists(id); + ProductInfoDO productInfoDO = validateProductInfoExists(id); // 删除 productInfoMapper.deleteById(id); + brandService.updateProductCount(productInfoDO.getBrandId()); + draftDesignDataService.updateProductCount(productInfoDO.getDraftDesignDataId()); } - private void validateProductInfoExists(Long id) { - if (productInfoMapper.selectById(id) == null) { + private ProductInfoDO validateProductInfoExists(Long id) { + ProductInfoDO productInfoDO = productInfoMapper.selectById(id); + if (productInfoDO == null) { throw exception(PRODUCT_INFO_NOT_EXISTS); } + return productInfoDO; } @Override @@ -161,7 +189,30 @@ public class ProductInfoServiceImpl implements ProductInfoService { return productInfoDOPageResult; } - private void checkCode(Long id,String code){ + + @Override + public PageResult queryPage(QueryFilterInfo queryFilterInfo) { + PageResult productInfoDOPageResult = productInfoMapper.selectPagePlus(queryFilterInfo); + List list = productInfoDOPageResult.getList(); + list.forEach(productInfoDO -> { + if(FuncUtil.isNotEmpty(productInfoDO.getBrandId())){ + BrandDO brandDO = brandMapper.selectById(productInfoDO.getBrandId()); + if(FuncUtil.isNotEmpty(brandDO)){ + productInfoDO.setBrandName(brandDO.getName()); + } + } + if(FuncUtil.isNotEmpty(productInfoDO.getProductTypeId())){ + ProductTypeDO productTypeDO = productTypeMapper.selectById(productInfoDO.getProductTypeId()); + if(FuncUtil.isNotEmpty(productTypeDO)){ + productInfoDO.setProductTypeName(productTypeDO.getLabel()); + } + } + }); + productInfoDOPageResult.setList(list); + return productInfoDOPageResult; + } + + private void checkCode(Long id, String code){ if(FuncUtil.isNotEmpty(code)){ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.select(ProductInfoDO::getId,ProductInfoDO::getCode, BaseDO::getDeleted); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java index a07eaf0..f037227 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java @@ -6,7 +6,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.*; import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.CreateSaleOrderDTO; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.CreateSaleOrderDTO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.*; import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendReqVO; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index c9eb700..14fb0dc 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -14,9 +14,9 @@ import cn.hangtag.module.oms.common.utils.WKHtmlToPdfUtil; import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; import cn.hangtag.module.oms.controller.admin.produceorder.vo.ProduceOrderSaveReqVO; import cn.hangtag.module.oms.controller.admin.product.vo.ProductPriceSaveReqVO; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.CreateSaleOrderDTO; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.SaleOrderEntryItemDTO; -import cn.hangtag.module.oms.controller.admin.saleorder.dto.SaleOrderSkuDTO; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.CreateSaleOrderDTO; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.SaleOrderEntryItemDTO; +import cn.hangtag.module.oms.controller.admin.saleorder.front.dto.SaleOrderSkuDTO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderRemarkReqVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderSaveReqVO; @@ -52,8 +52,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -66,7 +64,6 @@ import org.springframework.validation.annotation.Validated; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; -import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; import java.io.File; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/customer/CustomerAddressMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/customer/CustomerAddressMapper.xml new file mode 100644 index 0000000..2c769ab --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/customer/CustomerAddressMapper.xml @@ -0,0 +1,15 @@ + + + + + + + update oms_customer_address set is_default = 0 where customer_id = #{customerId} + + + \ No newline at end of file diff --git a/hangtag-module-system/hangtag-module-system-api/src/main/java/cn/hangtag/module/system/enums/ErrorCodeConstants.java b/hangtag-module-system/hangtag-module-system-api/src/main/java/cn/hangtag/module/system/enums/ErrorCodeConstants.java index d6d3944..a8ee116 100644 --- a/hangtag-module-system/hangtag-module-system-api/src/main/java/cn/hangtag/module/system/enums/ErrorCodeConstants.java +++ b/hangtag-module-system/hangtag-module-system-api/src/main/java/cn/hangtag/module/system/enums/ErrorCodeConstants.java @@ -16,6 +16,7 @@ public interface ErrorCodeConstants { ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1_002_000_006, "Token 已经过期"); ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); + ErrorCode AUTH_USER_NOT_PERMISSION = new ErrorCode(1_002_000_008, "没有相关权限"); // ========== 菜单模块 1-002-001-000 ========== ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); diff --git a/hangtag-ui/hangtag-ui-admin/src/api/oms/productinfo/index.ts b/hangtag-ui/hangtag-ui-admin/src/api/oms/productinfo/index.ts index 6f6c8e6..ed2fa71 100644 --- a/hangtag-ui/hangtag-ui-admin/src/api/oms/productinfo/index.ts +++ b/hangtag-ui/hangtag-ui-admin/src/api/oms/productinfo/index.ts @@ -1,4 +1,5 @@ import request from '@/config/axios' +import {data} from "autoprefixer"; // 产品资料 VO export interface ProductInfoVO { @@ -26,6 +27,10 @@ export const ProductInfoApi = { getProductInfoPage: async (params: any) => { return await request.get({ url: `/oms/product-info/page`, params }) }, + // 查询产品资料 分页 + queryPage: async (params: any) => { + return await request.post({ url: `/oms/product-info/query`, data:{...params}}) + }, // 查询产品资料 详情 getProductInfo: async (id: number) => { diff --git a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/DesignPropEdit.vue b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/DesignPropEdit.vue index 4bf1430..f8b1621 100644 --- a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/DesignPropEdit.vue +++ b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/DesignPropEdit.vue @@ -57,34 +57,37 @@ v-loading="loading" :src="that.previewUrl"/> - -
- - - -
-
- - - +
+
+ + +
+
+ + + +
-
- - - -
-
-
+ + +
+
+ + + +
+
+
- -
-
- - -
占比
-
- - - - -
%
-
-
+ +
+
+ + +
占比
+
+ + + + +
%
+
+
+
+
+ + +
+ - + @click="appendList(that.propInfo[tmp.key])"> + 添加
-
- - 添加 - -
- -
-
-
+
+
+
- + - -
+ +
-
- - -
占比
-
- - - - -
%
-
-
+
+ + +
占比
+
+ + + + +
%
+
+
+
+
+ + +
+ - + @click="appendList(that.propInfo[tmp.key])"> + 添加
-
- - 添加 - -
- -
-
-
-
- - - + +
+
+
+ +
+ + +
-
-
- -
- - - -
- - 添加 - + + 添加 + -
+
+ +
+
+
+
+
- - - -
{ diff --git a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/ImageLibraryManage.vue b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/ImageLibraryManage.vue index c686770..4230cbd 100644 --- a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/ImageLibraryManage.vue +++ b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/ImageLibraryManage.vue @@ -162,7 +162,7 @@ const uploadInfo = async ()=>{ } const addNew = async () => { for (let i = 0; i < fileList.value.length; i++) { - const base64Info = await convertImageToBase64(fileList.value[i].url as string) + // const base64Info = await convertImageToBase64(fileList.value[i].url as string) let info ={ key: ShapeType.vueShapeImage, shape: ShapeType.vueShapeImage, @@ -173,11 +173,11 @@ const addNew = async () => { shape: VueCellShapeType.Image, style: { shape:{ - href: base64Info, + href: fileList.value[i].url, }, } }, - icon: base64Info, + icon: fileList.value[i].url, //@ts-ignore label: fileList.value[i].filename || '未命名图片', filterKeyword: function (){ return this.label } diff --git a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/layout/index.vue b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/layout/index.vue index 88a52ee..3799b28 100644 --- a/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/layout/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/components/DraftDesign/components/layout/index.vue @@ -9,14 +9,14 @@ > @@ -251,6 +251,7 @@ import BrandDataListDialog from "@/components/Dialog/src/BrandDataListDialog/ind /** 产品资料 表单 */ defineOptions({name: 'ProductInfoForm'}) +const route = useRoute() // 路由 const {t} = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const dialogVisible = ref(false) // 弹窗的是否展示 @@ -275,7 +276,9 @@ const formData = ref({ specSizeThk: 0, specMaterial: '', }) + const that = reactive({ + brandId: undefined, draftDesignList: [{ remark: '', label: '', @@ -294,7 +297,7 @@ const that = reactive({ const addRow = () => { that.draftDesignList.push({ remark: '', - label: '', + label: '默认'+Math.random().toString(36).substring(2, 5), id: '' }) } @@ -356,6 +359,7 @@ const open = async (type: string, id?: number) => { type = type ? type : 'create' dialogTitle.value = t('action.' + type) formType.value = type + that.brandId = route.query.brandId resetForm() // 修改时,设置数据 if (id) { @@ -454,7 +458,7 @@ const submitForm = async () => { data.draftDesignList = JSON.stringify(that.draftDesignList) // 作为默认的设计稿 - data.draftDesignDataId = ids[0]; + data.draftDesignDataId = ids.join(","); if (formType.value === 'create') { await ProductInfoApi.createProductInfo(data as ProductInfoVO) message.success(t('common.createSuccess')) @@ -495,7 +499,7 @@ const resetForm = () => { code: undefined, name: undefined, cover: undefined, - brandId: '', + brandId: that.brandId || '', productTypeId: '', draftDesignDataId: undefined, draftDesignList: '', diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/index.vue index 3f4aad6..6b8bef1 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/productinfo/index.vue @@ -60,6 +60,9 @@ class="!w-240px" /> + + + ([]) // 列表的数据 @@ -205,6 +209,7 @@ const queryParams = reactive({ details: undefined, createTime: [], }) + const queryFormRef = ref() // 搜索的表单 const exportLoading = ref(false) // 导出的加载中 @@ -212,7 +217,12 @@ const exportLoading = ref(false) // 导出的加载中 const getList = async () => { loading.value = true try { - const data = await ProductInfoApi.getProductInfoPage(queryParams) + const data = await ProductInfoApi.queryPage(buildQuery(queryParams,{ + easyOption: "create_time@between,name@like,code@like,draftDesignDataId@inSet", + orderBy: 'create_time desc', + ignoreField: "pageNo,pageSize" + })) + // const data = await ProductInfoApi.queryPage(queryParams) list.value = data.list total.value = data.total } finally { @@ -285,8 +295,20 @@ const init = async () => { }) }) } +let first_load = true; /** 初始化 **/ onMounted(() => { + if(first_load){ + first_load = false; + queryParams.brandId = route.query.brandId + queryParams.draftDesignDataId = route.query.draftDesignDataId + const tmp = route.query._add + if(tmp == 1){ + // 删除 url的参数 + openForm('create') + } + } + getList(); init(); }) diff --git a/hangtag-ui/hangtag-ui-front/src/api/oms/customer/address.ts b/hangtag-ui/hangtag-ui-front/src/api/oms/customer/address.ts new file mode 100644 index 0000000..7515149 --- /dev/null +++ b/hangtag-ui/hangtag-ui-front/src/api/oms/customer/address.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' +import {i18n} from "@/plugins/vueI18n"; +import {useAppStore} from "@/store/modules/app"; +const appStore = useAppStore() +// 地址 API +export const AddressApi = { + + + // 获取当前用户的地址列表 + getCustomerAddressList: async (params: any) => { + return await request.get({ url: `/front/oms/address/page`,params }) + }, + delAddress: async (id: number) => { + return await request.delete({ url: `/front/oms/address/${id}` }) + }, + getAddressInfo: async (id: number) => { + return await request.get({ url: `/front/oms/address/${id}`}) + }, + setDefaultAddress: async (id: number) => { + return await request.put({ url: `/front/oms/address/default/${id}`}) + }, + // 提交表单数据 + submit: async (data: any) => { + return await request.post({ url: `/front/oms/address/submit`, data }) + }, + getAreaTree: async () => { + let type = 0; + try { + type = i18n.global.locale.value == "zh-CN" ? "1" : "0" + }catch (e) { + } + return await request.get({ url: '/front/oms/address/area-tree/'+type }) + } +} + + + diff --git a/hangtag-ui/hangtag-ui-front/src/api/oms/customer/index.ts b/hangtag-ui/hangtag-ui-front/src/api/oms/customer/index.ts index 2e97fbf..972c125 100644 --- a/hangtag-ui/hangtag-ui-front/src/api/oms/customer/index.ts +++ b/hangtag-ui/hangtag-ui-front/src/api/oms/customer/index.ts @@ -44,12 +44,18 @@ export const CustomerApi = { return await request.download({ url: `/oms/customer/export-excel`, params }) }, + // 查询当前登录客户 + getCustomerInfo: async () => { + return await request.get({ url: `/front/oms/customer/info`}) + }, // ==================== 子表(用户地址) ==================== // 获得用户地址列表 getCustomerAddressListByCustomerId: async (customerId) => { return await request.get({ url: `/oms/customer/customer-address/list-by-customer-id?customerId=` + customerId }) }, + + } diff --git a/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/DataForm.vue b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/DataForm.vue new file mode 100644 index 0000000..c4fe1ab --- /dev/null +++ b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/DataForm.vue @@ -0,0 +1,95 @@ + + diff --git a/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/config.data.ts b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/config.data.ts new file mode 100644 index 0000000..65602a0 --- /dev/null +++ b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/config.data.ts @@ -0,0 +1,58 @@ +import type { CrudSchema } from '@/hooks/web/useCrudSchemas' + +// 表单校验 +export const rules = reactive({ + code: [required], + name: [required], +}) + +// CrudSchema https://doc.iocoder.cn/vue3/crud-schema/ +const crudSchemas = reactive([ + + { + label: 'id', + field: 'id', + isForm: false, + table: { + show: false + }, + }, + { + label: '名称', + field: 'name', + isSearch: true, + },{ + label: '联系电话', + field: 'phone', + isSearch: true, + },{ + label: '地区', + field: 'areaId', + table: { + show: false + }, + isSearch: false, + }, + { + label: '地址', + field: 'address', + isSearch: true, + }, + { + label: '默认地址', + field: 'isDefault', + isSearch: true, + }, + { + field: 'action', + width: '260px', + label: '操作' , + form: { + show: false + }, + detail: { + show: false + } + } +]) +export const { allSchemas } = useCrudSchemas(crudSchemas) diff --git a/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/index.vue b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/index.vue new file mode 100644 index 0000000..bc6294b --- /dev/null +++ b/hangtag-ui/hangtag-ui-front/src/components/Dialog/src/AddressListDialog/index.vue @@ -0,0 +1,348 @@ + + + + + diff --git a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPropEdit.vue b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPropEdit.vue index 4bf1430..f8b1621 100644 --- a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPropEdit.vue +++ b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/DesignPropEdit.vue @@ -57,34 +57,37 @@ v-loading="loading" :src="that.previewUrl"/>
- -
- - - -
-
- - - +
+
+ + +
+
+ + + +
-
- - - -
-
-
+ + +
+
+ + + +
+
+
- -
-
- - -
占比
-
- - - - -
%
-
-
+ +
+
+ + +
占比
+
+ + + + +
%
+
+
+
+
+ + +
+ - + @click="appendList(that.propInfo[tmp.key])"> + 添加
-
- - 添加 - -
- -
-
-
+
+
+
- + - -
+ +
-
- - -
占比
-
- - - - -
%
-
-
+
+ + +
占比
+
+ + + + +
%
+
+
+
+
+ + +
+ - + @click="appendList(that.propInfo[tmp.key])"> + 添加
-
- - 添加 - -
- -
-
-
-
- - - + +
+
+
+ +
+ + +
-
-
- -
- - - -
- - 添加 - + + 添加 + -
+
+ +
+
+
+
+
- - - -
{ diff --git a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/ImageLibraryManage.vue b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/ImageLibraryManage.vue index c686770..4230cbd 100644 --- a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/ImageLibraryManage.vue +++ b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/ImageLibraryManage.vue @@ -162,7 +162,7 @@ const uploadInfo = async ()=>{ } const addNew = async () => { for (let i = 0; i < fileList.value.length; i++) { - const base64Info = await convertImageToBase64(fileList.value[i].url as string) + // const base64Info = await convertImageToBase64(fileList.value[i].url as string) let info ={ key: ShapeType.vueShapeImage, shape: ShapeType.vueShapeImage, @@ -173,11 +173,11 @@ const addNew = async () => { shape: VueCellShapeType.Image, style: { shape:{ - href: base64Info, + href: fileList.value[i].url, }, } }, - icon: base64Info, + icon: fileList.value[i].url, //@ts-ignore label: fileList.value[i].filename || '未命名图片', filterKeyword: function (){ return this.label } diff --git a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/layout/index.vue b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/layout/index.vue index 88a52ee..3799b28 100644 --- a/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/layout/index.vue +++ b/hangtag-ui/hangtag-ui-front/src/components/DraftDesign/components/layout/index.vue @@ -9,14 +9,14 @@ >