From 716b7b6ac8077b758f10ee46a0460e539515dfcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E9=B8=A3?= Date: Fri, 19 Mar 2021 10:39:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E6=96=AD=E7=BA=BF?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=20=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/CameraController.java | 3 +- .../web/controller/OrderController.java | 11 -- .../web/controller/RealTimeController.java | 2 - .../web/controller/StockController.java | 37 ++++-- .../web/controller/WarnController.java | 18 +-- .../com/zhehekeji/web/entity/StockLog.java | 2 + .../zhehekeji/web/lib/PtzControlModule.java | 35 ++++-- .../com/zhehekeji/web/mapper/StockMapper.java | 2 +- .../zhehekeji/web/pojo/stock/CheckByMan.java | 34 ++++++ .../zhehekeji/web/pojo/stock/StockCheck.java | 2 - .../zhehekeji/web/pojo/stock/StockStatus.java | 4 +- .../zhehekeji/web/pojo/warn/WarnSearch.java | 2 + .../web/service/HeartNettyClientHandler.java | 10 +- .../zhehekeji/web/service/NettyClient.java | 53 +++++++-- .../com/zhehekeji/web/service/PlcService.java | 10 +- .../zhehekeji/web/service/StockService.java | 105 ++++++++++++++---- .../com/zhehekeji/web/service/StreetConn.java | 3 + .../zhehekeji/web/service/StreetService.java | 19 +++- 18 files changed, 254 insertions(+), 98 deletions(-) create mode 100644 web/src/main/java/com/zhehekeji/web/pojo/stock/CheckByMan.java diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java index 73154a0..c1ed3db 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java @@ -105,7 +105,8 @@ public class CameraController { @PostMapping("/io/toPtz") @ApiOperation(value = "转至球机IO配置点") public Result toPtz(@RequestBody CameraIOPtz req) { - validatorUtil.validate(req); + //todo + //validatorUtil.validate(req); Integer ptzId = cameraService.getPtzId(req.getCameraIOId()); PtzControlModule.toPtz(ptzId,req.getCameraId()); return Result.success(); diff --git a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java index a44bdb9..b6d6773 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -3,8 +3,6 @@ package com.zhehekeji.web.controller; import com.github.pagehelper.PageInfo; import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; -import com.zhehekeji.core.util.Assert; -import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.OrderVO; @@ -12,14 +10,12 @@ import com.zhehekeji.web.service.OrderService; import com.zhehekeji.web.service.PlcOrderInfo; import com.zhehekeji.web.service.PlcService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; @Api(value = "OrderController",tags = "订单管理") @RestController(value = "OrderController") @@ -88,11 +84,4 @@ public class OrderController { return Result.success(orderService.orders(orderSearch)); } - /*@GetMapping("/userCenter") - @ApiOperation("用户中心地址") - public Result userCenter(){ - return Result.success(applicationService.userCenter()); - }*/ - - } diff --git a/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java b/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java index c6d0d83..02dc483 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java @@ -1,8 +1,6 @@ package com.zhehekeji.web.controller; import com.zhehekeji.core.pojo.Result; -import com.zhehekeji.web.entity.Order; -import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.realTime.RealTime; import com.zhehekeji.web.service.RealTimeService; import io.swagger.annotations.Api; diff --git a/web/src/main/java/com/zhehekeji/web/controller/StockController.java b/web/src/main/java/com/zhehekeji/web/controller/StockController.java index 0285332..49bbff4 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StockController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StockController.java @@ -3,8 +3,10 @@ package com.zhehekeji.web.controller; import com.alibaba.excel.EasyExcel; import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; -import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Stock; +import com.zhehekeji.web.lib.PtzControlModule; +import com.zhehekeji.web.pojo.category.PageSearch; +import com.zhehekeji.web.pojo.stock.CheckByMan; import com.zhehekeji.web.pojo.stock.StockCheck; import com.zhehekeji.web.pojo.stock.StockExportExcel; import com.zhehekeji.web.service.StockService; @@ -42,10 +44,16 @@ public class StockController { @GetMapping("/list") @ApiOperation(value = "盘点页面 返回map key:货架号 value:库存信息") - public Result>> stockByStreet(@RequestParam(required = true) Integer streetId){ + public Result>> stockByStreet(@RequestParam(required = true) Integer streetId){ return Result.success(stockService.stocksByStreetId(streetId)); } + @PostMapping("/page") + @ApiOperation(value = "库存列表") + public Result> page(@RequestBody PageSearch pageSearch){ + return Result.success(stockService.page(pageSearch)); + } + @ApiOperation(value = "导出全部巷道excel") @RequestMapping(value = "/export", method = RequestMethod.GET) public void export(@RequestParam Integer streetId, HttpServletResponse response) throws IOException { @@ -59,20 +67,31 @@ public class StockController { } - @ApiOperation(value = "复核页面") + @ApiOperation(value = "复核页面的核对信息") @RequestMapping(value = "/info", method = RequestMethod.POST) public Result stockInfo(@RequestBody StockCheck stockCheck){ validatorUtil.validate(stockCheck); - stockCheck.setStatus(null); return Result.success(stockService.stockInfo(stockCheck)); } - @ApiOperation(value = "复核页面") - @RequestMapping(value = "/check", method = RequestMethod.POST) - public Result check(@RequestBody StockCheck stockCheck){ + @ApiOperation(value = "复核正确") + @RequestMapping(value = "/checkCorrect", method = RequestMethod.POST) + public Result check(@RequestBody StockCheck stockCheck){ validatorUtil.validate(stockCheck); - Assert.notNull(stockCheck.getStatus(),"核对状态必填"); - stockService.check(stockCheck); + return Result.success(stockService.checkCorrect(stockCheck)); + } + + @ApiOperation(value = "人工复核") + @RequestMapping(value = "/checkByMan", method = RequestMethod.POST) + public Result checkByMan(@RequestBody CheckByMan checkByMan){ + validatorUtil.validate(checkByMan); + return Result.success(stockService.checkByMan(checkByMan)); + } + + @ApiOperation(value = "slow") + @RequestMapping(value = "/slow", method = RequestMethod.GET) + public Result slow(Integer ptzId,Integer cameraId){ + PtzControlModule.toPtzSlow(ptzId,cameraId); return Result.success(); } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/WarnController.java b/web/src/main/java/com/zhehekeji/web/controller/WarnController.java index a11beff..f57dde2 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/WarnController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/WarnController.java @@ -3,23 +3,14 @@ package com.zhehekeji.web.controller; import com.github.pagehelper.PageInfo; import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; -import com.zhehekeji.web.entity.Order; -import com.zhehekeji.web.entity.Warn; -import com.zhehekeji.web.pojo.OrderSaveReq; -import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.warn.WarnSearch; import com.zhehekeji.web.pojo.warn.WarnVO; -import com.zhehekeji.web.service.OrderService; -import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.WarnService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; @Api(value = "Warn",tags = "告警管理") @RestController @@ -32,17 +23,10 @@ public class WarnController { private ValidatorUtil validatorUtil; @PostMapping("/list") - @ApiOperation(value = "查询") + @ApiOperation(value = "告警日志 和告警视频 都用这个接口") //@SessionHandler public Result> orders(@RequestBody WarnSearch warnSearch) { validatorUtil.validate(warnSearch); return Result.success(warnService.page(warnSearch)); } - /*@GetMapping("/userCenter") - @ApiOperation("用户中心地址") - public Result userCenter(){ - return Result.success(applicationService.userCenter()); - }*/ - - } diff --git a/web/src/main/java/com/zhehekeji/web/entity/StockLog.java b/web/src/main/java/com/zhehekeji/web/entity/StockLog.java index 3632ed9..2470caa 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/StockLog.java +++ b/web/src/main/java/com/zhehekeji/web/entity/StockLog.java @@ -26,6 +26,8 @@ public class StockLog { @TableField("`column`") private Integer column; + private String content; + @ApiModelProperty("之前的状态") private Integer oldStatus; diff --git a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java index 7d8b35a..11b4aea 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java @@ -261,27 +261,42 @@ public class PtzControlModule { public static void ptz(Integer ptzId,String name,Integer cameraId){ int dwzCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL; int nPressetIndex = ptzId; - Boolean ok = ptzControler(dwzCommand,0,nPressetIndex,0,0,ToolKits.GetGBKStringToPointer(name),CameraConnMap.getConnId(cameraId)); + Boolean ok =LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwzCommand,0,ptzId,0,0,ToolKits.GetGBKStringToPointer(name)); Assert.isTrue(ok,"设置失败"); } - public static Boolean ptzControler(int dwPTZCOmmand, int lParam1, int lParam2, int lParam3, int dwStop, Pointer pointer, NetSDKLib.LLong loginId){ - return LoginModule.netsdk.CLIENT_DHPTZControlEx2(loginId,0,dwPTZCOmmand,lParam1,lParam2,lParam3,dwStop,pointer); - } - /** * 转至 预置点 - * @param ioId + * @param ptzId * @param cameraId */ - public static void toPtz(Integer ioId,Integer cameraId){ + public static void toPtz(Integer ptzId,Integer cameraId){ int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL; - int nPresetIndex = ioId; + int nPresetIndex = ptzId; + Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwPTZCommand,0,ptzId,0,0,null); + if(!ok ){ + log.error("转至预置点 失败 cameraId:{},ptzId:{}",cameraId,ptzId); + } + } - Boolean ok = ptzControler(dwPTZCommand, 0, nPresetIndex, 0, 0, null,CameraConnMap.getConnId(cameraId)); + /** + * 转至 预置点 + * @param ptzId + * @param cameraId + */ + public static void toPtzSlow(Integer ptzId,Integer cameraId){ + int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_MOVE_ABSOLUTELY; + NetSDKLib.PTZ_CONTROL_ABSOLUTELY absolutely = new NetSDKLib.PTZ_CONTROL_ABSOLUTELY(); + absolutely.stuPosition.nPositionX = 3600; + absolutely.stuPosition.nPositionY= 0; + absolutely.stuSpeed.fPositionX = 0.9f; + absolutely.stuSpeed.fPositionY = 0f; + //absolutely.stuSpeed.fZoom = 0.5f; + Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwPTZCommand, + 0,0,0,0,absolutely.getPointer()); if(!ok ){ - log.error("转至预置点 失败 cameraId:{},ioId:{}",cameraId,ioId); + log.error("失败 cameraId:{},ptzId:{}",cameraId,ptzId); } } diff --git a/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java index e728361..c14dd0a 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java @@ -14,7 +14,7 @@ public interface StockMapper extends BaseMapper { void insertOrUpdate(@Param("req") Stock stock); - @Select("select * from stock where shelve_id =#{shelveId}") + @Select("select * from stock where shelve_id =#{shelveId} and `row` = #{row} and `column` = #{column} limit 1") Stock getByShelveIdAndRowColumn(String shelveId,Integer row,Integer column); Integer updateStock(Stock stock); diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/CheckByMan.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/CheckByMan.java new file mode 100644 index 0000000..c80eecb --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/CheckByMan.java @@ -0,0 +1,34 @@ +package com.zhehekeji.web.pojo.stock; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 人工复核 + */ +@Data +public class CheckByMan { + + @NotEmpty(message = "货架号不能为空") + @ApiModelProperty("货架号") + private String shelveId; + + @NotNull(message = "行不能为空") + @ApiModelProperty("行号") + private Integer row; + + @NotNull(message = "列不能为空") + @ApiModelProperty("列") + private Integer column; + + @NotNull(message = "数量不能为空") + @ApiModelProperty("数量") + private Integer count; + + @NotEmpty(message = "品规不能为空") + @ApiModelProperty("品规") + private String category; +} diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java index 585f3e7..e17ff73 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java @@ -21,6 +21,4 @@ public class StockCheck { @ApiModelProperty("列") private Integer column; - @ApiModelProperty("1:盘点异常 2:核对正确") - private Integer status; } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockStatus.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockStatus.java index a603a43..d4d74e6 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockStatus.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockStatus.java @@ -14,11 +14,11 @@ public enum StockStatus { /** * 待发货 */ - SUCCESS(1, "核对准确"), + SUCCESS(2, "核对准确"), /** * 已发货 */ - ERROR(2, "核对错误"), + ERROR(1, "核对错误"), ; private Integer status; diff --git a/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java index 9024640..34df2ae 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java @@ -20,4 +20,6 @@ public class WarnSearch { @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; + + private Integer streetId; } diff --git a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java index 5eda023..ddb6b21 100644 --- a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java @@ -2,7 +2,6 @@ package com.zhehekeji.web.service; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; @@ -19,9 +18,12 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter { private Integer streetId; - public HeartNettyClientHandler(Integer streetId,SendHeart heart){ + private NettyClient nettyClient; + + public HeartNettyClientHandler(Integer streetId,SendHeart heart , NettyClient nettyClient){ this.streetId = streetId; this.heart = heart; + this.nettyClient = nettyClient; } /** @@ -39,8 +41,10 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.info("streetId:{}连接被关闭",streetId); + log.info("streetId:{} closed",streetId); StreetConn.disConn(streetId); + log.info(" streetId reconnect......"); + nettyClient.reconnect(streetId); } /** diff --git a/web/src/main/java/com/zhehekeji/web/service/NettyClient.java b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java index d485c44..f0e8e88 100644 --- a/web/src/main/java/com/zhehekeji/web/service/NettyClient.java +++ b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java @@ -1,6 +1,7 @@ package com.zhehekeji.web.service; import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.mapper.StreetMapper; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; @@ -11,32 +12,66 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; +/** + * 连接plc + * 断线重连 + */ @Slf4j @Component public class NettyClient { private static EventLoopGroup group = new NioEventLoopGroup(); - @Resource private PlcService plcService; + @Resource + private StreetMapper streetMapper; + + /** + * 重连最大次数 + */ + private static int RECONNECT_NUM = 5; public void createClient(Street street) throws InterruptedException { - if(StringUtils.isEmpty(street.getPlcIp()) || street.getPlcPort() == null){ + if (StringUtils.isEmpty(street.getPlcIp()) || street.getPlcPort() == null) { return; } Bootstrap client = new Bootstrap(); - // 第1步 定义线程组,处理读写和链接事件,没有了accept事件 client.group(group); - // 第2步 绑定客户端通道 client.channel(NioSocketChannel.class); - // 第3步 给NIoSocketChannel初始化handler, 处理读写事件 SendHeart sendHeart = new SendHeart(street.getPlcId()); - client.handler(new HeartNettyClientFilter(street.getId(),sendHeart,plcService)); + client.handler(new HeartNettyClientFilter(street.getId(), sendHeart, plcService)); // 连接服务端 - client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); + client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); } - public static void close() { - group.shutdownGracefully(); + /** + * 断线重连 尝试 RECONNECT_NUM 次 + * + * @param streetId + */ + public void reconnect(Integer streetId) { + Boolean isConnected = false; + int num = 0; + Street street = streetMapper.selectById(streetId); + if (street == null) { + log.error("reconnect ,street is null ,id:{}", streetId); + return; + } + while (num < RECONNECT_NUM && !isConnected) { + try { + createClient(street); + } catch (Exception e) { + //没连上 继续 + log.error("reconnect error num:{}", num); + num++; + continue; + } + isConnected = true; + } + if (isConnected) { + log.info("plc reconnect success"); + } else { + log.error("plc reconnect error .streetId:{},reconnect num:{},name:{},ip:{},port:{}", streetId, num, street.getName(), street.getPlcIp(), street.getPlcPort()); + } } } diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 9c5d38d..4edfcb0 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -5,6 +5,7 @@ import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.entity.*; import com.zhehekeji.web.lib.*; import com.zhehekeji.web.mapper.*; +import com.zhehekeji.web.pojo.stock.StockStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -29,8 +30,8 @@ public class PlcService { @Resource private OrderMapper orderMapper; -// @Resource -// private StreetShelveMapper streetShelveMapper; + @Resource + private StockMapper stockMapper; @Resource private StreetMapper streetMapper; @Resource @@ -147,6 +148,11 @@ public class PlcService { CameraCaptureMap.put(street.getCamera1Id(),orderInfo); CameraCaptureMap.put(street.getCamera2Id(),orderInfo); move(street.getCamera1Id(), street.getCamera2Id(), code); + Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,row,column); + if(stock != null){ + stock.setStatus(StockStatus.PENDING.getStatus()); + stockMapper.updateById(stock); + } // PtzControlModule.pic(street.getCamera1Id(),0,orderInfo); // PtzControlModule.pic(street.getCamera2Id(),0,orderInfo); } diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 601bda7..a79b7e6 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -1,27 +1,29 @@ package com.zhehekeji.web.service; import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.github.pagehelper.PageHelper; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Stock; import com.zhehekeji.web.entity.StockLog; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.mapper.StockLogMapper; import com.zhehekeji.web.mapper.StockMapper; -import com.zhehekeji.web.pojo.stock.StockCheck; -import com.zhehekeji.web.pojo.stock.StockExcel; -import com.zhehekeji.web.pojo.stock.StockExportExcel; -import com.zhehekeji.web.pojo.stock.StockStatus; +import com.zhehekeji.web.pojo.category.PageSearch; +import com.zhehekeji.web.pojo.stock.*; import com.zhehekeji.web.pojo.street.StreetType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -36,7 +38,7 @@ public class StockService { @Resource private StockLogMapper logMapper; - public void importExcel(MultipartFile file){ + public void importExcel(MultipartFile file) { log.info("import excel stock"); Thread thread = new Thread( new Runnable() { @@ -45,7 +47,7 @@ public class StockService { try { EasyExcel.read(file.getInputStream(), StockExcel.class, new StockImport(stockMapper)).sheet().doRead(); } catch (IOException e) { - log.error("库存导入error:{}",e); + log.error("库存导入error:{}", e); } } } @@ -55,28 +57,36 @@ public class StockService { /** * 根据巷道获取所有的格子 + * * @param streetId * @return */ - public Map> stocksByStreetId(Integer streetId){ + public Map> stocksByStreetId(Integer streetId) { List stocks = list(streetId); - Map> shelveMap = stocks.stream().collect(Collectors.groupingBy(Stock::getShelveId)); + Map> shelveMap = stocks.stream().collect(Collectors.groupingBy(Stock::getShelveId)); return shelveMap; } - public List list(Integer streetId){ + public List list(Integer streetId) { Street street = streetService.streetById(streetId); List shelves = streetService.check(street); - List stocks = stockMapper.selectList(new QueryWrapper().in("shelve_id",shelves).orderByAsc("shelve_id","`row`","`column`")); + List stocks = stockMapper.selectList(new QueryWrapper().in("shelve_id", shelves).orderByAsc("shelve_id", "`row`", "`column`")); + return stocks; + } + + public List page(PageSearch pageSearch) { + PageHelper.startPage(pageSearch.getPageNum(), pageSearch.getPageSize()); + List stocks = stockMapper.selectList(new QueryWrapper().orderByAsc("shelve_id", "`row`", "`column`")); return stocks; } /** * 导出巷道格子信息 + * * @param streetId * @return */ - public List exportExcels(Integer streetId){ + public List exportExcels(Integer streetId) { List stocks = list(streetId); Street street = streetService.streetById(streetId); List stockExportExcels = new ArrayList<>(stocks.size()); @@ -97,34 +107,83 @@ public class StockService { /** * 获取行列号,货架号对应的格子信息 + * * @param stockCheck * @return */ - public Stock stockInfo(StockCheck stockCheck){ - Stock stock = stockMapper.getByShelveIdAndRowColumn(stockCheck.getShelveId(),stockCheck.getRow(),stockCheck.getColumn()); + public Stock stockInfo(StockCheck stockCheck) { + Stock stock = stockMapper.getByShelveIdAndRowColumn(stockCheck.getShelveId(), stockCheck.getRow(), stockCheck.getColumn()); return stock; } /** * 核对单子 - * 核对正确、核对错误 + * 核对正确 + * * @param stockCheck */ - public void check(StockCheck stockCheck){ - log.debug("check stock shelveID:{},row:{},column:{},status:{}",stockCheck.getShelveId(),stockCheck.getRow(),stockCheck.getColumn(),stockCheck.getStatus()); + public Stock checkCorrect(StockCheck stockCheck) { + log.debug("check stock correct, shelveID:{},row:{},column:{}", stockCheck.getShelveId(), stockCheck.getRow(), stockCheck.getColumn()); Stock stock = stockInfo(stockCheck); - Assert.notNull(stock,"库存不存在"); + Assert.notNull(stock, "该货位暂时没有记录"); Integer oldStatus = stock.getStatus(); - stock.setStatus(stockCheck.getStatus()); + stock.setStatus(StockStatus.SUCCESS.getStatus()); stockMapper.updateById(stock); - checkLog(stock,oldStatus); + checkLog(stock, oldStatus, null, null); + return stock; } - private void checkLog(Stock stock,Integer oldStatus){ + /** + * 人工核对 + * + * @param checkByMan + * @return + */ + public Stock checkByMan(CheckByMan checkByMan) { + Stock stock = stockMapper.getByShelveIdAndRowColumn(checkByMan.getShelveId(), checkByMan.getRow(), checkByMan.getColumn()); + Assert.notNull(stock, "该货位暂时没有记录"); + Boolean same = checkByMan.getCategory().equals(stock.getCategory()) && checkByMan.getCount().equals(stock.getCount()); + Assert.isTrue(!same, "品规和数量与原有记录相同"); + Integer oldStatus = stock.getStatus(); + String oldCategory = stock.getCategory(); + Integer count = stock.getCount(); + stock.setStatus(StockStatus.ERROR.getStatus()); + stock.setCategory(checkByMan.getCategory()); + stock.setCount(checkByMan.getCount()); + stockMapper.updateById(stock); + checkLog(stock, oldStatus, oldCategory, count); + return stock; + + } + + /** + * 核对历史记录 + * + * @param stock + * @param oldStatus + * @param oldCategory + * @param oldCount + */ + private void checkLog(Stock stock, Integer oldStatus, String oldCategory, Integer oldCount) { StockLog stockLog = new StockLog(); - BeanUtils.copyProperties(stock,stockLog); - stockLog.setOldStatus(oldStatus); - stockLog.setNewStatus(stock.getStatus()); + BeanUtils.copyProperties(stock, stockLog); + Map map = new HashMap<>(8); + if (oldStatus != null) { + map.put("old_status", oldStatus); + } + if (!StringUtils.isEmpty(oldCategory)) { + map.put("old_category", oldCategory); + } + if (oldCount != null) { + map.put("old_count", oldCount); + } + map.put("new_status", stock.getStatus()); + map.put("new_category", stock.getCategory()); + map.put("new_count", stock.getCount()); + stockLog.setContent(JSONObject.toJSONString(map)); + stockLog.setCreateTime(LocalDateTime.now()); + stockLog.setUserId(1); + stockLog.setUsername("wong"); // todo username logMapper.insert(stockLog); } diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetConn.java b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java index e59765f..5e8dec3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetConn.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java @@ -10,6 +10,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * PLC连接状态 + */ @Data public class StreetConn { diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetService.java b/web/src/main/java/com/zhehekeji/web/service/StreetService.java index 913853e..01c306d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -45,12 +45,19 @@ public class StreetService { Assert.isTrue(false, "PLC ID已存在"); } StreetConn.init(street.getId(), street.getPlcId()); - //连接 - try { - nettyClient.createClient(street); - } catch (InterruptedException e) { - log.error("新增巷道,连接异常"); - } + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + //连接 + try { + nettyClient.createClient(street); + } catch (InterruptedException e) { + log.error("新增巷道,连接异常"); + } + } + }); + thread.start(); + return street.getId(); }