浏览代码

维多利亚 库存表生成

home 2 年之前
父节点
当前提交
f0a527efd8
共有 19 个文件被更改,包括 1416 次插入14 次删除
  1. 1 1
      hx-common/code-generator/src/main/java/com/fjhx/modular/Victoriatourist.java
  2. 1 1
      hx-common/code-generator/src/main/resources/codeTemplates/controller.java.vm
  3. 1 1
      hx-common/code-generator/src/main/resources/codeTemplates/service.java.vm
  4. 4 10
      hx-common/code-generator/src/main/resources/codeTemplates/serviceImpl.java.vm
  5. 1 1
      hx-common/common-tool/src/main/java/com/fjhx/base/BaseService.java
  6. 696 0
      hx-common/common-tool/src/main/java/com/fjhx/utils/wrapperUtil/IWrapper.java
  7. 43 0
      hx-common/common-tool/src/main/java/com/fjhx/utils/wrapperUtil/KeywordData.java
  8. 98 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/supplier/Supplier.java
  9. 43 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/supplier/AccountPeriodTypeEnum.java
  10. 17 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/supplier/SupplierEx.java
  11. 17 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/supplier/SupplierVo.java
  12. 241 0
      hx-service/victoriatourist/src/main/java/com/fjhx/config/LogicDeleteInterceptor.java
  13. 60 0
      hx-service/victoriatourist/src/main/java/com/fjhx/config/MybatisConfig.java
  14. 55 0
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/supplier/SupplierController.java
  15. 16 0
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.java
  16. 5 0
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.xml
  17. 28 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/SupplierService.java
  18. 86 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/impl/SupplierServiceImpl.java
  19. 3 0
      hx-service/victoriatourist/src/main/resources/application-dev.yml

+ 1 - 1
hx-common/code-generator/src/main/java/com/fjhx/modular/Victoriatourist.java

@@ -12,7 +12,7 @@ public class Victoriatourist {
         CodeGenerator.MODULAR_NAME = "victoriatourist";
 
         // 需要生成的表名称,多表用,隔开
-        CodeGenerator.INCLUDE = "warehouse";
+        CodeGenerator.INCLUDE = "supplier";
 
         // mysql连接
         CodeGenerator.MYSQL_URL = "36.134.91.96:17330";

+ 1 - 1
hx-common/code-generator/src/main/resources/codeTemplates/controller.java.vm

@@ -48,7 +48,7 @@ public class ${table.controllerName} {
     private ${table.serviceName} ${table.entityPath}Service;
 
     @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
+    public R page(@RequestBody Map<String, Object> condition){
         Page<${entity}> result = ${table.entityPath}Service.getPage(condition);
         return R.success(result);
     }

+ 1 - 1
hx-common/code-generator/src/main/resources/codeTemplates/service.java.vm

@@ -17,7 +17,7 @@ import java.util.Map;
  */
 public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
 
-    Page<${entity}> getPage(Map<String, String> condition);
+    Page<${entity}> getPage(Map<String, Object> condition);
 
     void add(${entity}Vo ${table.entityPath}Vo);
 

+ 4 - 10
hx-common/code-generator/src/main/resources/codeTemplates/serviceImpl.java.vm

@@ -1,14 +1,12 @@
 package ${package.ServiceImpl};
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.utils.WrapperUtil;
 import ${cfg.entityName}.${entity};
 import ${cfg.voPath}.${entity}Vo;
 import ${package.Mapper}.${table.mapperName};
 import ${package.Service}.${table.serviceName};
 import ${superServiceImplClassPackage};
+import com.fjhx.utils.wrapperUtil.IWrapper;
 import org.springframework.stereotype.Service;
 
 import java.util.Map;
@@ -25,15 +23,11 @@ import java.util.Map;
 public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
 
     @Override
-    public Page<${entity}> getPage(Map<String, String> condition) {
+    public Page<${entity}> getPage(Map<String, Object> condition) {
 
-        QueryWrapper<${entity}> wrapper = Wrappers.query();
+        IWrapper<${entity}> wrapper = IWrapper.getWrapper(condition);
 
-        WrapperUtil.init(condition, wrapper)
-                .createTimeDesc();
-
-        Page<${entity}> page = page(condition, wrapper);
-        return page;
+        return page(condition, wrapper);
     }
 
     @Override

+ 1 - 1
hx-common/common-tool/src/main/java/com/fjhx/base/BaseService.java

@@ -48,7 +48,7 @@ public interface BaseService<T> extends IService<T> {
      * @param queryWrapper wrapper
      * @return 分页后的对象
      */
-    default Page<Map<String, Object>> pageMaps(Map<String, String> condition, Wrapper<T> queryWrapper) {
+    default Page<Map<String, Object>> pageMaps(Map<String, ?> condition, Wrapper<T> queryWrapper) {
         Page<Map<String, Object>> page = createPageMap(condition);
         return pageMaps(page, queryWrapper);
     }

+ 696 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/wrapperUtil/IWrapper.java

@@ -0,0 +1,696 @@
+package com.fjhx.utils.wrapperUtil;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.core.conditions.SharedString;
+import com.baomidou.mybatisplus.core.conditions.query.Query;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import lombok.SneakyThrows;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+import org.springblade.core.log.exception.ServiceException;
+
+import java.lang.invoke.SerializedLambda;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
+
+@SuppressWarnings({"unused"})
+public class IWrapper<T> extends AbstractWrapper<T, String, IWrapper<T>> implements Query<IWrapper<T>, T, String> {
+
+    // =====================================================================
+    // QueryWrapper原生方法
+    // =====================================================================
+
+    private final SharedString sqlSelect = new SharedString();
+
+    private IWrapper(T entityMap, Class<T> entityClass, AtomicInteger paramNameSeq,
+                     Map<String, Object> paramNameValuePairs, MergeSegments mergeSegments,
+                     SharedString lastSql, SharedString sqlComment, SharedString sqlFirst) {
+        super.setEntity(entityMap);
+        super.setEntityClass(entityClass);
+        this.paramNameSeq = paramNameSeq;
+        this.paramNameValuePairs = paramNameValuePairs;
+        this.expression = mergeSegments;
+        this.lastSql = lastSql;
+        this.sqlComment = sqlComment;
+        this.sqlFirst = sqlFirst;
+    }
+
+    @Override
+    public IWrapper<T> select(String... columns) {
+        if (ArrayUtils.isNotEmpty(columns)) {
+            this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns));
+        }
+        return typedThis;
+    }
+
+    @Override
+    public IWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
+        super.setEntityClass(entityClass);
+        this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate));
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSelect() {
+        return sqlSelect.getStringValue();
+    }
+
+    @Override
+    protected IWrapper<T> instance() {
+        return new IWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(),
+                SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString());
+    }
+
+    @Override
+    public void clear() {
+        super.clear();
+        sqlSelect.toNull();
+    }
+
+
+    // =====================================================================
+    // 初始化
+    // =====================================================================
+
+    private Map<String, ?> entityMap;
+
+    private IWrapper() {
+        super.initNeed();
+    }
+
+    private IWrapper(Object obj) {
+        super.initNeed();
+        entityMap = BeanUtil.beanToMap(obj);
+    }
+
+    private IWrapper(Map<String, ?> map) {
+        super.initNeed();
+        entityMap = map;
+    }
+
+    public static <T> IWrapper<T> getWrapper() {
+        return new IWrapper<>();
+    }
+
+    public static <T> IWrapper<T> getWrapper(Object obj) {
+        return new IWrapper<>(obj);
+    }
+
+    public static <T> IWrapper<T> getWrapper(Map<String, ?> map) {
+        return new IWrapper<>(map);
+    }
+
+    // =====================================================================
+    // 拓展方法
+    // =====================================================================
+
+    /**
+     * 时间段查询
+     */
+    public <K, V> IWrapper<T> periodTime(SFunction<K, V> function) {
+        return periodTime(getSqlFieldName(function));
+    }
+
+    public <K, V> IWrapper<T> periodTime(String alias, SFunction<K, V> function) {
+        return periodTime(getSqlFieldName(alias, function));
+    }
+
+    public IWrapper<T> periodTime(String field) {
+        Object beginTime = getValue("beginTime");
+        if (ObjectUtil.isNull(beginTime)) {
+            return this;
+        }
+
+        Object endTime = getValue("endTime");
+        if (ObjectUtil.isNull(endTime)) {
+            return this;
+        }
+
+        Date beginOfDay;
+        Date endOfDay;
+
+        try {
+            beginOfDay = DateUtil.beginOfDay(DateUtil.parse(beginTime.toString()));
+            endOfDay = DateUtil.endOfDay(DateUtil.parse(endTime.toString()));
+        } catch (Exception e) {
+            throw new ServiceException("时间类型转换错误");
+        }
+
+        return between(true, field, beginOfDay, endOfDay);
+    }
+
+    /**
+     * 关键字查询
+     */
+    public IWrapper<T> keyword(KeywordData... keywordData) {
+        Object value = getValue("keyword");
+        return keyword(value, keywordData);
+    }
+
+    public IWrapper<T> keyword(Object value, KeywordData... keywordData) {
+        this.and(ObjectUtil.isNotEmpty(value), q -> {
+            for (KeywordData keywordDatum : keywordData) {
+                q.or().like(keywordDatum.getSqlFieldName(), value);
+            }
+        });
+        return this;
+    }
+
+    /**
+     * 查询字段
+     */
+    @SafeVarargs
+    public final <K, V> IWrapper<T> select(SFunction<K, V>... functions) {
+        return select(getColumns(functions));
+    }
+
+    /**
+     * 排序
+     */
+    public <K, V> IWrapper<T> orderByAsc(SFunction<K, V> function) {
+        return orderByAsc(getSqlFieldName(function));
+    }
+
+    public <K, V> IWrapper<T> orderByDesc(SFunction<K, V> function) {
+        return orderByDesc(getSqlFieldName(function));
+    }
+
+    /**
+     * between
+     */
+    public <K, V> IWrapper<T> between(SFunction<K, V> function, Object val1, Object val2) {
+        String sqlFieldName = getSqlFieldName(function);
+        return between(sqlFieldName, val1, val2);
+    }
+
+    public <K, V> IWrapper<T> between(String alias, SFunction<K, V> function, Object val1, Object val2) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return between(sqlFieldName, val1, val2);
+    }
+
+    public <K, V> IWrapper<T> between(String sqlFieldName, Object val1, Object val2) {
+        return between(ObjectUtil.isAllNotEmpty(val1, val2), sqlFieldName, val1, val2);
+    }
+
+    /**
+     * eq
+     */
+    public <K, V> IWrapper<T> eq(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return eq(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> eq(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return eq(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> eq(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return eq(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> eq(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return eq(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> eq(String sqlFieldName, Object value) {
+        return eq(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * ne
+     */
+    public <K, V> IWrapper<T> ne(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return ne(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ne(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return ne(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ne(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return ne(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ne(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return ne(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> ne(String sqlFieldName, Object value) {
+        return ne(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * ge
+     */
+    public <K, V> IWrapper<T> ge(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return ge(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ge(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return ge(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ge(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return ge(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> ge(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return ge(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> ge(String sqlFieldName, Object value) {
+        return ge(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * gt
+     */
+    public <K, V> IWrapper<T> gt(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return gt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> gt(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return gt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> gt(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return gt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> gt(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return gt(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> gt(String sqlFieldName, Object value) {
+        return gt(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * le
+     */
+    public <K, V> IWrapper<T> le(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return le(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> le(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return le(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> le(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return le(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> le(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return le(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> le(String sqlFieldName, Object value) {
+        return le(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * lt
+     */
+    public <K, V> IWrapper<T> lt(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return lt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> lt(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return lt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> lt(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return lt(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> lt(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return lt(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> lt(String sqlFieldName, Object value) {
+        return lt(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * like
+     */
+    public <K, V> IWrapper<T> like(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return like(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> like(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return like(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> like(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return like(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> like(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return like(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> like(String sqlFieldName, Object value) {
+        return like(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * notLike
+     */
+    public <K, V> IWrapper<T> notLike(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return notLike(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notLike(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return notLike(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notLike(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return notLike(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notLike(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return notLike(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> notLike(String sqlFieldName, Object value) {
+        return notLike(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * likeLeft
+     */
+    public <K, V> IWrapper<T> likeLeft(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return likeLeft(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeLeft(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return likeLeft(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeLeft(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return likeLeft(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeLeft(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return likeLeft(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> likeLeft(String sqlFieldName, Object value) {
+        return likeLeft(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * likeRight
+     */
+    public <K, V> IWrapper<T> likeRight(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return likeRight(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeRight(SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return likeRight(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeRight(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return likeRight(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> likeRight(String alias, SFunction<K, V> function, Object value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return likeRight(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> likeRight(String sqlFieldName, Object value) {
+        return likeRight(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * in
+     */
+    public <K, V> IWrapper<T> in(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return in(sqlFieldName, (Collection<?>) value);
+    }
+
+    public <K, V> IWrapper<T> in(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return in(sqlFieldName, (Collection<?>) value);
+    }
+
+    public <K, V> IWrapper<T> in(SFunction<K, V> function, Collection<?> value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return in(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> in(String alias, SFunction<K, V> function, Collection<?> value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return in(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> in(SFunction<K, V> function, Object... value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return in(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> in(String alias, SFunction<K, V> function, Object... value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return in(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> in(String sqlFieldName, Collection<?> value) {
+        return in(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> in(String sqlFieldName, Object... value) {
+        return in(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    /**
+     * notIn
+     */
+    public <K, V> IWrapper<T> notIn(SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(fieldName);
+        Object value = getValue(fieldName);
+        return notIn(sqlFieldName, (Collection<?>) value);
+    }
+
+    public <K, V> IWrapper<T> notIn(String alias, SFunction<K, V> function) {
+        String fieldName = getFieldName(function);
+        String sqlFieldName = getSqlFieldName(alias, fieldName);
+        Object value = getValue(fieldName);
+        return notIn(sqlFieldName, (Collection<?>) value);
+    }
+
+    public <K, V> IWrapper<T> notIn(SFunction<K, V> function, Collection<?> value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return notIn(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notIn(String alias, SFunction<K, V> function, Collection<?> value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return notIn(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notIn(SFunction<K, V> function, Object... value) {
+        String sqlFieldName = getSqlFieldName(function);
+        return notIn(sqlFieldName, value);
+    }
+
+    public <K, V> IWrapper<T> notIn(String alias, SFunction<K, V> function, Object... value) {
+        String sqlFieldName = getSqlFieldName(alias, function);
+        return notIn(sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> notIn(String sqlFieldName, Collection<?> value) {
+        return notIn(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+    @Override
+    public IWrapper<T> notIn(String sqlFieldName, Object... value) {
+        return notIn(ObjectUtil.isNotEmpty(value), sqlFieldName, value);
+    }
+
+
+    // =====================================================================
+    // 私有方法
+    // =====================================================================
+
+    /**
+     * 获取对象字段名
+     * 例:getFieldName(Entity::getBaseId) -》 return "baseId"
+     */
+    @SneakyThrows
+    private <K, V> String getFieldName(SFunction<K, V> function) {
+        // SerializedLambda resolve = SerializedLambda.resolve(function);
+        // return PropertyNamer.methodToProperty(resolve.getImplMethodName());
+
+        Method method = function.getClass().getDeclaredMethod("writeReplace");
+        method.setAccessible(true);
+        SerializedLambda serializedLambda = (SerializedLambda) method.invoke(function);
+        return PropertyNamer.methodToProperty(serializedLambda.getImplMethodName());
+    }
+
+    /**
+     * 获取sql字段名
+     * 例:getSqlFieldName(Entity::getBaseId) -》 return "base_id"
+     */
+    private <K, V> String getSqlFieldName(SFunction<K, V> function) {
+        return StrUtil.toUnderlineCase(getFieldName(function));
+    }
+
+    /**
+     * 获取sql字段名
+     * 例:getSqlFieldName("s", Entity::getBaseId) -》 return "s.base_id"
+     */
+    private <K, V> String getSqlFieldName(String alias, SFunction<K, V> function) {
+        return StrUtil.toUnderlineCase(alias + "." + getFieldName(function));
+    }
+
+    /**
+     * 获取sql字段名
+     * 例:getSqlFieldName("baseId") -》 return "base_id"
+     */
+    private String getSqlFieldName(String fieldName) {
+        return StrUtil.toUnderlineCase(fieldName);
+    }
+
+    /**
+     * 获取sql字段名
+     * 例:getSqlFieldName("s", "baseId") -》 return "s.base_id"
+     */
+    private String getSqlFieldName(String alias, String fieldName) {
+        return alias + "." + StrUtil.toUnderlineCase(fieldName);
+    }
+
+    /**
+     * 获取字段值
+     */
+    private Object getValue(String fieldName) {
+        if (entityMap == null) {
+            throw new NullPointerException("需要传入提供字段值的对象");
+        }
+
+        return entityMap.get(fieldName);
+    }
+
+    /**
+     * functions转String[]
+     */
+    @SafeVarargs
+    private final <K, V> String[] getColumns(SFunction<K, V>... functions) {
+        String[] columns = new String[functions.length];
+        for (int i = 0; i < functions.length; i++) {
+            columns[i] = getSqlFieldName(functions[i]);
+        }
+        return columns;
+    }
+
+}

+ 43 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/wrapperUtil/KeywordData.java

@@ -0,0 +1,43 @@
+package com.fjhx.utils.wrapperUtil;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import lombok.Getter;
+import lombok.SneakyThrows;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+
+import java.lang.invoke.SerializedLambda;
+import java.lang.reflect.Method;
+
+@SuppressWarnings({"unused"})
+@Getter
+public class KeywordData {
+
+    private final String sqlFieldName;
+
+    public KeywordData(String sqlFieldName) {
+        this.sqlFieldName = sqlFieldName;
+    }
+
+    public <K, V> KeywordData(SFunction<K, V> function) {
+        this.sqlFieldName = getSqlFieldName(function);
+    }
+
+    public <K, V> KeywordData(String alias, SFunction<K, V> function) {
+        this.sqlFieldName = alias + "." + getSqlFieldName(function);
+    }
+
+    /**
+     * 获取sql字段名
+     * 例:getSqlFieldName(Entity::getBaseId) -》 return "base_id"
+     */
+    @SneakyThrows
+    private <K, V> String getSqlFieldName(SFunction<K, V> function) {
+        Method method = function.getClass().getDeclaredMethod("writeReplace");
+        method.setAccessible(true);
+        SerializedLambda serializedLambda = (SerializedLambda) method.invoke(function);
+        String fieldName = PropertyNamer.methodToProperty(serializedLambda.getImplMethodName());
+        return StrUtil.toUnderlineCase(fieldName);
+    }
+
+}

+ 98 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/supplier/Supplier.java

@@ -0,0 +1,98 @@
+package com.fjhx.entity.supplier;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fjhx.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 供应商
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Supplier extends BaseEntity {
+
+    /**
+     * 供应商类型
+     */
+    private Integer type;
+
+    /**
+     * 供应商名称
+     */
+    private String name;
+
+    /**
+     * 供应商编码
+     */
+    private String code;
+
+    /**
+     * 联系人
+     */
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    private Long phone;
+
+    /**
+     * 联系电话前缀类型
+     */
+    private Integer phonePrefixType;
+
+    /**
+     * 国家
+     */
+    private String countryId;
+
+    /**
+     * 省
+     */
+    private String provinceId;
+
+    /**
+     * 市
+     */
+    private String cityId;
+
+    /**
+     * 详细地址
+     */
+    private String detailedAddress;
+
+    /**
+     * 账期/天
+     */
+    private Integer accountPeriod;
+
+    /**
+     * 退换货期限/天
+     */
+    private Integer returnPeriod;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
+
+}

+ 43 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/supplier/AccountPeriodTypeEnum.java

@@ -0,0 +1,43 @@
+package com.fjhx.enums.supplier;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+
+@Getter
+public enum AccountPeriodTypeEnum {
+
+    ACCOUNTING_PERIOD(1, "有账期"),
+    NO_ACCOUNTING_PERIOD(0, "无账期");
+
+    private final Integer type;
+    private final String name;
+
+    private static final HashMap<Integer, AccountPeriodTypeEnum> map = new HashMap<>();
+
+    AccountPeriodTypeEnum(Integer type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    static {
+        for (AccountPeriodTypeEnum value : AccountPeriodTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    /**
+     * 根据type获取枚举
+     */
+    public static AccountPeriodTypeEnum get(Integer type) {
+        return map.get(type);
+    }
+
+    /**
+     * 根据type值获取枚举
+     */
+    public static String getName(Integer type) {
+        return map.get(type).getName();
+    }
+
+}

+ 17 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/supplier/SupplierEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.supplier;
+
+import com.fjhx.entity.supplier.Supplier;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 供应商
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SupplierEx extends Supplier {
+
+}

+ 17 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/supplier/SupplierVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.supplier;
+
+import com.fjhx.entity.supplier.Supplier;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 供应商
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SupplierVo extends Supplier {
+
+}

+ 241 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/config/LogicDeleteInterceptor.java

@@ -0,0 +1,241 @@
+package com.fjhx.config;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.*;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
+import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
+import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
+import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.ItemsList;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.select.*;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+public class LogicDeleteInterceptor implements InnerInterceptor {
+
+    private static final String delFlagName = "del_flag";
+    private static final Expression delFlagValue = new LongValue(0);
+
+    /**
+     * 赋值存在del_flag字段的表名
+     */
+    private static final List<String> delFlagTableNameList = Collections.emptyList();
+
+
+    @SneakyThrows
+    @Override
+    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds,
+                            ResultHandler resultHandler, BoundSql boundSql) {
+
+        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
+        mpBs.sql(handleSql(boundSql.getSql()));
+    }
+
+    /**
+     * 改写SQL
+     * {@link com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor  processSelect 方法}
+     *
+     * @param sql 执行的SQL语句
+     * @return 处理后的SQL
+     */
+    private String handleSql(String sql) throws JSQLParserException {
+        Select select = (Select) CCJSqlParserUtil.parse(sql);
+        processSelectBody(select.getSelectBody());
+        List<WithItem> withItemsList = select.getWithItemsList();
+        if (!CollectionUtils.isEmpty(withItemsList)) {
+            withItemsList.forEach(this::processSelectBody);
+        }
+        return select.toString();
+    }
+
+    private void processSelectBody(SelectBody selectBody) {
+        if (selectBody == null) {
+            return;
+        }
+        if (selectBody instanceof PlainSelect) {
+            processPlainSelect((PlainSelect) selectBody);
+        } else if (selectBody instanceof WithItem) {
+            WithItem withItem = (WithItem) selectBody;
+            processSelectBody(withItem.getSubSelect().getSelectBody());
+        } else {
+            SetOperationList operationList = (SetOperationList) selectBody;
+            if (operationList.getSelects() != null && operationList.getSelects().size() > 0) {
+                operationList.getSelects().forEach(this::processSelectBody);
+            }
+        }
+    }
+
+    /**
+     * 处理 PlainSelect
+     */
+    private void processPlainSelect(PlainSelect plainSelect) {
+        FromItem fromItem = plainSelect.getFromItem();
+        Expression where = plainSelect.getWhere();
+        processWhereSubSelect(where);
+        if (fromItem instanceof Table) {
+            Table fromTable = (Table) fromItem;
+            if (delFlagTableNameList.contains(fromTable.getName()) && !where.toString().contains(delFlagName)) {
+                plainSelect.setWhere(builderExpression(where, fromTable));
+            }
+        } else {
+            processFromItem(fromItem);
+        }
+        List<Join> joins = plainSelect.getJoins();
+        if (joins != null && joins.size() > 0) {
+            joins.forEach(j -> {
+                processJoin(j);
+                processFromItem(j.getRightItem());
+            });
+        }
+    }
+
+    /**
+     * 处理where条件内的子查询
+     * <p>
+     * 支持如下:
+     * 1. in
+     * 2. =
+     * 3. >
+     * 4. <
+     * 5. >=
+     * 6. <=
+     * 7. <>
+     * 8. EXISTS
+     * 9. NOT EXISTS
+     * <p>
+     * 前提条件:
+     * 1. 子查询必须放在小括号中
+     * 2. 子查询一般放在比较操作符的右边
+     *
+     * @param where where 条件
+     */
+    private void processWhereSubSelect(Expression where) {
+        if (where == null) {
+            return;
+        }
+        if (where instanceof FromItem) {
+            processFromItem((FromItem) where);
+            return;
+        }
+        if (where.toString().indexOf("SELECT") > 0) {
+            // 有子查询
+            if (where instanceof BinaryExpression) {
+                // 比较符号 , and , or , 等等
+                BinaryExpression expression = (BinaryExpression) where;
+                processWhereSubSelect(expression.getLeftExpression());
+                processWhereSubSelect(expression.getRightExpression());
+            } else if (where instanceof InExpression) {
+                // in
+                InExpression expression = (InExpression) where;
+                ItemsList itemsList = expression.getRightItemsList();
+                if (itemsList instanceof SubSelect) {
+                    processSelectBody(((SubSelect) itemsList).getSelectBody());
+                }
+            } else if (where instanceof ExistsExpression) {
+                // exists
+                ExistsExpression expression = (ExistsExpression) where;
+                processWhereSubSelect(expression.getRightExpression());
+            } else if (where instanceof NotExpression) {
+                // not exists
+                NotExpression expression = (NotExpression) where;
+                processWhereSubSelect(expression.getExpression());
+            } else if (where instanceof Parenthesis) {
+                Parenthesis expression = (Parenthesis) where;
+                processWhereSubSelect(expression.getExpression());
+            }
+        }
+    }
+
+    /**
+     * 处理子查询等
+     */
+    private void processFromItem(FromItem fromItem) {
+        if (fromItem instanceof SubJoin) {
+            SubJoin subJoin = (SubJoin) fromItem;
+            if (subJoin.getJoinList() != null) {
+                subJoin.getJoinList().forEach(this::processJoin);
+            }
+            if (subJoin.getLeft() != null) {
+                processFromItem(subJoin.getLeft());
+            }
+        } else if (fromItem instanceof SubSelect) {
+            SubSelect subSelect = (SubSelect) fromItem;
+            if (subSelect.getSelectBody() != null) {
+                processSelectBody(subSelect.getSelectBody());
+            }
+        } else if (fromItem instanceof ValuesList) {
+            log.debug("Perform a subquery, if you do not give us feedback");
+        } else if (fromItem instanceof LateralSubSelect) {
+            LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
+            if (lateralSubSelect.getSubSelect() != null) {
+                SubSelect subSelect = lateralSubSelect.getSubSelect();
+                if (subSelect.getSelectBody() != null) {
+                    processSelectBody(subSelect.getSelectBody());
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理联接语句
+     */
+    private void processJoin(Join join) {
+        if (join.getRightItem() instanceof Table) {
+            Table fromTable = (Table) join.getRightItem();
+            if (delFlagTableNameList.contains(fromTable.getName())) {
+                join.setOnExpression(builderExpression(join.getOnExpression(), fromTable));
+            }
+        }
+    }
+
+    /**
+     * 处理条件
+     */
+    private Expression builderExpression(Expression currentExpression, Table table) {
+        EqualsTo equalsTo = new EqualsTo();
+        equalsTo.setLeftExpression(getAliasColumn(table));
+        equalsTo.setRightExpression(delFlagValue);
+        if (currentExpression == null) {
+            return equalsTo;
+        }
+
+        if (currentExpression instanceof OrExpression) {
+            return new AndExpression(new Parenthesis(currentExpression), equalsTo);
+        } else {
+            return new AndExpression(currentExpression, equalsTo);
+        }
+    }
+
+    /**
+     * 逻辑删除字段别名设置
+     *
+     * @param table 表对象
+     * @return 字段
+     */
+    private Column getAliasColumn(Table table) {
+        StringBuilder column = new StringBuilder();
+        if (table.getAlias() != null) {
+            column.append(table.getAlias().getName()).append(StringPool.DOT);
+        }
+        column.append(delFlagName);
+        return new Column(column.toString());
+    }
+
+}

+ 60 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/config/MybatisConfig.java

@@ -0,0 +1,60 @@
+package com.fjhx.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.StringValue;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@Configuration
+public class MybatisConfig {
+
+    /**
+     * 排除租户表集合
+     */
+    private static final List<String> excludeTenantTableName = Collections.emptyList();
+
+    /**
+     * 租户插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptorPage() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+
+        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
+
+            @Override
+            public Expression getTenantId() {
+                return new StringValue(AuthUtil.getTenantId());
+            }
+
+            @Override
+            public boolean ignoreTable(String tableName) {
+                return excludeTenantTableName.contains(tableName);
+            }
+
+        }));
+
+        // 拼接逻辑删除字段
+        interceptor.addInnerInterceptor(new LogicDeleteInterceptor());
+
+        // 分页
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+
+        // 乐观锁
+        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+
+        return interceptor;
+    }
+
+}

+ 55 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/controller/supplier/SupplierController.java

@@ -0,0 +1,55 @@
+package com.fjhx.controller.supplier;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.core.tool.api.R;
+import com.fjhx.params.supplier.SupplierVo;
+import com.fjhx.service.supplier.SupplierService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 供应商 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+@RestController
+@RequestMapping("/supplier")
+public class SupplierController {
+
+    @Autowired
+    private SupplierService supplierService;
+
+    @PostMapping("/page")
+    public R page(@RequestBody Map<String, Object> condition){
+        Page<Map<String, Object>> result = supplierService.getPage(condition);
+        return R.success(result);
+    }
+
+    @PostMapping("/add")
+    public R add(@RequestBody SupplierVo supplierVo){
+        supplierService.add(supplierVo);
+        return R.success();
+    }
+
+    @PostMapping("/edit")
+    public R edit(@RequestBody SupplierVo supplierVo){
+        supplierService.edit(supplierVo);
+        return R.success();
+    }
+
+    @PostMapping("/delete")
+    public R delete(@RequestBody SupplierVo supplierVo){
+        supplierService.delete(supplierVo);
+        return R.success();
+    }
+
+}
+

+ 16 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.mapper.supplier;
+
+import com.fjhx.entity.supplier.Supplier;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 供应商 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+public interface SupplierMapper extends BaseMapper<Supplier> {
+
+}

+ 5 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.mapper.supplier.SupplierMapper">
+
+</mapper>

+ 28 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/SupplierService.java

@@ -0,0 +1,28 @@
+package com.fjhx.service.supplier;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.supplier.Supplier;
+import com.fjhx.params.supplier.SupplierVo;
+import com.fjhx.base.BaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 供应商 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+public interface SupplierService extends BaseService<Supplier> {
+
+    Page<Map<String, Object>> getPage(Map<String, Object> condition);
+
+    void add(SupplierVo supplierVo);
+
+    void edit(SupplierVo supplierVo);
+
+    void delete(SupplierVo supplierVo);
+
+}

+ 86 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/impl/SupplierServiceImpl.java

@@ -0,0 +1,86 @@
+package com.fjhx.service.supplier.impl;
+
+import cn.hutool.core.convert.Convert;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.supplier.Supplier;
+import com.fjhx.enums.supplier.AccountPeriodTypeEnum;
+import com.fjhx.mapper.supplier.SupplierMapper;
+import com.fjhx.params.supplier.SupplierVo;
+import com.fjhx.service.supplier.SupplierService;
+import com.fjhx.utils.wrapperUtil.IWrapper;
+import com.fjhx.utils.wrapperUtil.KeywordData;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 供应商 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-24
+ */
+@Service
+public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> implements SupplierService {
+
+    @Override
+    public Page<Map<String, Object>> getPage(Map<String, Object> condition) {
+
+        IWrapper<Supplier> wrapper = IWrapper.getWrapper(condition);
+        wrapper.keyword(new KeywordData(Supplier::getName), new KeywordData(Supplier::getContacts))
+                .eq(Supplier::getType)
+                .like(Supplier::getCode)
+                .like(Supplier::getName)
+                .eq(Supplier::getCountryId)
+                .eq(Supplier::getProvinceId)
+                .eq(Supplier::getCityId)
+                .like(Supplier::getContacts)
+                .eq(Supplier::getPhonePrefixType)
+                .like(Supplier::getPhone)
+                .func(q -> {
+                    Integer accountPeriodType = Convert.toInt(condition.get("accountPeriodType"));
+                    // 有账期
+                    if (Objects.equals(accountPeriodType, AccountPeriodTypeEnum.ACCOUNTING_PERIOD.getType())) {
+                        q.gt(Supplier::getAccountPeriod, 0);
+                    }
+                    // 无账期
+                    else if (Objects.equals(accountPeriodType, AccountPeriodTypeEnum.NO_ACCOUNTING_PERIOD.getType())) {
+                        q.eq(Supplier::getAccountPeriod, 0);
+                    }
+                })
+                .func(q -> {
+                    Integer returnPeriodType = Convert.toInt(condition.get("returnPeriodType"));
+                    // 有退换货期限/天
+                    if (Objects.equals(returnPeriodType, AccountPeriodTypeEnum.ACCOUNTING_PERIOD.getType())) {
+                        q.gt(Supplier::getReturnPeriod, 0);
+                    }
+                    // 无退换货期限/天
+                    else if (Objects.equals(returnPeriodType, AccountPeriodTypeEnum.NO_ACCOUNTING_PERIOD.getType())) {
+                        q.eq(Supplier::getReturnPeriod, 0);
+                    }
+                });
+
+        Page<Map<String, Object>> page = pageMaps(condition, wrapper);
+
+        return page;
+    }
+
+    @Override
+    public void add(SupplierVo supplierVo) {
+        save(supplierVo);
+    }
+
+    @Override
+    public void edit(SupplierVo supplierVo) {
+        updateById(supplierVo);
+    }
+
+    @Override
+    public void delete(SupplierVo supplierVo) {
+        removeById(supplierVo.getId());
+    }
+
+}

+ 3 - 0
hx-service/victoriatourist/src/main/resources/application-dev.yml

@@ -9,3 +9,6 @@ spring:
     url: ${blade.datasource.victoriatourist.dev.url}
     username: ${blade.datasource.victoriatourist.dev.username}
     password: ${blade.datasource.victoriatourist.dev.password}
+
+    druid:
+      time-between-eviction-runs-millis: 30000000