master
unknown 6 years ago
parent ab047aafbb
commit 87492b3e37
  1. 65
      README.md
  2. 6
      java/.gitignore
  3. 3993
      java/my.sql
  4. 170
      java/pom.xml
  5. 17
      java/src/main/java/com/toesbieya/my/MyApplication.java
  6. 10
      java/src/main/java/com/toesbieya/my/annoation/Lock.java
  7. 10
      java/src/main/java/com/toesbieya/my/annoation/TimeCost.java
  8. 12
      java/src/main/java/com/toesbieya/my/annoation/Tx.java
  9. 10
      java/src/main/java/com/toesbieya/my/annoation/UserAction.java
  10. 74
      java/src/main/java/com/toesbieya/my/aspect/LockAspect.java
  11. 45
      java/src/main/java/com/toesbieya/my/aspect/TimeCostAspect.java
  12. 69
      java/src/main/java/com/toesbieya/my/aspect/UserActionAspect.java
  13. 65
      java/src/main/java/com/toesbieya/my/config/ExecutorConfig.java
  14. 55
      java/src/main/java/com/toesbieya/my/config/HttpSessionConfig.java
  15. 55
      java/src/main/java/com/toesbieya/my/config/RedisConfig.java
  16. 26
      java/src/main/java/com/toesbieya/my/config/SocketConfig.java
  17. 67
      java/src/main/java/com/toesbieya/my/config/WebConfig.java
  18. 8
      java/src/main/java/com/toesbieya/my/constant/SessionConstant.java
  19. 11
      java/src/main/java/com/toesbieya/my/constant/SocketConstant.java
  20. 25
      java/src/main/java/com/toesbieya/my/controller/BizDocumentHistoryController.java
  21. 138
      java/src/main/java/com/toesbieya/my/controller/BizPurchaseInboundController.java
  22. 147
      java/src/main/java/com/toesbieya/my/controller/BizPurchaseOrderController.java
  23. 147
      java/src/main/java/com/toesbieya/my/controller/BizSellOrderController.java
  24. 139
      java/src/main/java/com/toesbieya/my/controller/BizSellOutboundController.java
  25. 39
      java/src/main/java/com/toesbieya/my/controller/BizStockController.java
  26. 29
      java/src/main/java/com/toesbieya/my/controller/FileController.java
  27. 71
      java/src/main/java/com/toesbieya/my/controller/LoginController.java
  28. 17
      java/src/main/java/com/toesbieya/my/controller/MonitorController.java
  29. 36
      java/src/main/java/com/toesbieya/my/controller/StatisticController.java
  30. 65
      java/src/main/java/com/toesbieya/my/controller/SysCategoryController.java
  31. 70
      java/src/main/java/com/toesbieya/my/controller/SysCustomerController.java
  32. 57
      java/src/main/java/com/toesbieya/my/controller/SysDepartmentController.java
  33. 35
      java/src/main/java/com/toesbieya/my/controller/SysResourceController.java
  34. 62
      java/src/main/java/com/toesbieya/my/controller/SysRoleController.java
  35. 70
      java/src/main/java/com/toesbieya/my/controller/SysSupplierController.java
  36. 162
      java/src/main/java/com/toesbieya/my/controller/SysUserController.java
  37. 48
      java/src/main/java/com/toesbieya/my/controller/TestController.java
  38. 15
      java/src/main/java/com/toesbieya/my/enumeration/BizDocumentFinishEnum.java
  39. 15
      java/src/main/java/com/toesbieya/my/enumeration/BizDocumentHistoryEnum.java
  40. 15
      java/src/main/java/com/toesbieya/my/enumeration/BizDocumentStatusEnum.java
  41. 15
      java/src/main/java/com/toesbieya/my/enumeration/GeneralStatusEnum.java
  42. 15
      java/src/main/java/com/toesbieya/my/enumeration/RecLoginHistoryEnum.java
  43. 15
      java/src/main/java/com/toesbieya/my/enumeration/UserActionEnum.java
  44. 7
      java/src/main/java/com/toesbieya/my/exception/JsonResultException.java
  45. 55
      java/src/main/java/com/toesbieya/my/handler/GlobalExceptionHandler.java
  46. 44
      java/src/main/java/com/toesbieya/my/interceptor/RateControlInterceptor.java
  47. 66
      java/src/main/java/com/toesbieya/my/interceptor/SecurityInterceptor.java
  48. 15
      java/src/main/java/com/toesbieya/my/interceptor/UserActionInterceptor.java
  49. 24
      java/src/main/java/com/toesbieya/my/listener/RedisSessionListener.java
  50. 15
      java/src/main/java/com/toesbieya/my/mapper/BizDocumentHistoryMapper.java
  51. 33
      java/src/main/java/com/toesbieya/my/mapper/BizPurchaseInboundMapper.java
  52. 44
      java/src/main/java/com/toesbieya/my/mapper/BizPurchaseOrderMapper.java
  53. 44
      java/src/main/java/com/toesbieya/my/mapper/BizSellOrderMapper.java
  54. 33
      java/src/main/java/com/toesbieya/my/mapper/BizSellOutboundMapper.java
  55. 31
      java/src/main/java/com/toesbieya/my/mapper/BizStockMapper.java
  56. 20
      java/src/main/java/com/toesbieya/my/mapper/RecAttachmentMapper.java
  57. 15
      java/src/main/java/com/toesbieya/my/mapper/RecLoginHistoryMapper.java
  58. 12
      java/src/main/java/com/toesbieya/my/mapper/RecUserActionMapper.java
  59. 28
      java/src/main/java/com/toesbieya/my/mapper/StatisticMapper.java
  60. 27
      java/src/main/java/com/toesbieya/my/mapper/SysCategoryMapper.java
  61. 26
      java/src/main/java/com/toesbieya/my/mapper/SysCustomerMapper.java
  62. 20
      java/src/main/java/com/toesbieya/my/mapper/SysDepartmentMapper.java
  63. 15
      java/src/main/java/com/toesbieya/my/mapper/SysResourceMapper.java
  64. 23
      java/src/main/java/com/toesbieya/my/mapper/SysRoleMapper.java
  65. 26
      java/src/main/java/com/toesbieya/my/mapper/SysSupplierMapper.java
  66. 30
      java/src/main/java/com/toesbieya/my/mapper/SysUserMapper.java
  67. 22
      java/src/main/java/com/toesbieya/my/model/entity/BizDocument.java
  68. 22
      java/src/main/java/com/toesbieya/my/model/entity/BizDocumentHistory.java
  69. 12
      java/src/main/java/com/toesbieya/my/model/entity/BizDocumentSub.java
  70. 12
      java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseInbound.java
  71. 12
      java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseInboundSub.java
  72. 16
      java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrder.java
  73. 13
      java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrderSub.java
  74. 16
      java/src/main/java/com/toesbieya/my/model/entity/BizSellOrder.java
  75. 13
      java/src/main/java/com/toesbieya/my/model/entity/BizSellOrderSub.java
  76. 12
      java/src/main/java/com/toesbieya/my/model/entity/BizSellOutbound.java
  77. 12
      java/src/main/java/com/toesbieya/my/model/entity/BizSellOutboundSub.java
  78. 21
      java/src/main/java/com/toesbieya/my/model/entity/BizStock.java
  79. 20
      java/src/main/java/com/toesbieya/my/model/entity/RecAttachment.java
  80. 20
      java/src/main/java/com/toesbieya/my/model/entity/RecLoginHistory.java
  81. 22
      java/src/main/java/com/toesbieya/my/model/entity/RecUserAction.java
  82. 11
      java/src/main/java/com/toesbieya/my/model/entity/StatFinishOrder.java
  83. 13
      java/src/main/java/com/toesbieya/my/model/entity/StatProfitGoods.java
  84. 12
      java/src/main/java/com/toesbieya/my/model/entity/StatProfitTotal.java
  85. 12
      java/src/main/java/com/toesbieya/my/model/entity/SysCategory.java
  86. 23
      java/src/main/java/com/toesbieya/my/model/entity/SysCustomer.java
  87. 11
      java/src/main/java/com/toesbieya/my/model/entity/SysDepartment.java
  88. 12
      java/src/main/java/com/toesbieya/my/model/entity/SysRegion.java
  89. 19
      java/src/main/java/com/toesbieya/my/model/entity/SysResource.java
  90. 20
      java/src/main/java/com/toesbieya/my/model/entity/SysRole.java
  91. 17
      java/src/main/java/com/toesbieya/my/model/entity/SysSupplier.java
  92. 40
      java/src/main/java/com/toesbieya/my/model/entity/SysUser.java
  93. 10
      java/src/main/java/com/toesbieya/my/model/vo/IpResultVo.java
  94. 40
      java/src/main/java/com/toesbieya/my/model/vo/export/PurchaseInboundExport.java
  95. 52
      java/src/main/java/com/toesbieya/my/model/vo/export/PurchaseOrderExport.java
  96. 52
      java/src/main/java/com/toesbieya/my/model/vo/export/SellOrderExport.java
  97. 40
      java/src/main/java/com/toesbieya/my/model/vo/export/SellOutboundExport.java
  98. 52
      java/src/main/java/com/toesbieya/my/model/vo/export/StockExport.java
  99. 54
      java/src/main/java/com/toesbieya/my/model/vo/info/CpuInfo.java
  100. 25
      java/src/main/java/com/toesbieya/my/model/vo/info/DiskInfo.java
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,65 @@
<p align="center">
<img width="100" src="https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png">
</p>
## 简介
一个前后端分离的简易进销存后台管理系统,基于 [SpringBoot](https://spring.io/projects/spring-boot/) 和 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)实现,具备常见的后台管理功能,登录态使用session,使用基于资源url的简单权限控制。
- [在线预览](https://toesbieya.cn)
## 开发
**前端没有写mock,必须搭配后端启动。**
**后端依赖jdk8,mysql8.0,redis3.2,请确保本地具备以上环境。初次安装时请运行后端项目的初始化sql脚本**
**大部分情况下,你只需要修改后端的application.yml里的mysql、redis、七牛配置项,前端需要修改config/index.js里的七牛云相关配置项即可**
##前端说明
- 基于[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) 4.2.1,功能做了大量调整,具体如下:
```
- 样式修改
- 标签页tagsView右键菜单样式风格改为和侧边栏一样
- 对ele的样式做了修改,具体可以查看assets/style/element-ui.scss,或者在预览页面里查看`演示用例->样式`
- 移除响应式功能(复杂的后台管理想做成像VuePress那样的响应式不现实)
- 布局修改
- 经典后台布局改用flex实现
- 主页面使用el-scrollbar包裹
- 增加了ele的backToTop组件
- 路由修改
- 修改部分路由配置项,详细请看代码备注
- addRoutes时不判断权限,添加全部路由,然后在全局路由守卫内判断是否有权限进入页面
- 组件修改
- 侧边栏、导航栏增加了一些显示效果,具体可以在个性化设置内查看
- 标签页tagsView改造,加入了快捷键切换、拖拽排序、双击关闭功能,平滑滚动,修复关闭所有后路由未跳转的bug
- 面包屑改成样子货,纯粹展示当前路由路径
```
- 目录结构
```
├── mock # 项目mock,有需要的可以自己写,然后在vue.config.js里配置devServer
├── public
├── src
│ ├── api
│ ├── assets
│ │ │── icons # 项目所有 svg icons
│ │ └── styles # 全局样式
│ ├── bizComponents # 全局公用业务组件
│ ├── components # 全局公用组件
│ ├── config
│ │ │── index.js # 基础配置项
│ │ └── request.js # axios封装
│ ├── directive
│ ├── filters
│ ├── layout
│ ├── mixins # 公用混入
│ ├── plugin # 一些插件
│ ├── router
│ ├── store
│ ├── utils
│ ├── views
│ ├── App.vue
│ └── main.js
```

6
java/.gitignore vendored

@ -0,0 +1,6 @@
/target/
/.idea/
*.iml
.mvn
mvnw
*.cmd

File diff suppressed because it is too large Load Diff

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.toesbieya</groupId>
<artifactId>my</artifactId>
<version>0.0.1</version>
<name>my</name>
<description>简易进销存</description>
<properties>
<java.version>1.8</java.version>
<mybatis.version>2.1.0</mybatis.version>
<pagehelper.version>1.2.12</pagehelper.version>
<socketio.version>1.7.11</socketio.version>
<guava.version>28.1-jre</guava.version>
<fastjson.version>1.2.60</fastjson.version>
<!--系统监控-->
<jna.version>5.5.0</jna.version>
<oshi.version>4.3.0</oshi.version>
<!--七牛云-->
<qiniu.version>[7.2.0, 7.2.99]</qiniu.version>
<!--三方工具-->
<easyexcel.version>2.1.6</easyexcel.version>
<poi.version>4.1.1</poi.version>
<ehcache.version>3.8.1</ehcache.version>
<cglib.version>3.3.0</cglib.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--mysql数据库相关-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>${socketio.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--七牛云-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>${qiniu.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<scope>compile</scope>
</dependency>
<!--系统监控-->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>${oshi.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>${jna.version}</version>
</dependency>
<!-- 三方工具类 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>${cglib.version}</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,17 @@
package com.toesbieya.my;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@MapperScan("com.toesbieya.my.mapper")
@EnableScheduling
@EnableCaching
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

@ -0,0 +1,10 @@
package com.toesbieya.my.annoation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {
String[] value() default {};
}

@ -0,0 +1,10 @@
package com.toesbieya.my.annoation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TimeCost {
}

@ -0,0 +1,12 @@
package com.toesbieya.my.annoation;
import org.springframework.transaction.annotation.Transactional;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Transactional(rollbackFor = Exception.class)
public @interface Tx {
}

@ -0,0 +1,10 @@
package com.toesbieya.my.annoation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserAction {
String value() default "";
}

@ -0,0 +1,74 @@
package com.toesbieya.my.aspect;
import com.toesbieya.my.annoation.Lock;
import com.toesbieya.my.module.redis.LockHelper;
import com.toesbieya.my.module.redis.RedisLockHelper;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Method;
import java.util.ArrayList;
@Component
@Aspect
@Slf4j
@Order(Integer.MAX_VALUE - 1)
public class LockAspect {
private ThreadLocal<ArrayList<LockHelper>> lockHelperThreadLocal = new ThreadLocal<>();
@Pointcut("@annotation(com.toesbieya.my.annoation.Lock)&&execution(com.toesbieya.my.utils.Result com.toesbieya.my..*.*(..))")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
String[] values = method.getAnnotation(Lock.class).value();
if (values.length <= 0) {
return point.proceed();
}
ArrayList<LockHelper> locks = new ArrayList<>();
String[] parameterNames = signature.getParameterNames();
Object[] args = point.getArgs();
for (String v : values) {
String lockKey = (String) SpringUtil.spell(v, parameterNames, args);
LockHelper lockHelper = new RedisLockHelper(lockKey);
if (!lockHelper.lock()) {
if (locks.size() > 0) {
locks.forEach(LockHelper::close);
}
return Result.fail("操作失败,请刷新后重试");
}
locks.add(lockHelper);
}
lockHelperThreadLocal.set(locks);
return point.proceed();
}
@AfterReturning("pointCut()")
public void afterReturning() {
unlock();
}
@AfterThrowing("pointCut()")
public void afterThrowing() {
unlock();
}
private void unlock() {
ArrayList<LockHelper> locks = lockHelperThreadLocal.get();
if (!CollectionUtils.isEmpty(locks)) {
locks.forEach(LockHelper::close);
lockHelperThreadLocal.remove();
}
}
}

@ -0,0 +1,45 @@
package com.toesbieya.my.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
@Component
@Aspect
@Slf4j
@Order(1)
public class TimeCostAspect {
private ThreadLocal<Instant> instantThreadLocal = new ThreadLocal<>();
@Pointcut("@annotation(com.toesbieya.my.annoation.TimeCost)")
public void pointCut() {
}
@Before("pointCut()")
public void before() {
instantThreadLocal.set(Instant.now());
}
@AfterReturning("pointCut()")
public void afterReturning(JoinPoint point) {
if (null != instantThreadLocal.get()) {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
log.info("类:{},方法:{},耗时:{}毫秒",
method.getDeclaringClass().getName(),
method.getName(),
ChronoUnit.MILLIS.between(instantThreadLocal.get(), Instant.now()));
}
}
}

@ -0,0 +1,69 @@
package com.toesbieya.my.aspect;
import com.toesbieya.my.annoation.UserAction;
import com.toesbieya.my.enumeration.UserActionEnum;
import com.toesbieya.my.model.entity.RecUserAction;
import com.toesbieya.my.service.RecService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.SpringUtil;
import com.toesbieya.my.utils.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.lang.reflect.Method;
@Component
@Aspect
@Slf4j
@Order(Integer.MAX_VALUE - 2)
public class UserActionAspect {
@Resource
private RecService recService;
@Pointcut("@annotation(com.toesbieya.my.annoation.UserAction)&&execution(com.toesbieya.my.utils.Result com.toesbieya.my..*.*(..))")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
RecUserAction action = ThreadUtil.getAction();
if (action == null) {
return pjp.proceed();
}
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
Object[] args = pjp.getArgs();
String[] argNames = signature.getParameterNames();
UserAction annotation = method.getAnnotation(UserAction.class);
//优先使用注解表达式
if (!StringUtils.isEmpty(annotation.value())) {
String str = (String) SpringUtil.spell(annotation.value(), argNames, args);
if (!StringUtils.isEmpty(str)) {
action.setAction(str);
}
}
Result result = (Result) pjp.proceed();
if (result.isSuccess()) {
recService.insertUserAction(action, UserActionEnum.SUCCESS);
}
else {
action.setError(result.getMsg());
recService.insertUserAction(action, UserActionEnum.FAIL);
}
return result;
}
}

@ -0,0 +1,65 @@
package com.toesbieya.my.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
@Slf4j
public class ExecutorConfig implements AsyncConfigurer {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
log.error("异步线程执行失败。方法:[{}],异常信息[{}] : ", method, ex.getMessage(), ex);
};
}
//定时任务线程池
@Bean
public Executor scheduledExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
threadPoolTaskExecutor.setCorePoolSize(2);
//是否回收空闲线程
threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(5);
//配置等待队列大小
threadPoolTaskExecutor.setQueueCapacity(2);
//配置线程池前缀
threadPoolTaskExecutor.setThreadNamePrefix("scheduled-");
//拒绝策略
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
//数据库插入线程池
@Bean
public Executor dbInsertExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
threadPoolTaskExecutor.setCorePoolSize(5);
//是否回收空闲线程
threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(10);
//配置等待队列大小
threadPoolTaskExecutor.setQueueCapacity(50);
//配置线程池前缀
threadPoolTaskExecutor.setThreadNamePrefix("dbInsert-");
//拒绝策略
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}

@ -0,0 +1,55 @@
package com.toesbieya.my.config;
import com.alibaba.fastjson.JSON;
import com.toesbieya.my.listener.RedisSessionListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@Configuration
@EnableRedisHttpSession()
public class HttpSessionConfig {
@Bean
public RedisSessionListener httpSessionEventPublisher() {
return new RedisSessionListener();
}
@Bean("springSessionDefaultRedisSerializer")
public RedisSerializer<Object> defaultRedisSerializer() {
return new JsonRedisSerializer<>(Object.class);
}
private class JsonRedisSerializer<T> implements RedisSerializer<T> {
private final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private Class<T> clazz;
public JsonRedisSerializer(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return JSON.parseObject(str, clazz);
}
}
}

@ -0,0 +1,55 @@
package com.toesbieya.my.config;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置值(value)的序列化采用FastJsonRedisSerializer。
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setDefaultSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60))
// 设置key的序列化方式
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
// 设置value的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
// 不缓存null值
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.transactionAware()
.build();
}
}

@ -0,0 +1,26 @@
package com.toesbieya.my.config;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;
import com.toesbieya.my.constant.SocketConstant;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SocketConfig {
@Bean
public SocketIOServer socketIOServer() {
com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
config.setHostname(SocketConstant.HOSTNAME);
config.setPort(SocketConstant.PORT);
config.setMaxFramePayloadLength(SocketConstant.MAX_FRAME_PAYLOAD);
config.setMaxHttpContentLength(SocketConstant.MAX_HTTP_CONTENT);
return new SocketIOServer(config);
}
@Bean
public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {
return new SpringAnnotationScanner(socketServer);
}
}

@ -0,0 +1,67 @@
package com.toesbieya.my.config;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.toesbieya.my.interceptor.RateControlInterceptor;
import com.toesbieya.my.interceptor.SecurityInterceptor;
import com.toesbieya.my.interceptor.UserActionInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/*
先把JackSon的消息转换器删除.
备注:(1)源码分析可知返回json的过程为:
Controller调用结束后返回一个数据对象for循环遍历conventers找到支持application/json的HttpMessageConverter然后将返回的数据序列化成json
具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor的writeWithMessageConverters方法
(2)由于是list结构我们添加的fastjson在最后因此必须要将jackson的转换器删除不然会先匹配上jackson导致没使用fastjson
*/
for (int i = converters.size() - 1; i >= 0; i--) {
if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
converters.remove(i);
}
}
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
SerializerFeature.WriteMapNullValue, // 是否输出值为null的字段,默认为false,我们将它打开
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.DisableCircularReferenceDetect // 禁用循环引用
);
fastJsonHttpMessageConverter.setFastJsonConfig(config);
// 添加支持的MediaTypes;不添加时默认为*/*,也就是默认支持全部
// 但是MappingJackson2HttpMessageConverter里面支持的MediaTypes为application/json
// 参考它的做法, fastjson也只添加application/json的MediaType
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(fastJsonHttpMessageConverter);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] exclude = {"/test/**", "/login", "/logout", "/register", "/error"};
addInterceptor(registry, new SecurityInterceptor(), exclude);
addInterceptor(registry, new RateControlInterceptor(), exclude);
addInterceptor(registry, new UserActionInterceptor(), exclude);
}
private void addInterceptor(InterceptorRegistry registry, HandlerInterceptor interceptor, String[] exclude) {
InterceptorRegistration registration = registry.addInterceptor(interceptor).addPathPatterns("/**");
registration.excludePathPatterns(exclude);
}
}

@ -0,0 +1,8 @@
package com.toesbieya.my.constant;
public class SessionConstant {
public static String REDIS_NAMESPACE = "spring:session:sessions:";
public static String USER_KEY = "user";
public static String TOKEN_KEY = "X-Token";
public static Integer PREDICT_MAX_USER = 128;
}

@ -0,0 +1,11 @@
package com.toesbieya.my.constant;
import com.toesbieya.my.utils.YmlUtil;
public class SocketConstant {
public static final String HOSTNAME = (String) YmlUtil.get("socket.hostname");
public static final int PORT = (int) YmlUtil.get("socket.port");
public static final int MAX_FRAME_PAYLOAD = (int) YmlUtil.get("socket.max-frame-payload");
public static final int MAX_HTTP_CONTENT = (int) YmlUtil.get("socket.max-http-content");
public static final String EVENT_LOGOUT = (String) YmlUtil.get("socket.event.logout");
}

@ -0,0 +1,25 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.vo.search.DocumentHistorySearch;
import com.toesbieya.my.service.BizDocumentHistoryService;
import com.toesbieya.my.utils.Result;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("document/history")
public class BizDocumentHistoryController {
@Resource
private BizDocumentHistoryService documentHistoryService;
@GetMapping("get")
public Result get(@RequestParam("pid") String pid) {
return Result.success(documentHistoryService.getByPid(pid));
}
@PostMapping("search")
public Result search(@RequestBody DocumentHistorySearch vo) {
return Result.success(documentHistoryService.search(vo));
}
}

@ -0,0 +1,138 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.enumeration.BizDocumentStatusEnum;
import com.toesbieya.my.model.entity.BizPurchaseInbound;
import com.toesbieya.my.model.entity.BizPurchaseInboundSub;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.PurchaseInboundSearch;
import com.toesbieya.my.model.vo.update.DocumentStatusUpdate;
import com.toesbieya.my.service.BizPurchaseInboundService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@RestController
@RequestMapping("purchase/inbound")
public class BizPurchaseInboundController {
@Resource
private BizPurchaseInboundService purchaseInboundService;
@Resource
private HttpSession session;
@GetMapping("getById")
public Result getById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
BizPurchaseInbound inbound = purchaseInboundService.getById(id);
return inbound == null ? Result.fail("获取单据信息失败") : Result.success(inbound);
}
@GetMapping("getSubById")
public Result getSubById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return Result.success(purchaseInboundService.getSubById(id));
}
@PostMapping("search")
public Result search(@RequestBody PurchaseInboundSearch vo) {
return Result.success(purchaseInboundService.search(vo));
}
@PostMapping("export")
public void export(@RequestBody PurchaseInboundSearch vo, HttpServletResponse response) throws Exception {
purchaseInboundService.export(vo, response);
}
@PostMapping("add")
public Result add(@RequestBody BizPurchaseInbound inbound) {
String errMsg = validateSub(inbound.getData());
if (errMsg != null) return Result.fail(errMsg);
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
inbound.setCid(sysUser.getId());
inbound.setCname(sysUser.getName());
inbound.setCtime(System.currentTimeMillis());
inbound.setStatus(BizDocumentStatusEnum.DRAFT.getCode());
return purchaseInboundService.add(inbound);
}
@PostMapping("update")
public Result update(@RequestBody BizPurchaseInbound inbound) {
String errMsg = validateUpdate(inbound);
if (errMsg == null) errMsg = validateSub(inbound.getData());
if (errMsg != null) return Result.fail(errMsg);
return purchaseInboundService.update(inbound);
}
@PostMapping("commit")
public Result commit(@RequestBody BizPurchaseInbound inbound) {
boolean isFirst = StringUtils.isEmpty(inbound.getId());
String errMsg = validateSub(inbound.getData());
if (!isFirst && errMsg == null) errMsg = validateUpdate(inbound);
if (errMsg != null) return Result.fail(errMsg);
inbound.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode());
if (isFirst) {
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
inbound.setCid(sysUser.getId());
inbound.setCname(sysUser.getName());
inbound.setCtime(System.currentTimeMillis());
}
return purchaseInboundService.commit(inbound);
}
@PostMapping("withdraw")
public Result withdraw(@RequestBody DocumentStatusUpdate vo) {
return purchaseInboundService.withdraw(vo, Util.getUser(session));
}
@PostMapping("pass")
public Result pass(@RequestBody DocumentStatusUpdate vo) {
if (StringUtils.isEmpty(vo.getPid())) return Result.fail("参数错误");
return purchaseInboundService.pass(vo, Util.getUser(session));
}
@PostMapping("reject")
public Result reject(@RequestBody DocumentStatusUpdate vo) {
return purchaseInboundService.reject(vo, Util.getUser(session));
}
@GetMapping("del")
public Result del(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return purchaseInboundService.del(id);
}
private String validateUpdate(BizPurchaseInbound main) {
if (StringUtils.isEmpty(main.getId())
|| StringUtils.isEmpty(main.getPid())
|| StringUtils.isEmpty(main.getCid())
|| StringUtils.isEmpty(main.getCname())
|| StringUtils.isEmpty(main.getCtime())
|| StringUtils.isEmpty(main.getStatus())
) return "参数错误";
return null;
}
private String validateSub(List<BizPurchaseInboundSub> list) {
if (CollectionUtils.isEmpty(list)) return "采购入库单必须要有入库列表";
int i = 1;
for (BizPurchaseInboundSub sub : list) {
if (sub.getNum() == null || sub.getNum() <= 0) return "第" + i + "个入库商品数量有误";
if (sub.getCid() == null || StringUtils.isEmpty(sub.getCname())) return "第" + i + "个入库商品数量有误";
i++;
}
return null;
}
}

@ -0,0 +1,147 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.enumeration.BizDocumentStatusEnum;
import com.toesbieya.my.model.entity.BizPurchaseOrder;
import com.toesbieya.my.model.entity.BizPurchaseOrderSub;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.PurchaseOrderSearch;
import com.toesbieya.my.model.vo.update.DocumentStatusUpdate;
import com.toesbieya.my.service.BizPurchaseOrderService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@RestController
@RequestMapping("purchase/order")
public class BizPurchaseOrderController {
@Resource
private BizPurchaseOrderService purchaseOrderService;
@Resource
private HttpSession session;
@GetMapping("getById")
public Result getById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
BizPurchaseOrder order = purchaseOrderService.getById(id);
return order == null ? Result.fail("获取单据信息失败") : Result.success(order);
}
@GetMapping("getSubById")
public Result getSubById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return Result.success(purchaseOrderService.getSubById(id));
}
@PostMapping("search")
public Result search(@RequestBody PurchaseOrderSearch vo) {
return Result.success(purchaseOrderService.search(vo));
}
@PostMapping("export")
public void export(@RequestBody PurchaseOrderSearch vo, HttpServletResponse response) throws Exception {
purchaseOrderService.export(vo, response);
}
@PostMapping("add")
public Result add(@RequestBody BizPurchaseOrder order) {
if (order.getSid() == null
|| StringUtils.isEmpty(order.getSname())
|| order.getTotal() == null) {
return Result.fail("参数错误");
}
String errMsg = validateSub(order.getData());
if (errMsg != null) return Result.fail(errMsg);
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
order.setCid(sysUser.getId());
order.setCname(sysUser.getName());
order.setCtime(System.currentTimeMillis());
order.setStatus(BizDocumentStatusEnum.DRAFT.getCode());
return purchaseOrderService.add(order);
}
@PostMapping("update")
public Result update(@RequestBody BizPurchaseOrder order) {
String errMsg = validateUpdate(order);
if (errMsg == null) errMsg = validateSub(order.getData());
if (errMsg != null) return Result.fail(errMsg);
return purchaseOrderService.update(order);
}
@PostMapping("commit")
public Result commit(@RequestBody BizPurchaseOrder order) {
boolean isFirst = StringUtils.isEmpty(order.getId());
String errMsg = validateSub(order.getData());
if (!isFirst && errMsg == null) errMsg = validateUpdate(order);
if (errMsg != null) return Result.fail(errMsg);
order.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode());
if (isFirst) {
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
order.setCid(sysUser.getId());
order.setCname(sysUser.getName());
order.setCtime(System.currentTimeMillis());
}
return purchaseOrderService.commit(order);
}
@PostMapping("withdraw")
public Result withdraw(@RequestBody DocumentStatusUpdate vo) {
return purchaseOrderService.withdraw(vo, Util.getUser(session));
}
@PostMapping("pass")
public Result pass(@RequestBody DocumentStatusUpdate vo) {
return purchaseOrderService.pass(vo, Util.getUser(session));
}
@PostMapping("reject")
public Result reject(@RequestBody DocumentStatusUpdate vo) {
return purchaseOrderService.reject(vo, Util.getUser(session));
}
@GetMapping("del")
public Result del(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return purchaseOrderService.del(id);
}
private String validateUpdate(BizPurchaseOrder main) {
if (StringUtils.isEmpty(main.getId())
|| StringUtils.isEmpty(main.getSid())
|| StringUtils.isEmpty(main.getSname())
|| StringUtils.isEmpty(main.getCid())
|| StringUtils.isEmpty(main.getCname())
|| StringUtils.isEmpty(main.getCtime())
|| StringUtils.isEmpty(main.getStatus())
|| main.getTotal() == null
) return "参数错误";
return null;
}
private String validateSub(List<BizPurchaseOrderSub> list) {
if (CollectionUtils.isEmpty(list)) return "采购订单必须要有采购列表";
int i = 1;
for (BizPurchaseOrderSub sub : list) {
if (sub.getPrice() == null || sub.getPrice() <= 0) return "第" + i + "个采购商品价格有误";
if (sub.getNum() == null || sub.getNum() <= 0) return "第" + i + "个采购商品数量有误";
i++;
}
return null;
}
}

@ -0,0 +1,147 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.enumeration.BizDocumentStatusEnum;
import com.toesbieya.my.model.entity.BizSellOrder;
import com.toesbieya.my.model.entity.BizSellOrderSub;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.SellOrderSearch;
import com.toesbieya.my.model.vo.update.DocumentStatusUpdate;
import com.toesbieya.my.service.BizSellOrderService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@RestController
@RequestMapping("sell/order")
public class BizSellOrderController {
@Resource
private BizSellOrderService sellOrderService;
@Resource
private HttpSession session;
@GetMapping("getById")
public Result getById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
BizSellOrder order = sellOrderService.getById(id);
return order == null ? Result.fail("获取单据信息失败") : Result.success(order);
}
@GetMapping("getSubById")
public Result getSubById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return Result.success(sellOrderService.getSubById(id));
}
@PostMapping("search")
public Result search(@RequestBody SellOrderSearch vo) {
return Result.success(sellOrderService.search(vo));
}
@PostMapping("export")
public void export(@RequestBody SellOrderSearch vo, HttpServletResponse response) throws Exception {
sellOrderService.export(vo, response);
}
@PostMapping("add")
public Result add(@RequestBody BizSellOrder order) {
if (order.getCustomer_id() == null
|| StringUtils.isEmpty(order.getCustomer_name())
|| order.getTotal() == null) {
return Result.fail("参数错误");
}
String errMsg = validateSub(order.getData());
if (errMsg != null) return Result.fail(errMsg);
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
order.setCid(sysUser.getId());
order.setCname(sysUser.getName());
order.setCtime(System.currentTimeMillis());
order.setStatus(BizDocumentStatusEnum.DRAFT.getCode());
return sellOrderService.add(order);
}
@PostMapping("update")
public Result update(@RequestBody BizSellOrder order) {
String errMsg = validateUpdate(order);
if (errMsg == null) errMsg = validateSub(order.getData());
if (errMsg != null) return Result.fail(errMsg);
return sellOrderService.update(order);
}
@PostMapping("commit")
public Result commit(@RequestBody BizSellOrder order) {
boolean isFirst = StringUtils.isEmpty(order.getId());
String errMsg = validateSub(order.getData());
if (!isFirst && errMsg == null) errMsg = validateUpdate(order);
if (errMsg != null) return Result.fail(errMsg);
order.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode());
if (isFirst) {
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
order.setCid(sysUser.getId());
order.setCname(sysUser.getName());
order.setCtime(System.currentTimeMillis());
}
return sellOrderService.commit(order);
}
@PostMapping("withdraw")
public Result withdraw(@RequestBody DocumentStatusUpdate vo) {
return sellOrderService.withdraw(vo, Util.getUser(session));
}
@PostMapping("pass")
public Result pass(@RequestBody DocumentStatusUpdate vo) {
return sellOrderService.pass(vo, Util.getUser(session));
}
@PostMapping("reject")
public Result reject(@RequestBody DocumentStatusUpdate vo) {
return sellOrderService.reject(vo, Util.getUser(session));
}
@GetMapping("del")
public Result del(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return sellOrderService.del(id);
}
private String validateUpdate(BizSellOrder main) {
if (StringUtils.isEmpty(main.getId())
|| StringUtils.isEmpty(main.getCustomer_id())
|| StringUtils.isEmpty(main.getCustomer_name())
|| StringUtils.isEmpty(main.getCid())
|| StringUtils.isEmpty(main.getCname())
|| StringUtils.isEmpty(main.getCtime())
|| StringUtils.isEmpty(main.getStatus())
|| main.getTotal() == null
) return "参数错误";
return null;
}
private String validateSub(List<BizSellOrderSub> list) {
if (CollectionUtils.isEmpty(list)) return "销售订单必须要有销售列表";
int i = 1;
for (BizSellOrderSub sub : list) {
if (sub.getPrice() == null || sub.getPrice() <= 0) return "第" + i + "个销售商品价格有误";
if (sub.getNum() == null || sub.getNum() <= 0) return "第" + i + "个销售商品数量有误";
i++;
}
return null;
}
}

@ -0,0 +1,139 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.enumeration.BizDocumentStatusEnum;
import com.toesbieya.my.model.entity.BizSellOutbound;
import com.toesbieya.my.model.entity.BizSellOutboundSub;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.SellOutboundSearch;
import com.toesbieya.my.model.vo.update.DocumentStatusUpdate;
import com.toesbieya.my.service.BizSellOutboundService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@RestController
@RequestMapping("sell/outbound")
public class BizSellOutboundController {
@Resource
private BizSellOutboundService sellOutboundService;
@Resource
private HttpSession session;
@GetMapping("getById")
public Result getById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
BizSellOutbound outbound = sellOutboundService.getById(id);
return outbound == null ? Result.fail("获取单据信息失败") : Result.success(outbound);
}
@GetMapping("getSubById")
public Result getSubById(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return Result.success(sellOutboundService.getSubById(id));
}
@PostMapping("search")
public Result search(@RequestBody SellOutboundSearch vo) {
return Result.success(sellOutboundService.search(vo));
}
@PostMapping("export")
public void export(@RequestBody SellOutboundSearch vo, HttpServletResponse response) throws Exception {
sellOutboundService.export(vo, response);
}
@PostMapping("add")
public Result add(@RequestBody BizSellOutbound outbound) {
String errMsg = validateSub(outbound.getData());
if (errMsg != null) return Result.fail(errMsg);
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
outbound.setCid(sysUser.getId());
outbound.setCname(sysUser.getName());
outbound.setCtime(System.currentTimeMillis());
outbound.setStatus(BizDocumentStatusEnum.DRAFT.getCode());
return sellOutboundService.add(outbound);
}
@PostMapping("update")
public Result update(@RequestBody BizSellOutbound outbound) {
String errMsg = validateUpdate(outbound);
if (errMsg == null) errMsg = validateSub(outbound.getData());
if (errMsg != null) return Result.fail(errMsg);
return sellOutboundService.update(outbound);
}
@PostMapping("commit")
public Result commit(@RequestBody BizSellOutbound outbound) {
boolean isFirst = StringUtils.isEmpty(outbound.getId());
String errMsg = validateSub(outbound.getData());
if (!isFirst && errMsg == null) errMsg = validateUpdate(outbound);
if (errMsg != null) return Result.fail(errMsg);
outbound.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode());
if (isFirst) {
SysUser sysUser = Util.getUser(session);
assert sysUser != null;
outbound.setCid(sysUser.getId());
outbound.setCname(sysUser.getName());
outbound.setCtime(System.currentTimeMillis());
}
return sellOutboundService.commit(outbound);
}
@PostMapping("withdraw")
public Result withdraw(@RequestBody DocumentStatusUpdate vo) {
return sellOutboundService.withdraw(vo, Util.getUser(session));
}
@PostMapping("pass")
public Result pass(@RequestBody DocumentStatusUpdate vo) {
if (StringUtils.isEmpty(vo.getPid())) return Result.fail("参数错误");
return sellOutboundService.pass(vo, Util.getUser(session));
}
@PostMapping("reject")
public Result reject(@RequestBody DocumentStatusUpdate vo) {
return sellOutboundService.reject(vo, Util.getUser(session));
}
@GetMapping("del")
public Result del(@RequestParam String id) {
if (StringUtils.isEmpty(id)) return Result.fail("参数错误");
return sellOutboundService.del(id);
}
private String validateUpdate(BizSellOutbound main) {
if (StringUtils.isEmpty(main.getId())
|| StringUtils.isEmpty(main.getPid())
|| StringUtils.isEmpty(main.getCid())
|| StringUtils.isEmpty(main.getCname())
|| StringUtils.isEmpty(main.getCtime())
|| StringUtils.isEmpty(main.getStatus())
) return "参数错误";
return null;
}
private String validateSub(List<BizSellOutboundSub> list) {
if (CollectionUtils.isEmpty(list)) return "销售出库单必须要有出库列表";
int i = 1;
for (BizSellOutboundSub sub : list) {
if (sub.getSid() == null) return "第" + i + "个出库商品没有选择库存";
if (sub.getNum() == null || sub.getNum() <= 0) return "第" + i + "个出库商品数量有误";
if (sub.getCid() == null || StringUtils.isEmpty(sub.getCname())) return "第" + i + "个出库商品数量有误";
i++;
}
return null;
}
}

@ -0,0 +1,39 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.vo.search.StockSearch;
import com.toesbieya.my.service.BizStockService;
import com.toesbieya.my.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("stock/current")
public class BizStockController {
@Resource
private BizStockService stockService;
@PostMapping("search")
public Result search(@RequestBody StockSearch vo) {
return Result.success(stockService.search(vo));
}
@GetMapping("getDetail")
public Result getDetail(@RequestParam String cid) {
if (StringUtils.isEmpty(cid)) return Result.fail("参数错误");
return Result.success(stockService.getDetail(cid));
}
@GetMapping("getDetailById")
public Result getDetailById(@RequestParam String ids) {
if (StringUtils.isEmpty(ids)) return Result.fail("参数错误");
return Result.success(stockService.getDetailById(ids));
}
@PostMapping("export")
public void export(@RequestBody StockSearch vo, HttpServletResponse response) throws Exception {
stockService.export(vo, response);
}
}

@ -0,0 +1,29 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.utils.QiniuUtil;
import com.toesbieya.my.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
@RestController
@RequestMapping("file")
@Slf4j
public class FileController {
@GetMapping("delete")
public Result delete(@RequestParam String url) throws UnsupportedEncodingException {
QiniuUtil.delete(URLDecoder.decode(url, "utf-8"));
return Result.success("删除成功");
}
@GetMapping("getToken")
public Result getToken() {
return Result.success(null, QiniuUtil.getToken());
}
}

@ -0,0 +1,71 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.enumeration.RecLoginHistoryEnum;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.service.RecService;
import com.toesbieya.my.service.SysUserService;
import com.toesbieya.my.utils.IpUtil;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;
@RestController
public class LoginController {
@Resource
private SysUserService userService;
@Resource
private RecService recService;
@Resource
private HttpSession session;
@PostMapping("login")
public Result login(HttpServletRequest request, @RequestBody Map<String, String> map) {
String username = map.get("username");
String password = map.get("password");
String err = validate(username, password);
if (err != null) return Result.fail(err);
return userService.login(username, password, IpUtil.getIp(request));
}
@PostMapping("register")
public Result register(@RequestBody Map<String, String> map) {
String username = map.get("username");
String password = map.get("password");
String err = validate(username, password);
if (err != null) return Result.fail(err);
return userService.register(username, password);
}
@GetMapping("logout")
public Result logout(HttpServletRequest request) {
SysUser user = Util.getUser(session);
if (user != null) {
recService.insertLoginHistory(user, IpUtil.getIp(request), RecLoginHistoryEnum.LOGOUT);
}
session.invalidate();
return Result.success("登出成功");
}
private String validate(String username, String password) {
if ((StringUtils.isEmpty(username)
|| StringUtils.isEmpty(password)
|| username.length() > 20
|| password.length() != 32)) {
return "用户名或密码输入有误";
}
return null;
}
}

@ -0,0 +1,17 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.utils.MonitorUtil;
import com.toesbieya.my.utils.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("system/monitor")
public class MonitorController {
@GetMapping("get")
public Result get() {
return Result.success(MonitorUtil.getMonitorInfo());
}
}

@ -0,0 +1,36 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.service.StatisticService;
import com.toesbieya.my.utils.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("statistic")
public class StatisticController {
@Resource
private StatisticService statisticService;
@GetMapping("getFourBlock")
public Result getFourBlock() {
return Result.success(statisticService.getFourBlock());
}
@GetMapping("getDailyProfitStat")
public Result getDailyProfitStat() {
return Result.success(statisticService.getDailyProfitStat());
}
@GetMapping("getDailyFinishOrder")
public Result getDailyFinishOrder() {
return Result.success(statisticService.getDailyFinishOrder());
}
@GetMapping("getTotalProfitGoods")
public Result getTotalProfitGoods() {
return Result.success(statisticService.getTotalProfitGoods());
}
}

@ -0,0 +1,65 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysCategory;
import com.toesbieya.my.model.vo.search.CategorySearch;
import com.toesbieya.my.service.SysCategoryService;
import com.toesbieya.my.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/category")
public class SysCategoryController {
@Resource
private SysCategoryService categoryService;
@GetMapping("getAll")
public Result getAll() {
return Result.success(categoryService.getAll());
}
@PostMapping("search")
public Result search(@RequestBody CategorySearch vo) {
return Result.success(categoryService.search(vo));
}
@PostMapping("add")
public Result add(@RequestBody SysCategory category) {
String errMsg = validateCategoryCreateParam(category);
if (errMsg != null) return Result.fail(errMsg);
category.setCtime(System.currentTimeMillis());
return categoryService.add(category);
}
@PostMapping("update")
public Result update(@RequestBody SysCategory category) {
String errMsg = validateCategoryUpdateParam(category);
if (errMsg != null) return Result.fail(errMsg);
return categoryService.update(category);
}
@PostMapping("del")
public Result del(@RequestBody SysCategory category) {
if (category.getId() == null) return Result.fail("删除失败,参数错误");
return categoryService.del(category);
}
private String validateCategoryCreateParam(SysCategory category) {
if (category.getPid() == null) return "创建失败,参数错误";
if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
if (category.getType() == null) return "创建失败,分类类型不能为空";
return null;
}
private String validateCategoryUpdateParam(SysCategory category) {
if (category.getId() == null) return "修改失败,参数错误";
if (category.getPid() == null) return "创建失败,参数错误";
if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
if (category.getType() == null) return "创建失败,分类类型不能为空";
return null;
}
}

@ -0,0 +1,70 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysCustomer;
import com.toesbieya.my.model.vo.search.CustomerSearch;
import com.toesbieya.my.service.SysCustomerService;
import com.toesbieya.my.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/customer")
public class SysCustomerController {
@Resource
private SysCustomerService customerService;
@GetMapping("getLimitRegion")
public Result getLimitRegion() {
return Result.success(customerService.getLimitRegion());
}
@GetMapping("get")
public Result get() {
return Result.success(customerService.get());
}
@PostMapping("search")
public Result search(@RequestBody CustomerSearch vo) {
return Result.success(customerService.search(vo));
}
@PostMapping("add")
public Result add(@RequestBody SysCustomer customer) {
String errMsg = validateCreateParam(customer);
if (errMsg != null) return Result.fail("创建失败," + errMsg);
customer.setCtime(System.currentTimeMillis());
return customerService.add(customer);
}
@PostMapping("update")
public Result update(@RequestBody SysCustomer customer) {
String errMsg = validateUpdateParam(customer);
if (errMsg != null) return Result.fail("修改失败," + errMsg);
return customerService.update(customer);
}
@PostMapping("del")
public Result del(@RequestBody SysCustomer customer) {
if (customer.getId() == null) return Result.fail("删除失败,参数错误");
return customerService.del(customer);
}
private String validateCreateParam(SysCustomer customer) {
if (StringUtils.isEmpty(customer.getName())) return "客户名称不能为空";
if (StringUtils.isEmpty(customer.getRegion())) return "客户行政区域不能为空";
if (StringUtils.isEmpty(customer.getAddress())) return "客户地址不能为空";
if (StringUtils.isEmpty(customer.getLinkman())) return "客户联系人不能为空";
if (StringUtils.isEmpty(customer.getLinkphone())) return "客户联系电话不能为空";
if (customer.getStatus() == null) return "客户状态不能为空";
return null;
}
private String validateUpdateParam(SysCustomer customer) {
if (customer.getId() == null) return "参数错误";
return validateCreateParam(customer);
}
}

@ -0,0 +1,57 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysDepartment;
import com.toesbieya.my.service.SysDepartmentService;
import com.toesbieya.my.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/department")
public class SysDepartmentController {
@Resource
private SysDepartmentService departmentService;
@GetMapping("get")
public Result get() {
return Result.success(departmentService.get());
}
@GetMapping("getAll")
public Result getAll() {
return Result.success(departmentService.getAll());
}
@PostMapping("add")
public Result add(@RequestBody SysDepartment department) {
if (null == department.getPid()
|| StringUtils.isEmpty(department.getName())
|| null == department.getStatus()
) {
return Result.fail("添加失败,参数错误");
}
return departmentService.add(department);
}
@PostMapping("update")
public Result update(@RequestBody SysDepartment department) {
if (null == department.getId()
|| null == department.getPid()
|| StringUtils.isEmpty(department.getName())
|| null == department.getStatus()
) {
return Result.fail("修改失败,参数错误");
}
return departmentService.update(department);
}
@PostMapping("del")
public Result del(@RequestBody SysDepartment department) {
if (null == department.getId() || StringUtils.isEmpty(department.getName())) {
return Result.fail("删除失败,参数错误");
}
return departmentService.del(department);
}
}

@ -0,0 +1,35 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysResource;
import com.toesbieya.my.service.SysResourceService;
import com.toesbieya.my.utils.Result;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/resource")
public class SysResourceController {
@Resource
private SysResourceService resourceService;
@GetMapping("get")
public Result get() {
return Result.success(resourceService.get());
}
@GetMapping("getAll")
public Result getAll() {
return Result.success(resourceService.getAll());
}
@PostMapping("update")
public Result update(@RequestBody SysResource resource) {
if (resource.getId() == null
|| resource.getTotal_rate() == null
|| resource.getIp_rate() == null) {
return Result.fail("参数错误");
}
return resourceService.update(resource);
}
}

@ -0,0 +1,62 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysRole;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.RoleSearch;
import com.toesbieya.my.service.SysRoleService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.Util;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
@RequestMapping("system/role")
@RestController
public class SysRoleController {
@Resource
private SysRoleService roleService;
@Resource
private HttpSession session;
@GetMapping("get")
public Result get() {
return Result.success(roleService.get());
}
@PostMapping("search")
public Result search(@RequestBody RoleSearch vo) {
return Result.success(roleService.search(vo));
}
@PostMapping("add")
public Result add(@RequestBody SysRole role) {
if (StringUtils.isEmpty(role.getName())
|| role.getStatus() == null) {
return Result.fail("添加失败,参数错误");
}
SysUser user = Util.getUser(session);
assert user != null;
role.setCid(user.getId());
role.setCname(user.getName());
role.setCtime(System.currentTimeMillis());
return roleService.add(role);
}
@PostMapping("update")
public Result update(@RequestBody SysRole role) {
if (StringUtils.isEmpty(role.getName())
|| role.getId() == null
|| role.getStatus() == null) {
return Result.fail("修改失败,参数错误");
}
return roleService.update(role);
}
@PostMapping("del")
public Result del(@RequestBody SysRole role) {
if (role.getId() == null) return Result.fail("删除失败,参数错误");
return roleService.del(role);
}
}

@ -0,0 +1,70 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.SysSupplier;
import com.toesbieya.my.model.vo.search.SupplierSearch;
import com.toesbieya.my.service.SysSupplierService;
import com.toesbieya.my.utils.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/supplier")
public class SysSupplierController {
@Resource
private SysSupplierService supplierService;
@GetMapping("getLimitRegion")
public Result getLimitRegion() {
return Result.success(supplierService.getLimitRegion());
}
@GetMapping("get")
public Result get() {
return Result.success(supplierService.get());
}
@PostMapping("search")
public Result search(@RequestBody SupplierSearch vo) {
return Result.success(supplierService.search(vo));
}
@PostMapping("add")
public Result add(@RequestBody SysSupplier supplier) {
String errMsg = validateCreateParam(supplier);
if (errMsg != null) return Result.fail("添加失败," + errMsg);
supplier.setCtime(System.currentTimeMillis());
return supplierService.add(supplier);
}
@PostMapping("update")
public Result update(@RequestBody SysSupplier supplier) {
String errMsg = validateUpdateParam(supplier);
if (errMsg != null) return Result.fail("修改失败," + errMsg);
return supplierService.update(supplier);
}
@PostMapping("del")
public Result del(@RequestBody SysSupplier supplier) {
if (supplier.getId() == null) return Result.fail("删除失败,参数错误");
return supplierService.del(supplier);
}
private String validateCreateParam(SysSupplier supplier) {
if (StringUtils.isEmpty(supplier.getName())) return "供应商名称不能为空";
if (StringUtils.isEmpty(supplier.getRegion())) return "供应商行政区域不能为空";
if (StringUtils.isEmpty(supplier.getAddress())) return "供应商地址不能为空";
if (StringUtils.isEmpty(supplier.getLinkman())) return "供应商联系人不能为空";
if (StringUtils.isEmpty(supplier.getLinkphone())) return "供应商联系电话不能为空";
if (supplier.getStatus() == null) return "供应商状态不能为空";
return null;
}
private String validateUpdateParam(SysSupplier supplier) {
if (supplier.getId() == null) return "参数错误";
return validateCreateParam(supplier);
}
}

@ -0,0 +1,162 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.model.entity.RecUserAction;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.LoginHistorySearch;
import com.toesbieya.my.model.vo.search.UserActionSearch;
import com.toesbieya.my.model.vo.search.UserSearch;
import com.toesbieya.my.model.vo.update.UserUpdatePwd;
import com.toesbieya.my.service.RecService;
import com.toesbieya.my.service.SysUserService;
import com.toesbieya.my.utils.DateUtil;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.ThreadUtil;
import com.toesbieya.my.utils.Util;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("system/user")
public class SysUserController {
@Resource
private SysUserService userService;
@Resource
private RecService recService;
@Resource
private HttpSession session;
@PostMapping("search")
public Result search(@RequestBody UserSearch vo) {
return Result.success(userService.search(vo));
}
@PostMapping("getLoginHistory")
public Result getLoginHistory(@RequestBody LoginHistorySearch vo) {
SysUser user = Util.getUser(session);
assert user != null;
if (!user.getAdmin().equals(1)) {
vo.setStartTime(null);
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
return Result.success(recService.searchLoginHistory(vo));
}
@PostMapping("getUserAction")
public Result getUserAction(@RequestBody UserActionSearch vo) {
SysUser user = Util.getUser(session);
assert user != null;
if (user.getAdmin() != 1) {
vo.setStartTime(null);
vo.setEndTime(DateUtil.getTimestampBeforeNow(-7));
}
return Result.success(recService.searchUserAction(vo));
}
@PostMapping("add")
public Result add(@RequestBody SysUser user) {
String errMsg = validateUserCreateParam(user);
if (errMsg != null) {
return Result.fail(errMsg);
}
return userService.add(user);
}
@PostMapping("update")
public Result update(@RequestBody SysUser user) {
String errMsg = validateUserUpdateParam(user);
if (errMsg != null) {
return Result.fail(errMsg);
}
userService.setUpdateAction(user);
return userService.update(user);
}
@PostMapping("del")
public Result del(@RequestBody SysUser user) {
if (user.getId() == null) {
return Result.fail("删除失败");
}
return userService.del(user);
}
@PostMapping("kick")
public Result kick(@RequestBody List<SysUser> users) {
if (users == null || users.isEmpty()) {
return Result.fail("参数错误");
}
RecUserAction action = ThreadUtil.getAction();
List<String> names = users.stream().map(SysUser::getName).collect(Collectors.toList());
action.setAction("踢出用户:【" + String.join(",", names) + "】");
return userService.kick(users);
}
@PostMapping("updatePwd")
public Result updatePwd(@RequestBody UserUpdatePwd vo) {
SysUser user = Util.getUser(session);
assert user != null;
vo.setId(user.getId());
String errMsg = validateUpdatePwdParam(vo);
if (errMsg != null) {
return Result.fail(errMsg);
}
vo.setOld_pwd(DigestUtils.md5DigestAsHex(vo.getOld_pwd().getBytes()));
vo.setNew_pwd(DigestUtils.md5DigestAsHex(vo.getNew_pwd().getBytes()));
return userService.updatePwd(vo);
}
@PostMapping("resetPwd")
public Result resetPwd(@RequestBody SysUser user) {
if (user.getId() == null || StringUtils.isEmpty(user.getName())) {
return Result.fail("参数错误");
}
return userService.resetPwd(user);
}
@GetMapping("updateAvatar")
public Result updateAvatar(@RequestParam String key) throws UnsupportedEncodingException {
if (StringUtils.isEmpty(key)) return Result.fail("参数错误");
SysUser user = Util.getUser(session);
assert user != null;
return userService.updateAvatar(user, URLDecoder.decode(key, "utf-8"), session);
}
@GetMapping("validate")
public Result validate(@RequestParam String pwd) {
SysUser current = Util.getUser(session);
if (!pwd.equals(current.getPwd())) return Result.fail("校验失败");
return Result.success("校验通过");
}
private String validateUserCreateParam(SysUser user) {
if (user.getId() != null) return "创建失败,参数错误";
if (StringUtils.isEmpty(user.getName())) return "创建失败,用户名称不能为空";
if (user.getRole() == null) return "创建失败,用户角色不能为空";
return null;
}
private String validateUserUpdateParam(SysUser user) {
if (user.getId() == null) return "修改失败,参数错误";
if (StringUtils.isEmpty(user.getName())) return "修改失败,用户名称不能为空";
if (user.getRole() == null) return "修改失败,用户角色不能为空";
if (user.getStatus() == null) return "修改失败,用户状态不能为空";
return null;
}
private String validateUpdatePwdParam(UserUpdatePwd vo) {
if (vo.getId() == null) return "修改失败,参数错误";
if (StringUtils.isEmpty(vo.getOld_pwd())) return "修改失败,原密码不能为空";
if (StringUtils.isEmpty(vo.getNew_pwd())) return "修改失败,新密码不能为空";
if (vo.getOld_pwd().equals(vo.getNew_pwd())) return "修改失败,新密码不得与旧密码相同";
if (vo.getNew_pwd().length() < 6 || vo.getNew_pwd().length() > 32) return "修改失败,密码长度为6-32位";
return null;
}
}

@ -0,0 +1,48 @@
package com.toesbieya.my.controller;
import com.toesbieya.my.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
@Controller
@RequestMapping("test")
@CrossOrigin
@Slf4j
public class TestController {
@GetMapping("pressure/1")
@ResponseBody
public void pressure1() {
Map<String, String> map = new LinkedHashMap<>();
map = null;
}
@GetMapping("pressure/2")
@ResponseBody
public void pressure2() {
Map<String, String> map = new LinkedHashMap<>();
}
@PostMapping("test")
@ResponseBody
public Result test() {
return Result.success();
}
@PostMapping("upload")
@ResponseBody
public Result upload(MultipartFile file, @RequestParam String extraParam1, @RequestParam String extraParam2) throws IOException {
/*System.out.println("extraParam1:" + extraParam1);
System.out.println("extraParam2:" + extraParam2);
System.out.println("文件名称:" + file.getOriginalFilename());
String tempPath = "C:/static/" + file.getOriginalFilename();
file.transferTo(Paths.get(tempPath));*/
return Result.success("ok");
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum BizDocumentFinishEnum {
TO_BE_STARTED(0), UNDERWAY(1), FINISHED(2);
private int code;
BizDocumentFinishEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum BizDocumentHistoryEnum {
WITHDRAW(0), COMMIT(1), PASS(2), REJECT(3);
private int code;
BizDocumentHistoryEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum BizDocumentStatusEnum {
DRAFT(0), WAIT_VERIFY(1), VERIFIED(2);
private int code;
BizDocumentStatusEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum GeneralStatusEnum {
DISABLED(0), ENABLED(1);
private int code;
GeneralStatusEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum RecLoginHistoryEnum {
LOGOUT(0), LOGIN(1);
private int code;
RecLoginHistoryEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.enumeration;
public enum UserActionEnum {
FAIL(0), SUCCESS(1);
private int code;
UserActionEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -0,0 +1,7 @@
package com.toesbieya.my.exception;
public class JsonResultException extends RuntimeException {
public JsonResultException(String message) {
super(message);
}
}

@ -0,0 +1,55 @@
package com.toesbieya.my.handler;
import com.toesbieya.my.enumeration.UserActionEnum;
import com.toesbieya.my.exception.JsonResultException;
import com.toesbieya.my.model.entity.RecUserAction;
import com.toesbieya.my.service.RecService;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.ThreadUtil;
import com.toesbieya.my.utils.Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import javax.annotation.Resource;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@Resource
private RecService recService;
//抛出异常时希望返回给前台
@ExceptionHandler(JsonResultException.class)
public Result handleJsonResultException(JsonResultException e) {
recordUserAction(e);
return Result.fail(e.getMessage());
}
//上传文件过大
@ExceptionHandler(MaxUploadSizeExceededException.class)
public Result handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
log.error("上传的文件超出限定大小,{}", e.getMessage());
recordUserAction(e);
return Result.fail("上传的文件过大");
}
//最终捕获
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
log.error("服务运行异常", e);
recordUserAction(e);
return Result.fail("服务运行异常");
}
private void recordUserAction(Exception e) {
RecUserAction action = ThreadUtil.getAction();
if (action != null && !StringUtils.isEmpty(action.getAction())) {
action.setError(Util.exception2Str(e));
recService.insertUserAction(action, UserActionEnum.FAIL);
}
ThreadUtil.clearAll();
}
}

@ -0,0 +1,44 @@
package com.toesbieya.my.interceptor;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.module.request.RequestModule;
import com.toesbieya.my.utils.IpUtil;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.ThreadUtil;
import com.toesbieya.my.utils.Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class RateControlInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
SysUser user = ThreadUtil.getUser();
if (user.getAdmin() == 1) return true;
String url = request.getServletPath();
String ip = IpUtil.getIp(request);
int result = RequestModule.pass(url, ip);
switch (result) {
case -1:
log.warn("限流拦截,服务的总请求频率超出,url:{},用户:{},ip:{}", url, user.getName(), ip);
Util.responseJson(response, Result.overload());
break;
case 0:
log.warn("限流拦截,ip已被暂时拉黑,url:{},用户:{},ip:{}", url, user.getName(), ip);
Util.responseJson(response, Result.tooManyRequest());
break;
case -2:
log.warn("限流拦截,ip的请求频率超出,url:{},用户:{},ip:{}", url, user.getName(), ip);
Util.responseJson(response, Result.tooManyRequest());
break;
case 1:
return true;
}
ThreadUtil.clearUser();
return false;
}
}

@ -0,0 +1,66 @@
package com.toesbieya.my.interceptor;
import com.toesbieya.my.constant.SessionConstant;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.module.PermissionModule;
import com.toesbieya.my.module.request.RequestModule;
import com.toesbieya.my.utils.IpUtil;
import com.toesbieya.my.utils.Result;
import com.toesbieya.my.utils.ThreadUtil;
import com.toesbieya.my.utils.Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Slf4j
public class SecurityInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
String url = request.getServletPath();
String method = request.getMethod();
String ip = IpUtil.getIp(request);
if (!RequestModule.urlExistMapping(url, method)) {
Util.responseJson(response, Result.notfound());
log.error("请求地址不存在:{},{},IP:{}", url, method, ip);
ThreadUtil.clearUser();
return false;
}
SysUser sysUser = Util.getUser(session);
if (sysUser == null
|| request.getHeader(SessionConstant.TOKEN_KEY) == null
|| !request.getHeader(SessionConstant.TOKEN_KEY).equals(session.getAttribute(SessionConstant.TOKEN_KEY))) {
Util.responseJson(response, Result.requireLogin());
ThreadUtil.clearUser();
return false;
}
if (!PermissionModule.authority(sysUser, url)) {
Util.responseJson(response, Result.noPermission());
log.warn("权限拦截,访问路径:{},用户:{},IP:{}", url, sysUser.getName(), ip);
ThreadUtil.clearUser();
return false;
}
ThreadUtil.setUser(sysUser);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.interceptor;
import com.toesbieya.my.utils.ThreadUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserActionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
ThreadUtil.quicklySetAction(request);
return true;
}
}

@ -0,0 +1,24 @@
package com.toesbieya.my.listener;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.module.SocketModule;
import com.toesbieya.my.utils.Util;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class RedisSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
SysUser sysUser = Util.getUser(se.getSession());
if (sysUser != null) {
SocketModule.logout(sysUser.getId(), "登陆状态过期,请重新登陆");
}
}
}

@ -0,0 +1,15 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizDocumentHistory;
import com.toesbieya.my.model.vo.search.DocumentHistorySearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizDocumentHistoryMapper {
List<BizDocumentHistory> getByPid(@Param("pid") String pid);
List<BizDocumentHistory> search(DocumentHistorySearch vo);
int add(BizDocumentHistory history);
}

@ -0,0 +1,33 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizPurchaseInbound;
import com.toesbieya.my.model.entity.BizPurchaseInboundSub;
import com.toesbieya.my.model.vo.export.PurchaseInboundExport;
import com.toesbieya.my.model.vo.search.PurchaseInboundSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizPurchaseInboundMapper {
BizPurchaseInbound getById(@Param("id") String id);
List<BizPurchaseInboundSub> getSubById(@Param("id") String id);
List<BizPurchaseInbound> search(PurchaseInboundSearch vo);
List<PurchaseInboundExport> export(PurchaseInboundSearch vo);
int add(BizPurchaseInbound param);
void addSub(List<BizPurchaseInboundSub> list);
int update(BizPurchaseInbound param);
int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime);
int reject(@Param("id") String id);
int del(@Param("id") String id);
void delSubByPid(@Param("pid") String pid);
}

@ -0,0 +1,44 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizPurchaseOrder;
import com.toesbieya.my.model.entity.BizPurchaseOrderSub;
import com.toesbieya.my.model.entity.StatProfitGoods;
import com.toesbieya.my.model.vo.export.PurchaseOrderExport;
import com.toesbieya.my.model.vo.search.PurchaseOrderSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizPurchaseOrderMapper {
BizPurchaseOrder getById(@Param("id") String id);
List<BizPurchaseOrderSub> getSubById(@Param("id") String id);
List<BizPurchaseOrder> search(PurchaseOrderSearch vo);
List<PurchaseOrderExport> export(PurchaseOrderSearch vo);
int add(BizPurchaseOrder param);
void addSub(List<BizPurchaseOrderSub> list);
int update(BizPurchaseOrder param);
int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") double remain_num);
int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime);
int reject(@Param("id") String id);
int del(@Param("id") String id);
void delSubByPid(@Param("pid") String pid);
int updateFinish(@Param("id") String id, @Param("finish") Integer finish, @Param("ftime") Long ftime);
double getDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> getDailyProfitGoods(@Param("start") long start, @Param("end") long end);
Integer getLastDayFinishOrderNum();
}

@ -0,0 +1,44 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizSellOrder;
import com.toesbieya.my.model.entity.BizSellOrderSub;
import com.toesbieya.my.model.entity.StatProfitGoods;
import com.toesbieya.my.model.vo.export.SellOrderExport;
import com.toesbieya.my.model.vo.search.SellOrderSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizSellOrderMapper {
BizSellOrder getById(@Param("id") String id);
List<BizSellOrderSub> getSubById(@Param("id") String id);
List<BizSellOrder> search(SellOrderSearch vo);
List<SellOrderExport> export(SellOrderSearch vo);
int add(BizSellOrder param);
void addSub(List<BizSellOrderSub> list);
int update(BizSellOrder param);
int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") double remain_num);
int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime);
int reject(@Param("id") String id);
int del(@Param("id") String id);
void delSubByPid(@Param("pid") String pid);
int updateFinish(@Param("id") String id, @Param("finish") Integer finish, @Param("ftime") Long ftime);
double getDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> getDailyProfitGoods(@Param("start") long start, @Param("end") long end);
Integer getLastDayFinishOrderNum();
}

@ -0,0 +1,33 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizSellOutbound;
import com.toesbieya.my.model.entity.BizSellOutboundSub;
import com.toesbieya.my.model.vo.export.SellOutboundExport;
import com.toesbieya.my.model.vo.search.SellOutboundSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizSellOutboundMapper {
BizSellOutbound getById(@Param("id") String id);
List<BizSellOutboundSub> getSubById(@Param("id") String id);
List<BizSellOutbound> search(SellOutboundSearch vo);
List<SellOutboundExport> export(SellOutboundSearch vo);
int add(BizSellOutbound param);
void addSub(List<BizSellOutboundSub> list);
int update(BizSellOutbound param);
int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime);
int reject(@Param("id") String id);
int del(@Param("id") String id);
void delSubByPid(@Param("pid") String pid);
}

@ -0,0 +1,31 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.BizStock;
import com.toesbieya.my.model.vo.export.StockExport;
import com.toesbieya.my.model.vo.result.StockSearchResult;
import com.toesbieya.my.model.vo.search.StockSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BizStockMapper {
List<StockSearchResult> search(StockSearch vo);
List<BizStock> getDetail(@Param("cid") String cid);
List<BizStock> getDetailById(@Param("ids") String ids);
List<StockExport> export(StockSearch vo);
int deleteByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(BizStock record);
int updateByPrimaryKey(BizStock record);
int updateBatchSelective(List<BizStock> list);
int batchInsert(@Param("list") List<BizStock> list);
int outbound(@Param("id") Integer id, @Param("num") Double num);
}

@ -0,0 +1,20 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.RecAttachment;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface RecAttachmentMapper {
List<RecAttachment> getByPid(@Param("pid") String pid);
List<String> getUrlByPid(@Param("pid") String pid);
int add(List<RecAttachment> list);
int del(RecAttachment attachment);
int delByPid(@Param("pid") String pid);
int delByUrls(List<String> list);
}

@ -0,0 +1,15 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.RecLoginHistory;
import com.toesbieya.my.model.vo.search.LoginHistorySearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface RecLoginHistoryMapper {
int insert(RecLoginHistory history);
List<RecLoginHistory> search(LoginHistorySearch vo);
List<RecLoginHistory> getByUid(@Param("uid") Integer uid);
}

@ -0,0 +1,12 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.RecUserAction;
import com.toesbieya.my.model.vo.search.UserActionSearch;
import java.util.List;
public interface RecUserActionMapper {
void insert(RecUserAction action);
List<RecUserAction> search(UserActionSearch vo);
}

@ -0,0 +1,28 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.StatFinishOrder;
import com.toesbieya.my.model.entity.StatProfitGoods;
import com.toesbieya.my.model.entity.StatProfitTotal;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface StatisticMapper {
List<StatProfitTotal> searchTotalProfit(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> searchGoodsProfit(@Param("start") Long start, @Param("end") Long end);
List<StatFinishOrder> searchFinishOrder(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> getHistoryTotalProfitGoods();
boolean checkDailyFinishOrderExist(@Param("time") long time);
int insertFinishOrder(StatFinishOrder param);
boolean checkDailyProfitExist(@Param("time") long time);
int insertProfitTotal(StatProfitTotal param);
int insertProfitGoodsBatch(@Param("list") List<StatProfitGoods> list);
}

@ -0,0 +1,27 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysCategory;
import com.toesbieya.my.model.vo.search.CategorySearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysCategoryMapper {
List<SysCategory> getAll();
List<SysCategory> search(CategorySearch vo);
SysCategory getById(@Param("id") int id);
int add(SysCategory sysCategory);
int update(SysCategory sysCategory);
int del(@Param("id") int id);
boolean hasChildren(@Param("id") int id);
boolean isNameExist(@Param("name") String name, @Param("id") Integer id);
boolean checkIsUse(@Param("cid") Integer cid);
}

@ -0,0 +1,26 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysCustomer;
import com.toesbieya.my.model.vo.result.RegionValueResult;
import com.toesbieya.my.model.vo.search.CustomerSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysCustomerMapper {
List<SysCustomer> get();
SysCustomer getById(int id);
List<SysCustomer> search(CustomerSearch vo);
int add(SysCustomer category);
int update(SysCustomer category);
int del(int id);
List<RegionValueResult> getLimitRegion();
boolean isNameExist(@Param("name") String name, @Param("id") Integer id);
}

@ -0,0 +1,20 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysDepartment;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysDepartmentMapper {
List<SysDepartment> get();
List<SysDepartment> getAll();
int add(SysDepartment department);
int update(SysDepartment department);
int del(@Param("id") int id);
boolean nameExist(@Param("id") Integer id, @Param("pid") int pid, @Param("name") String name);
}

@ -0,0 +1,15 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysResource;
import java.util.List;
public interface SysResourceMapper {
List<SysResource> get();
List<SysResource> getAll();
List<SysResource> getByRole(int role);
int update(SysResource resource);
}

@ -0,0 +1,23 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysRole;
import com.toesbieya.my.model.vo.search.RoleSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysRoleMapper {
List<SysRole> get();
List<SysRole> getAll();
List<SysRole> search(RoleSearch vo);
int add(SysRole role);
int update(SysRole role);
int del(int id);
boolean isNameExist(@Param("name") String name, @Param("id") Integer id);
}

@ -0,0 +1,26 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysSupplier;
import com.toesbieya.my.model.vo.result.RegionValueResult;
import com.toesbieya.my.model.vo.search.SupplierSearch;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysSupplierMapper {
List<SysSupplier> get();
SysSupplier getById(int id);
List<SysSupplier> search(SupplierSearch vo);
int add(SysSupplier category);
int update(SysSupplier category);
int del(int id);
List<RegionValueResult> getLimitRegion();
boolean isNameExist(@Param("name") String name, @Param("id") Integer id);
}

@ -0,0 +1,30 @@
package com.toesbieya.my.mapper;
import com.toesbieya.my.model.entity.SysUser;
import com.toesbieya.my.model.vo.search.UserSearch;
import com.toesbieya.my.model.vo.update.UserUpdatePwd;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysUserMapper {
SysUser getById(@Param("id") Integer id);
SysUser getByNameAndPwd(@Param("name") String name, @Param("pwd") String pwd);
List<SysUser> search(UserSearch vo);
boolean isNameExist(@Param("name") String name, @Param("id") Integer id);
int add(SysUser user);
int update(SysUser user);
int del(@Param("id") Integer id);
int resetPwd(@Param("id") Integer id, @Param("pwd") String pwd);
int updatePwd(UserUpdatePwd vo);
int updateAvatar(@Param("id") Integer id, @Param("avatar") String avatar);
}

@ -0,0 +1,22 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import java.util.List;
@Data
public class BizDocument<T> {
private String id;
private Integer cid;
private String cname;
private Long ctime;
private Integer vid;
private String vname;
private Long vtime;
private Integer status;
private String remark;
private List<T> data;
private List<RecAttachment> imageList;
private List<RecAttachment> uploadImageList;
private List<String> deleteImageList;
}

@ -0,0 +1,22 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BizDocumentHistory {
private Integer id;
private String pid;
private Integer type;
private Integer uid;
private String uname;
private Integer status_before;
private Integer status_after;
private Long time;
private String info;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class BizDocumentSub {
private Integer id;
private String pid;
private Integer cid;
private String cname;
private Double num;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseInbound extends BizDocument<BizPurchaseInboundSub> {
private String pid;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseInboundSub extends BizDocumentSub {
}

@ -0,0 +1,16 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseOrder extends BizDocument<BizPurchaseOrderSub>{
private Integer sid;
private String sname;
private Integer finish;
private Long ftime;
private Double total;
}

@ -0,0 +1,13 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseOrderSub extends BizDocumentSub {
private Double price;
private Double remain_num;
}

@ -0,0 +1,16 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOrder extends BizDocument<BizSellOrderSub>{
private Integer customer_id;
private String customer_name;
private Integer finish;
private Long ftime;
private Double total;
}

@ -0,0 +1,13 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOrderSub extends BizDocumentSub{
private Double price;
private Double remain_num;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOutbound extends BizDocument<BizSellOutboundSub>{
private String pid;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOutboundSub extends BizDocumentSub{
private Integer sid;
}

@ -0,0 +1,21 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BizStock {
private Integer id;
private Integer cid;
private String cname;
private Double num;
private Double price;
private Long ctime;
private String cgrkid;
private String cgddid;
}

@ -0,0 +1,20 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RecAttachment {
private Integer id;
private String pid;
private String name;
private Long time;
private Integer order;
private String url;
private Long size;
}

@ -0,0 +1,20 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecLoginHistory {
private Long id;
private Integer uid;
private String uname;
private String ip;
private String address;
private Integer type;
private Long time;
}

@ -0,0 +1,22 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecUserAction {
private Long id;
private Integer uid;
private String uname;
private String url;
private String ip;
private Long time;
private String action;
private String error;
private Integer type;
}

@ -0,0 +1,11 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class StatFinishOrder {
private Integer id;
private Integer purchase;
private Integer sell;
private Long time;
}

@ -0,0 +1,13 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class StatProfitGoods extends StatProfitTotal {
private Integer cid;
private String cname;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class StatProfitTotal {
private Integer id;
private Double purchase;
private Double sell;
private Double profit;
private Long time;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class SysCategory {
private Integer id;
private Integer pid;
private String name;
private Integer type;
private Long ctime;
}

@ -0,0 +1,23 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SysCustomer {
private Integer id;
private String name;
private String address;
private String linkman;
private String linkphone;
private String region;
private String region_name;
private Integer status;
private Long ctime;
private String remark;
}

@ -0,0 +1,11 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class SysDepartment {
private Integer id;
private Integer pid;
private String name;
private Integer status;
}

@ -0,0 +1,12 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class SysRegion {
private String id;
private String pid;
private String name;
private String fullname;
private int level;
}

@ -0,0 +1,19 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysResource {
private Integer id;
private Integer pid;
private String name;
private String fullName;
private String url;
private Integer admin;
private Integer total_rate;
private Integer ip_rate;
}

@ -0,0 +1,20 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SysRole {
private Integer id;
private String name;
private String resource_id;
private Integer cid;
private String cname;
private Long ctime;
private Integer status;
}

@ -0,0 +1,17 @@
package com.toesbieya.my.model.entity;
import lombok.Data;
@Data
public class SysSupplier {
private Integer id;
private String name;
private String address;
private String linkman;
private String linkphone;
private String region;
private String region_name;
private Integer status;
private Long ctime;
private String remark;
}

@ -0,0 +1,40 @@
package com.toesbieya.my.model.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.HashSet;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysUser implements Serializable {
private static final long serialVersionUID = 9527L;
private Integer id;
private String name;
private String pwd;
private Integer role;
private String role_name;
private String avatar;
private Long ctime;
private Integer admin;
private Integer status;
private Boolean online;
private HashSet<Integer> resource_ids;
public static String getUpdateInfo(SysUser origin, SysUser update) {
StringBuilder stringBuilder = new StringBuilder();
if (!origin.getName().equals(update.getName())) {
stringBuilder.append(String.format(",名称改为【%s】", update.getName()));
}
if (!origin.getRole().equals(update.getRole())) {
stringBuilder.append(String.format(",角色改为【%s】", update.getRole_name()));
}
if (!origin.getStatus().equals(update.getStatus())) {
stringBuilder.append(String.format(",状态改为【%s】", update.getStatus() == 1 ? "正常" : "禁用"));
}
return stringBuilder.toString();
}
}

@ -0,0 +1,10 @@
package com.toesbieya.my.model.vo;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
@Data
public class IpResultVo {
private Integer code;
private JSONObject data;
}

@ -0,0 +1,40 @@
package com.toesbieya.my.model.vo.export;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class PurchaseInboundExport{
@ExcelProperty(value="单号",index=0)
@ColumnWidth(20)
private String id;
@ExcelProperty(value="采购订单单号",index=1)
@ColumnWidth(20)
private String pid;
@ExcelProperty(value="创建人",index=2)
@ColumnWidth(20)
private String cname;
@ExcelProperty(value="创建时间",index=3)
@ColumnWidth(20)
private String ctime;
@ExcelProperty(value="审核人",index=4)
@ColumnWidth(20)
private String vname;
@ExcelProperty(value="审核时间",index=5)
@ColumnWidth(20)
private String vtime;
@ExcelProperty(value="状态",index=6)
@ColumnWidth(20)
private String status;
@ExcelProperty(value="备注",index=7)
@ColumnWidth(50)
private String remark;
}

@ -0,0 +1,52 @@
package com.toesbieya.my.model.vo.export;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class PurchaseOrderExport{
@ExcelProperty(value="单号",index=0)
@ColumnWidth(20)
private String id;
@ExcelProperty(value="供应商",index=1)
@ColumnWidth(30)
private String sname;
@ExcelProperty(value="创建人",index=2)
@ColumnWidth(20)
private String cname;
@ExcelProperty(value="创建时间",index=3)
@ColumnWidth(20)
private String ctime;
@ExcelProperty(value="审核人",index=4)
@ColumnWidth(20)
private String vname;
@ExcelProperty(value="审核时间",index=5)
@ColumnWidth(20)
private String vtime;
@ExcelProperty(value="状态",index=6)
@ColumnWidth(20)
private String status;
@ExcelProperty(value="完成情况",index=7)
@ColumnWidth(20)
private String finish;
@ExcelProperty(value="完成时间",index=8)
@ColumnWidth(20)
private String ftime;
@ExcelProperty(value="总额",index=9)
@ColumnWidth(20)
private String total;
@ExcelProperty(value="备注",index=10)
@ColumnWidth(50)
private String remark;
}

@ -0,0 +1,52 @@
package com.toesbieya.my.model.vo.export;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class SellOrderExport{
@ExcelProperty(value="单号",index=0)
@ColumnWidth(20)
private String id;
@ExcelProperty(value="客户",index=1)
@ColumnWidth(30)
private String customer_name;
@ExcelProperty(value="创建人",index=2)
@ColumnWidth(20)
private String cname;
@ExcelProperty(value="创建时间",index=3)
@ColumnWidth(20)
private String ctime;
@ExcelProperty(value="审核人",index=4)
@ColumnWidth(20)
private String vname;
@ExcelProperty(value="审核时间",index=5)
@ColumnWidth(20)
private String vtime;
@ExcelProperty(value="状态",index=6)
@ColumnWidth(20)
private String status;
@ExcelProperty(value="完成情况",index=7)
@ColumnWidth(20)
private String finish;
@ExcelProperty(value="完成时间",index=8)
@ColumnWidth(20)
private String ftime;
@ExcelProperty(value="总额",index=9)
@ColumnWidth(20)
private String total;
@ExcelProperty(value="备注",index=10)
@ColumnWidth(50)
private String remark;
}

@ -0,0 +1,40 @@
package com.toesbieya.my.model.vo.export;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class SellOutboundExport{
@ExcelProperty(value="单号",index=0)
@ColumnWidth(20)
private String id;
@ExcelProperty(value="销售订单单号",index=1)
@ColumnWidth(20)
private String pid;
@ExcelProperty(value="创建人",index=2)
@ColumnWidth(20)
private String cname;
@ExcelProperty(value="创建时间",index=3)
@ColumnWidth(20)
private String ctime;
@ExcelProperty(value="审核人",index=4)
@ColumnWidth(20)
private String vname;
@ExcelProperty(value="审核时间",index=5)
@ColumnWidth(20)
private String vtime;
@ExcelProperty(value="状态",index=6)
@ColumnWidth(20)
private String status;
@ExcelProperty(value="备注",index=7)
@ColumnWidth(50)
private String remark;
}

@ -0,0 +1,52 @@
package com.toesbieya.my.model.vo.export;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class StockExport {
@ExcelIgnore
private int cid;
@ExcelProperty(value = "序号", index = 0)
@ColumnWidth(20)
private int id;
@ExcelProperty(value = "分类名称", index = 1)
@ColumnWidth(20)
private String cname;
@ExcelProperty(value = "库存总数", index = 2)
@ColumnWidth(20)
private double total_num;
@ExcelProperty(value = "库存总值", index = 3)
@ColumnWidth(20)
private double total_price;
@ExcelProperty(value = "采购订单号", index = 4)
@ColumnWidth(20)
private String cgddid;
@ExcelProperty(value = "采购单价", index = 5)
@ColumnWidth(20)
private double cg_price;
@ExcelProperty(value = "采购数量", index = 6)
@ColumnWidth(20)
private double cg_num;
@ExcelProperty(value = "采购入库单号", index = 7)
@ColumnWidth(20)
private String cgrkid;
@ExcelProperty(value = "入库时间", index = 8)
@ColumnWidth(20)
private String ctime;
@ExcelProperty(value = "入库数量", index = 9)
@ColumnWidth(20)
private double rk_num;
}

@ -0,0 +1,54 @@
package com.toesbieya.my.model.vo.info;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import oshi.hardware.CentralProcessor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CpuInfo {
//cpu名称
private String name;
//核心数
private int core;
//内核态CPU时间
private double system;
//用户态CPU时间
private double user;
//低优先级用户态CPU时间
private double nice;
//空闲时间,不包括io等待时间
private double idle;
//等待I/O的CPU时间
private double ioWait;
//处理硬中断的CPU时间
private double irq;
//处理软中断的CPU时间
private double softIrq;
//运行在虚拟机中的时候,被其他虚拟机占用的CPU时间
private double steal;
public CpuInfo(CentralProcessor processor, long[] prevTicks, long[] ticks) {
this.name = processor.getProcessorIdentifier().getName().trim();
this.core = processor.getLogicalProcessorCount();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long system = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long ioWait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long total = user + nice + system + idle + ioWait + irq + softIrq + steal;
this.system = system * 1.0 / total * 100;
this.nice = nice * 1.0 / total * 100;
this.user = user * 1.0 / total * 100;
this.idle = idle * 1.0 / total * 100;
this.ioWait = ioWait * 1.0 / total * 100;
this.irq = irq * 1.0 / total * 100;
this.softIrq = softIrq * 1.0 / total * 100;
this.steal = steal * 1.0 / total * 100;
}
}

@ -0,0 +1,25 @@
package com.toesbieya.my.model.vo.info;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import oshi.software.os.OSFileStore;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DiskInfo {
private String name;
private long total;
private long used;
private long remain;
private double utilizationRate;
public DiskInfo(OSFileStore fs) {
this.name = fs.getMount();
this.total = fs.getTotalSpace();
this.remain = fs.getUsableSpace();
this.used = this.total - this.remain;
this.utilizationRate = this.used * 1.0 / this.total * 100;
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save