ChenYang 1 год назад
Родитель
Сommit
179b99281f

BIN
doc/~$环境使用手册.docx


+ 16 - 10
pom.xml

@@ -23,8 +23,8 @@
         <bitwalker.version>1.21</bitwalker.version>
         <bitwalker.version>1.21</bitwalker.version>
         <swagger.version>3.0.0</swagger.version>
         <swagger.version>3.0.0</swagger.version>
         <kaptcha.version>2.3.2</kaptcha.version>
         <kaptcha.version>2.3.2</kaptcha.version>
-        <mybatis-spring-boot.version>2.2.0</mybatis-spring-boot.version>
-        <pagehelper.boot.version>1.4.0</pagehelper.boot.version>
+        <mybatisplus.version>3.5.2</mybatisplus.version>
+        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
         <fastjson.version>1.2.79</fastjson.version>
         <fastjson.version>1.2.79</fastjson.version>
         <oshi.version>5.8.6</oshi.version>
         <oshi.version>5.8.6</oshi.version>
         <jna.version>5.10.0</jna.version>
         <jna.version>5.10.0</jna.version>
@@ -40,7 +40,6 @@
     <!-- 依赖声明 -->
     <!-- 依赖声明 -->
     <dependencyManagement>
     <dependencyManagement>
         <dependencies>
         <dependencies>
-
             <!-- SpringBoot的依赖配置-->
             <!-- SpringBoot的依赖配置-->
             <dependency>
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <groupId>org.springframework.boot</groupId>
@@ -50,6 +49,12 @@
                 <scope>import</scope>
                 <scope>import</scope>
             </dependency>
             </dependency>
 
 
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatisplus.version}</version>
+            </dependency>
+
             <!-- 阿里数据库连接池 -->
             <!-- 阿里数据库连接池 -->
             <dependency>
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <groupId>com.alibaba</groupId>
@@ -64,13 +69,6 @@
                 <version>${bitwalker.version}</version>
                 <version>${bitwalker.version}</version>
             </dependency>
             </dependency>
 
 
-            <!-- SpringBoot集成mybatis框架 -->
-            <dependency>
-                <groupId>org.mybatis.spring.boot</groupId>
-                <artifactId>mybatis-spring-boot-starter</artifactId>
-                <version>${mybatis-spring-boot.version}</version>
-            </dependency>
-
             <!-- pagehelper 分页插件 -->
             <!-- pagehelper 分页插件 -->
             <dependency>
             <dependency>
                 <groupId>com.github.pagehelper</groupId>
                 <groupId>com.github.pagehelper</groupId>
@@ -215,6 +213,13 @@
                 <version>${warewms.version}</version>
                 <version>${warewms.version}</version>
             </dependency>
             </dependency>
 
 
+            <!-- hard模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>warewms-hard</artifactId>
+                <version>${warewms.version}</version>
+            </dependency>
+
         </dependencies>
         </dependencies>
     </dependencyManagement>
     </dependencyManagement>
 
 
@@ -227,6 +232,7 @@
         <module>ruoyi-common</module>
         <module>ruoyi-common</module>
         <module>warewms-base</module>
         <module>warewms-base</module>
         <module>warewms-ams</module>
         <module>warewms-ams</module>
+        <module>warewms-hard</module>
     </modules>
     </modules>
     <packaging>pom</packaging>
     <packaging>pom</packaging>
 
 

+ 18 - 0
ruoyi-framework/pom.xml

@@ -27,6 +27,18 @@
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
             <artifactId>spring-boot-starter-aop</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-jdbc</artifactId>
+            <version>5.3.16</version>
         </dependency>
         </dependency>
 
 
         <!-- 阿里数据库连接池 -->
         <!-- 阿里数据库连接池 -->
@@ -35,6 +47,12 @@
             <artifactId>druid-spring-boot-starter</artifactId>
             <artifactId>druid-spring-boot-starter</artifactId>
         </dependency>
         </dependency>
 
 
+        <!-- SwggerUI集成 -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+        </dependency>
+
         <!-- 验证码 -->
         <!-- 验证码 -->
         <dependency>
         <dependency>
             <groupId>com.github.penggle</groupId>
             <groupId>com.github.penggle</groupId>

+ 2 - 3
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java

@@ -1,12 +1,12 @@
 package com.ruoyi.framework.config;
 package com.ruoyi.framework.config;
 
 
-import java.util.TimeZone;
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 
 
+import java.util.TimeZone;
+
 /**
 /**
  * 程序注解配置
  * 程序注解配置
  *
  *
@@ -16,7 +16,6 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
 // 表示通过aop框架暴露该代理对象,AopContext能够访问
 // 表示通过aop框架暴露该代理对象,AopContext能够访问
 @EnableAspectJAutoProxy(exposeProxy = true)
 @EnableAspectJAutoProxy(exposeProxy = true)
 // 指定要扫描的Mapper类的包的路径
 // 指定要扫描的Mapper类的包的路径
-@MapperScan("com.ruoyi.**.mapper")
 public class ApplicationConfig
 public class ApplicationConfig
 {
 {
     /**
     /**

+ 0 - 132
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java

@@ -1,132 +0,0 @@
-package com.ruoyi.framework.config;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import javax.sql.DataSource;
-import org.apache.ibatis.io.VFS;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-import org.springframework.core.io.DefaultResourceLoader;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
-import org.springframework.core.type.classreading.MetadataReader;
-import org.springframework.core.type.classreading.MetadataReaderFactory;
-import org.springframework.util.ClassUtils;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * Mybatis支持*匹配扫描包
- * 
- * @author ruoyi
- */
-@Configuration
-public class MyBatisConfig
-{
-    @Autowired
-    private Environment env;
-
-    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
-
-    public static String setTypeAliasesPackage(String typeAliasesPackage)
-    {
-        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
-        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
-        List<String> allResult = new ArrayList<String>();
-        try
-        {
-            for (String aliasesPackage : typeAliasesPackage.split(","))
-            {
-                List<String> result = new ArrayList<String>();
-                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
-                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
-                Resource[] resources = resolver.getResources(aliasesPackage);
-                if (resources != null && resources.length > 0)
-                {
-                    MetadataReader metadataReader = null;
-                    for (Resource resource : resources)
-                    {
-                        if (resource.isReadable())
-                        {
-                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
-                            try
-                            {
-                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
-                            }
-                            catch (ClassNotFoundException e)
-                            {
-                                e.printStackTrace();
-                            }
-                        }
-                    }
-                }
-                if (result.size() > 0)
-                {
-                    HashSet<String> hashResult = new HashSet<String>(result);
-                    allResult.addAll(hashResult);
-                }
-            }
-            if (allResult.size() > 0)
-            {
-                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
-            }
-            else
-            {
-                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
-            }
-        }
-        catch (IOException e)
-        {
-            e.printStackTrace();
-        }
-        return typeAliasesPackage;
-    }
-
-    public Resource[] resolveMapperLocations(String[] mapperLocations)
-    {
-        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
-        List<Resource> resources = new ArrayList<Resource>();
-        if (mapperLocations != null)
-        {
-            for (String mapperLocation : mapperLocations)
-            {
-                try
-                {
-                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
-                    resources.addAll(Arrays.asList(mappers));
-                }
-                catch (IOException e)
-                {
-                    // ignore
-                }
-            }
-        }
-        return resources.toArray(new Resource[resources.size()]);
-    }
-
-    @Bean
-    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
-    {
-        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
-        String mapperLocations = env.getProperty("mybatis.mapperLocations");
-        String configLocation = env.getProperty("mybatis.configLocation");
-        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
-        VFS.addImplClass(SpringBootVFS.class);
-
-        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-        sessionFactory.setDataSource(dataSource);
-        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
-        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
-        return sessionFactory.getObject();
-    }
-}

+ 33 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java

@@ -0,0 +1,33 @@
+package com.ruoyi.framework.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * mybatis-plus配置
+ * @author chenyang
+ *
+ */
+@Configuration
+@MapperScan({"com.ruoyi.**.mapper", "com.ruoyi.**.dao"})
+public class MybatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+        // 分页插件 为兼容老系统的分页插件这个分页插件是没有用的
+        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        // 乐观锁
+        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+        // 防止全表更新与删除
+        mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+        return mybatisPlusInterceptor;
+    }
+
+}

+ 12 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/dao/BaseDao.java

@@ -0,0 +1,12 @@
+package com.ruoyi.framework.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 基础Dao
+ * @author chenyang
+ *
+ */
+public interface BaseDao<T> extends BaseMapper<T> {
+
+}

+ 109 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/service/BaseService.java

@@ -0,0 +1,109 @@
+package com.ruoyi.framework.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * 基础服务接口,所有Service接口都要继承
+ *
+ * @author chenyang
+ */
+public interface BaseService<T> {
+
+    Class<T> currentModelClass();
+
+    /**
+     * <p>
+     * 插入一条记录(选择字段,策略插入)
+     * </p>
+     *
+     * @param entity 实体对象
+     */
+    boolean insert(T entity);
+
+    /**
+     * <p>
+     * 插入(批量),该方法不支持 Oracle、SQL Server
+     * </p>
+     *
+     * @param entityList 实体对象集合
+     */
+    boolean insertBatch(Collection<T> entityList);
+
+    /**
+     * <p>
+     * 插入(批量),该方法不支持 Oracle、SQL Server
+     * </p>
+     *
+     * @param entityList 实体对象集合
+     * @param batchSize  插入批次数量
+     */
+    boolean insertBatch(Collection<T> entityList, int batchSize);
+
+    /**
+     * <p>
+     * 根据 ID 选择修改
+     * </p>
+     *
+     * @param entity 实体对象
+     */
+    boolean updateById(T entity);
+
+    /**
+     * <p>
+     * 根据 whereEntity 条件,更新记录
+     * </p>
+     *
+     * @param entity        实体对象
+     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
+     */
+    boolean update(T entity, Wrapper<T> updateWrapper);
+
+    /**
+     * <p>
+     * 根据ID 批量更新
+     * </p>
+     *
+     * @param entityList 实体对象集合
+     */
+    boolean updateBatchById(Collection<T> entityList);
+
+    /**
+     * <p>
+     * 根据ID 批量更新
+     * </p>
+     *
+     * @param entityList 实体对象集合
+     * @param batchSize  更新批次数量
+     */
+    boolean updateBatchById(Collection<T> entityList, int batchSize);
+
+    /**
+     * <p>
+     * 根据 ID 查询
+     * </p>
+     *
+     * @param id 主键ID
+     */
+    T selectById(Serializable id);
+
+    /**
+     * <p>
+     * 根据 ID 删除
+     * </p>
+     *
+     * @param id 主键ID
+     */
+    boolean deleteById(Serializable id);
+
+    /**
+     * <p>
+     * 删除(根据ID 批量删除)
+     * </p>
+     *
+     * @param idList 主键ID列表
+     */
+    boolean deleteBatchIds(Collection<? extends Serializable> idList);
+}

+ 27 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/service/CrudService.java

@@ -0,0 +1,27 @@
+package com.ruoyi.framework.service;
+
+import com.ruoyi.framework.service.bean.PageData;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  CRUD基础服务接口
+ *
+ * @author chenyang
+ */
+public interface CrudService<T, D> extends BaseService<T> {
+
+    PageData<D> page(Map<String, Object> params);
+
+    List<D> list(Map<String, Object> params);
+
+    D get(Long id);
+
+    void save(D dto);
+
+    void update(D dto);
+
+    void delete(Long[] ids);
+
+}

+ 35 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/service/bean/PageData.java

@@ -0,0 +1,35 @@
+package com.ruoyi.framework.service.bean;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分页工具类
+ *
+ * @author chenyang
+ */
+@Data
+@ApiModel(value = "分页数据")
+public class PageData<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "总记录数")
+    private int total;
+
+    @ApiModelProperty(value = "列表数据")
+    private List<T> list;
+
+    /**
+     * 分页
+     * @param list   列表数据
+     * @param total  总记录数
+     */
+    public PageData(List<T> list, long total) {
+        this.list = list;
+        this.total = (int)total;
+    }
+}

+ 210 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/service/impl/BaseServiceImpl.java

@@ -0,0 +1,210 @@
+package com.ruoyi.framework.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.enums.SqlMethod;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.ConvertUtils;
+import com.ruoyi.framework.service.BaseService;
+import com.ruoyi.framework.service.bean.PageData;
+import org.apache.ibatis.binding.MapperMethod;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.session.SqlSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
+
+/**
+ * 基础服务类,所有Service都要继承
+ *
+ * @author chenyang
+ */
+public abstract class BaseServiceImpl<M extends BaseMapper<T>, T>  implements BaseService<T> {
+    @Autowired
+    protected M baseDao;
+    protected Log log = LogFactory.getLog(getClass());
+
+    /**
+     * 获取分页对象
+     * @param params      分页查询参数
+     * @param defaultOrderField  默认排序字段
+     * @param isAsc              排序方式
+     */
+    protected IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
+        //分页参数
+        long curPage = 1;
+        long limit = 10;
+
+        if(params.get(Constants.PAGE) != null){
+            curPage = Long.parseLong((String)params.get(Constants.PAGE));
+        }
+        if(params.get(Constants.LIMIT) != null){
+            limit = Long.parseLong((String)params.get(Constants.LIMIT));
+        }
+
+        //分页对象
+        Page<T> page = new Page<>(curPage, limit);
+
+        //分页参数
+        params.put(Constants.PAGE, page);
+
+        //排序字段
+        String orderField = (String)params.get(Constants.ORDER_FIELD);
+        String order = (String)params.get(Constants.ORDER);
+
+        //前端字段排序
+        if(StringUtils.isNotBlank(orderField) && StringUtils.isNotBlank(order)){
+            if(Constants.ASC.equalsIgnoreCase(order)) {
+                return page.addOrder(OrderItem.asc(orderField));
+            }else {
+                return page.addOrder(OrderItem.desc(orderField));
+            }
+        }
+
+        //没有排序字段,则不排序
+        if(StringUtils.isBlank(defaultOrderField)){
+            return page;
+        }
+
+        //默认排序
+        if(isAsc) {
+            page.addOrder(OrderItem.asc(defaultOrderField));
+        }else {
+            page.addOrder(OrderItem.desc(defaultOrderField));
+        }
+
+        return page;
+    }
+
+    protected <T> PageData<T> getPageData(List<?> list, long total, Class<T> target){
+        List<T> targetList = ConvertUtils.sourceToTarget(list, target);
+
+        return new PageData<>(targetList, total);
+    }
+
+    protected <T> PageData<T> getPageData(IPage page, Class<T> target){
+        return getPageData(page.getRecords(), page.getTotal(), target);
+    }
+
+    protected void paramsToLike(Map<String, Object> params, String... likes){
+        for (String like : likes){
+            String val = (String)params.get(like);
+            if (StringUtils.isNotBlank(val)){
+                params.put(like, "%" + val + "%");
+            }else {
+                params.put(like, null);
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * 判断数据库操作是否成功
+     * </p>
+     * <p>
+     * 注意!! 该方法为 Integer 判断,不可传入 int 基本类型
+     * </p>
+     *
+     * @param result 数据库操作返回影响条数
+     * @return boolean
+     */
+    protected static boolean retBool(Integer result) {
+        return SqlHelper.retBool(result);
+    }
+
+    protected Class<M> currentMapperClass() {
+        return (Class<M>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 0);
+    }
+
+    @Override
+    public Class<T> currentModelClass() {
+        return (Class<T>)ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 1);
+    }
+
+    protected String getSqlStatement(SqlMethod sqlMethod) {
+        return SqlHelper.getSqlStatement(this.currentMapperClass(), sqlMethod);
+    }
+
+    @Override
+    public boolean insert(T entity) {
+        return BaseServiceImpl.retBool(baseDao.insert(entity));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBatch(Collection<T> entityList) {
+        return insertBatch(entityList, 100);
+    }
+
+    /**
+     * 批量插入
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBatch(Collection<T> entityList, int batchSize) {
+        String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);
+        return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
+    }
+
+    /**
+     * 执行批量操作
+     */
+    protected <E> boolean executeBatch(Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
+        return SqlHelper.executeBatch(this.currentModelClass(), this.log, list, batchSize, consumer);
+    }
+
+
+    @Override
+    public boolean updateById(T entity) {
+        return BaseServiceImpl.retBool(baseDao.updateById(entity));
+    }
+
+    @Override
+    public boolean update(T entity, Wrapper<T> updateWrapper) {
+        return BaseServiceImpl.retBool(baseDao.update(entity, updateWrapper));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateBatchById(Collection<T> entityList) {
+        return updateBatchById(entityList, 30);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateBatchById(Collection<T> entityList, int batchSize) {
+        String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID);
+        return executeBatch(entityList, batchSize, (sqlSession, entity) -> {
+            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
+            param.put(com.baomidou.mybatisplus.core.toolkit.Constants.ENTITY, entity);
+            sqlSession.update(sqlStatement, param);
+        });
+    }
+
+    @Override
+    public T selectById(Serializable id) {
+        return baseDao.selectById(id);
+    }
+
+    @Override
+    public boolean deleteById(Serializable id) {
+        return SqlHelper.retBool(baseDao.deleteById(id));
+    }
+
+    @Override
+    public boolean deleteBatchIds(Collection<? extends Serializable> idList) {
+        return SqlHelper.retBool(baseDao.deleteBatchIds(idList));
+    }
+}

+ 72 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/service/impl/CrudServiceImpl.java

@@ -0,0 +1,72 @@
+package com.ruoyi.framework.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
+import com.ruoyi.common.utils.ConvertUtils;
+import com.ruoyi.framework.service.CrudService;
+import com.ruoyi.framework.service.bean.PageData;
+import org.springframework.beans.BeanUtils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  CRUD基础服务类
+ *
+ * @author chenyang
+ */
+public abstract class CrudServiceImpl<M extends BaseMapper<T>, T, D> extends BaseServiceImpl<M, T> implements CrudService<T, D> {
+
+    protected Class<D> currentDtoClass() {
+        return (Class<D>)ReflectionKit.getSuperClassGenericType(getClass(), CrudServiceImpl.class, 2);
+    }
+
+    @Override
+    public PageData<D> page(Map<String, Object> params) {
+        IPage<T> page = baseDao.selectPage(
+            getPage(params, null, false),
+            getWrapper(params)
+        );
+
+        return getPageData(page, currentDtoClass());
+    }
+
+    @Override
+    public List<D> list(Map<String, Object> params) {
+        List<T> entityList = baseDao.selectList(getWrapper(params));
+
+        return ConvertUtils.sourceToTarget(entityList, currentDtoClass());
+    }
+
+    public abstract QueryWrapper<T> getWrapper(Map<String, Object> params);
+
+    @Override
+    public D get(Long id) {
+        T entity = baseDao.selectById(id);
+
+        return ConvertUtils.sourceToTarget(entity, currentDtoClass());
+    }
+
+    @Override
+    public void save(D dto) {
+        T entity = ConvertUtils.sourceToTarget(dto, currentModelClass());
+        insert(entity);
+
+        //copy主键值到dto
+        BeanUtils.copyProperties(entity, dto);
+    }
+
+    @Override
+    public void update(D dto) {
+        T entity = ConvertUtils.sourceToTarget(dto, currentModelClass());
+        updateById(entity);
+    }
+
+    @Override
+    public void delete(Long[] ids) {
+        baseDao.deleteBatchIds(Arrays.asList(ids));
+    }
+}

+ 0 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java

@@ -9,7 +9,6 @@ import com.ruoyi.common.core.domain.entity.SysDictType;
  * 
  * 
  * @author ruoyi
  * @author ruoyi
  */
  */
-@Mapper
 public interface SysDictTypeMapper
 public interface SysDictTypeMapper
 {
 {
     /**
     /**

+ 4 - 4
warewms-ams/pom.xml

@@ -15,16 +15,16 @@
 
 
     <dependencies>
     <dependencies>
 
 
-        <!-- 通用工具-->
         <dependency>
         <dependency>
             <groupId>com.ruoyi</groupId>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-common</artifactId>
+            <artifactId>warewms-base</artifactId>
         </dependency>
         </dependency>
 
 
         <dependency>
         <dependency>
             <groupId>com.ruoyi</groupId>
             <groupId>com.ruoyi</groupId>
-            <artifactId>warewms-base</artifactId>
+            <artifactId>warewms-hard</artifactId>
         </dependency>
         </dependency>
+
     </dependencies>
     </dependencies>
 
 
-</project>
+</project>

+ 1 - 1
warewms-base/pom.xml

@@ -18,7 +18,7 @@
         <!-- 通用工具-->
         <!-- 通用工具-->
         <dependency>
         <dependency>
             <groupId>com.ruoyi</groupId>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-common</artifactId>
+            <artifactId>ruoyi-framework</artifactId>
         </dependency>
         </dependency>
 
 
     </dependencies>
     </dependencies>

+ 71 - 0
warewms-hard/pom.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.8.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>warewms-hard</artifactId>
+    <version>1.0</version>
+    <description>硬件对接</description>
+
+    <dependencies>
+        <!-- 若依框架 -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+        <!--自定义starter组件-->
+        <dependency>
+            <groupId>com.jwk</groupId>
+            <artifactId>modbus-spring-boot-starter</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/modbus-spring-boot-starter.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.jwk</groupId>
+            <artifactId>rfid-zebra-spring-boot-starter</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/rfid-zebra-spring-boot-starter.jar</systemPath>
+        </dependency>
+
+        <!-- rfid-zebra-只能跑在window上-->
+        <dependency>
+            <groupId>com.warewms</groupId>
+            <artifactId>rfid</artifactId>
+            <version>1.0.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/rfid-1.0.0.jar</systemPath>
+        </dependency>
+
+        <!--modbus4j start-->
+        <dependency>
+            <groupId>com.jwk</groupId>
+            <artifactId>RXTXcomm</artifactId>
+            <version>3.0.5</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/RXTXcomm.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.jwk</groupId>
+            <artifactId>modbus4j</artifactId>
+            <version>3.0.5</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/modbus4j-3.0.5.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.jwk</groupId>
+            <artifactId>jssc</artifactId>
+            <version>2.8.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/jssc-2.8.0.jar</systemPath>
+        </dependency>
+        <!--modbus4j end-->
+    </dependencies>
+</project>