From f7366130ea2f1ef5c377a00a8b138b955f7ab591 Mon Sep 17 00:00:00 2001 From: toesbieya <1647775459@qq.com> Date: Wed, 15 Jul 2020 22:01:18 +0800 Subject: [PATCH] =?UTF-8?q?websocket=E6=A8=A1=E5=9D=97=E8=A7=A3=E8=80=A6?= =?UTF-8?q?=20=E6=95=B0=E5=AD=97=E8=AE=A1=E7=AE=97=E4=BD=BF=E7=94=A8BigDec?= =?UTF-8?q?imal=20=E4=BB=A3=E7=A0=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/pom.xml | 28 +- .../java/com/toesbieya/my/annoation/Tx.java | 12 - .../com/toesbieya/my/config/RedisConfig.java | 6 +- .../my/config/RedisEventListenerConfig.java | 145 ++++++++++ .../my/constant/SessionConstant.java | 12 + .../toesbieya/my/constant/SocketConstant.java | 13 +- .../my/controller/AccountController.java | 14 +- .../BizDocumentHistoryController.java | 6 +- .../BizPurchaseInboundController.java | 77 +++--- .../BizPurchaseOrderController.java | 83 +++--- .../my/controller/BizSellOrderController.java | 83 +++--- .../controller/BizSellOutboundController.java | 85 +++--- .../my/controller/BizStockController.java | 14 +- .../my/controller/FileController.java | 1 - ...mentFinishEnum.java => DocFinishEnum.java} | 4 +- ...ntHistoryEnum.java => DocHistoryEnum.java} | 4 +- ...mentStatusEnum.java => DocStatusEnum.java} | 4 +- .../my/interceptor/SecurityInterceptor.java | 9 - .../my/mapper/BizDocumentHistoryMapper.java | 2 +- .../my/mapper/BizPurchaseInboundMapper.java | 2 +- .../my/mapper/BizPurchaseOrderMapper.java | 12 +- .../my/mapper/BizSellOrderMapper.java | 12 +- .../my/mapper/BizSellOutboundMapper.java | 2 +- .../toesbieya/my/mapper/BizStockMapper.java | 13 +- .../toesbieya/my/mapper/StatisticMapper.java | 17 +- .../my/model/entity/BizDocumentSub.java | 4 +- .../my/model/entity/BizPurchaseOrder.java | 4 +- .../my/model/entity/BizPurchaseOrderSub.java | 6 +- .../my/model/entity/BizSellOrder.java | 4 +- .../my/model/entity/BizSellOrderSub.java | 8 +- .../toesbieya/my/model/entity/BizStock.java | 6 +- .../my/model/entity/StatProfitTotal.java | 8 +- .../com/toesbieya/my/model/vo/IpResultVo.java | 10 - .../toesbieya/my/model/vo/SocketEventVo.java | 21 ++ .../my/model/vo/SocketOfflineVo.java | 16 ++ .../my/model/vo/export/StockExport.java | 12 +- .../my/model/vo/result/StockSearchResult.java | 6 +- .../my/model/vo/statictis/FourBlockStat.java | 10 +- .../toesbieya/my/module/PermissionModule.java | 2 + ...SocketModule.java => WebSocketServer.java} | 74 ++++-- .../my/module/request/RequestModule.java | 43 --- .../DocumentTask.java} | 56 ++-- .../toesbieya/my/schedule/SessionTask.java | 66 +++++ .../toesbieya/my/schedule/StatisticTask.java | 116 ++++++++ .../toesbieya/my/service/AccountService.java | 5 +- .../my/service/BizDocumentHistoryService.java | 6 +- .../my/service/BizPurchaseInboundService.java | 234 +++++++++------- .../my/service/BizPurchaseOrderService.java | 149 ++++++----- .../my/service/BizSellOrderService.java | 149 ++++++----- .../my/service/BizSellOutboundService.java | 250 +++++++++++------- .../toesbieya/my/service/BizStockService.java | 4 +- .../com/toesbieya/my/service/MsgService.java | 29 +- .../my/service/StatisticService.java | 135 +++------- .../toesbieya/my/service/SysUserService.java | 33 ++- .../com/toesbieya/my/utils/DocumentUtil.java | 4 +- .../com/toesbieya/my/utils/RedisUtil.java | 84 +++++- .../com/toesbieya/my/utils/SessionUtil.java | 22 +- .../java/com/toesbieya/my/utils/Util.java | 30 --- .../com/toesbieya/my/utils/WebSocketUtil.java | 36 +++ .../java/com/toesbieya/my/utils/YmlUtil.java | 28 -- java/src/main/resources/application.yml | 25 +- .../resources/mapper/BizDocumentHistory.xml | 2 +- .../resources/mapper/BizPurchaseInbound.xml | 2 +- .../resources/mapper/BizPurchaseOrder.xml | 27 +- .../main/resources/mapper/BizSellOrder.xml | 27 +- .../main/resources/mapper/BizSellOutbound.xml | 2 +- java/src/main/resources/mapper/BizStock.xml | 109 +------- java/src/main/resources/mapper/Statistic.xml | 80 +++++- 68 files changed, 1523 insertions(+), 1081 deletions(-) delete mode 100644 java/src/main/java/com/toesbieya/my/annoation/Tx.java create mode 100644 java/src/main/java/com/toesbieya/my/config/RedisEventListenerConfig.java rename java/src/main/java/com/toesbieya/my/enumeration/{BizDocumentFinishEnum.java => DocFinishEnum.java} (73%) rename java/src/main/java/com/toesbieya/my/enumeration/{BizDocumentHistoryEnum.java => DocHistoryEnum.java} (73%) rename java/src/main/java/com/toesbieya/my/enumeration/{BizDocumentStatusEnum.java => DocStatusEnum.java} (73%) delete mode 100644 java/src/main/java/com/toesbieya/my/model/vo/IpResultVo.java create mode 100644 java/src/main/java/com/toesbieya/my/model/vo/SocketEventVo.java create mode 100644 java/src/main/java/com/toesbieya/my/model/vo/SocketOfflineVo.java rename java/src/main/java/com/toesbieya/my/module/{SocketModule.java => WebSocketServer.java} (55%) rename java/src/main/java/com/toesbieya/my/{module/RedisModule.java => schedule/DocumentTask.java} (72%) create mode 100644 java/src/main/java/com/toesbieya/my/schedule/SessionTask.java create mode 100644 java/src/main/java/com/toesbieya/my/schedule/StatisticTask.java create mode 100644 java/src/main/java/com/toesbieya/my/utils/WebSocketUtil.java delete mode 100644 java/src/main/java/com/toesbieya/my/utils/YmlUtil.java diff --git a/java/pom.xml b/java/pom.xml index bc33479..9bdc84c 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -34,6 +34,11 @@ + + org.springframework.boot + spring-boot-starter + + org.springframework.boot spring-boot-starter-web @@ -81,6 +86,12 @@ lombok + + org.springframework.boot + spring-boot-configuration-processor + true + + com.google.guava guava @@ -110,23 +121,6 @@ compile - - - com.github.oshi - oshi-core - ${oshi.version} - - - net.java.dev.jna - jna - ${jna.version} - - - net.java.dev.jna - jna-platform - ${jna.version} - - com.alibaba diff --git a/java/src/main/java/com/toesbieya/my/annoation/Tx.java b/java/src/main/java/com/toesbieya/my/annoation/Tx.java deleted file mode 100644 index d4fbfd3..0000000 --- a/java/src/main/java/com/toesbieya/my/annoation/Tx.java +++ /dev/null @@ -1,12 +0,0 @@ -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 { -} diff --git a/java/src/main/java/com/toesbieya/my/config/RedisConfig.java b/java/src/main/java/com/toesbieya/my/config/RedisConfig.java index cc87835..c049d06 100644 --- a/java/src/main/java/com/toesbieya/my/config/RedisConfig.java +++ b/java/src/main/java/com/toesbieya/my/config/RedisConfig.java @@ -10,8 +10,8 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); @@ -31,4 +31,4 @@ public class RedisConfig { redisTemplate.afterPropertiesSet(); return redisTemplate; } -} +} \ No newline at end of file diff --git a/java/src/main/java/com/toesbieya/my/config/RedisEventListenerConfig.java b/java/src/main/java/com/toesbieya/my/config/RedisEventListenerConfig.java new file mode 100644 index 0000000..bb93422 --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/config/RedisEventListenerConfig.java @@ -0,0 +1,145 @@ +package com.toesbieya.my.config; + +import com.alibaba.fastjson.JSON; +import com.toesbieya.my.constant.SessionConstant; +import com.toesbieya.my.constant.SocketConstant; +import com.toesbieya.my.model.vo.SocketEventVo; +import com.toesbieya.my.module.WebSocketServer; +import com.toesbieya.my.utils.RedisUtil; +import com.toesbieya.my.utils.SessionUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +import java.util.List; +import java.util.Properties; + +@Configuration +@Slf4j +public class RedisEventListenerConfig { + private WebSocketServer server; + + @Autowired + public void setSocketServer(WebSocketServer server) { + this.server = server; + } + + @Bean + RedisMessageListenerContainer container(RedisConnectionFactory factory) { + modifyRedisEventConfig(factory); + + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(factory); + + addEventSendListener(container); + addExpireListener(container); + + return container; + } + + //发送消息的监听器 + private void addEventSendListener(RedisMessageListenerContainer container) { + container.addMessageListener( + (message, bytes) -> { + SocketEventVo vo = JSON.parseObject(message.toString(), SocketEventVo.class); + + if (vo == null) return; + + int type = vo.getType(); + String eventName = vo.getEvent(); + Object data = vo.getData(); + List to = vo.getTo(); + + //登出消息 + if (type == SocketConstant.REDIS_EVENT_LOGOUT) { + if (to != null) { + to.forEach(id -> server.logout(id, (String) data)); + } + } + //指定用户 + else if (type == SocketConstant.REDIS_EVENT_SPECIFIC) { + if (to != null) { + to.forEach(id -> server.sendEvent(eventName, id, data)); + } + } + //广播消息 + else if (type == SocketConstant.REDIS_EVENT_BROADCAST) { + server.broadcast(eventName, data); + } + }, + new ChannelTopic(SocketConstant.REDIS_EVENT_TOPIC_SEND) + ); + } + + //key过期的监听器 + private void addExpireListener(RedisMessageListenerContainer container) { + //监听key过期事件 + String expireTopic = SessionConstant.REDIS_EXPIRE_TOPIC_PREFIX + SessionConstant.REDIS_NAMESPACE; + + container.addMessageListener( + (message, bytes) -> { + String event = message.toString(); + String channel = new String(message.getChannel()); + + if (!"del".equals(event) && !"expired".equals(event) + || !channel.startsWith(expireTopic)) { + return; + } + + String token = channel.replace(expireTopic, ""); + Integer uid = SessionUtil.getUidFromToken(token); + + server.logout(uid, "登陆信息过期,请重新登陆"); + + //删除离线表信息 + RedisUtil.hdel(SocketConstant.REDIS_OFFLINE_USER, SessionConstant.REDIS_NAMESPACE + token); + }, + new PatternTopic(expireTopic + "*") + ); + } + + //将redis的notify-keyspace-events配置改为Kgx + private void modifyRedisEventConfig(RedisConnectionFactory factory) { + RedisConnection connection = factory.getConnection(); + try { + Properties config = connection.getConfig("notify-keyspace-events"); + + String notifyOptions = + config == null || config.isEmpty() + ? "" + : config.getProperty(config.stringPropertyNames().iterator().next()); + + String customizedNotifyOptions = notifyOptions; + + if (!customizedNotifyOptions.contains("K")) { + customizedNotifyOptions += "K"; + } + + boolean A = customizedNotifyOptions.contains("A"); + + if (!(A || customizedNotifyOptions.contains("g"))) { + customizedNotifyOptions += "g"; + } + if (!(A || customizedNotifyOptions.contains("x"))) { + customizedNotifyOptions += "x"; + } + if (!notifyOptions.equals(customizedNotifyOptions)) { + connection.setConfig("notify-keyspace-events", customizedNotifyOptions); + } + } + finally { + try { + connection.close(); + } + catch (Exception ex) { + log.error("Error closing RedisConnection", ex); + } + } + } +} diff --git a/java/src/main/java/com/toesbieya/my/constant/SessionConstant.java b/java/src/main/java/com/toesbieya/my/constant/SessionConstant.java index a112834..1a3c74d 100644 --- a/java/src/main/java/com/toesbieya/my/constant/SessionConstant.java +++ b/java/src/main/java/com/toesbieya/my/constant/SessionConstant.java @@ -1,6 +1,18 @@ package com.toesbieya.my.constant; public class SessionConstant { + //session过期时间,单位秒 + public static long EXPIRE = 3600 * 8; + + //存储用户信息的键的前缀 public static String REDIS_NAMESPACE = "sessions:"; + + //key过期事件的前缀 + public static String REDIS_EXPIRE_TOPIC_PREFIX = "__keyspace@0__:"; + + //http headers中token的字段名 public static String TOKEN_KEY = "X-Token"; + + //区别无活动用户的时间间隔,单位秒 + public static long NO_ACTION_INTERVAL = 1800; } diff --git a/java/src/main/java/com/toesbieya/my/constant/SocketConstant.java b/java/src/main/java/com/toesbieya/my/constant/SocketConstant.java index 93d59d8..e0d6574 100644 --- a/java/src/main/java/com/toesbieya/my/constant/SocketConstant.java +++ b/java/src/main/java/com/toesbieya/my/constant/SocketConstant.java @@ -1,14 +1,23 @@ package com.toesbieya.my.constant; public class SocketConstant { - public static String REDIS_EVENT_TOPIC_SEND = "socket:event:send"; + //web-socket服务端订阅的redis主题名称 + public static String REDIS_EVENT_TOPIC_SEND = "socket-event-send"; + + //指定用户 public static int REDIS_EVENT_SPECIFIC = 0; + //广播 public static int REDIS_EVENT_BROADCAST = 1; + //登出 public static int REDIS_EVENT_LOGOUT = 2; - public static String REDIS_ONLINE_NUM = "socket:online-num"; + //存放于redis中的在线用户的ID集合的键 public static String REDIS_ONLINE_USER = "socket:online-user"; + //存放于redis中的离线用户的离线时间的键 + public static String REDIS_OFFLINE_USER = "socket:offline-user"; + //登出事件 public static final String EVENT_LOGOUT = "logout"; + //新消息事件 public static final String EVENT_NEW_MESSAGE = "new-message"; } diff --git a/java/src/main/java/com/toesbieya/my/controller/AccountController.java b/java/src/main/java/com/toesbieya/my/controller/AccountController.java index 8a9bced..5df23f9 100644 --- a/java/src/main/java/com/toesbieya/my/controller/AccountController.java +++ b/java/src/main/java/com/toesbieya/my/controller/AccountController.java @@ -21,22 +21,22 @@ import java.net.URLDecoder; @RequestMapping("account") public class AccountController { @Resource - private AccountService accountService; + private AccountService service; @PostMapping("login") public Result login(HttpServletRequest request, @Valid @RequestBody LoginParam param) { - return accountService.login(param, IpUtil.getIp(request)); + return service.login(param, IpUtil.getIp(request)); } @GetMapping("logout") public Result logout(HttpServletRequest request) { UserVo user = SessionUtil.get(); - return accountService.logout(user, IpUtil.getIp(request)); + return service.logout(user, IpUtil.getIp(request)); } @PostMapping("register") public Result register(@Valid @RequestBody RegisterParam param) { - return accountService.register(param); + return service.register(param); } @PostMapping("updatePwd") @@ -47,7 +47,7 @@ public class AccountController { String errMsg = validateUpdatePwdParam(param); if (errMsg != null) return Result.fail(errMsg); - return accountService.updatePwd(param); + return service.updatePwd(param); } @GetMapping("updateAvatar") @@ -55,7 +55,7 @@ public class AccountController { if (StringUtils.isEmpty(key)) return Result.fail("参数错误"); UserVo user = SessionUtil.get(); - return accountService.updateAvatar(user, URLDecoder.decode(key, "utf-8")); + return service.updateAvatar(user, URLDecoder.decode(key, "utf-8")); } @GetMapping("validate") @@ -75,7 +75,7 @@ public class AccountController { return Result.success(); } - return Result.success(accountService.checkName(name, id) ? null : "该用户名已存在"); + return Result.success(service.checkName(name, id) ? null : "该用户名已存在"); } private String validateUpdatePwdParam(PasswordUpdateParam vo) { diff --git a/java/src/main/java/com/toesbieya/my/controller/BizDocumentHistoryController.java b/java/src/main/java/com/toesbieya/my/controller/BizDocumentHistoryController.java index 301c344..e5c6510 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizDocumentHistoryController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizDocumentHistoryController.java @@ -11,15 +11,15 @@ import javax.annotation.Resource; @RequestMapping("document/history") public class BizDocumentHistoryController { @Resource - private BizDocumentHistoryService documentHistoryService; + private BizDocumentHistoryService service; @GetMapping("get") public Result get(@RequestParam("pid") String pid) { - return Result.success(documentHistoryService.getByPid(pid)); + return Result.success(service.getByPid(pid)); } @PostMapping("search") public Result search(@RequestBody DocumentHistorySearch vo) { - return Result.success(documentHistoryService.search(vo)); + return Result.success(service.search(vo)); } } diff --git a/java/src/main/java/com/toesbieya/my/controller/BizPurchaseInboundController.java b/java/src/main/java/com/toesbieya/my/controller/BizPurchaseInboundController.java index b13b594..7f0f3ab 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizPurchaseInboundController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizPurchaseInboundController.java @@ -1,6 +1,6 @@ package com.toesbieya.my.controller; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.model.entity.BizPurchaseInbound; import com.toesbieya.my.model.entity.BizPurchaseInboundSub; import com.toesbieya.my.model.vo.UserVo; @@ -15,98 +15,99 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.List; @RestController -@RequestMapping("purchase/inbound") +@RequestMapping("document/purchase/inbound") public class BizPurchaseInboundController { @Resource - private BizPurchaseInboundService purchaseInboundService; + private BizPurchaseInboundService service; @GetMapping("getById") public Result getById(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - BizPurchaseInbound inbound = purchaseInboundService.getById(id); + BizPurchaseInbound inbound = service.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)); + return Result.success(service.getSubById(id)); } @PostMapping("search") public Result search(@RequestBody PurchaseInboundSearch vo) { - return Result.success(purchaseInboundService.search(vo)); + return Result.success(service.search(vo)); } @PostMapping("export") public void export(@RequestBody PurchaseInboundSearch vo, HttpServletResponse response) throws Exception { - purchaseInboundService.export(vo, response); + service.export(vo, response); } @PostMapping("add") - public Result add(@RequestBody BizPurchaseInbound inbound) { - String errMsg = validateSub(inbound.getData()); + public Result add(@RequestBody BizPurchaseInbound vo) { + String errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); UserVo user = SessionUtil.get(); - inbound.setCid(user.getId()); - inbound.setCname(user.getName()); - inbound.setCtime(System.currentTimeMillis()); - inbound.setStatus(BizDocumentStatusEnum.DRAFT.getCode()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); + vo.setStatus(DocStatusEnum.DRAFT.getCode()); - return purchaseInboundService.add(inbound); + return service.add(vo); } @PostMapping("update") - public Result update(@RequestBody BizPurchaseInbound inbound) { - String errMsg = validateUpdate(inbound); - if (errMsg == null) errMsg = validateSub(inbound.getData()); + public Result update(@RequestBody BizPurchaseInbound vo) { + String errMsg = validateUpdate(vo); + if (errMsg == null) errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); - return purchaseInboundService.update(inbound); + return service.update(vo); } @PostMapping("commit") - public Result commit(@RequestBody BizPurchaseInbound inbound) { - boolean isFirst = StringUtils.isEmpty(inbound.getId()); + public Result commit(@RequestBody BizPurchaseInbound vo) { + boolean isFirst = StringUtils.isEmpty(vo.getId()); - String errMsg = validateSub(inbound.getData()); - if (!isFirst && errMsg == null) errMsg = validateUpdate(inbound); + String errMsg = validateSub(vo.getData()); + if (!isFirst && errMsg == null) errMsg = validateUpdate(vo); if (errMsg != null) return Result.fail(errMsg); - inbound.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode()); + vo.setStatus(DocStatusEnum.WAIT_VERIFY.getCode()); if (isFirst) { UserVo user = SessionUtil.get(); - inbound.setCid(user.getId()); - inbound.setCname(user.getName()); - inbound.setCtime(System.currentTimeMillis()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); } - return purchaseInboundService.commit(inbound); + return service.commit(vo); } @PostMapping("withdraw") public Result withdraw(@RequestBody DocumentStatusUpdate vo) { - return purchaseInboundService.withdraw(vo, SessionUtil.get()); + return service.withdraw(vo, SessionUtil.get()); } @PostMapping("pass") public Result pass(@RequestBody DocumentStatusUpdate vo) { if (StringUtils.isEmpty(vo.getPid())) return Result.fail("参数错误"); - return purchaseInboundService.pass(vo, SessionUtil.get()); + return service.pass(vo, SessionUtil.get()); } @PostMapping("reject") public Result reject(@RequestBody DocumentStatusUpdate vo) { - return purchaseInboundService.reject(vo, SessionUtil.get()); + return service.reject(vo, SessionUtil.get()); } @GetMapping("del") public Result del(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - return purchaseInboundService.del(id); + return service.del(id); } private String validateUpdate(BizPurchaseInbound main) { @@ -122,11 +123,15 @@ public class BizPurchaseInboundController { private String validateSub(List 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++; + int len = list.size(); + for (int i = 0; i < len; i++) { + BizPurchaseInboundSub sub = list.get(i); + if (sub.getNum() == null || sub.getNum().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个入库商品数量有误", i); + } + if (sub.getCid() == null || StringUtils.isEmpty(sub.getCname())) { + return String.format("第%d个入库商品分类有误", i); + } } return null; } diff --git a/java/src/main/java/com/toesbieya/my/controller/BizPurchaseOrderController.java b/java/src/main/java/com/toesbieya/my/controller/BizPurchaseOrderController.java index 22c7774..287d787 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizPurchaseOrderController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizPurchaseOrderController.java @@ -1,6 +1,6 @@ package com.toesbieya.my.controller; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.model.entity.BizPurchaseOrder; import com.toesbieya.my.model.entity.BizPurchaseOrderSub; import com.toesbieya.my.model.vo.UserVo; @@ -15,104 +15,105 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.List; @RestController -@RequestMapping("purchase/order") +@RequestMapping("document/purchase/order") public class BizPurchaseOrderController { @Resource - private BizPurchaseOrderService purchaseOrderService; + private BizPurchaseOrderService service; @GetMapping("getById") public Result getById(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - BizPurchaseOrder order = purchaseOrderService.getById(id); + BizPurchaseOrder order = service.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)); + return Result.success(service.getSubById(id)); } @PostMapping("search") public Result search(@RequestBody PurchaseOrderSearch vo) { - return Result.success(purchaseOrderService.search(vo)); + return Result.success(service.search(vo)); } @PostMapping("export") public void export(@RequestBody PurchaseOrderSearch vo, HttpServletResponse response) throws Exception { - purchaseOrderService.export(vo, response); + service.export(vo, response); } @PostMapping("add") - public Result add(@RequestBody BizPurchaseOrder order) { - if (order.getSid() == null - || StringUtils.isEmpty(order.getSname()) - || order.getTotal() == null) { + public Result add(@RequestBody BizPurchaseOrder vo) { + if (vo.getSid() == null + || StringUtils.isEmpty(vo.getSname()) + || vo.getTotal() == null) { return Result.fail("参数错误"); } - String errMsg = validateSub(order.getData()); + String errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); UserVo user = SessionUtil.get(); - order.setCid(user.getId()); - order.setCname(user.getName()); - order.setCtime(System.currentTimeMillis()); - order.setStatus(BizDocumentStatusEnum.DRAFT.getCode()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); + vo.setStatus(DocStatusEnum.DRAFT.getCode()); - return purchaseOrderService.add(order); + return service.add(vo); } @PostMapping("update") - public Result update(@RequestBody BizPurchaseOrder order) { - String errMsg = validateUpdate(order); - if (errMsg == null) errMsg = validateSub(order.getData()); + public Result update(@RequestBody BizPurchaseOrder vo) { + String errMsg = validateUpdate(vo); + if (errMsg == null) errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); - return purchaseOrderService.update(order); + return service.update(vo); } @PostMapping("commit") - public Result commit(@RequestBody BizPurchaseOrder order) { - boolean isFirst = StringUtils.isEmpty(order.getId()); + public Result commit(@RequestBody BizPurchaseOrder vo) { + boolean isFirst = StringUtils.isEmpty(vo.getId()); - String errMsg = validateSub(order.getData()); - if (!isFirst && errMsg == null) errMsg = validateUpdate(order); + String errMsg = validateSub(vo.getData()); + if (!isFirst && errMsg == null) errMsg = validateUpdate(vo); if (errMsg != null) return Result.fail(errMsg); - order.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode()); + vo.setStatus(DocStatusEnum.WAIT_VERIFY.getCode()); if (isFirst) { UserVo user = SessionUtil.get(); - order.setCid(user.getId()); - order.setCname(user.getName()); - order.setCtime(System.currentTimeMillis()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); } - return purchaseOrderService.commit(order); + return service.commit(vo); } @PostMapping("withdraw") public Result withdraw(@RequestBody DocumentStatusUpdate vo) { - return purchaseOrderService.withdraw(vo, SessionUtil.get()); + return service.withdraw(vo, SessionUtil.get()); } @PostMapping("pass") public Result pass(@RequestBody DocumentStatusUpdate vo) { - return purchaseOrderService.pass(vo, SessionUtil.get()); + return service.pass(vo, SessionUtil.get()); } @PostMapping("reject") public Result reject(@RequestBody DocumentStatusUpdate vo) { - return purchaseOrderService.reject(vo, SessionUtil.get()); + return service.reject(vo, SessionUtil.get()); } @GetMapping("del") public Result del(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - return purchaseOrderService.del(id); + return service.del(id); } private String validateUpdate(BizPurchaseOrder main) { @@ -130,11 +131,15 @@ public class BizPurchaseOrderController { private String validateSub(List 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++; + int len = list.size(); + for (int i = 0; i < len; i++) { + BizPurchaseOrderSub sub = list.get(i); + if (sub.getNum() == null || sub.getNum().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个入库商品数量有误", i); + } + if (sub.getPrice() == null || sub.getPrice().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个采购商品价格有误", i); + } } return null; } diff --git a/java/src/main/java/com/toesbieya/my/controller/BizSellOrderController.java b/java/src/main/java/com/toesbieya/my/controller/BizSellOrderController.java index 8953c12..d21280f 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizSellOrderController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizSellOrderController.java @@ -1,6 +1,6 @@ package com.toesbieya.my.controller; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.model.entity.BizSellOrder; import com.toesbieya.my.model.entity.BizSellOrderSub; import com.toesbieya.my.model.vo.UserVo; @@ -15,106 +15,107 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.List; @RestController -@RequestMapping("sell/order") +@RequestMapping("document/sell/order") public class BizSellOrderController { @Resource - private BizSellOrderService sellOrderService; + private BizSellOrderService service; @GetMapping("getById") public Result getById(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - BizSellOrder order = sellOrderService.getById(id); + BizSellOrder order = service.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)); + return Result.success(service.getSubById(id)); } @PostMapping("search") public Result search(@RequestBody SellOrderSearch vo) { - return Result.success(sellOrderService.search(vo)); + return Result.success(service.search(vo)); } @PostMapping("export") public void export(@RequestBody SellOrderSearch vo, HttpServletResponse response) throws Exception { - sellOrderService.export(vo, response); + service.export(vo, response); } @PostMapping("add") - public Result add(@RequestBody BizSellOrder order) { - if (order.getCustomer_id() == null - || StringUtils.isEmpty(order.getCustomer_name()) - || order.getTotal() == null) { + public Result add(@RequestBody BizSellOrder vo) { + if (vo.getCustomer_id() == null + || StringUtils.isEmpty(vo.getCustomer_name()) + || vo.getTotal() == null) { return Result.fail("参数错误"); } - String errMsg = validateSub(order.getData()); + String errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); UserVo user = SessionUtil.get(); - order.setCid(user.getId()); - order.setCname(user.getName()); - order.setCtime(System.currentTimeMillis()); - order.setStatus(BizDocumentStatusEnum.DRAFT.getCode()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); + vo.setStatus(DocStatusEnum.DRAFT.getCode()); - return sellOrderService.add(order); + return service.add(vo); } @PostMapping("update") - public Result update(@RequestBody BizSellOrder order) { - String errMsg = validateUpdate(order); - if (errMsg == null) errMsg = validateSub(order.getData()); + public Result update(@RequestBody BizSellOrder vo) { + String errMsg = validateUpdate(vo); + if (errMsg == null) errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); - return sellOrderService.update(order); + return service.update(vo); } @PostMapping("commit") - public Result commit(@RequestBody BizSellOrder order) { - boolean isFirst = StringUtils.isEmpty(order.getId()); + public Result commit(@RequestBody BizSellOrder vo) { + boolean isFirst = StringUtils.isEmpty(vo.getId()); - String errMsg = validateSub(order.getData()); - if (!isFirst && errMsg == null) errMsg = validateUpdate(order); + String errMsg = validateSub(vo.getData()); + if (!isFirst && errMsg == null) errMsg = validateUpdate(vo); if (errMsg != null) return Result.fail(errMsg); - order.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode()); + vo.setStatus(DocStatusEnum.WAIT_VERIFY.getCode()); if (isFirst) { UserVo user = SessionUtil.get(); - order.setCid(user.getId()); - order.setCname(user.getName()); - order.setCtime(System.currentTimeMillis()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); } - return sellOrderService.commit(order); + return service.commit(vo); } @PostMapping("withdraw") public Result withdraw(@RequestBody DocumentStatusUpdate vo) { - return sellOrderService.withdraw(vo, SessionUtil.get()); + return service.withdraw(vo, SessionUtil.get()); } @PostMapping("pass") public Result pass(@RequestBody DocumentStatusUpdate vo) { - return sellOrderService.pass(vo, SessionUtil.get()); + return service.pass(vo, SessionUtil.get()); } @PostMapping("reject") public Result reject(@RequestBody DocumentStatusUpdate vo) { - return sellOrderService.reject(vo, SessionUtil.get()); + return service.reject(vo, SessionUtil.get()); } @GetMapping("del") public Result del(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - return sellOrderService.del(id); + return service.del(id); } private String validateUpdate(BizSellOrder main) { @@ -132,11 +133,15 @@ public class BizSellOrderController { private String validateSub(List 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++; + int len = list.size(); + for (int i = 0; i < len; i++) { + BizSellOrderSub sub = list.get(i); + if (sub.getNum() == null || sub.getNum().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个销售商品数量有误", i); + } + if (sub.getPrice() == null || sub.getPrice().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个销售商品价格有误", i); + } } return null; } diff --git a/java/src/main/java/com/toesbieya/my/controller/BizSellOutboundController.java b/java/src/main/java/com/toesbieya/my/controller/BizSellOutboundController.java index a746c74..78dedd4 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizSellOutboundController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizSellOutboundController.java @@ -1,6 +1,6 @@ package com.toesbieya.my.controller; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.model.entity.BizSellOutbound; import com.toesbieya.my.model.entity.BizSellOutboundSub; import com.toesbieya.my.model.vo.UserVo; @@ -15,100 +15,101 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.List; @RestController -@RequestMapping("sell/outbound") +@RequestMapping("document/sell/outbound") public class BizSellOutboundController { @Resource - private BizSellOutboundService sellOutboundService; + private BizSellOutboundService service; @GetMapping("getById") public Result getById(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - BizSellOutbound outbound = sellOutboundService.getById(id); + BizSellOutbound outbound = service.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)); + return Result.success(service.getSubById(id)); } @PostMapping("search") public Result search(@RequestBody SellOutboundSearch vo) { - return Result.success(sellOutboundService.search(vo)); + return Result.success(service.search(vo)); } @PostMapping("export") public void export(@RequestBody SellOutboundSearch vo, HttpServletResponse response) throws Exception { - sellOutboundService.export(vo, response); + service.export(vo, response); } @PostMapping("add") - public Result add(@RequestBody BizSellOutbound outbound) { - String errMsg = validateSub(outbound.getData()); + public Result add(@RequestBody BizSellOutbound vo) { + String errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); UserVo user = SessionUtil.get(); - outbound.setCid(user.getId()); - outbound.setCname(user.getName()); - outbound.setCtime(System.currentTimeMillis()); - outbound.setStatus(BizDocumentStatusEnum.DRAFT.getCode()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); + vo.setStatus(DocStatusEnum.DRAFT.getCode()); - return sellOutboundService.add(outbound); + return service.add(vo); } @PostMapping("update") - public Result update(@RequestBody BizSellOutbound outbound) { - String errMsg = validateUpdate(outbound); - if (errMsg == null) errMsg = validateSub(outbound.getData()); + public Result update(@RequestBody BizSellOutbound vo) { + String errMsg = validateUpdate(vo); + if (errMsg == null) errMsg = validateSub(vo.getData()); if (errMsg != null) return Result.fail(errMsg); - return sellOutboundService.update(outbound); + return service.update(vo); } @PostMapping("commit") - public Result commit(@RequestBody BizSellOutbound outbound) { - boolean isFirst = StringUtils.isEmpty(outbound.getId()); + public Result commit(@RequestBody BizSellOutbound vo) { + boolean isFirst = StringUtils.isEmpty(vo.getId()); - String errMsg = validateSub(outbound.getData()); - if (!isFirst && errMsg == null) errMsg = validateUpdate(outbound); + String errMsg = validateSub(vo.getData()); + if (!isFirst && errMsg == null) errMsg = validateUpdate(vo); if (errMsg != null) return Result.fail(errMsg); - outbound.setStatus(BizDocumentStatusEnum.WAIT_VERIFY.getCode()); + vo.setStatus(DocStatusEnum.WAIT_VERIFY.getCode()); if (isFirst) { UserVo user = SessionUtil.get(); - outbound.setCid(user.getId()); - outbound.setCname(user.getName()); - outbound.setCtime(System.currentTimeMillis()); + vo.setCid(user.getId()); + vo.setCname(user.getName()); + vo.setCtime(System.currentTimeMillis()); } - return sellOutboundService.commit(outbound); + return service.commit(vo); } @PostMapping("withdraw") public Result withdraw(@RequestBody DocumentStatusUpdate vo) { - return sellOutboundService.withdraw(vo, SessionUtil.get()); + return service.withdraw(vo, SessionUtil.get()); } @PostMapping("pass") public Result pass(@RequestBody DocumentStatusUpdate vo) { if (StringUtils.isEmpty(vo.getPid())) return Result.fail("参数错误"); - return sellOutboundService.pass(vo, SessionUtil.get()); + return service.pass(vo, SessionUtil.get()); } @PostMapping("reject") public Result reject(@RequestBody DocumentStatusUpdate vo) { - return sellOutboundService.reject(vo, SessionUtil.get()); + return service.reject(vo, SessionUtil.get()); } @GetMapping("del") public Result del(@RequestParam String id) { if (StringUtils.isEmpty(id)) return Result.fail("参数错误"); - return sellOutboundService.del(id); + return service.del(id); } private String validateUpdate(BizSellOutbound main) { @@ -123,13 +124,21 @@ public class BizSellOutboundController { } private String validateSub(List 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++; + if (CollectionUtils.isEmpty(list)) { + return "销售出库单必须要有出库列表"; + } + int len = list.size(); + for (int i = 0; i < len; i++) { + BizSellOutboundSub sub = list.get(i); + if (sub.getSid() == null) { + return String.format("第%d个出库商品没有选择库存", i); + } + if (sub.getNum() == null || sub.getNum().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("第%d个出库商品数量有误", i); + } + if (sub.getCid() == null || StringUtils.isEmpty(sub.getCname())) { + return String.format("第%d个出库商品数量有误", i); + } } return null; } diff --git a/java/src/main/java/com/toesbieya/my/controller/BizStockController.java b/java/src/main/java/com/toesbieya/my/controller/BizStockController.java index 962d84e..9530efa 100644 --- a/java/src/main/java/com/toesbieya/my/controller/BizStockController.java +++ b/java/src/main/java/com/toesbieya/my/controller/BizStockController.java @@ -13,27 +13,27 @@ import javax.servlet.http.HttpServletResponse; @RequestMapping("stock/current") public class BizStockController { @Resource - private BizStockService stockService; + private BizStockService service; @PostMapping("search") public Result search(@RequestBody StockSearch vo) { - return Result.success(stockService.search(vo)); + return Result.success(service.search(vo)); } @GetMapping("getDetail") - public Result getDetail(@RequestParam String cid) { - if (StringUtils.isEmpty(cid)) return Result.fail("参数错误"); - return Result.success(stockService.getDetail(cid)); + public Result getDetail(@RequestParam String cids) { + if (StringUtils.isEmpty(cids)) return Result.fail("参数错误"); + return Result.success(service.getDetail(cids)); } @GetMapping("getDetailById") public Result getDetailById(@RequestParam String ids) { if (StringUtils.isEmpty(ids)) return Result.fail("参数错误"); - return Result.success(stockService.getDetailById(ids)); + return Result.success(service.getDetailById(ids)); } @PostMapping("export") public void export(@RequestBody StockSearch vo, HttpServletResponse response) throws Exception { - stockService.export(vo, response); + service.export(vo, response); } } diff --git a/java/src/main/java/com/toesbieya/my/controller/FileController.java b/java/src/main/java/com/toesbieya/my/controller/FileController.java index 900ec3c..70b5716 100644 --- a/java/src/main/java/com/toesbieya/my/controller/FileController.java +++ b/java/src/main/java/com/toesbieya/my/controller/FileController.java @@ -15,7 +15,6 @@ import java.net.URLDecoder; @RequestMapping("file") @Slf4j public class FileController { - @GetMapping("delete") public Result delete(@RequestParam String url) throws UnsupportedEncodingException { QiniuUtil.delete(URLDecoder.decode(url, "utf-8")); diff --git a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentFinishEnum.java b/java/src/main/java/com/toesbieya/my/enumeration/DocFinishEnum.java similarity index 73% rename from java/src/main/java/com/toesbieya/my/enumeration/BizDocumentFinishEnum.java rename to java/src/main/java/com/toesbieya/my/enumeration/DocFinishEnum.java index b9900e2..9311bfb 100644 --- a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentFinishEnum.java +++ b/java/src/main/java/com/toesbieya/my/enumeration/DocFinishEnum.java @@ -1,11 +1,11 @@ package com.toesbieya.my.enumeration; -public enum BizDocumentFinishEnum { +public enum DocFinishEnum { TO_BE_STARTED(0), UNDERWAY(1), FINISHED(2); private final int code; - BizDocumentFinishEnum(int code) { + DocFinishEnum(int code) { this.code = code; } diff --git a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentHistoryEnum.java b/java/src/main/java/com/toesbieya/my/enumeration/DocHistoryEnum.java similarity index 73% rename from java/src/main/java/com/toesbieya/my/enumeration/BizDocumentHistoryEnum.java rename to java/src/main/java/com/toesbieya/my/enumeration/DocHistoryEnum.java index a577dde..dfb114b 100644 --- a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentHistoryEnum.java +++ b/java/src/main/java/com/toesbieya/my/enumeration/DocHistoryEnum.java @@ -1,11 +1,11 @@ package com.toesbieya.my.enumeration; -public enum BizDocumentHistoryEnum { +public enum DocHistoryEnum { WITHDRAW(0), COMMIT(1), PASS(2), REJECT(3); private final int code; - BizDocumentHistoryEnum(int code) { + DocHistoryEnum(int code) { this.code = code; } diff --git a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentStatusEnum.java b/java/src/main/java/com/toesbieya/my/enumeration/DocStatusEnum.java similarity index 73% rename from java/src/main/java/com/toesbieya/my/enumeration/BizDocumentStatusEnum.java rename to java/src/main/java/com/toesbieya/my/enumeration/DocStatusEnum.java index 917d586..1380b8f 100644 --- a/java/src/main/java/com/toesbieya/my/enumeration/BizDocumentStatusEnum.java +++ b/java/src/main/java/com/toesbieya/my/enumeration/DocStatusEnum.java @@ -1,11 +1,11 @@ package com.toesbieya.my.enumeration; -public enum BizDocumentStatusEnum { +public enum DocStatusEnum { DRAFT(0), WAIT_VERIFY(1), VERIFIED(2); private final int code; - BizDocumentStatusEnum(int code) { + DocStatusEnum(int code) { this.code = code; } diff --git a/java/src/main/java/com/toesbieya/my/interceptor/SecurityInterceptor.java b/java/src/main/java/com/toesbieya/my/interceptor/SecurityInterceptor.java index e0cf623..2b946b2 100644 --- a/java/src/main/java/com/toesbieya/my/interceptor/SecurityInterceptor.java +++ b/java/src/main/java/com/toesbieya/my/interceptor/SecurityInterceptor.java @@ -2,7 +2,6 @@ package com.toesbieya.my.interceptor; import com.toesbieya.my.model.vo.UserVo; import com.toesbieya.my.module.PermissionModule; -import com.toesbieya.my.module.request.RequestModule; import com.toesbieya.my.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; @@ -15,16 +14,8 @@ public class SecurityInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String url = request.getServletPath(); - String method = request.getMethod(); String ip = IpUtil.getIp(request); - if (!RequestModule.urlExistMapping(url, method)) { - WebUtil.responseJson(response, Result.notfound()); - log.error("请求地址不存在:{},{},IP:{}", url, method, ip); - ThreadUtil.clearUser(); - return false; - } - UserVo user = SessionUtil.get(request); if (user == null) { diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizDocumentHistoryMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizDocumentHistoryMapper.java index e65e8c6..171321b 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizDocumentHistoryMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizDocumentHistoryMapper.java @@ -11,5 +11,5 @@ public interface BizDocumentHistoryMapper { List search(DocumentHistorySearch vo); - int add(BizDocumentHistory history); + int insert(BizDocumentHistory history); } diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseInboundMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseInboundMapper.java index b0c3f3d..ed96355 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseInboundMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseInboundMapper.java @@ -17,7 +17,7 @@ public interface BizPurchaseInboundMapper { List export(PurchaseInboundSearch vo); - int add(BizPurchaseInbound param); + int insert(BizPurchaseInbound param); void addSub(List list); diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseOrderMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseOrderMapper.java index 2eb64ba..688d7ec 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseOrderMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizPurchaseOrderMapper.java @@ -2,11 +2,11 @@ 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.math.BigDecimal; import java.util.List; public interface BizPurchaseOrderMapper { @@ -18,13 +18,13 @@ public interface BizPurchaseOrderMapper { List export(PurchaseOrderSearch vo); - int add(BizPurchaseOrder param); + int insert(BizPurchaseOrder param); void addSub(List list); int update(BizPurchaseOrder param); - int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") double remain_num); + int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") BigDecimal remain_num); int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime); @@ -35,10 +35,4 @@ public interface BizPurchaseOrderMapper { 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 getDailyProfitGoods(@Param("start") long start, @Param("end") long end); - - Integer getLastDayFinishOrderNum(); } diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizSellOrderMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizSellOrderMapper.java index 5598bfe..0c61347 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizSellOrderMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizSellOrderMapper.java @@ -2,11 +2,11 @@ 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.math.BigDecimal; import java.util.List; public interface BizSellOrderMapper { @@ -18,13 +18,13 @@ public interface BizSellOrderMapper { List export(SellOrderSearch vo); - int add(BizSellOrder param); + int insert(BizSellOrder param); void addSub(List list); int update(BizSellOrder param); - int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") double remain_num); + int updateSubRemainNum(@Param("id") Integer id, @Param("remain_num") BigDecimal remain_num); int pass(@Param("id") String id, @Param("vid") Integer vid, @Param("vname") String vname, @Param("vtime") long vtime); @@ -35,10 +35,4 @@ public interface BizSellOrderMapper { 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 getDailyProfitGoods(@Param("start") long start, @Param("end") long end); - - Integer getLastDayFinishOrderNum(); } diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizSellOutboundMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizSellOutboundMapper.java index e26891b..8af920b 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizSellOutboundMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizSellOutboundMapper.java @@ -17,7 +17,7 @@ public interface BizSellOutboundMapper { List export(SellOutboundSearch vo); - int add(BizSellOutbound param); + int insert(BizSellOutbound param); void addSub(List list); diff --git a/java/src/main/java/com/toesbieya/my/mapper/BizStockMapper.java b/java/src/main/java/com/toesbieya/my/mapper/BizStockMapper.java index 0954f83..7ec1db6 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/BizStockMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/BizStockMapper.java @@ -6,26 +6,19 @@ import com.toesbieya.my.model.vo.result.StockSearchResult; import com.toesbieya.my.model.vo.search.StockSearch; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; import java.util.List; public interface BizStockMapper { List search(StockSearch vo); - List getDetail(@Param("cid") String cid); + List getDetail(@Param("cids") String cids); List getDetailById(@Param("ids") String ids); List export(StockSearch vo); - int deleteByPrimaryKey(Integer id); - - int updateByPrimaryKeySelective(BizStock record); - - int updateByPrimaryKey(BizStock record); - - int updateBatchSelective(List list); - int batchInsert(@Param("list") List list); - int outbound(@Param("id") Integer id, @Param("num") Double num); + int outbound(@Param("id") Integer id, @Param("num") BigDecimal num); } \ No newline at end of file diff --git a/java/src/main/java/com/toesbieya/my/mapper/StatisticMapper.java b/java/src/main/java/com/toesbieya/my/mapper/StatisticMapper.java index 6aada3a..b59816e 100644 --- a/java/src/main/java/com/toesbieya/my/mapper/StatisticMapper.java +++ b/java/src/main/java/com/toesbieya/my/mapper/StatisticMapper.java @@ -5,6 +5,7 @@ import com.toesbieya.my.model.entity.StatProfitGoods; import com.toesbieya.my.model.entity.StatProfitTotal; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; import java.util.List; public interface StatisticMapper { @@ -18,11 +19,23 @@ public interface StatisticMapper { boolean checkDailyFinishOrderExist(@Param("time") long time); - int insertFinishOrder(StatFinishOrder param); - boolean checkDailyProfitExist(@Param("time") long time); + int insertFinishOrder(StatFinishOrder param); + int insertProfitTotal(StatProfitTotal param); int insertProfitGoodsBatch(@Param("list") List list); + + BigDecimal getPurchaseOrderDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end); + + List getPurchaseOrderDailyProfitGoods(@Param("start") long start, @Param("end") long end); + + Integer getPurchaseOrderLastDayFinishOrderNum(); + + BigDecimal getSellOrderDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end); + + List getSellOrderDailyProfitGoods(@Param("start") long start, @Param("end") long end); + + Integer getSellOrderLastDayFinishOrderNum(); } diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizDocumentSub.java b/java/src/main/java/com/toesbieya/my/model/entity/BizDocumentSub.java index 684de9e..fa43e4e 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizDocumentSub.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizDocumentSub.java @@ -2,11 +2,13 @@ package com.toesbieya.my.model.entity; import lombok.Data; +import java.math.BigDecimal; + @Data public class BizDocumentSub { private Integer id; private String pid; private Integer cid; private String cname; - private Double num; + private BigDecimal num; } diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrder.java b/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrder.java index 484cf71..213dfb7 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrder.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrder.java @@ -4,6 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.math.BigDecimal; + @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) @@ -12,5 +14,5 @@ public class BizPurchaseOrder extends BizDocument { private String sname; private Integer finish; private Long ftime; - private Double total; + private BigDecimal total; } diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrderSub.java b/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrderSub.java index 7f395a8..8abc885 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrderSub.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizPurchaseOrderSub.java @@ -4,10 +4,12 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.math.BigDecimal; + @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class BizPurchaseOrderSub extends BizDocumentSub { - private Double price; - private Double remain_num; + private BigDecimal price; + private BigDecimal remain_num; } diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrder.java b/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrder.java index 8102557..92f4d2b 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrder.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrder.java @@ -4,6 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.math.BigDecimal; + @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) @@ -12,5 +14,5 @@ public class BizSellOrder extends BizDocument { private String customer_name; private Integer finish; private Long ftime; - private Double total; + private BigDecimal total; } diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrderSub.java b/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrderSub.java index 493be61..31d75ae 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrderSub.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizSellOrderSub.java @@ -4,10 +4,12 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.math.BigDecimal; + @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class BizSellOrderSub extends BizDocumentSub { - private Double price; - private Double remain_num; -} + private BigDecimal price; + private BigDecimal remain_num; +} \ No newline at end of file diff --git a/java/src/main/java/com/toesbieya/my/model/entity/BizStock.java b/java/src/main/java/com/toesbieya/my/model/entity/BizStock.java index 7ed9134..cc1dfcd 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/BizStock.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/BizStock.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + @Data @Builder @AllArgsConstructor @@ -13,8 +15,8 @@ public class BizStock { private Integer id; private Integer cid; private String cname; - private Double num; - private Double price; + private BigDecimal num; + private BigDecimal price; private Long ctime; private String cgrkid; private String cgddid; diff --git a/java/src/main/java/com/toesbieya/my/model/entity/StatProfitTotal.java b/java/src/main/java/com/toesbieya/my/model/entity/StatProfitTotal.java index f969fa8..7609689 100644 --- a/java/src/main/java/com/toesbieya/my/model/entity/StatProfitTotal.java +++ b/java/src/main/java/com/toesbieya/my/model/entity/StatProfitTotal.java @@ -2,11 +2,13 @@ package com.toesbieya.my.model.entity; import lombok.Data; +import java.math.BigDecimal; + @Data public class StatProfitTotal { private Integer id; - private Double purchase; - private Double sell; - private Double profit; + private BigDecimal purchase; + private BigDecimal sell; + private BigDecimal profit; private Long time; } diff --git a/java/src/main/java/com/toesbieya/my/model/vo/IpResultVo.java b/java/src/main/java/com/toesbieya/my/model/vo/IpResultVo.java deleted file mode 100644 index eadc3f0..0000000 --- a/java/src/main/java/com/toesbieya/my/model/vo/IpResultVo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.toesbieya.my.model.vo; - -import com.alibaba.fastjson.JSONObject; -import lombok.Data; - -@Data -public class IpResultVo { - private Integer code; - private JSONObject data; -} diff --git a/java/src/main/java/com/toesbieya/my/model/vo/SocketEventVo.java b/java/src/main/java/com/toesbieya/my/model/vo/SocketEventVo.java new file mode 100644 index 0000000..fdc13ad --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/model/vo/SocketEventVo.java @@ -0,0 +1,21 @@ +package com.toesbieya.my.model.vo; + +import com.toesbieya.my.constant.SocketConstant; +import lombok.Data; + +import java.util.List; + +@Data +public class SocketEventVo { + //事件类型 + private int type = SocketConstant.REDIS_EVENT_SPECIFIC; + + //事件名称 + private String event; + + //发送对象的id集合 + private List to; + + //数据包 + private Object data; +} diff --git a/java/src/main/java/com/toesbieya/my/model/vo/SocketOfflineVo.java b/java/src/main/java/com/toesbieya/my/model/vo/SocketOfflineVo.java new file mode 100644 index 0000000..c2d2ffc --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/model/vo/SocketOfflineVo.java @@ -0,0 +1,16 @@ +package com.toesbieya.my.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SocketOfflineVo { + //用户的sessionKey + private String key; + + //断开时间 + private Long time; +} diff --git a/java/src/main/java/com/toesbieya/my/model/vo/export/StockExport.java b/java/src/main/java/com/toesbieya/my/model/vo/export/StockExport.java index 399d020..6c51e7f 100644 --- a/java/src/main/java/com/toesbieya/my/model/vo/export/StockExport.java +++ b/java/src/main/java/com/toesbieya/my/model/vo/export/StockExport.java @@ -5,6 +5,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import lombok.Data; +import java.math.BigDecimal; + @Data public class StockExport { @ExcelIgnore @@ -20,11 +22,11 @@ public class StockExport { @ExcelProperty(value = "库存总数", index = 2) @ColumnWidth(20) - private double total_num; + private BigDecimal total_num; @ExcelProperty(value = "库存总值", index = 3) @ColumnWidth(20) - private double total_price; + private BigDecimal total_price; @ExcelProperty(value = "采购订单号", index = 4) @ColumnWidth(20) @@ -32,11 +34,11 @@ public class StockExport { @ExcelProperty(value = "采购单价", index = 5) @ColumnWidth(20) - private double cg_price; + private BigDecimal cg_price; @ExcelProperty(value = "采购数量", index = 6) @ColumnWidth(20) - private double cg_num; + private BigDecimal cg_num; @ExcelProperty(value = "采购入库单号", index = 7) @ColumnWidth(20) @@ -48,5 +50,5 @@ public class StockExport { @ExcelProperty(value = "入库数量", index = 9) @ColumnWidth(20) - private double rk_num; + private BigDecimal rk_num; } diff --git a/java/src/main/java/com/toesbieya/my/model/vo/result/StockSearchResult.java b/java/src/main/java/com/toesbieya/my/model/vo/result/StockSearchResult.java index df5f391..d646a2c 100644 --- a/java/src/main/java/com/toesbieya/my/model/vo/result/StockSearchResult.java +++ b/java/src/main/java/com/toesbieya/my/model/vo/result/StockSearchResult.java @@ -2,10 +2,12 @@ package com.toesbieya.my.model.vo.result; import lombok.Data; +import java.math.BigDecimal; + @Data public class StockSearchResult { private Integer cid; private String cname; - private Double total_num; - private Double total_price; + private BigDecimal total_num; + private BigDecimal total_price; } diff --git a/java/src/main/java/com/toesbieya/my/model/vo/statictis/FourBlockStat.java b/java/src/main/java/com/toesbieya/my/model/vo/statictis/FourBlockStat.java index 20b2cfc..be4468b 100644 --- a/java/src/main/java/com/toesbieya/my/model/vo/statictis/FourBlockStat.java +++ b/java/src/main/java/com/toesbieya/my/model/vo/statictis/FourBlockStat.java @@ -2,10 +2,12 @@ package com.toesbieya.my.model.vo.statictis; import lombok.Data; +import java.math.BigDecimal; + @Data public class FourBlockStat { - private int online; - private double purchase; - private double sell; - private double profit; + private long online; + private BigDecimal purchase; + private BigDecimal sell; + private BigDecimal profit; } diff --git a/java/src/main/java/com/toesbieya/my/module/PermissionModule.java b/java/src/main/java/com/toesbieya/my/module/PermissionModule.java index bef452b..12cd0f6 100644 --- a/java/src/main/java/com/toesbieya/my/module/PermissionModule.java +++ b/java/src/main/java/com/toesbieya/my/module/PermissionModule.java @@ -4,6 +4,7 @@ import com.toesbieya.my.model.entity.SysResource; import com.toesbieya.my.model.vo.UserVo; import com.toesbieya.my.service.SysResourceService; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -14,6 +15,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @Slf4j +@Component public class PermissionModule { private final static ConcurrentHashMap urlMap = new ConcurrentHashMap<>(128); private final static ConcurrentHashMap adminUrlMap = new ConcurrentHashMap<>(128); diff --git a/java/src/main/java/com/toesbieya/my/module/SocketModule.java b/java/src/main/java/com/toesbieya/my/module/WebSocketServer.java similarity index 55% rename from java/src/main/java/com/toesbieya/my/module/SocketModule.java rename to java/src/main/java/com/toesbieya/my/module/WebSocketServer.java index 2bad309..65437e9 100644 --- a/java/src/main/java/com/toesbieya/my/module/SocketModule.java +++ b/java/src/main/java/com/toesbieya/my/module/WebSocketServer.java @@ -6,7 +6,10 @@ import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.annotation.OnConnect; import com.corundumstudio.socketio.annotation.OnDisconnect; import com.corundumstudio.socketio.annotation.OnEvent; +import com.toesbieya.my.constant.SessionConstant; import com.toesbieya.my.constant.SocketConstant; +import com.toesbieya.my.model.vo.SocketOfflineVo; +import com.toesbieya.my.utils.RedisUtil; import com.toesbieya.my.utils.SessionUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -21,21 +24,25 @@ import java.util.function.BiConsumer; @Component @Slf4j -public class SocketModule { - private static final ConcurrentHashMap socketMap = new ConcurrentHashMap<>(128); - private static SocketIOServer server; +public class WebSocketServer { + private final ConcurrentHashMap socketMap = new ConcurrentHashMap<>(128); + private final SocketIOServer server; @Autowired - public SocketModule(SocketIOServer server) { - SocketModule.server = server; + public WebSocketServer(SocketIOServer server) { + this.server = server; + + //启动socket服务前清空redis中的在线用户信息 + RedisUtil.del(SocketConstant.REDIS_ONLINE_USER); + server.start(); } - public static void sendEvent(String event, Integer uid, Object... data) { + public void sendEvent(String event, Integer uid, Object... data) { sendEvent(event, uid, data, null); } - public static void sendEvent(String event, Integer uid, Object data, BiConsumer consumer) { + public void sendEvent(String event, Integer uid, Object data, BiConsumer consumer) { UserObject obj = socketMap.get(uid); if (obj == null) return; @@ -49,48 +56,67 @@ public class SocketModule { if (consumer != null) consumer.accept(obj, client); } - public static void broadcast(String event, Object... data) { + public void broadcast(String event, Object... data) { server.getBroadcastOperations().sendEvent(event, data); } - public static boolean online(Integer uid) { - return uid != null && socketMap.containsKey(uid); - } - - public static void logout(Integer uid, String msg) { + public void logout(Integer uid, String msg) { sendEvent(SocketConstant.EVENT_LOGOUT, uid, msg, (obj, client) -> { SessionUtil.remove(obj.getToken()); client.disconnect(); - socketMap.remove(uid); }); } - public static int getOnlineNum() { - return socketMap.size(); - } - @OnConnect public void onConnect(SocketIOClient client) { UserObject obj = new UserObject(client); Integer uid = obj.getUid(); + //用户session是否过期? + if (!RedisUtil.exist(obj.getKey())) { + logout(uid, "登陆信息过期,请重新登陆"); + return; + } + + //如果存在,说明该账号重复登陆,强制登出 if (socketMap.containsKey(uid)) { logout(uid, "该账号在其他位置登录"); } - else socketMap.put(uid, obj); + + socketMap.put(uid, obj); + + //放入在线用户ID集合 + RedisUtil.sadd(SocketConstant.REDIS_ONLINE_USER, uid); + //移除离线表的信息 + RedisUtil.hdel(SocketConstant.REDIS_OFFLINE_USER, String.valueOf(uid)); } @OnDisconnect public void onDisconnect(SocketIOClient client) { + long now = System.currentTimeMillis(); UserObject obj = new UserObject(client); + Integer uid = obj.getUid(); + String sessionKey = obj.getKey(); + + //重复登陆时,不需要执行操作 UserObject already = socketMap.get(uid); + if (already == null || !sessionKey.equals(already.getKey())) { + return; + } + + socketMap.remove(uid); - if (already == null) return; + //移除在线用户ID集合对应的ID + RedisUtil.srem(SocketConstant.REDIS_ONLINE_USER, uid); - //只有token相同时才移除 - if (obj.getToken().equals(already.getToken())) { - socketMap.remove(uid); + //在用户session未过期时设置离线表信息 + if (RedisUtil.exist(sessionKey)) { + RedisUtil.hset( + SocketConstant.REDIS_OFFLINE_USER, + String.valueOf(uid), + new SocketOfflineVo(sessionKey, now) + ); } } @@ -101,6 +127,7 @@ public class SocketModule { @Data private static class UserObject { + private String key; //redis的键名 private Integer uid; //用户id private String token; //redis中的token private UUID uuid; //socketClient自己的sessionID @@ -112,6 +139,7 @@ public class SocketModule { list = params.get("token"); this.token = list.get(0); this.uuid = client.getSessionId(); + this.key = SessionConstant.REDIS_NAMESPACE + this.token; } } } diff --git a/java/src/main/java/com/toesbieya/my/module/request/RequestModule.java b/java/src/main/java/com/toesbieya/my/module/request/RequestModule.java index 8a38558..08ea40c 100644 --- a/java/src/main/java/com/toesbieya/my/module/request/RequestModule.java +++ b/java/src/main/java/com/toesbieya/my/module/request/RequestModule.java @@ -6,18 +6,11 @@ import com.toesbieya.my.utils.RedisUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import javax.annotation.PostConstruct; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -27,29 +20,14 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; public class RequestModule { private final static String IP_LIMIT_KEY = "limit:url-ip:"; private final static String BLACK_IP_KEY = "limit:black-ip:"; - private final static int REQUEST_URL_INIT_VALUE = 128; - //判断能拿到令牌的最大时间,毫秒 private final static long TIME_OUT = 200L; - - //所有controller的,一个url只会有一个mappingMethod - private final static HashMap requestUrlMap = new HashMap<>(REQUEST_URL_INIT_VALUE); - //ip暂时拉黑的时间,单位秒 private final static long EXPIRE_SECONDS = 10L; - //url的总访问频率限制 private static ConcurrentHashMap limitMap; - - private RequestMappingHandlerMapping mapping; private SysResourceService resourceService; - //根据请求地址和请求方法判断是否为合法请求 - public static boolean urlExistMapping(String url, String method) { - String s = requestUrlMap.get(url); - return s != null && s.equals(method); - } - /** * 未在resource表中配置的不进行限制 * @@ -81,28 +59,12 @@ public class RequestModule { public void init() { Instant start = Instant.now(); - initRequestMap(); initLimitMap(); Instant end = Instant.now(); log.info("路由模块启动成功,耗时:{}毫秒", ChronoUnit.MILLIS.between(start, end)); } - private void initRequestMap() { - // 获取url与类和方法的对应信息 - Map map = mapping.getHandlerMethods(); - - for (RequestMappingInfo info : map.keySet()) { - Set patterns = info.getPatternsCondition().getPatterns(); - Set methods = info.getMethodsCondition().getMethods(); - if (methods.size() <= 0) { - log.warn("url{}没有设置请求方法", patterns); - continue; - } - requestUrlMap.put(patterns.iterator().next(), methods.iterator().next().toString()); - } - } - private void initLimitMap() { limitMap = new ConcurrentHashMap<>(); List resources = resourceService.getAll(); @@ -117,11 +79,6 @@ public class RequestModule { limitMap.put(url, new RateLimiterHelper(totalRate, ipRate)); } - @Autowired - public void setMapping(RequestMappingHandlerMapping mapping) { - this.mapping = mapping; - } - @Autowired public void setResourceService(SysResourceService resourceService) { this.resourceService = resourceService; diff --git a/java/src/main/java/com/toesbieya/my/module/RedisModule.java b/java/src/main/java/com/toesbieya/my/schedule/DocumentTask.java similarity index 72% rename from java/src/main/java/com/toesbieya/my/module/RedisModule.java rename to java/src/main/java/com/toesbieya/my/schedule/DocumentTask.java index c44bf75..e0d09b7 100644 --- a/java/src/main/java/com/toesbieya/my/module/RedisModule.java +++ b/java/src/main/java/com/toesbieya/my/schedule/DocumentTask.java @@ -1,4 +1,4 @@ -package com.toesbieya.my.module; +package com.toesbieya.my.schedule; import com.toesbieya.my.constant.DocumentConstant; import com.toesbieya.my.utils.DateUtil; @@ -19,28 +19,32 @@ import java.util.Map; @Component @Slf4j @DependsOn("redisUtil") -public class RedisModule { +public class DocumentTask { @PostConstruct - public void init() { - Instant start = Instant.now(); - - initDocumentsID(); + public void run() { + template("初始化单据ID", 0); + } - Instant end = Instant.now(); - log.info("redis模块启动成功,耗时:{}毫秒", ChronoUnit.MILLIS.between(start, end)); + //每天零点重置单据ID的值 + @Async("scheduledExecutor") + @Scheduled(cron = "1 0 0 */1 * ?") + public void autoRefreshDocumentID() { + template("定时更新单据ID", 1); } - //初始化单据ID + //启动时初始化单据ID private void initDocumentsID() { String[] fields = new String[DocumentConstant.DOCUMENT_TYPE.length + 1]; fields[0] = "date"; System.arraycopy(DocumentConstant.DOCUMENT_TYPE, 0, fields, 1, fields.length - 1); + List result = RedisUtil.hmget(DocumentConstant.DOCUMENT_TYPE_REDIS_KEY, fields); long now = DateUtil.getTimestampNow(); - //日期不是今天时,更新全部,初始值为1 - if (null == result.get(0) || now != (long) result.get(0)) { + //日期不是今天时,更新全部 + Object firstItem = result.get(0); + if (null == firstItem || now != (long) firstItem) { updateAllDocument(now); log.info("更新【{}】种单据ID成功", DocumentConstant.DOCUMENT_TYPE.length); return; @@ -50,18 +54,21 @@ public class RedisModule { int updateNum = 0; Map update = new HashMap<>(); int resultSize = result.size(); + for (int i = 1; i < resultSize; i++) { if (result.get(i) == null) { updateNum++; update.put(DocumentConstant.DOCUMENT_TYPE[i - 1], 1); } } + if (updateNum > 0) { RedisUtil.hmset(DocumentConstant.DOCUMENT_TYPE_REDIS_KEY, update); log.info("更新增加的单据【{}】种", updateNum); } } + //每种单据的值置为1 private void updateAllDocument(long now) { Map map = new HashMap<>(); map.put("date", now); @@ -71,26 +78,29 @@ public class RedisModule { RedisUtil.hmset(DocumentConstant.DOCUMENT_TYPE_REDIS_KEY, map); } - //每天零点初始化单据ID - @Async("scheduledExecutor") - @Scheduled(cron = "1 0 0 */1 * ?") - public void autoRefreshDocumentID() { - log.info("开始定时更新单据ID......当前共有【{}】种待更新......", DocumentConstant.DOCUMENT_TYPE.length); + //模板 + private void template(String action, int type) { + Instant start = Instant.now(); String lockKey = DocumentConstant.UPDATE_DOCUMENTS_LOCK_KEY; try (RedisUtil.Locker locker = new RedisUtil.Locker(lockKey)) { - if (!locker.lock()) { - log.error("定时更新单据ID失败,获取锁【{}】失败", lockKey); + log.error("{}失败,获取锁【{}】失败", action, lockKey); return; } - updateAllDocument(DateUtil.getTimestampNow()); + if (type == 0) { + initDocumentsID(); + } + else { + updateAllDocument(DateUtil.getTimestampNow()); + } - log.info("定时更新单据ID结束,成功更新【{}】种", DocumentConstant.DOCUMENT_TYPE.length); - } catch (Exception e) { - log.error("定时更新单据ID失败", e); + log.info("{}成功,耗时:{}毫秒", action, ChronoUnit.MILLIS.between(start, Instant.now())); + } + catch (Exception e) { + log.error("{}失败", action, e); } } -} +} \ No newline at end of file diff --git a/java/src/main/java/com/toesbieya/my/schedule/SessionTask.java b/java/src/main/java/com/toesbieya/my/schedule/SessionTask.java new file mode 100644 index 0000000..ffbf43d --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/schedule/SessionTask.java @@ -0,0 +1,66 @@ +package com.toesbieya.my.schedule; + +import com.alibaba.fastjson.JSONObject; +import com.toesbieya.my.constant.SessionConstant; +import com.toesbieya.my.constant.SocketConstant; +import com.toesbieya.my.model.vo.SocketOfflineVo; +import com.toesbieya.my.utils.RedisUtil; +import com.toesbieya.my.utils.SessionUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.DependsOn; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.Set; + +@Component +@Slf4j +@DependsOn("redisUtil") +public class SessionTask { + @PostConstruct + public void run() { + cleanSession(); + } + + @Async("scheduledExecutor") + @Scheduled(cron = "0 */1 * * * ?") + public void autoCleanSession() { + cleanSession(); + } + + //清理session中未活动的用户 + private void cleanSession() { + try { + long now = System.currentTimeMillis(); + + //获取所有用户session + Set sessionKeys = RedisUtil.keys(SessionConstant.REDIS_NAMESPACE + "*"); + + //获取离线情况 (k:sessionKey,v:SocketOfflineVo) + Map offlineMap = RedisUtil.hgetAll(SocketConstant.REDIS_OFFLINE_USER); + + //移除无活动时间超出限定的用户 + sessionKeys.forEach(sessionKey -> { + Object obj = offlineMap.get(sessionKey); + if (obj != null) { + SocketOfflineVo offlineVo = ((JSONObject) obj).toJavaObject(SocketOfflineVo.class); + if (now > offlineVo.getTime() + SessionConstant.NO_ACTION_INTERVAL) { + //删除session + RedisUtil.del(sessionKey); + + //删除离线表信息 + String token = sessionKey.replace(SessionConstant.REDIS_NAMESPACE, ""); + Integer uid = SessionUtil.getUidFromToken(token); + RedisUtil.hdel(SocketConstant.REDIS_OFFLINE_USER, String.valueOf(uid)); + } + } + }); + } + catch (Exception e) { + log.error("清理session失败", e); + } + } +} diff --git a/java/src/main/java/com/toesbieya/my/schedule/StatisticTask.java b/java/src/main/java/com/toesbieya/my/schedule/StatisticTask.java new file mode 100644 index 0000000..7772dc6 --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/schedule/StatisticTask.java @@ -0,0 +1,116 @@ +package com.toesbieya.my.schedule; + +import com.toesbieya.my.mapper.StatisticMapper; +import com.toesbieya.my.model.entity.StatFinishOrder; +import com.toesbieya.my.model.entity.StatProfitGoods; +import com.toesbieya.my.model.entity.StatProfitTotal; +import com.toesbieya.my.utils.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class StatisticTask { + @Resource + private StatisticMapper statisticMapper; + + @PostConstruct + public void run() { + this.autoStat(); + } + + //每天零点统计信息 + @Async("scheduledExecutor") + @Scheduled(cron = "1 0 0 */1 * ?") + public void autoStat() { + log.info("开始统计信息..."); + + long lastDay = DateUtil.getTimestampBeforeNow(1); + long today = DateUtil.getTimestampNow(); + + //检查是否已统计过昨日已完成的订单数 + if (!statisticMapper.checkDailyFinishOrderExist(lastDay)) { + Integer lastDayPurchaseOrderFinish = statisticMapper.getPurchaseOrderLastDayFinishOrderNum(); + Integer lastDaySellOrderFinish = statisticMapper.getSellOrderLastDayFinishOrderNum(); + + StatFinishOrder param = new StatFinishOrder(); + param.setPurchase(lastDayPurchaseOrderFinish); + param.setSell(lastDaySellOrderFinish); + param.setTime(lastDay); + + statisticMapper.insertFinishOrder(param); + } + + //检查是否已统计过昨日的采购额、销售额、毛利 + if (!statisticMapper.checkDailyProfitExist(lastDay)) { + //昨日各个商品的采购额、销售额 + List purchaseProfitGoods = statisticMapper.getPurchaseOrderDailyProfitGoods(lastDay, today); + List sellProfitGoods = statisticMapper.getSellOrderDailyProfitGoods(lastDay, today); + + //昨日的采购总额、销售总额 + BigDecimal totalPurchase = new BigDecimal(0); + BigDecimal totalSell = new BigDecimal(0); + + //根据商品分类计算 + Map map = new HashMap<>(sellProfitGoods.size()); + + for (StatProfitGoods p : sellProfitGoods) { + map.put(p.getCid(), p); + } + + for (StatProfitGoods p : purchaseProfitGoods) { + p.setTime(lastDay); + Integer cid = p.getCid(); + BigDecimal purchase = p.getPurchase(); + totalPurchase = totalPurchase.add(purchase); + StatProfitGoods s = map.get(cid); + + if (s != null) { + BigDecimal sell = s.getSell(); + totalSell = totalSell.add(sell); + p.setSell(sell); + p.setProfit(sell.subtract(purchase)); + map.remove(cid); + } + else { + p.setSell(new BigDecimal(0)); + p.setProfit(p.getSell().subtract(purchase)); + } + } + + for (StatProfitGoods s : map.values()) { + s.setTime(lastDay); + s.setPurchase(new BigDecimal(0)); + BigDecimal sell = s.getSell(); + s.setProfit(sell); + totalSell = totalSell.add(sell); + purchaseProfitGoods.add(s); + } + + BigDecimal totalProfit = totalSell.subtract(totalPurchase); + + StatProfitTotal statProfitTotal = new StatProfitTotal(); + statProfitTotal.setPurchase(totalPurchase); + statProfitTotal.setSell(totalSell); + statProfitTotal.setProfit(totalProfit); + statProfitTotal.setTime(lastDay); + + statisticMapper.insertProfitTotal(statProfitTotal); + + if (purchaseProfitGoods.size() > 0) { + statisticMapper.insertProfitGoodsBatch(purchaseProfitGoods); + } + } + + log.info("结束统计信息..."); + } +} diff --git a/java/src/main/java/com/toesbieya/my/service/AccountService.java b/java/src/main/java/com/toesbieya/my/service/AccountService.java index fb7fa33..076520e 100644 --- a/java/src/main/java/com/toesbieya/my/service/AccountService.java +++ b/java/src/main/java/com/toesbieya/my/service/AccountService.java @@ -1,5 +1,6 @@ package com.toesbieya.my.service; +import com.toesbieya.my.annoation.TimeCost; import com.toesbieya.my.annoation.UserAction; import com.toesbieya.my.enumeration.GeneralStatusEnum; import com.toesbieya.my.enumeration.RecLoginHistoryEnum; @@ -10,7 +11,6 @@ import com.toesbieya.my.model.vo.*; import com.toesbieya.my.utils.QiniuUtil; import com.toesbieya.my.utils.Result; import com.toesbieya.my.utils.SessionUtil; -import com.toesbieya.my.utils.Util; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -26,6 +26,7 @@ public class AccountService { @Resource private RecService recService; + @TimeCost public Result login(LoginParam param, String ip) { SysUser user = userMapper.getByNameAndPwd(param.getUsername(), param.getPassword()); @@ -41,7 +42,7 @@ public class AccountService { } //设置token - String token = Util.UUID(); + String token = SessionUtil.generateToken(user); //存入redis的数据 UserVo userVo = new UserVo(user); diff --git a/java/src/main/java/com/toesbieya/my/service/BizDocumentHistoryService.java b/java/src/main/java/com/toesbieya/my/service/BizDocumentHistoryService.java index d5da226..35a4cb9 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizDocumentHistoryService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizDocumentHistoryService.java @@ -11,13 +11,13 @@ import java.util.List; @Service public class BizDocumentHistoryService { @Resource - private BizDocumentHistoryMapper documentHistoryMapper; + private BizDocumentHistoryMapper historyMapper; public List search(DocumentHistorySearch vo) { - return documentHistoryMapper.search(vo); + return historyMapper.search(vo); } public List getByPid(String pid) { - return documentHistoryMapper.getByPid(pid); + return historyMapper.getByPid(pid); } } diff --git a/java/src/main/java/com/toesbieya/my/service/BizPurchaseInboundService.java b/java/src/main/java/com/toesbieya/my/service/BizPurchaseInboundService.java index e77e433..679c3b0 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizPurchaseInboundService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizPurchaseInboundService.java @@ -2,11 +2,10 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; import com.toesbieya.my.annoation.Lock; -import com.toesbieya.my.annoation.Tx; import com.toesbieya.my.annoation.UserAction; -import com.toesbieya.my.enumeration.BizDocumentFinishEnum; -import com.toesbieya.my.enumeration.BizDocumentHistoryEnum; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocFinishEnum; +import com.toesbieya.my.enumeration.DocHistoryEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.exception.JsonResultException; import com.toesbieya.my.mapper.BizDocumentHistoryMapper; import com.toesbieya.my.mapper.BizPurchaseInboundMapper; @@ -18,13 +17,19 @@ import com.toesbieya.my.model.vo.export.PurchaseInboundExport; import com.toesbieya.my.model.vo.result.PageResult; import com.toesbieya.my.model.vo.search.PurchaseInboundSearch; import com.toesbieya.my.model.vo.update.DocumentStatusUpdate; -import com.toesbieya.my.utils.*; +import com.toesbieya.my.utils.DocumentUtil; +import com.toesbieya.my.utils.ExcelUtil; +import com.toesbieya.my.utils.Result; +import com.toesbieya.my.utils.Util; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -32,69 +37,69 @@ import java.util.List; @Slf4j public class BizPurchaseInboundService { @Resource - private BizPurchaseInboundMapper purchaseInboundMapper; + private BizPurchaseInboundMapper mainMapper; @Resource - private BizPurchaseOrderMapper purchaseOrderMapper; + private BizPurchaseOrderMapper orderMapper; @Resource - private BizDocumentHistoryMapper documentHistoryMapper; + private BizDocumentHistoryMapper historyMapper; @Resource private BizStockMapper stockMapper; @Resource private RecService recService; public BizPurchaseInbound getById(String id) { - BizPurchaseInbound inbound = purchaseInboundMapper.getById(id); - if (inbound == null) return null; - List list = purchaseInboundMapper.getSubById(id); - inbound.setData(list); - List imageList = recService.getAttachmentByPid(id); - inbound.setImageList(imageList); - return inbound; + BizPurchaseInbound main = mainMapper.getById(id); + + if (main == null) return null; + + main.setData(this.getSubById(id)); + main.setImageList(recService.getAttachmentByPid(id)); + + return main; } public List getSubById(String id) { - return purchaseInboundMapper.getSubById(id); + return mainMapper.getSubById(id); } public PageResult search(PurchaseInboundSearch vo) { PageHelper.startPage(vo.getPage(), vo.getPageSize()); - List list = purchaseInboundMapper.search(vo); - return new PageResult<>(list); + return new PageResult<>(mainMapper.search(vo)); } public void export(PurchaseInboundSearch vo, HttpServletResponse response) throws Exception { - List list = purchaseInboundMapper.export(vo); + List list = mainMapper.export(vo); ExcelUtil.exportSimply(list, response, "采购入库单导出"); } @UserAction("'添加采购入库单'") - @Tx + @Transactional(rollbackFor = Exception.class) public Result add(BizPurchaseInbound doc) { - return addInbound(doc); + return addMain(doc); } @UserAction("'修改采购入库单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result update(BizPurchaseInbound doc) { - return updateInbound(doc); + return updateMain(doc); } @UserAction("'提交采购入库单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result commit(BizPurchaseInbound doc) { boolean isFirstCreate = StringUtils.isEmpty(doc.getId()); - Result result = isFirstCreate ? addInbound(doc) : updateInbound(doc); + Result result = isFirstCreate ? addMain(doc) : updateMain(doc); - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(doc.getId()) - .type(BizDocumentHistoryEnum.COMMIT.getCode()) + .type(DocHistoryEnum.COMMIT.getCode()) .uid(doc.getCid()) .uname(doc.getCname()) - .status_before(BizDocumentStatusEnum.DRAFT.getCode()) - .status_after(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) + .status_before(DocStatusEnum.DRAFT.getCode()) + .status_after(DocStatusEnum.WAIT_VERIFY.getCode()) .time(System.currentTimeMillis()) .build() ); @@ -105,23 +110,23 @@ public class BizPurchaseInboundService { @UserAction("'撤回采购入库单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result withdraw(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (purchaseInboundMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("撤回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.WITHDRAW.getCode()) + .type(DocHistoryEnum.WITHDRAW.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -132,63 +137,74 @@ public class BizPurchaseInboundService { @UserAction("'通过采购入库单'+#vo.id") @Lock({"#vo.pid", "#vo.id"}) - @Tx + @Transactional(rollbackFor = Exception.class) public Result pass(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); String pid = vo.getPid(); long now = System.currentTimeMillis(); - /*检查采购订单状态、入库商品是否符合订单要求*/ - List inboundSubList = purchaseInboundMapper.getSubById(vo.getId()); + //检查采购订单状态、入库商品是否符合订单要求 + List inboundSubList = mainMapper.getSubById(vo.getId()); String err = checkOrder(vo.getPid(), inboundSubList); if (err != null) return Result.fail("通过失败," + err); - if (purchaseInboundMapper.pass(id, user.getId(), user.getName(), now) < 1) { + if (mainMapper.pass(id, user.getId(), user.getName(), now) < 1) { return Result.fail("通过失败,请刷新重试"); } - /*修改采购订单完成情况、子表的未入库数量*/ + //修改采购订单完成情况、子表的未入库数量 List stockList = new ArrayList<>(); - BizDocumentFinishEnum finish = BizDocumentFinishEnum.FINISHED; + DocFinishEnum finish = DocFinishEnum.FINISHED; + //使用一级缓存 - List orderSubList = purchaseOrderMapper.getSubById(pid); - //如果有任意一个采购商品的remain_num大于采购商品的num,则完成情况为进行中,否则为已完成 + List orderSubList = orderMapper.getSubById(pid); + + //生成需要入库的商品列表 for (BizPurchaseOrderSub orderSub : orderSubList) { - if (orderSub.getRemain_num().equals(0D)) continue; + if (orderSub.getRemain_num().equals(BigDecimal.ZERO)) { + continue; + } + BizPurchaseInboundSub inboundSub = Util.find(inboundSubList, i -> i.getCid().equals(orderSub.getCid())); + if (inboundSub == null) continue; + stockList.add( BizStock.builder() - .cid(inboundSub.getCid()) - .cname(inboundSub.getCname()) - .num(inboundSub.getNum()) - .price(orderSub.getPrice()) - .ctime(now) - .cgddid(pid) - .cgrkid(id) + .cid(inboundSub.getCid()).cname(inboundSub.getCname()).num(inboundSub.getNum()) + .price(orderSub.getPrice()).ctime(now).cgddid(pid).cgrkid(id) .build() ); - double gap = orderSub.getRemain_num() - inboundSub.getNum(); - if (gap > 0) finish = BizDocumentFinishEnum.UNDERWAY; - //更新采购订单子表 - purchaseOrderMapper.updateSubRemainNum(orderSub.getId(), gap); + + BigDecimal gap = orderSub.getRemain_num().subtract(inboundSub.getNum()); + + //如果有任意一个采购商品的remain_num大于采购商品的num,则完成情况为进行中,否则为已完成 + if (gap.compareTo(BigDecimal.ZERO) > 0) { + finish = DocFinishEnum.UNDERWAY; + } + + //更新采购订单子表的remain_num + orderMapper.updateSubRemainNum(orderSub.getId(), gap); } + //更新采购订单完成情况 - purchaseOrderMapper.updateFinish(pid, finish.getCode(), finish == BizDocumentFinishEnum.FINISHED ? now : null); + if (1 > orderMapper.updateFinish(pid, finish.getCode(), finish == DocFinishEnum.FINISHED ? now : null)) { + throw new JsonResultException("通过失败,采购订单状态有误,请刷新重试"); + } //插入库存 if (stockList.size() == 0) throw new JsonResultException("通过失败,入库异常"); stockMapper.batchInsert(stockList); - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.PASS.getCode()) + .type(DocHistoryEnum.PASS.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.VERIFIED.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.VERIFIED.getCode()) .time(now) .info(info) .build() @@ -199,23 +215,23 @@ public class BizPurchaseInboundService { @UserAction("'驳回采购入库单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result reject(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (purchaseInboundMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("驳回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.REJECT.getCode()) + .type(DocHistoryEnum.REJECT.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -226,29 +242,40 @@ public class BizPurchaseInboundService { @UserAction("'删除采购入库单'+#id") @Lock("#id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result del(String id) { - if (purchaseInboundMapper.del(id) < 1) return Result.fail("删除失败"); - purchaseInboundMapper.delSubByPid(id); + if (mainMapper.del(id) < 1) { + return Result.fail("删除失败"); + } + + //同时删除子表和附件 + mainMapper.delSubByPid(id); recService.delAttachmentByPid(id); + return Result.success("删除成功"); } - private Result addInbound(BizPurchaseInbound doc) { - String err = checkOrder(doc.getPid(), doc.getData()); + private Result addMain(BizPurchaseInbound doc) { + List subList = doc.getData(); + + String err = checkOrder(doc.getPid(), subList); if (err != null) return Result.fail(err); String id = DocumentUtil.getDocumentID("CGRK"); - if (StringUtils.isEmpty(id)) return Result.fail("获取单号失败"); - doc.setId(id); - for (BizPurchaseInboundSub sub : doc.getData()) { - sub.setPid(id); + if (StringUtils.isEmpty(id)) { + return Result.fail("获取单号失败"); } - purchaseInboundMapper.add(doc); - purchaseInboundMapper.addSub(doc.getData()); + doc.setId(id); + + //设置子表的pid + subList.forEach(sub -> sub.setPid(id)); + mainMapper.insert(doc); + mainMapper.addSub(subList); + + //插入附件 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { @@ -260,19 +287,27 @@ public class BizPurchaseInboundService { return Result.success("添加成功", id); } - private Result updateInbound(BizPurchaseInbound doc) { - String err = checkUpdateStatus(doc.getId()); + private Result updateMain(BizPurchaseInbound doc) { + String docId = doc.getId(); + + String err = checkUpdateStatus(docId); if (err == null) err = checkOrder(doc.getPid(), doc.getData()); if (err != null) return Result.fail(err); - purchaseInboundMapper.delSubByPid(doc.getId()); - purchaseInboundMapper.update(doc); - purchaseInboundMapper.addSub(doc.getData()); + //更新主表 + mainMapper.update(doc); + //删除旧的子表 + mainMapper.delSubByPid(docId); + + //插入新的子表 + mainMapper.addSub(doc.getData()); + + //附件增删 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { - attachment.setPid(doc.getId()); + attachment.setPid(docId); attachment.setTime(time); } recService.handleAttachment(uploadImageList, doc.getDeleteImageList()); @@ -282,29 +317,40 @@ public class BizPurchaseInboundService { //只有拟定状态的单据才能修改 private String checkUpdateStatus(String id) { - BizPurchaseInbound doc = purchaseInboundMapper.getById(id); - if (doc == null || !doc.getStatus().equals(0)) return "单据状态已更新,请刷新后重试"; + BizPurchaseInbound doc = mainMapper.getById(id); + if (doc == null || !doc.getStatus().equals(DocStatusEnum.DRAFT.getCode())) { + return "单据状态已更新,请刷新后重试"; + } return null; } //检查采购订单是否已审核、未完成、还有未入库的商品 private String checkOrder(String pid, List docSubList) { - BizPurchaseOrder order = purchaseOrderMapper.getById(pid); - if (order == null || order.getStatus() != 2 || order.getFinish() == 2) { + BizPurchaseOrder order = orderMapper.getById(pid); + + if (order == null + || !order.getStatus().equals(DocStatusEnum.VERIFIED.getCode()) + || order.getFinish().equals(DocFinishEnum.FINISHED.getCode()) + ) { return "采购订单状态异常"; } - List orderSubList = purchaseOrderMapper.getSubById(pid); - if (orderSubList.size() <= 0) return "没有找到采购订单的数据"; + + List orderSubList = orderMapper.getSubById(pid); + + if (CollectionUtils.isEmpty(orderSubList)) return "没有找到采购订单的数据"; + + //判断入库商品是否合法 for (BizPurchaseInboundSub inboundSub : docSubList) { BizPurchaseOrderSub orderSub = Util.find(orderSubList, t -> t.getCid().equals(inboundSub.getCid())); + if (orderSub == null) { - return "入库商品【" + inboundSub.getCname() + "】不在采购订单中"; + return String.format("入库商品【%s】不在采购订单中", inboundSub.getCname()); } - if (orderSub.getRemain_num().equals(0D)) { - return "入库商品【" + inboundSub.getCname() + "】已全部入库"; + if (orderSub.getRemain_num().compareTo(BigDecimal.ZERO) <= 0) { + return String.format("入库商品【%s】已全部入库", inboundSub.getCname()); } - if (orderSub.getRemain_num() < inboundSub.getNum()) { - return "入库商品【" + inboundSub.getCname() + "】的数量超出订单数量"; + if (orderSub.getRemain_num().compareTo(inboundSub.getNum()) < 0) { + return String.format("入库商品【%s】的数量超出订单数量", inboundSub.getCname()); } } return null; diff --git a/java/src/main/java/com/toesbieya/my/service/BizPurchaseOrderService.java b/java/src/main/java/com/toesbieya/my/service/BizPurchaseOrderService.java index 7edbeba..b2c03c2 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizPurchaseOrderService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizPurchaseOrderService.java @@ -2,13 +2,15 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; import com.toesbieya.my.annoation.Lock; -import com.toesbieya.my.annoation.Tx; import com.toesbieya.my.annoation.UserAction; -import com.toesbieya.my.enumeration.BizDocumentHistoryEnum; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocHistoryEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.mapper.BizDocumentHistoryMapper; import com.toesbieya.my.mapper.BizPurchaseOrderMapper; -import com.toesbieya.my.model.entity.*; +import com.toesbieya.my.model.entity.BizDocumentHistory; +import com.toesbieya.my.model.entity.BizPurchaseOrder; +import com.toesbieya.my.model.entity.BizPurchaseOrderSub; +import com.toesbieya.my.model.entity.RecAttachment; import com.toesbieya.my.model.vo.UserVo; import com.toesbieya.my.model.vo.export.PurchaseOrderExport; import com.toesbieya.my.model.vo.result.PageResult; @@ -19,6 +21,7 @@ import com.toesbieya.my.utils.ExcelUtil; import com.toesbieya.my.utils.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; @@ -29,66 +32,65 @@ import java.util.List; @Slf4j public class BizPurchaseOrderService { @Resource - private BizPurchaseOrderMapper purchaseOrderMapper; + private BizPurchaseOrderMapper mainMapper; @Resource - private BizDocumentHistoryMapper documentHistoryMapper; + private BizDocumentHistoryMapper historyMapper; @Resource private RecService recService; public BizPurchaseOrder getById(String id) { - BizPurchaseOrder order = purchaseOrderMapper.getById(id); - if (order == null) return null; + BizPurchaseOrder main = mainMapper.getById(id); - List list = purchaseOrderMapper.getSubById(id); - order.setData(list); - List imageList = recService.getAttachmentByPid(id); - order.setImageList(imageList); + if (main == null) return null; - return order; + main.setData(this.getSubById(id)); + main.setImageList(recService.getAttachmentByPid(id)); + + return main; } public List getSubById(String id) { - return purchaseOrderMapper.getSubById(id); + return mainMapper.getSubById(id); } public PageResult search(PurchaseOrderSearch vo) { PageHelper.startPage(vo.getPage(), vo.getPageSize()); - return new PageResult<>(purchaseOrderMapper.search(vo)); + return new PageResult<>(mainMapper.search(vo)); } public void export(PurchaseOrderSearch vo, HttpServletResponse response) throws Exception { - List list = purchaseOrderMapper.export(vo); + List list = mainMapper.export(vo); ExcelUtil.exportSimply(list, response, "采购订单导出"); } @UserAction("'添加采购订单'") - @Tx + @Transactional(rollbackFor = Exception.class) public Result add(BizPurchaseOrder doc) { - return addOrder(doc); + return addMain(doc); } @UserAction("'修改采购订单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result update(BizPurchaseOrder doc) { - return updateOrder(doc); + return updateMain(doc); } @UserAction("'提交采购订单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result commit(BizPurchaseOrder doc) { boolean isFirstCreate = StringUtils.isEmpty(doc.getId()); - Result result = isFirstCreate ? addOrder(doc) : updateOrder(doc); + Result result = isFirstCreate ? addMain(doc) : updateMain(doc); - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(doc.getId()) - .type(BizDocumentHistoryEnum.COMMIT.getCode()) + .type(DocHistoryEnum.COMMIT.getCode()) .uid(doc.getCid()) .uname(doc.getCname()) - .status_before(BizDocumentStatusEnum.DRAFT.getCode()) - .status_after(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) + .status_before(DocStatusEnum.DRAFT.getCode()) + .status_after(DocStatusEnum.WAIT_VERIFY.getCode()) .time(System.currentTimeMillis()) .build() ); @@ -99,23 +101,23 @@ public class BizPurchaseOrderService { @UserAction("'撤回采购订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result withdraw(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (purchaseOrderMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("撤回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.WITHDRAW.getCode()) + .type(DocHistoryEnum.WITHDRAW.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -126,24 +128,24 @@ public class BizPurchaseOrderService { @UserAction("'通过采购订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result pass(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); long now = System.currentTimeMillis(); - if (purchaseOrderMapper.pass(id, user.getId(), user.getName(), now) < 1) { + if (mainMapper.pass(id, user.getId(), user.getName(), now) < 1) { return Result.fail("通过失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.PASS.getCode()) + .type(DocHistoryEnum.PASS.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.VERIFIED.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.VERIFIED.getCode()) .time(now) .info(info) .build() @@ -154,23 +156,23 @@ public class BizPurchaseOrderService { @UserAction("'驳回采购订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result reject(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (purchaseOrderMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("驳回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.REJECT.getCode()) + .type(DocHistoryEnum.REJECT.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -181,27 +183,41 @@ public class BizPurchaseOrderService { @UserAction("'删除采购订单'+#id") @Lock("#id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result del(String id) { - if (purchaseOrderMapper.del(id) < 1) return Result.fail("删除失败"); - purchaseOrderMapper.delSubByPid(id); + if (mainMapper.del(id) < 1) { + return Result.fail("删除失败"); + } + + //同时删除子表和附件 + mainMapper.delSubByPid(id); recService.delAttachmentByPid(id); + return Result.success("删除成功"); } - private Result addOrder(BizPurchaseOrder doc) { + private Result addMain(BizPurchaseOrder doc) { String id = DocumentUtil.getDocumentID("CGDD"); - if (StringUtils.isEmpty(id)) return Result.fail("获取单号失败"); + + if (StringUtils.isEmpty(id)) { + return Result.fail("获取单号失败"); + } doc.setId(id); - for (BizPurchaseOrderSub sub : doc.getData()) { + + List subList = doc.getData(); + + //设置子表的pid、剩余未出库数量 + for (BizPurchaseOrderSub sub : subList) { sub.setPid(id); sub.setRemain_num(sub.getNum()); } - purchaseOrderMapper.add(doc); - purchaseOrderMapper.addSub(doc.getData()); + //插入主表和子表 + mainMapper.insert(doc); + mainMapper.addSub(subList); + //插入附件 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { @@ -213,23 +229,28 @@ public class BizPurchaseOrderService { return Result.success("添加成功", id); } - private Result updateOrder(BizPurchaseOrder doc) { - String err = checkUpdateStatus(doc.getId()); + private Result updateMain(BizPurchaseOrder doc) { + String docId = doc.getId(); + + String err = checkUpdateStatus(docId); if (err != null) return Result.fail(err); - purchaseOrderMapper.delSubByPid(doc.getId()); - purchaseOrderMapper.update(doc); + //更新主表 + mainMapper.update(doc); + + //删除旧的子表 + mainMapper.delSubByPid(docId); + //插入新的子表 List subList = doc.getData(); - for (BizPurchaseOrderSub sub : subList) { - sub.setRemain_num(sub.getNum()); - } - purchaseOrderMapper.addSub(subList); + subList.forEach(sub -> sub.setRemain_num(sub.getNum())); + mainMapper.addSub(subList); + //附件增删 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { - attachment.setPid(doc.getId()); + attachment.setPid(docId); attachment.setTime(time); } recService.handleAttachment(uploadImageList, doc.getDeleteImageList()); @@ -239,8 +260,10 @@ public class BizPurchaseOrderService { //只有拟定状态的单据才能修改 private String checkUpdateStatus(String id) { - BizPurchaseOrder doc = purchaseOrderMapper.getById(id); - if (doc == null || !doc.getStatus().equals(0)) return "单据状态已更新,请刷新后重试"; + BizPurchaseOrder doc = mainMapper.getById(id); + if (doc == null || !doc.getStatus().equals(DocStatusEnum.DRAFT.getCode())) { + return "单据状态已更新,请刷新后重试"; + } return null; } } diff --git a/java/src/main/java/com/toesbieya/my/service/BizSellOrderService.java b/java/src/main/java/com/toesbieya/my/service/BizSellOrderService.java index 61c68de..3f7f8d8 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizSellOrderService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizSellOrderService.java @@ -2,10 +2,9 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; import com.toesbieya.my.annoation.Lock; -import com.toesbieya.my.annoation.Tx; import com.toesbieya.my.annoation.UserAction; -import com.toesbieya.my.enumeration.BizDocumentHistoryEnum; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocHistoryEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.mapper.BizDocumentHistoryMapper; import com.toesbieya.my.mapper.BizSellOrderMapper; import com.toesbieya.my.mapper.BizStockMapper; @@ -22,6 +21,7 @@ import com.toesbieya.my.utils.ExcelUtil; import com.toesbieya.my.utils.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; @@ -34,69 +34,66 @@ import java.util.stream.Collectors; @Slf4j public class BizSellOrderService { @Resource - private BizSellOrderMapper sellOrderMapper; + private BizSellOrderMapper mainMapper; @Resource private BizStockMapper stockMapper; @Resource - private BizDocumentHistoryMapper documentHistoryMapper; + private BizDocumentHistoryMapper historyMapper; @Resource private RecService recService; public BizSellOrder getById(String id) { - BizSellOrder order = sellOrderMapper.getById(id); - if (order == null) return null; + BizSellOrder main = mainMapper.getById(id); + if (main == null) return null; - List list = sellOrderMapper.getSubById(id); - order.setData(list); - List imageList = recService.getAttachmentByPid(id); - order.setImageList(imageList); + main.setData(this.getSubById(id)); + main.setImageList(recService.getAttachmentByPid(id)); - return order; + return main; } public List getSubById(String id) { - return sellOrderMapper.getSubById(id); + return mainMapper.getSubById(id); } public PageResult search(SellOrderSearch vo) { PageHelper.startPage(vo.getPage(), vo.getPageSize()); - return new PageResult<>(sellOrderMapper.search(vo)); + return new PageResult<>(mainMapper.search(vo)); } public void export(SellOrderSearch vo, HttpServletResponse response) throws Exception { - List list = sellOrderMapper.export(vo); - + List list = mainMapper.export(vo); ExcelUtil.exportSimply(list, response, "销售订单导出"); } @UserAction("'添加销售订单'") - @Tx + @Transactional(rollbackFor = Exception.class) public Result add(BizSellOrder doc) { - return addOrder(doc); + return addMain(doc); } @UserAction("'修改销售订单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result update(BizSellOrder doc) { - return updateOrder(doc); + return updateMain(doc); } @UserAction("'提交销售订单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result commit(BizSellOrder doc) { boolean isFirstCreate = StringUtils.isEmpty(doc.getId()); - Result result = isFirstCreate ? addOrder(doc) : updateOrder(doc); + Result result = isFirstCreate ? addMain(doc) : updateMain(doc); - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(doc.getId()) - .type(BizDocumentHistoryEnum.COMMIT.getCode()) + .type(DocHistoryEnum.COMMIT.getCode()) .uid(doc.getCid()) .uname(doc.getCname()) - .status_before(BizDocumentStatusEnum.DRAFT.getCode()) - .status_after(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) + .status_before(DocStatusEnum.DRAFT.getCode()) + .status_after(DocStatusEnum.WAIT_VERIFY.getCode()) .time(System.currentTimeMillis()) .build() ); @@ -107,23 +104,23 @@ public class BizSellOrderService { @UserAction("'撤回销售订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result withdraw(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (sellOrderMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("撤回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.WITHDRAW.getCode()) + .type(DocHistoryEnum.WITHDRAW.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -134,24 +131,24 @@ public class BizSellOrderService { @UserAction("'通过销售订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result pass(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); long now = System.currentTimeMillis(); - if (sellOrderMapper.pass(id, user.getId(), user.getName(), now) < 1) { + if (mainMapper.pass(id, user.getId(), user.getName(), now) < 1) { return Result.fail("通过失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.PASS.getCode()) + .type(DocHistoryEnum.PASS.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.VERIFIED.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.VERIFIED.getCode()) .time(now) .info(info) .build() @@ -162,23 +159,23 @@ public class BizSellOrderService { @UserAction("'驳回销售订单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result reject(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (sellOrderMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("驳回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.REJECT.getCode()) + .type(DocHistoryEnum.REJECT.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -189,30 +186,43 @@ public class BizSellOrderService { @UserAction("'删除销售订单'+#id") @Lock("#id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result del(String id) { - if (sellOrderMapper.del(id) < 1) return Result.fail("删除失败"); - sellOrderMapper.delSubByPid(id); + if (mainMapper.del(id) < 1) { + return Result.fail("删除失败"); + } + + //同时删除子表和附件 + mainMapper.delSubByPid(id); recService.delAttachmentByPid(id); + return Result.success("删除成功"); } - private Result addOrder(BizSellOrder doc) { + private Result addMain(BizSellOrder doc) { String err = checkStock(doc.getData()); if (err != null) return Result.fail(err); String id = DocumentUtil.getDocumentID("XSDD"); - if (StringUtils.isEmpty(id)) return Result.fail("获取单号失败"); + + if (StringUtils.isEmpty(id)) { + return Result.fail("获取单号失败"); + } doc.setId(id); - for (BizSellOrderSub sub : doc.getData()) { + + List subList = doc.getData(); + + for (BizSellOrderSub sub : subList) { sub.setPid(id); sub.setRemain_num(sub.getNum()); } - sellOrderMapper.add(doc); - sellOrderMapper.addSub(doc.getData()); + //插入主表和子表 + mainMapper.insert(doc); + mainMapper.addSub(subList); + //插入附件 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { @@ -224,24 +234,29 @@ public class BizSellOrderService { return Result.success("添加成功", id); } - private Result updateOrder(BizSellOrder doc) { - String err = checkUpdateStatus(doc.getId()); + private Result updateMain(BizSellOrder doc) { + String docId = doc.getId(); + + String err = checkUpdateStatus(docId); if (err == null) err = checkStock(doc.getData()); if (err != null) return Result.fail(err); - sellOrderMapper.delSubByPid(doc.getId()); - sellOrderMapper.update(doc); + //更新主表 + mainMapper.update(doc); + + //删除旧的子表 + mainMapper.delSubByPid(docId); + //插入新的子表 List subList = doc.getData(); - for (BizSellOrderSub sub : subList) { - sub.setRemain_num(sub.getNum()); - } - sellOrderMapper.addSub(subList); + subList.forEach(sub->sub.setRemain_num(sub.getNum())); + mainMapper.addSub(subList); + //附件增删 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { - attachment.setPid(doc.getId()); + attachment.setPid(docId); attachment.setTime(time); } recService.handleAttachment(uploadImageList, doc.getDeleteImageList()); @@ -251,8 +266,10 @@ public class BizSellOrderService { //只有拟定状态的单据才能修改 private String checkUpdateStatus(String id) { - BizSellOrder doc = sellOrderMapper.getById(id); - if (doc == null || !doc.getStatus().equals(0)) return "单据状态已更新,请刷新后重试"; + BizSellOrder doc = mainMapper.getById(id); + if (doc == null || !doc.getStatus().equals(DocStatusEnum.DRAFT.getCode())) { + return "单据状态已更新,请刷新后重试"; + } return null; } @@ -268,7 +285,7 @@ public class BizSellOrderService { int stockListLength = stockList.size(); if (subListLength != stockListLength) { BizSellOrderSub sub = list.get(stockListLength); - return "商品【" + sub.getCname() + "】库存不足"; + return String.format("商品【%s】库存不足", sub.getCname()); } list.sort(Comparator.comparing(BizDocumentSub::getCid)); @@ -276,8 +293,8 @@ public class BizSellOrderService { for (int i = 0; i < subListLength; i++) { BizSellOrderSub sub = list.get(i); StockSearchResult stock = stockList.get(i); - if (sub.getNum() > stock.getTotal_num()) { - return "商品【" + sub.getCname() + "】库存不足"; + if (sub.getNum().compareTo(stock.getTotal_num()) > 0) { + return String.format("商品【%s】库存不足", sub.getCname()); } } diff --git a/java/src/main/java/com/toesbieya/my/service/BizSellOutboundService.java b/java/src/main/java/com/toesbieya/my/service/BizSellOutboundService.java index cd97013..4b267a7 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizSellOutboundService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizSellOutboundService.java @@ -2,11 +2,10 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; import com.toesbieya.my.annoation.Lock; -import com.toesbieya.my.annoation.Tx; import com.toesbieya.my.annoation.UserAction; -import com.toesbieya.my.enumeration.BizDocumentFinishEnum; -import com.toesbieya.my.enumeration.BizDocumentHistoryEnum; -import com.toesbieya.my.enumeration.BizDocumentStatusEnum; +import com.toesbieya.my.enumeration.DocFinishEnum; +import com.toesbieya.my.enumeration.DocHistoryEnum; +import com.toesbieya.my.enumeration.DocStatusEnum; import com.toesbieya.my.exception.JsonResultException; import com.toesbieya.my.mapper.BizDocumentHistoryMapper; import com.toesbieya.my.mapper.BizSellOrderMapper; @@ -18,13 +17,19 @@ import com.toesbieya.my.model.vo.export.SellOutboundExport; import com.toesbieya.my.model.vo.result.PageResult; import com.toesbieya.my.model.vo.search.SellOutboundSearch; import com.toesbieya.my.model.vo.update.DocumentStatusUpdate; -import com.toesbieya.my.utils.*; +import com.toesbieya.my.utils.DocumentUtil; +import com.toesbieya.my.utils.ExcelUtil; +import com.toesbieya.my.utils.Result; +import com.toesbieya.my.utils.Util; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,11 +39,11 @@ import java.util.stream.Collectors; @Slf4j public class BizSellOutboundService { @Resource - private BizSellOutboundMapper sellOutboundMapper; + private BizSellOutboundMapper mainMapper; @Resource - private BizSellOrderMapper sellOrderMapper; + private BizSellOrderMapper orderMapper; @Resource - private BizDocumentHistoryMapper documentHistoryMapper; + private BizDocumentHistoryMapper historyMapper; @Resource private BizStockMapper stockMapper; @Resource @@ -47,58 +52,58 @@ public class BizSellOutboundService { private BizStockService stockService; public BizSellOutbound getById(String id) { - BizSellOutbound outbound = sellOutboundMapper.getById(id); - if (outbound == null) return null; - List list = sellOutboundMapper.getSubById(id); - outbound.setData(list); - List imageList = recService.getAttachmentByPid(id); - outbound.setImageList(imageList); - return outbound; + BizSellOutbound main = mainMapper.getById(id); + + if (main == null) return null; + + main.setData(this.getSubById(id)); + main.setImageList(recService.getAttachmentByPid(id)); + + return main; } public List getSubById(String pid) { - return sellOutboundMapper.getSubById(pid); + return mainMapper.getSubById(pid); } public PageResult search(SellOutboundSearch vo) { PageHelper.startPage(vo.getPage(), vo.getPageSize()); - List list = sellOutboundMapper.search(vo); - return new PageResult<>(list); + return new PageResult<>(mainMapper.search(vo)); } public void export(SellOutboundSearch vo, HttpServletResponse response) throws Exception { - List list = sellOutboundMapper.export(vo); + List list = mainMapper.export(vo); ExcelUtil.exportSimply(list, response, "销售出库单导出"); } @UserAction("'添加销售出库单'") - @Tx + @Transactional(rollbackFor = Exception.class) public Result add(BizSellOutbound doc) { - return addOutbound(doc); + return addMain(doc); } @UserAction("'修改销售出库单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result update(BizSellOutbound doc) { - return updateOutbound(doc); + return updateMain(doc); } @UserAction("'提交销售出库单'+#doc.id") @Lock("#doc.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result commit(BizSellOutbound doc) { boolean isFirstCreate = StringUtils.isEmpty(doc.getId()); - Result result = isFirstCreate ? addOutbound(doc) : updateOutbound(doc); + Result result = isFirstCreate ? addMain(doc) : updateMain(doc); - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(doc.getId()) - .type(BizDocumentHistoryEnum.COMMIT.getCode()) + .type(DocHistoryEnum.COMMIT.getCode()) .uid(doc.getCid()) .uname(doc.getCname()) - .status_before(BizDocumentStatusEnum.DRAFT.getCode()) - .status_after(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) + .status_before(DocStatusEnum.DRAFT.getCode()) + .status_after(DocStatusEnum.WAIT_VERIFY.getCode()) .time(System.currentTimeMillis()) .build() ); @@ -109,23 +114,23 @@ public class BizSellOutboundService { @UserAction("'撤回销售出库单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result withdraw(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (sellOutboundMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("撤回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.WITHDRAW.getCode()) + .type(DocHistoryEnum.WITHDRAW.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -136,59 +141,70 @@ public class BizSellOutboundService { @UserAction("'通过销售出库单'+#vo.id") @Lock({"#vo.pid", "#vo.id"}) - @Tx + @Transactional(rollbackFor = Exception.class) public Result pass(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); String pid = vo.getPid(); long now = System.currentTimeMillis(); - List outboundSubList = sellOutboundMapper.getSubById(vo.getId()); - String err = check(vo.getPid(), outboundSubList); + List subList = this.getSubById(vo.getId()); + String err = check(vo.getPid(), subList); if (err != null) return Result.fail("通过失败," + err); - if (sellOutboundMapper.pass(id, user.getId(), user.getName(), now) < 1) { + if (mainMapper.pass(id, user.getId(), user.getName(), now) < 1) { return Result.fail("通过失败,请刷新重试"); } - //获取销售订单子表 - List orderSubList = sellOrderMapper.getSubById(pid); - //按分类分组统计出库数量,并出库 - Map outboundCount = new HashMap<>(); - for (BizSellOutboundSub outboundSub : outboundSubList) { + Map outboundCount = new HashMap<>(); + for (BizSellOutboundSub outboundSub : subList) { int rows = stockMapper.outbound(outboundSub.getSid(), outboundSub.getNum()); - if (rows == 0) throw new JsonResultException("通过失败,商品" + outboundSub.getCname() + "库存不足"); + if (rows == 0) { + throw new JsonResultException(String.format("通过失败,商品%s库存不足", outboundSub.getCname())); + } Integer cid = outboundSub.getCid(); - Double num = outboundCount.getOrDefault(cid, 0D); - outboundCount.put(cid, num + outboundSub.getNum()); + BigDecimal num = outboundCount.getOrDefault(cid, BigDecimal.ZERO); + outboundCount.put(cid, num.add(outboundSub.getNum())); } //更新销售订单子表的剩余未出库数量,记录销售订单的完成情况 - BizDocumentFinishEnum finish = BizDocumentFinishEnum.FINISHED; + DocFinishEnum finish = DocFinishEnum.FINISHED; + List orderSubList = orderMapper.getSubById(pid); + for (BizSellOrderSub orderSub : orderSubList) { - if (orderSub.getRemain_num().equals(0D)) continue; - Double outboundNum = outboundCount.get(orderSub.getCid()); + if (orderSub.getRemain_num().equals(BigDecimal.ZERO)) { + continue; + } + + BigDecimal outboundNum = outboundCount.get(orderSub.getCid()); + if (outboundNum == null) continue; - double gap = orderSub.getRemain_num() - outboundNum; - if (gap > 0) finish = BizDocumentFinishEnum.UNDERWAY; + BigDecimal gap = orderSub.getRemain_num().subtract(outboundNum); + + //如果有任意一个采购商品的remain_num大于采购商品的num,则完成情况为进行中,否则为已完成 + if (gap.compareTo(BigDecimal.ZERO) > 0) { + finish = DocFinishEnum.UNDERWAY; + } - sellOrderMapper.updateSubRemainNum(orderSub.getId(), gap); + orderMapper.updateSubRemainNum(orderSub.getId(), gap); } //更新销售订单完成情况 - sellOrderMapper.updateFinish(pid, finish.getCode(), finish == BizDocumentFinishEnum.FINISHED ? now : null); + if (1 > orderMapper.updateFinish(pid, finish.getCode(), finish == DocFinishEnum.FINISHED ? now : null)) { + throw new JsonResultException("通过失败,销售订单状态有误,请刷新重试"); + } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.PASS.getCode()) + .type(DocHistoryEnum.PASS.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.VERIFIED.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.VERIFIED.getCode()) .time(now) .info(info) .build() @@ -199,23 +215,23 @@ public class BizSellOutboundService { @UserAction("'驳回销售出库单'+#vo.id") @Lock("#vo.id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result reject(DocumentStatusUpdate vo, UserVo user) { String id = vo.getId(); String info = vo.getInfo(); - if (sellOutboundMapper.reject(id) < 1) { + if (mainMapper.reject(id) < 1) { return Result.fail("驳回失败,请刷新重试"); } - documentHistoryMapper.add( + historyMapper.insert( BizDocumentHistory.builder() .pid(id) - .type(BizDocumentHistoryEnum.REJECT.getCode()) + .type(DocHistoryEnum.REJECT.getCode()) .uid(user.getId()) .uname(user.getName()) - .status_before(BizDocumentStatusEnum.WAIT_VERIFY.getCode()) - .status_after(BizDocumentStatusEnum.DRAFT.getCode()) + .status_before(DocStatusEnum.WAIT_VERIFY.getCode()) + .status_after(DocStatusEnum.DRAFT.getCode()) .time(System.currentTimeMillis()) .info(info) .build() @@ -226,29 +242,39 @@ public class BizSellOutboundService { @UserAction("'删除销售出库单'+#id") @Lock("#id") - @Tx + @Transactional(rollbackFor = Exception.class) public Result del(String id) { - if (sellOutboundMapper.del(id) < 1) return Result.fail("删除失败"); - sellOutboundMapper.delSubByPid(id); + if (mainMapper.del(id) < 1) { + return Result.fail("删除失败"); + } + + //同时删除子表和附件 + mainMapper.delSubByPid(id); recService.delAttachmentByPid(id); + return Result.success("删除成功"); } - private Result addOutbound(BizSellOutbound doc) { - String err = check(doc.getPid(), doc.getData()); + private Result addMain(BizSellOutbound doc) { + List subList = doc.getData(); + + String err = check(doc.getPid(), subList); if (err != null) return Result.fail(err); String id = DocumentUtil.getDocumentID("XSCK"); - if (StringUtils.isEmpty(id)) return Result.fail("获取单号失败"); - doc.setId(id); - for (BizSellOutboundSub sub : doc.getData()) { - sub.setPid(id); + if (StringUtils.isEmpty(id)) { + return Result.fail("获取单号失败"); } - sellOutboundMapper.add(doc); - sellOutboundMapper.addSub(doc.getData()); + doc.setId(id); + + subList.forEach(sub -> sub.setPid(id)); + mainMapper.insert(doc); + mainMapper.addSub(subList); + + //插入附件 List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { @@ -260,19 +286,21 @@ public class BizSellOutboundService { return Result.success("添加成功", id); } - private Result updateOutbound(BizSellOutbound doc) { - String err = checkUpdateStatus(doc.getId()); + private Result updateMain(BizSellOutbound doc) { + String docId = doc.getId(); + + String err = checkUpdateStatus(docId); if (err == null) err = check(doc.getPid(), doc.getData()); if (err != null) return Result.fail(err); - sellOutboundMapper.delSubByPid(doc.getId()); - sellOutboundMapper.update(doc); - sellOutboundMapper.addSub(doc.getData()); + mainMapper.update(doc); + mainMapper.delSubByPid(docId); + mainMapper.addSub(doc.getData()); List uploadImageList = doc.getUploadImageList(); Long time = System.currentTimeMillis(); for (RecAttachment attachment : uploadImageList) { - attachment.setPid(doc.getId()); + attachment.setPid(docId); attachment.setTime(time); } recService.handleAttachment(uploadImageList, doc.getDeleteImageList()); @@ -282,33 +310,33 @@ public class BizSellOutboundService { //只有拟定状态的单据才能修改 private String checkUpdateStatus(String id) { - BizSellOutbound doc = sellOutboundMapper.getById(id); - if (doc == null || !doc.getStatus().equals(0)) return "单据状态已更新,请刷新后重试"; + BizSellOutbound doc = mainMapper.getById(id); + if (doc == null || !doc.getStatus().equals(DocStatusEnum.DRAFT.getCode())) { + return "单据状态已更新,请刷新后重试"; + } return null; } //添加、修改、通过前都需要检查 private String check(String pid, List docSubList) { - BizSellOrder order = sellOrderMapper.getById(pid); + BizSellOrder order = orderMapper.getById(pid); //检查销售订单是否已审核、未完成 - if (order == null || order.getStatus() != 2 || order.getFinish() == 2) { + if (order == null + || !order.getStatus().equals(DocStatusEnum.VERIFIED.getCode()) + || order.getFinish().equals(DocFinishEnum.FINISHED.getCode()) + ) { return "销售订单状态异常"; } - List orderSubList = sellOrderMapper.getSubById(pid); - if (orderSubList.size() <= 0) return "没有找到销售订单的数据"; + List orderSubList = orderMapper.getSubById(pid); + + if (CollectionUtils.isEmpty(orderSubList)) { + return "没有找到销售订单的数据"; + } //按分类统计商品的出库数量 - Map outboundCount = - docSubList - .stream() - .collect( - Collectors.groupingBy( - BizSellOutboundSub::getCid, - Collectors.summingDouble(BizSellOutboundSub::getNum) - ) - ); + Map outboundCount = this.getOutboundCount(docSubList); String[] cids = new String[outboundCount.size()]; @@ -320,11 +348,11 @@ public class BizSellOutboundService { if (orderSub == null) { return "未在销售订单中找到对应的出库商品"; } - if (orderSub.getRemain_num().equals(0D)) { - return "出库商品【" + orderSub.getCname() + "】已全部出库"; + if (orderSub.getRemain_num().equals(BigDecimal.ZERO)) { + return String.format("出库商品【%s】已全部出库", orderSub.getCname()); } - if (orderSub.getRemain_num() < outboundCount.get(cid)) { - return "出库商品【" + orderSub.getCname() + "】的数量超出订单数量"; + if (orderSub.getRemain_num().compareTo(outboundCount.get(cid)) < 0) { + return String.format("出库商品【%s】的数量超出订单数量", orderSub.getCname()); } cids[index] = String.valueOf(cid); index++; @@ -334,11 +362,29 @@ public class BizSellOutboundService { List stockList = stockService.getDetail(String.join(",", cids)); for (BizSellOutboundSub sub : docSubList) { BizStock stock = Util.find(stockList, i -> i.getId().equals(sub.getSid())); - if (stock == null || stock.getNum() < sub.getNum()) { - return "出库商品【" + sub.getCname() + "】(采购入库单:" + sub.getPid() + ")库存不足"; + if (stock == null || stock.getNum().compareTo(sub.getNum()) < 0) { + return String.format("出库商品【%s】(采购入库单:%s)库存不足", sub.getCname(), sub.getPid()); } } return null; } + + private Map getOutboundCount(List list) { + if (CollectionUtils.isEmpty(list)) { + return new HashMap<>(); + } + return list + .stream() + .collect( + Collectors.groupingBy( + BizSellOutboundSub::getCid, + Collectors.reducing( + BigDecimal.ZERO, + BizSellOutboundSub::getNum, + BigDecimal::add + ) + ) + ); + } } diff --git a/java/src/main/java/com/toesbieya/my/service/BizStockService.java b/java/src/main/java/com/toesbieya/my/service/BizStockService.java index 464751c..99a3d1f 100644 --- a/java/src/main/java/com/toesbieya/my/service/BizStockService.java +++ b/java/src/main/java/com/toesbieya/my/service/BizStockService.java @@ -30,8 +30,8 @@ public class BizStockService { return new PageResult<>(stockMapper.search(vo)); } - public List getDetail(String cid) { - return stockMapper.getDetail(cid); + public List getDetail(String cids) { + return stockMapper.getDetail(cids); } public List getDetailById(String ids) { diff --git a/java/src/main/java/com/toesbieya/my/service/MsgService.java b/java/src/main/java/com/toesbieya/my/service/MsgService.java index 121d3ce..b2e84b7 100644 --- a/java/src/main/java/com/toesbieya/my/service/MsgService.java +++ b/java/src/main/java/com/toesbieya/my/service/MsgService.java @@ -1,23 +1,27 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; +import com.toesbieya.my.annoation.UserAction; import com.toesbieya.my.constant.MsgConstant; import com.toesbieya.my.constant.SocketConstant; import com.toesbieya.my.mapper.MsgMapper; import com.toesbieya.my.model.entity.Msg; import com.toesbieya.my.model.entity.MsgState; +import com.toesbieya.my.model.vo.SocketEventVo; import com.toesbieya.my.model.vo.UserVo; import com.toesbieya.my.model.vo.result.PageResult; import com.toesbieya.my.model.vo.search.MsgPersonalSearch; import com.toesbieya.my.model.vo.search.MsgSearch; -import com.toesbieya.my.module.SocketModule; import com.toesbieya.my.utils.Result; +import com.toesbieya.my.utils.WebSocketUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; @Service @Slf4j @@ -31,35 +35,50 @@ public class MsgService { return new PageResult<>(list); } + @UserAction("'添加消息:'+#msg.title") public Result add(Msg msg) { msg.setId(msgMapper.insert(msg)); return Result.success("添加成功", msg); } + @UserAction("'修改消息:'+#msg.title") public Result update(Msg msg) { int rows = msgMapper.update(msg); return rows > 0 ? Result.success("修改成功") : Result.fail("修改失败,请刷新重试"); } + @UserAction("'发布消息:'+#msg.title") public Result publish(Msg msg) { boolean isFirstCreate = msg.getId() == null; Result result = isFirstCreate ? add(msg) : update(msg); + if (result.isSuccess()) { result.setMsg("提交成功"); result.setData(msg); + + SocketEventVo eventVo = new SocketEventVo(); + eventVo.setEvent(SocketConstant.EVENT_NEW_MESSAGE); + if (msg.getBroadcast().equals(MsgConstant.TO_ALL)) { - SocketModule.broadcast(SocketConstant.EVENT_NEW_MESSAGE); + eventVo.setType(SocketConstant.REDIS_EVENT_BROADCAST); + WebSocketUtil.sendEvent(eventVo); } else { String recipient = msg.getRecipient(); + if (!StringUtils.isEmpty(recipient)) { - for (String id : recipient.split(",")) { - SocketModule.sendEvent(SocketConstant.EVENT_NEW_MESSAGE, Integer.valueOf(id)); - } + String[] ids = recipient.split(","); + List to = Arrays.stream(ids).map(Integer::valueOf).collect(Collectors.toList()); + + eventVo.setType(SocketConstant.REDIS_EVENT_SPECIFIC); + eventVo.setTo(to); + + WebSocketUtil.sendEvent(eventVo); } } } else result.setMsg("发布失败," + result.getMsg()); + return result; } diff --git a/java/src/main/java/com/toesbieya/my/service/StatisticService.java b/java/src/main/java/com/toesbieya/my/service/StatisticService.java index dd214ff..3083a60 100644 --- a/java/src/main/java/com/toesbieya/my/service/StatisticService.java +++ b/java/src/main/java/com/toesbieya/my/service/StatisticService.java @@ -1,21 +1,17 @@ package com.toesbieya.my.service; -import com.toesbieya.my.mapper.BizPurchaseOrderMapper; -import com.toesbieya.my.mapper.BizSellOrderMapper; import com.toesbieya.my.mapper.StatisticMapper; import com.toesbieya.my.model.entity.StatFinishOrder; import com.toesbieya.my.model.entity.StatProfitGoods; import com.toesbieya.my.model.entity.StatProfitTotal; import com.toesbieya.my.model.vo.statictis.FourBlockStat; -import com.toesbieya.my.module.SocketModule; import com.toesbieya.my.utils.DateUtil; +import com.toesbieya.my.utils.WebSocketUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -24,24 +20,25 @@ import java.util.Map; @Service @Slf4j public class StatisticService { - @Resource - private BizPurchaseOrderMapper purchaseOrderMapper; - @Resource - private BizSellOrderMapper sellOrderMapper; @Resource private StatisticMapper statisticMapper; //获取首页四个色块的数据,在线用户、今日采购额、今日销售额、今日毛利润 public FourBlockStat getFourBlock() { long now = DateUtil.getTimestampNow(); + FourBlockStat stat = new FourBlockStat(); - double purchase = purchaseOrderMapper.getDailyTotalPurchasePrice(now, null); - double sell = sellOrderMapper.getDailyTotalPurchasePrice(now, null); - int onlineNum = SocketModule.getOnlineNum(); - stat.setOnline(onlineNum == 0 ? 1 : onlineNum);//进行此请求时在线用户必然大于0 + + BigDecimal purchase = statisticMapper.getPurchaseOrderDailyTotalPurchasePrice(now, null); + BigDecimal sell = statisticMapper.getSellOrderDailyTotalPurchasePrice(now, null); + + long onlineNum = WebSocketUtil.getOnlineUserNum(); + + stat.setOnline(onlineNum == 0L ? 1L : onlineNum);//进行此请求时在线用户必然大于0 stat.setPurchase(purchase); stat.setSell(sell); - stat.setProfit(sell - purchase); + stat.setProfit(sell.subtract(purchase)); + return stat; } @@ -65,109 +62,37 @@ public class StatisticService { //获取今日的信息 long today = DateUtil.getTimestampNow(); long nextDay = DateUtil.getTimestampBeforeNow(-1); - history.addAll(purchaseOrderMapper.getDailyProfitGoods(today, nextDay)); - history.addAll(sellOrderMapper.getDailyProfitGoods(today, nextDay)); + history.addAll(statisticMapper.getPurchaseOrderDailyProfitGoods(today, nextDay)); + history.addAll(statisticMapper.getSellOrderDailyProfitGoods(today, nextDay)); Map map = new HashMap<>(history.size()); + //根据商品分类计算 for (StatProfitGoods p : history) { Integer cid = p.getCid(); - if (p.getPurchase() == null) p.setPurchase(0D); - if (p.getSell() == null) p.setSell(0D); - if (p.getProfit() == null) p.setProfit(p.getSell() - p.getPurchase()); - StatProfitGoods already = map.get(cid); - if (already == null) map.put(cid, p); - else { - Double pT = already.getPurchase() + p.getPurchase(); - Double sT = already.getSell() + p.getSell(); - already.setPurchase(pT); - already.setSell(sT); - already.setProfit(sT - pT); - } - } - - return map.values(); - } - //每天零点统计信息 - @Async("scheduledExecutor") - @Scheduled(cron = "1 0 0 */1 * ?") - @PostConstruct - public void autoStat() { - log.info("开始统计信息..."); - - long lastDay = DateUtil.getTimestampBeforeNow(1); - long today = DateUtil.getTimestampNow(); - - //检查是否已统计过昨日已完成的订单数 - if (!statisticMapper.checkDailyFinishOrderExist(lastDay)) { - Integer lastDayPurchaseOrderFinish = purchaseOrderMapper.getLastDayFinishOrderNum(); - Integer lastDaySellOrderFinish = sellOrderMapper.getLastDayFinishOrderNum(); - StatFinishOrder param = new StatFinishOrder(); - param.setPurchase(lastDayPurchaseOrderFinish); - param.setSell(lastDaySellOrderFinish); - param.setTime(lastDay); - statisticMapper.insertFinishOrder(param); - } - - //检查是否已统计过昨日的采购额、销售额、毛利 - if (!statisticMapper.checkDailyProfitExist(lastDay)) { - //昨日各个商品的采购额、销售额 - List purchaseProfitGoods = purchaseOrderMapper.getDailyProfitGoods(lastDay, today); - List sellProfitGoods = sellOrderMapper.getDailyProfitGoods(lastDay, today); - - //昨日的采购总额、销售总额 - double totalPurchase = 0; - double totalSell = 0; - - Map map = new HashMap<>(sellProfitGoods.size()); - for (StatProfitGoods p : sellProfitGoods) { - map.put(p.getCid(), p); + if (p.getPurchase() == null) { + p.setPurchase(new BigDecimal(0)); } - - for (StatProfitGoods p : purchaseProfitGoods) { - p.setTime(lastDay); - Integer cid = p.getCid(); - Double purchase = p.getPurchase(); - totalPurchase += purchase; - StatProfitGoods s = map.get(cid); - if (s != null) { - Double sell = s.getSell(); - totalSell += sell; - p.setSell(sell); - p.setProfit(sell - purchase); - map.remove(cid); - } - else { - p.setSell(0D); - p.setProfit(-purchase); - } + if (p.getSell() == null) { + p.setSell(new BigDecimal(0)); } - - for (StatProfitGoods s : map.values()) { - s.setTime(lastDay); - s.setPurchase(0D); - Double sell = s.getSell(); - s.setProfit(sell); - totalSell += sell; - purchaseProfitGoods.add(s); + if (p.getProfit() == null) { + p.setProfit(p.getSell().subtract(p.getPurchase())); } - double totalProfit = totalSell - totalPurchase; - - StatProfitTotal statProfitTotal = new StatProfitTotal(); - statProfitTotal.setPurchase(totalPurchase); - statProfitTotal.setSell(totalSell); - statProfitTotal.setProfit(totalProfit); - statProfitTotal.setTime(lastDay); - - statisticMapper.insertProfitTotal(statProfitTotal); + StatProfitGoods already = map.get(cid); - if (purchaseProfitGoods.size() > 0) { - statisticMapper.insertProfitGoodsBatch(purchaseProfitGoods); + if (already == null) map.put(cid, p); + else { + BigDecimal pT = already.getPurchase().add(p.getPurchase()); + BigDecimal sT = already.getSell().add(p.getSell()); + already.setPurchase(pT); + already.setSell(sT); + already.setProfit(sT.subtract(pT)); } } - log.info("结束统计信息..."); + return map.values(); } } diff --git a/java/src/main/java/com/toesbieya/my/service/SysUserService.java b/java/src/main/java/com/toesbieya/my/service/SysUserService.java index 228104d..7050d0c 100644 --- a/java/src/main/java/com/toesbieya/my/service/SysUserService.java +++ b/java/src/main/java/com/toesbieya/my/service/SysUserService.java @@ -1,20 +1,24 @@ package com.toesbieya.my.service; import com.github.pagehelper.PageHelper; -import com.toesbieya.my.annoation.Tx; import com.toesbieya.my.annoation.UserAction; import com.toesbieya.my.mapper.SysUserMapper; import com.toesbieya.my.model.entity.SysUser; import com.toesbieya.my.model.vo.UserVo; import com.toesbieya.my.model.vo.result.PageResult; import com.toesbieya.my.model.vo.search.UserSearch; -import com.toesbieya.my.module.SocketModule; import com.toesbieya.my.utils.Result; +import com.toesbieya.my.utils.Util; +import com.toesbieya.my.utils.WebSocketUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.DigestUtils; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @Service public class SysUserService { @@ -27,8 +31,12 @@ public class SysUserService { List users = userMapper.search(vo); + //当前在线的用户id + Set onlineUserIds = WebSocketUtil.getOnlineUserIds(); + + //设置在线情况 for (UserVo user : users) { - user.setOnline(SocketModule.online(user.getId())); + user.setOnline(Util.some(onlineUserIds, i -> user.getId().equals(i))); } return new PageResult<>(users); @@ -59,18 +67,23 @@ public class SysUserService { } @UserAction("'删除用户:'+#user.name") - @Tx + @Transactional(rollbackFor = Exception.class) public Result del(SysUser user) { - userMapper.del(user.getId()); - SocketModule.logout(user.getId(), "该用户已删除"); - return Result.success("删除成功"); + int rows = userMapper.del(user.getId()); + WebSocketUtil.sendLogoutEvent(Collections.singletonList(user.getId()), "该用户已删除"); + return rows > 0 ? Result.success("删除成功") : Result.fail("删除失败,请刷新后重试"); } @UserAction public Result kick(List users) { - for (SysUser user : users) { - SocketModule.logout(user.getId(), null); - } + WebSocketUtil.sendLogoutEvent( + users + .stream() + .map(SysUser::getId) + .collect(Collectors.toList()), + "你已被强制下线,请重新登陆" + ); + return Result.success("踢出成功"); } diff --git a/java/src/main/java/com/toesbieya/my/utils/DocumentUtil.java b/java/src/main/java/com/toesbieya/my/utils/DocumentUtil.java index 38773da..228a674 100644 --- a/java/src/main/java/com/toesbieya/my/utils/DocumentUtil.java +++ b/java/src/main/java/com/toesbieya/my/utils/DocumentUtil.java @@ -33,9 +33,9 @@ public class DocumentUtil { RedisScript redisScript = new DefaultRedisScript<>(GET_DOCUMENT_ID_SCRIPT, Long.class); - Long result = RedisUtil.execute( + Long result = RedisUtil.getStringRedisTemplate().execute( redisScript, - Arrays.asList(DocumentConstant.DOCUMENT_TYPE_REDIS_KEY, DocumentConstant.DOCUMENT_TYPE_REDIS_KEY), + Arrays.asList(DocumentConstant.UPDATE_DOCUMENTS_LOCK_KEY, DocumentConstant.DOCUMENT_TYPE_REDIS_KEY), String.valueOf(DateUtil.getTimestampNow()), type ); diff --git a/java/src/main/java/com/toesbieya/my/utils/RedisUtil.java b/java/src/main/java/com/toesbieya/my/utils/RedisUtil.java index b3d033f..0300d02 100644 --- a/java/src/main/java/com/toesbieya/my/utils/RedisUtil.java +++ b/java/src/main/java/com/toesbieya/my/utils/RedisUtil.java @@ -4,7 +4,7 @@ import com.google.common.io.ByteStreams; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; @@ -18,19 +18,43 @@ import java.util.concurrent.TimeUnit; @Slf4j public class RedisUtil { private static String INCREMENT_AND_EXPIRE_SCRIPT = null; - private static RedisTemplate redisTemplate; + private static RedisTemplate redisTemplate; + private static StringRedisTemplate stringRedisTemplate; static { try { INCREMENT_AND_EXPIRE_SCRIPT = new String(ByteStreams.toByteArray(new ClassPathResource("/script/increase_and_expire.lua").getInputStream())); - } catch (IOException e) { + } + catch (IOException e) { e.printStackTrace(); } } @Autowired - public RedisUtil(RedisTemplate redisTemplate) { + public RedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) { RedisUtil.redisTemplate = redisTemplate; + RedisUtil.stringRedisTemplate = stringRedisTemplate; + } + + public static Set keys(String match) { + return redisTemplate.execute((RedisCallback>) connection -> { + Set result = new HashSet<>(); + + Cursor cursor = + connection.scan( + new ScanOptions + .ScanOptionsBuilder() + .match(match) + .count(2000) + .build() + ); + + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + + return result; + }); } public static boolean exist(String key) { @@ -38,20 +62,24 @@ public class RedisUtil { return result != null && result; } + public static void del(String... keys) { + redisTemplate.delete(Arrays.asList(keys)); + } + public static long incrAndExpire(String key, int time) { RedisScript redisScript = new DefaultRedisScript<>(INCREMENT_AND_EXPIRE_SCRIPT, Long.class); Long result = redisTemplate.execute(redisScript, Collections.singletonList(key), time); return result == null ? 0 : result; } - public static void expireImmediately(String key) { - redisTemplate.expire(key, 0L, TimeUnit.MILLISECONDS); - } - public static Object get(String key) { return redisTemplate.opsForValue().get(key); } + public static void set(String key, Object value) { + redisTemplate.opsForValue().set(key, value); + } + public static void set(String key, Object value, long expire) { redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS); } @@ -60,10 +88,19 @@ public class RedisUtil { return redisTemplate.opsForHash().get(key, field); } + public static Map hgetAll(String key) { + return redisTemplate.opsForHash().entries(key); + } + public static void hset(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } + //fields需要是String类型 + public static void hdel(String key, Object... fields) { + redisTemplate.opsForHash().delete(key, fields); + } + public static List hmget(String key, String... field) { return redisTemplate.opsForHash().multiGet(key, Arrays.asList(field)); } @@ -72,14 +109,33 @@ public class RedisUtil { redisTemplate.opsForHash().putAll(key, map); } - public static T execute(RedisScript script, List keys, Object... args) { - return redisTemplate.execute(script, keys, args); + public static long sadd(String key, Object... members) { + Long result = redisTemplate.opsForSet().add(key, members); + return result == null ? 0 : result; + } + + public static void srem(String key, Object... members) { + redisTemplate.opsForSet().remove(key, members); + } + + public static long scard(String key) { + Long result = redisTemplate.opsForSet().size(key); + return result == null ? 0 : result; + } + + public static Set smembers(String key) { + Set result = redisTemplate.opsForSet().members(key); + return result == null ? Collections.emptySet() : result; } - public static RedisTemplate getRedisTemplate() { + public static RedisTemplate getRedisTemplate() { return redisTemplate; } + public static StringRedisTemplate getStringRedisTemplate() { + return stringRedisTemplate; + } + public static class Locker implements Closeable { private final String key; private final String value; @@ -99,14 +155,14 @@ public class RedisUtil { public boolean lock() { String LOCK_LUA_SCRIPT = "return redis.call('set',KEYS[1],ARGV[1],'EX',ARGV[2],'NX')"; RedisScript redisScript = new DefaultRedisScript<>(LOCK_LUA_SCRIPT, Boolean.class); - Boolean result = RedisUtil.execute(redisScript, Collections.singletonList(key), value, expire); - return Objects.equals(result, true); + Boolean result = redisTemplate.execute(redisScript, Collections.singletonList(key), value, expire); + return result != null; } public void unlock() { String UNLOCK_LUA_SCRIPT = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return false end"; RedisScript redisScript = new DefaultRedisScript<>(UNLOCK_LUA_SCRIPT, Boolean.class); - Boolean result = RedisUtil.execute(redisScript, Collections.singletonList(key), value); + Boolean result = redisTemplate.execute(redisScript, Collections.singletonList(key), value); if (result == null || !result) { log.error("redis锁释放失败,key:{},value:{}", key, value); } diff --git a/java/src/main/java/com/toesbieya/my/utils/SessionUtil.java b/java/src/main/java/com/toesbieya/my/utils/SessionUtil.java index 424019e..e277e60 100644 --- a/java/src/main/java/com/toesbieya/my/utils/SessionUtil.java +++ b/java/src/main/java/com/toesbieya/my/utils/SessionUtil.java @@ -2,18 +2,20 @@ package com.toesbieya.my.utils; import com.alibaba.fastjson.JSONObject; import com.toesbieya.my.constant.SessionConstant; +import com.toesbieya.my.model.entity.SysUser; import com.toesbieya.my.model.vo.UserVo; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; public class SessionUtil { - private static long expire = 3600 * 8; + //token中的连接符 + private static final String tokenSeparator = "-*-"; public static void remove(String token) { if (StringUtils.isEmpty(token)) return; - RedisUtil.expireImmediately(SessionConstant.REDIS_NAMESPACE + token); + RedisUtil.del(SessionConstant.REDIS_NAMESPACE + token); } public static void save(UserVo user) { @@ -21,7 +23,7 @@ public class SessionUtil { if (StringUtils.isEmpty(token)) return; - RedisUtil.set(SessionConstant.REDIS_NAMESPACE + token, user, expire); + RedisUtil.set(SessionConstant.REDIS_NAMESPACE + token, user, SessionConstant.EXPIRE); } public static UserVo get() { @@ -43,4 +45,18 @@ public class SessionUtil { String token = request.getHeader(SessionConstant.TOKEN_KEY); return get(token); } + + public static String generateToken(SysUser user) { + return user.getId() + tokenSeparator + Util.UUID(); + } + + public static Integer getUidFromToken(String token) { + if (StringUtils.isEmpty(token)) { + return null; + } + + String[] arr = token.split(tokenSeparator); + + return arr.length > 1 ? Integer.valueOf(arr[0]) : null; + } } diff --git a/java/src/main/java/com/toesbieya/my/utils/Util.java b/java/src/main/java/com/toesbieya/my/utils/Util.java index 830b909..8506b86 100644 --- a/java/src/main/java/com/toesbieya/my/utils/Util.java +++ b/java/src/main/java/com/toesbieya/my/utils/Util.java @@ -6,7 +6,6 @@ import javax.validation.constraints.NotNull; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import java.text.DecimalFormat; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -37,10 +36,6 @@ public class Util { return new String(baKeyword, StandardCharsets.ISO_8859_1); } - public static T getOrDefault(T o, T defaultValue) { - return o == null ? defaultValue : o; - } - public static boolean isInteger(String str) { Pattern pattern = Pattern.compile("^[-+]?[\\d]*$"); return pattern.matcher(str).matches(); @@ -54,51 +49,26 @@ public class Util { return stringWriter.toString(); } - public static String formatByte(long byteNumber) { - //换算单位 - double FORMAT = 1024.0; - double kbNumber = byteNumber / FORMAT; - if (kbNumber < FORMAT) { - return new DecimalFormat("#.##KB").format(kbNumber); - } - double mbNumber = kbNumber / FORMAT; - if (mbNumber < FORMAT) { - return new DecimalFormat("#.##MB").format(mbNumber); - } - double gbNumber = mbNumber / FORMAT; - if (gbNumber < FORMAT) { - return new DecimalFormat("#.##GB").format(gbNumber); - } - double tbNumber = gbNumber / FORMAT; - return new DecimalFormat("#.##TB").format(tbNumber); - } - public static T find(Iterable list, Predicate predicate) { if (list == null) return null; - for (T t : list) { if (predicate.test(t)) return t; } - return null; } public static int findIndex(Iterable list, Predicate predicate) { int i = -1; - if (list == null) return i; - for (T t : list) { i++; if (predicate.test(t)) return i; } - return -1; } public static boolean some(Iterable list, Predicate predicate) { int index = findIndex(list, predicate); - return index > -1; } } diff --git a/java/src/main/java/com/toesbieya/my/utils/WebSocketUtil.java b/java/src/main/java/com/toesbieya/my/utils/WebSocketUtil.java new file mode 100644 index 0000000..a9f1061 --- /dev/null +++ b/java/src/main/java/com/toesbieya/my/utils/WebSocketUtil.java @@ -0,0 +1,36 @@ +package com.toesbieya.my.utils; + +import com.toesbieya.my.constant.SocketConstant; +import com.toesbieya.my.model.vo.SocketEventVo; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class WebSocketUtil { + //获取在线用户的总数 + public static long getOnlineUserNum() { + return RedisUtil.scard(SocketConstant.REDIS_ONLINE_USER); + } + + //获取所有在线用户的id集合 + public static Set getOnlineUserIds() { + Set result = RedisUtil.smembers(SocketConstant.REDIS_ONLINE_USER); + + return result.stream().map(e -> (Integer) e).collect(Collectors.toSet()); + } + + //发送消息 + public static void sendEvent(SocketEventVo vo) { + RedisUtil.getRedisTemplate().convertAndSend(SocketConstant.REDIS_EVENT_TOPIC_SEND, vo); + } + + //登出 + public static void sendLogoutEvent(List to, String msg) { + SocketEventVo vo = new SocketEventVo(); + vo.setEvent(SocketConstant.EVENT_LOGOUT); + vo.setTo(to); + vo.setData(msg); + sendEvent(vo); + } +} diff --git a/java/src/main/java/com/toesbieya/my/utils/YmlUtil.java b/java/src/main/java/com/toesbieya/my/utils/YmlUtil.java deleted file mode 100644 index 0493f53..0000000 --- a/java/src/main/java/com/toesbieya/my/utils/YmlUtil.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.toesbieya.my.utils; - -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; - -import java.util.Properties; - -public class YmlUtil { - private static Properties properties; - - public static Object get(String key) { - if (properties != null) { - return properties.get(key); - } - Resource resource = new ClassPathResource("application.yml"); - try { - YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); - yamlFactory.setResources(resource); - properties = yamlFactory.getObject(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - assert properties != null; - return properties.get(key); - } -} diff --git a/java/src/main/resources/application.yml b/java/src/main/resources/application.yml index 111d47c..deca6a0 100644 --- a/java/src/main/resources/application.yml +++ b/java/src/main/resources/application.yml @@ -20,14 +20,14 @@ spring: min-idle: 50 max-active: 2000 max-wait: 1000 - session: - store-type: redis servlet: multipart: #单文件上传最大值 max-file-size: 10MB #单次请求最大值 max-request-size: 10MB + aop: + proxy-target-class: true mybatis: mapper-locations: @@ -43,21 +43,14 @@ socket: #hostname: 172.24.52.184 hostname: localhost port: 12580 - max-frame-payload: 1048576 - max-http-content: 1048576 - event: - logout: logout - new-message: new-message + max-frame-payload-length: 1048576 + max-http-content-length: 1048576 qiniu: - access-key: access-key - secret-key: secret-key - bucket: bucket + access-key: + secret-key: + bucket: #七牛的临时上传凭证的有效期,单位秒 - token-expires: 3600 + token-expire: 3600 #七牛的临时上传凭证的redis键名 - redis-cache-key: qiniu-token - -#logging: -# level: -# com.toesbieya.my.mapper: DEBUG \ No newline at end of file + redis-cache-key: qiniu-token \ No newline at end of file diff --git a/java/src/main/resources/mapper/BizDocumentHistory.xml b/java/src/main/resources/mapper/BizDocumentHistory.xml index 94f0353..243f730 100644 --- a/java/src/main/resources/mapper/BizDocumentHistory.xml +++ b/java/src/main/resources/mapper/BizDocumentHistory.xml @@ -19,7 +19,7 @@ order by id desc - + insert into biz_document_history (pid, type, uid, uname, status_before, status_after, time, info) VALUES (#{pid}, #{type}, #{uid}, #{uname}, #{status_before}, #{status_after}, #{time}, #{info}) diff --git a/java/src/main/resources/mapper/BizPurchaseInbound.xml b/java/src/main/resources/mapper/BizPurchaseInbound.xml index 63db8ca..b98152c 100644 --- a/java/src/main/resources/mapper/BizPurchaseInbound.xml +++ b/java/src/main/resources/mapper/BizPurchaseInbound.xml @@ -49,7 +49,7 @@ order by ctime desc - + insert into biz_purchase_inbound id,pid,cid,cname,ctime, diff --git a/java/src/main/resources/mapper/BizPurchaseOrder.xml b/java/src/main/resources/mapper/BizPurchaseOrder.xml index dbdbd76..2b86143 100644 --- a/java/src/main/resources/mapper/BizPurchaseOrder.xml +++ b/java/src/main/resources/mapper/BizPurchaseOrder.xml @@ -55,7 +55,7 @@ order by ctime desc - + insert into biz_purchase_order id,sid,sname,cid,cname,ctime,finish,total, @@ -130,29 +130,4 @@ set remain_num=#{remain_num} where id = #{id} - - - \ No newline at end of file diff --git a/java/src/main/resources/mapper/BizSellOrder.xml b/java/src/main/resources/mapper/BizSellOrder.xml index 0e61f81..31bef46 100644 --- a/java/src/main/resources/mapper/BizSellOrder.xml +++ b/java/src/main/resources/mapper/BizSellOrder.xml @@ -55,7 +55,7 @@ order by ctime desc - + insert into biz_sell_order id,customer_id,customer_name,cid,cname,ctime,finish,total, @@ -130,29 +130,4 @@ set remain_num=#{remain_num} where id = #{id} - - - \ No newline at end of file diff --git a/java/src/main/resources/mapper/BizSellOutbound.xml b/java/src/main/resources/mapper/BizSellOutbound.xml index 2d69003..bc87a45 100644 --- a/java/src/main/resources/mapper/BizSellOutbound.xml +++ b/java/src/main/resources/mapper/BizSellOutbound.xml @@ -49,7 +49,7 @@ order by ctime desc - + insert into biz_sell_outbound id,pid,cid,cname,ctime, diff --git a/java/src/main/resources/mapper/BizStock.xml b/java/src/main/resources/mapper/BizStock.xml index 5842e74..1b12431 100644 --- a/java/src/main/resources/mapper/BizStock.xml +++ b/java/src/main/resources/mapper/BizStock.xml @@ -13,6 +13,7 @@ and ctime = ]]> #{startTime} and ctime #{endTime} + + + + - - delete - from biz_stock - where id = #{id,jdbcType=INTEGER} - - - update biz_stock - - - cid = #{cid,jdbcType=INTEGER}, - - - cname = #{cname,jdbcType=VARCHAR}, - - - num = #{num,jdbcType=DECIMAL}, - - - price = #{price,jdbcType=DECIMAL}, - - - ctime = #{ctime,jdbcType=BIGINT}, - - - cgrkid = #{cgrkid,jdbcType=VARCHAR}, - - - cgddid = #{cgddid,jdbcType=VARCHAR}, - - - where id = #{id,jdbcType=INTEGER} - - - update biz_stock - set cid = #{cid,jdbcType=INTEGER}, - cname = #{cname,jdbcType=VARCHAR}, - num = #{num,jdbcType=DECIMAL}, - price = #{price,jdbcType=DECIMAL}, - ctime = #{ctime,jdbcType=BIGINT}, - cgrkid = #{cgrkid,jdbcType=VARCHAR}, - cgddid = #{cgddid,jdbcType=VARCHAR} - where id = #{id,jdbcType=INTEGER} - - - update biz_stock - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.cid,jdbcType=INTEGER} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.cname,jdbcType=VARCHAR} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.num,jdbcType=DECIMAL} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.price,jdbcType=DECIMAL} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.ctime,jdbcType=BIGINT} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.cgrkid,jdbcType=VARCHAR} - - - - - - - when id = #{item.id,jdbcType=INTEGER} then #{item.cgddid,jdbcType=VARCHAR} - - - - - where id in - - #{item.id,jdbcType=INTEGER} - - + insert into biz_stock @@ -171,6 +75,7 @@ #{item.cgddid,jdbcType=VARCHAR}) + update biz_stock set num = num - #{num,jdbcType=DECIMAL} diff --git a/java/src/main/resources/mapper/Statistic.xml b/java/src/main/resources/mapper/Statistic.xml index 647ac4a..490ce73 100644 --- a/java/src/main/resources/mapper/Statistic.xml +++ b/java/src/main/resources/mapper/Statistic.xml @@ -8,6 +8,7 @@ and time = ]]> #{start} and time #{end} + + + + - - insert into stat_finish_order (purchase, sell, time) - values (#{purchase}, #{sell}, #{time}) - + + + + insert into stat_finish_order (purchase, sell, time) + values (#{purchase}, #{sell}, #{time}) + + insert into stat_profit_total (purchase, sell, profit, time) values (#{purchase}, #{sell}, #{profit}, #{time}) + @@ -61,4 +69,68 @@ (#{item.cid},#{item.purchase},#{item.sell},#{item.profit},#{item.time}) + + + + + + + + + + + + \ No newline at end of file