From 42b44cdf83fcb0e619c9680a81502d81aae58257 Mon Sep 17 00:00:00 2001 From: dabin <2827029098@qq.com> Date: Fri, 30 Aug 2024 18:14:33 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90admin=E3=80=91=E6=96=B0=E5=A2=9E#=201.?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=AE=A2=E5=8D=95=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=202.=E6=96=B0=E5=A2=9E=E5=A4=A7=E5=B1=8Fwebsocket?= =?UTF-8?q?=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hcy/admin/AdminApplication.java | 15 +++- .../system/SystemNotificationController.java | 26 ++++++ .../java/com/hcy/admin/netty/NettyConfig.java | 20 +++++ .../hcy/admin/netty/NettyWebsocketServer.java | 61 ++++++++++++++ .../hcy/admin/netty/WebsocketChannelInit.java | 82 +++++++++++++++++++ .../com/hcy/admin/netty/WebsocketHandler.java | 72 ++++++++++++++++ .../client/impl/EquipmentServiceImpl.java | 4 +- .../service/crontab/impl/CouponCrontab.java | 33 -------- .../service/crontab/impl/OrderCrontab.java | 2 + .../impl/MaintenanceOrderServiceImpl.java | 9 ++ .../RoutingInspectionOrderServiceImpl.java | 16 +++- .../impl/SystemAuthAdminServiceImpl.java | 74 +++++++---------- admin/src/main/resources/application.yml | 7 +- .../enums/order/OrderOperateRecordEnum.java | 1 + .../hcy/common/mapper/plant/PlantMapper.java | 4 +- .../hcy/common/mapper/user/UserMapper.java | 2 +- .../java/com/hcy/common/utils/TimeUtil.java | 4 + .../order/IMaintenanceOrderService.java | 2 +- .../impl/MaintenanceOrderServiceImpl.java | 11 +++ .../order/impl/RepairOrderServiceImpl.java | 22 ++--- 20 files changed, 364 insertions(+), 103 deletions(-) create mode 100644 admin/src/main/java/com/hcy/admin/controller/system/SystemNotificationController.java create mode 100644 admin/src/main/java/com/hcy/admin/netty/NettyConfig.java create mode 100644 admin/src/main/java/com/hcy/admin/netty/NettyWebsocketServer.java create mode 100644 admin/src/main/java/com/hcy/admin/netty/WebsocketChannelInit.java create mode 100644 admin/src/main/java/com/hcy/admin/netty/WebsocketHandler.java delete mode 100644 admin/src/main/java/com/hcy/admin/service/crontab/impl/CouponCrontab.java diff --git a/admin/src/main/java/com/hcy/admin/AdminApplication.java b/admin/src/main/java/com/hcy/admin/AdminApplication.java index 3b5ec50..b096af6 100644 --- a/admin/src/main/java/com/hcy/admin/AdminApplication.java +++ b/admin/src/main/java/com/hcy/admin/AdminApplication.java @@ -1,6 +1,8 @@ package com.hcy.admin; +import com.hcy.admin.netty.NettyWebsocketServer; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration; @@ -9,6 +11,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; +import javax.annotation.Resource; + /** * 启动器 */ @@ -18,11 +22,20 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @EnableScheduling @SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class}) -public class AdminApplication { +public class AdminApplication implements CommandLineRunner { + + @Resource + private NettyWebsocketServer nettyWebsocketServer; public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); System.out.println("(♥◠‿◠)ノ゙ charging_pile启动成功 ლ(´ڡ`ლ)゙"); } + @Override + public void run(String... args) throws Exception { + //启动websocket服务 + new Thread(nettyWebsocketServer).start(); + } + } diff --git a/admin/src/main/java/com/hcy/admin/controller/system/SystemNotificationController.java b/admin/src/main/java/com/hcy/admin/controller/system/SystemNotificationController.java new file mode 100644 index 0000000..abe8328 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/controller/system/SystemNotificationController.java @@ -0,0 +1,26 @@ +package com.hcy.admin.controller.system; + +import com.hcy.admin.config.aop.Log; +import com.hcy.admin.validate.system.SystemAuthAdminParam; +import com.hcy.common.core.AjaxResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("api/system/notification") +public class SystemNotificationController { + + + /** + * 系统通知 + * @author dabin + * @param systemAuthAdminParam 参数 + * @return Object + */ + @Log(title = "系统通知send") + @GetMapping("/send") + public Object add(SystemAuthAdminParam systemAuthAdminParam) { + + return AjaxResult.success(); + } +} diff --git a/admin/src/main/java/com/hcy/admin/netty/NettyConfig.java b/admin/src/main/java/com/hcy/admin/netty/NettyConfig.java new file mode 100644 index 0000000..713263f --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/netty/NettyConfig.java @@ -0,0 +1,20 @@ +package com.hcy.admin.netty; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * netty配置 + */ +@Component +@Data +@ConfigurationProperties(prefix = "netty") +public class NettyConfig { + + //netty监听端口 + private int port; + + //websocket访问路径 + private String path; +} diff --git a/admin/src/main/java/com/hcy/admin/netty/NettyWebsocketServer.java b/admin/src/main/java/com/hcy/admin/netty/NettyWebsocketServer.java new file mode 100644 index 0000000..356ef97 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/netty/NettyWebsocketServer.java @@ -0,0 +1,61 @@ +package com.hcy.admin.netty; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.PreDestroy; +import javax.annotation.Resource; + +/** + * Netty的Websocket服务器 + */ +@Component +public class NettyWebsocketServer implements Runnable{ + + @Resource + private NettyConfig nettyConfig; + @Resource + private WebsocketChannelInit websocketChannelInit; + + private final NioEventLoopGroup bossGroup = new NioEventLoopGroup(1); + private final NioEventLoopGroup workerGroup = new NioEventLoopGroup(); + + @Override + public void run() { + try { + // 1.创建服务端启动助手 + ServerBootstrap serverBootstrap = new ServerBootstrap(); + // 2.设置线程组 + serverBootstrap.group(bossGroup, workerGroup); + // 3.设置参数 + serverBootstrap.channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.DEBUG)) + .childHandler(websocketChannelInit); + // 4.启动服务端 + ChannelFuture channelFuture = serverBootstrap.bind(nettyConfig.getPort()).sync(); + System.out.println("------Netty Admin 服务端启动成功------"); + channelFuture.channel().closeFuture().sync(); + } catch (InterruptedException e) { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + throw new RuntimeException(e); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + /** + * 关闭资源-容器销毁时候关闭 + */ + @PreDestroy + public void close() { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } +} diff --git a/admin/src/main/java/com/hcy/admin/netty/WebsocketChannelInit.java b/admin/src/main/java/com/hcy/admin/netty/WebsocketChannelInit.java new file mode 100644 index 0000000..d4a017b --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/netty/WebsocketChannelInit.java @@ -0,0 +1,82 @@ +package com.hcy.admin.netty; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpServerCodec; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; +import io.netty.handler.stream.ChunkedWriteHandler; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.KeyStore; + +/** + * 通道初始化对象 + */ +@Component +public class WebsocketChannelInit extends ChannelInitializer { + + @Resource + private NettyConfig nettyConfig; + + @Resource + private WebsocketHandler websocketHandler; + + @Override + protected void initChannel(Channel channel) throws Exception { + ChannelPipeline pipeline = channel.pipeline(); + + // 对HTTP协议的支持 + pipeline.addLast(new HttpServerCodec()); + + // 对大数据流的支持 + pipeline.addLast(new ChunkedWriteHandler()); + + // post请求分为三个部分:request line/request header/message body + // 对POST请求的支持,将多个信息转化成单一的request/response对象 + pipeline.addLast(new HttpObjectAggregator(8000)); + + // 对WebSocket协议的支持 + // 将http协议升级为ws协议 + pipeline.addLast(new WebSocketServerProtocolHandler(nettyConfig.getPath())); + +// // SSL处理器 +// SSLContext sslContext = createSslContext("JKS", "D:\\jks\\xcx\\xcx.jks","1234567"); +// //SSLEngine 此类允许使用ssl安全套接层协议进行安全通信 +// SSLEngine sslEngine = sslContext.createSSLEngine(); +// sslEngine.setNeedClientAuth(false); +// sslEngine.setUseClientMode(false); +// pipeline.addFirst("ssl", new SslHandler(sslEngine)); + + // 自定义处理handler + pipeline.addLast(websocketHandler); + } + + /** + * @param type 证书类型 + * @param path 证书路径 + * @param password 证书密码 + * @return SSLContext + */ + public SSLContext createSslContext(String type , String path , String password) throws Exception { + InputStream inputStream = Files.newInputStream(Paths.get(path)); + char[] passArray = password.toCharArray(); + SSLContext sslContext = SSLContext.getInstance("SSLv3"); + KeyStore ks = KeyStore.getInstance(type); + //加载keytool 生成的文件 + ks.load(inputStream, passArray); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(ks, passArray); + sslContext.init(kmf.getKeyManagers(), null, null); + inputStream.close(); + return sslContext; + } + +} diff --git a/admin/src/main/java/com/hcy/admin/netty/WebsocketHandler.java b/admin/src/main/java/com/hcy/admin/netty/WebsocketHandler.java new file mode 100644 index 0000000..ac1bef7 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/netty/WebsocketHandler.java @@ -0,0 +1,72 @@ +package com.hcy.admin.netty; + +import com.alibaba.fastjson2.JSON; +import com.hcy.common.core.AjaxResult; +import com.hcy.common.entity.staff.Staff; +import com.hcy.common.enums.staff.StaffReceiveOrderTypeEnum; +import com.hcy.common.mapper.staff.StaffMapper; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 自定义Websocket处理类 + * Websocket数据以帧的形式进行处理 + * 需要设置通道共享 + **/ +@Component +@Log4j2 +@ChannelHandler.Sharable +public class WebsocketHandler extends SimpleChannelInboundHandler { + + public static List clientList = new ArrayList<>(); + + public static void sendMessageToClient(String msg){ + for (Channel channel : clientList) { + channel.writeAndFlush(new TextWebSocketFrame(msg)); + } + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + clientList.add(ctx.channel()); + ctx.channel().writeAndFlush(new TextWebSocketFrame("数据大屏客户端连接成功")); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + System.out.println("客户端与服务端连接关闭"); + clientList.remove(ctx.channel()); + super.channelInactive(ctx); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + super.channelReadComplete(ctx); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame tf) { + String text = tf.text(); + for (Channel channel : clientList) { + if(ctx.channel() != channel){ + channel.writeAndFlush(new TextWebSocketFrame(text)); + } + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + clientList.remove(ctx.channel()); + super.exceptionCaught(ctx, cause); + } +} diff --git a/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java index 4da6143..d542ddb 100644 --- a/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/client/impl/EquipmentServiceImpl.java @@ -350,8 +350,8 @@ public class EquipmentServiceImpl implements IEquipmentService { .eq("is_delete", 0) .last("limit 1")); - if (model != null){ - return true; + if (ObjectUtil.isNotNull(model) && model.getId().equals(bo.getId())) { + return false; } return false; } diff --git a/admin/src/main/java/com/hcy/admin/service/crontab/impl/CouponCrontab.java b/admin/src/main/java/com/hcy/admin/service/crontab/impl/CouponCrontab.java deleted file mode 100644 index c684d9a..0000000 --- a/admin/src/main/java/com/hcy/admin/service/crontab/impl/CouponCrontab.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hcy.admin.service.crontab.impl; - -import com.hcy.admin.service.coupon.ICouponService; -import com.hcy.admin.service.coupon.IUserCouponService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; - -@Slf4j -@Service(value = "couponCrontab") -@Transactional(rollbackFor = Exception.class) -public class CouponCrontab { - - @Resource - private ICouponService iCouponService; - - @Resource - private IUserCouponService iUserCouponService; - - public void sendCoupon(){ - log.info("发放优惠券"); - iCouponService.sendCoupon(); - log.info("停用优惠券"); - iCouponService.stopSendTimeEndOrUseTimeEndCoupon(); - } - - public void deleteUserGetCoupon(){ - log.info("删除用户过期5天的优惠券"); - iUserCouponService.deleteUserGetCoupon(); - } -} diff --git a/admin/src/main/java/com/hcy/admin/service/crontab/impl/OrderCrontab.java b/admin/src/main/java/com/hcy/admin/service/crontab/impl/OrderCrontab.java index 3f664a3..e1b6cf0 100644 --- a/admin/src/main/java/com/hcy/admin/service/crontab/impl/OrderCrontab.java +++ b/admin/src/main/java/com/hcy/admin/service/crontab/impl/OrderCrontab.java @@ -64,6 +64,7 @@ public class OrderCrontab { ClientMapper clientMapper; public void orderTimeOut(){ + log.info("orderTimeOut 被执行......"); SystemConfiguration systemConfiguration = systemConfigurationMapper.selectById(1); //检修单和巡检单超时时间 Integer repairerAutoOrderTime = systemConfiguration.getRepairerAutoOrderTime(); @@ -138,6 +139,7 @@ public class OrderCrontab { } public void equipmentPollingPeriod(){ + log.info("equipmentPollingPeriod 被执行......"); //获取当前时间 Calendar currentTime = Calendar.getInstance(); diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java index 23affb4..33a881a 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/MaintenanceOrderServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hcy.admin.AdminThreadLocal; +import com.hcy.admin.netty.WebsocketHandler; import com.hcy.admin.service.order.IMaintenanceOrderService; import com.hcy.admin.service.region.IDevRegionService; import com.hcy.admin.validate.common.PageParam; @@ -328,6 +329,8 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { MaintenanceOrder maintenanceOrder = maintenanceOrderMapper.findLastMaintenanceOrderByTime(TimeUtil.getCurrentTimeYYYYMMDD()); model.setOrderNo(OrderUtil.getOrderNo(maintenanceOrder == null ? "" :maintenanceOrder.getOrderNo())); model.setCreatorId(AdminThreadLocal.getAdminId().longValue()); + Date date = new Date(); + model.setCreateTime(date); maintenanceOrderMapper.insert(model); //新增订单操作记录 @@ -345,6 +348,12 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { ,"【"+AdminThreadLocal.get("username")+"】指派检修单给检修员【"+user.getUsername()+"】"); } } + + SystemAuthAdmin systemAuthAdmin = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId()); + Client client = clientMapper.findClientById(maintenanceOrderParam.getClientId()); + if(client != null && systemAuthAdmin != null){ + WebsocketHandler.sendMessageToClient("【"+systemAuthAdmin.getUsername()+"】于【"+TimeUtil.dateTransitionString(date)+"】为客户【"+client.getClientName()+"】新建检修工单,报修设备【"+equipment.getName()+"】;"); + } } /** diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java index 6b95944..8b0a3eb 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RoutingInspectionOrderServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hcy.admin.AdminThreadLocal; +import com.hcy.admin.netty.WebsocketHandler; import com.hcy.admin.service.order.IRoutingInspectionOrderService; import com.hcy.admin.service.region.IDevRegionService; import com.hcy.admin.validate.common.PageParam; @@ -28,6 +29,7 @@ import com.hcy.common.mapper.fault.FaultMapper; import com.hcy.common.mapper.order.RoutingInspectionOrderMapper; import com.hcy.common.mapper.system.SystemAuthAdminMapper; import com.hcy.common.mapper.user.UserMapper; +import com.hcy.common.utils.TimeUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -193,12 +195,20 @@ public class RoutingInspectionOrderServiceImpl implements IRoutingInspectionOrde model.setRemark(routingInspectionOrderParam.getRemark()); // 备注 model.setReceiverType(routingInspectionOrderParam.getReceiverType()); // 接单类型 0-区域派单;1-距离派单 model.setOrderDistance(routingInspectionOrderParam.getOrderDistance()); // 抢单最大公里数 - model.setCreateTime(new Date()); //创建时间 + Date currentTime = new Date(); + model.setCreateTime(currentTime); //创建时间 // 获取当前的用户 - String adminId = AdminThreadLocal.get("adminId").toString(); - model.setCreatorId(Integer.parseInt(adminId)); // 创建人id + model.setCreatorId(AdminThreadLocal.getAdminId()); // 创建人id routingInspectionOrderMapper.insert(model); + + + SystemAuthAdmin systemAuthAdmin = systemAuthAdminMapper.findSystemAuthAdminById(AdminThreadLocal.getAdminId()); + Client client = clientMapper.findClientById(routingInspectionOrderParam.getClientId()); + Equipment equipment = equipmentMapper.findEquipmentById(routingInspectionOrderParam.getEquipmentId()); + if(client != null && systemAuthAdmin != null && equipment != null){ + WebsocketHandler.sendMessageToClient("【"+systemAuthAdmin.getUsername()+"】于【"+TimeUtil.dateTransitionString(currentTime)+"】为客户【"+client.getClientName()+"】新建巡检工单,报修设备【"+equipment.getName()+"】;"); + } } /** diff --git a/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java index 7d0bb14..af562ae 100644 --- a/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/system/impl/SystemAuthAdminServiceImpl.java @@ -121,7 +121,6 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { BeanUtils.copyProperties(param,systemAuthAdminDto); IPage iPage = systemAuthAdminMapper.list(new Page<>(page, limit), systemAuthAdminDto); - long total = 0; List list = new LinkedList<>(); for (SystemAuthAdminDto dto : iPage.getRecords()) { @@ -166,6 +165,7 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { vo.setReceiveOrderStatus(user.getReceiveOrderStatus()); } + list.add(item); } return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); @@ -366,55 +366,41 @@ public class SystemAuthAdminServiceImpl implements ISystemAuthAdminService { systemAuthAdminMapper.insert(model); //获取管理员id Long adminId = model.getId().longValue(); - //新增用户的时候,角色是检修员或维修员,就在检修员仓库或者维修员仓库下新增一个仓库 - Integer role = Integer.valueOf(systemAuthAdminParam.getRole()); //获取角色 + Map regionMap = regionService.getRegionMap(); String province = regionMap.get(model.getProvinceId()); String city = regionMap.get(model.getCityId()); String district = regionMap.get(model.getDistrictId()); - if(role == RoleEnum.OVERHAUL_RESULT.getStatus()){ - Warehouse warehouse = new Warehouse(); - warehouse.setPid(Long.valueOf(WarehouseEnum.MAINTANCE_WAREHOUSE.getStatus())); //仓库上级id - warehouse.setWarehouseName(systemAuthAdminParam.getNickname()); //仓库名称 - warehouse.setWarehouseCoding(systemAuthAdminParam.getNickname() + "-" + systemAuthAdminParam.getPhone()); // 仓库编码 - warehouse.setWarehouseAddress(province + city + district); // 仓库地址 - warehouseMapper.insert(warehouse); - //获取仓库id - Long warehouseId = warehouse.getId().longValue(); - //获取小程序用户id - SystemAuthAdmin authAdmin = systemAuthAdminMapper.selectOne( - new QueryWrapper() - .eq("id", adminId) - .eq("is_delete", 0)); - User user= userMapper.selectOne( - new QueryWrapper() - .eq("id", authAdmin.getUserId()) - .eq("is_delete", 0)); - user.setWarehouseId(warehouseId); - userMapper.updateById(user);//绑定仓库 - - }else if(role == RoleEnum.MAINTENANCE_MAN.getStatus()){ - Warehouse warehouse = new Warehouse(); - warehouse.setPid(Long.valueOf(WarehouseEnum.REPAIR_WAREHOUSE.getStatus())); //仓库上级id - warehouse.setWarehouseName(systemAuthAdminParam.getNickname()); //仓库名称 - warehouse.setWarehouseCoding(systemAuthAdminParam.getNickname() + "-" + systemAuthAdminParam.getPhone()); // 仓库编码 - warehouse.setWarehouseAddress(province + city + district); // 仓库地址 - warehouseMapper.insert(warehouse); - //获取仓库id - Long warehouseId = warehouse.getId().longValue(); - //获取小程序用户id - SystemAuthAdmin authAdmin = systemAuthAdminMapper.selectOne( - new QueryWrapper() - .eq("id", adminId) - .eq("is_delete", 0)); - User user= userMapper.selectOne( - new QueryWrapper() - .eq("id", authAdmin.getUserId()) - .eq("is_delete", 0)); - user.setWarehouseId(warehouseId); - userMapper.updateById(user);//绑定仓库 + //新增用户的时候,角色是检修员或维修员,就在检修员仓库或者维修员仓库下新增一个仓库 + //获取当前新增用户角色 + List roleList = Arrays.asList(systemAuthAdminParam.getRole().split(",")); + if(roleList.contains(String.valueOf(RoleEnum.OVERHAUL_RESULT.getStatus()))){ + addWarehouse(systemAuthAdminParam,province + city + district,adminId,WarehouseEnum.MAINTANCE_WAREHOUSE.getStatus()); } + + if(roleList.contains(String.valueOf(RoleEnum.MAINTENANCE_MAN.getStatus()))){ + addWarehouse(systemAuthAdminParam,province + city + district,adminId,WarehouseEnum.REPAIR_WAREHOUSE.getStatus()); + } + } + + private void addWarehouse(SystemAuthAdminParam systemAuthAdminParam,String addressDetail,Long adminId,Integer roleType) { + Warehouse warehouse = new Warehouse(); + warehouse.setPid(Long.valueOf(roleType)); //仓库上级id + warehouse.setWarehouseName(systemAuthAdminParam.getNickname()); //仓库名称 + warehouse.setWarehouseCoding(systemAuthAdminParam.getUsername() + "-" + systemAuthAdminParam.getPhone()); // 仓库编码 + warehouse.setWarehouseAddress(addressDetail); // 仓库地址 + warehouseMapper.insert(warehouse); + //获取仓库id + Long warehouseId = warehouse.getId(); + //获取小程序用户id + SystemAuthAdmin authAdmin = systemAuthAdminMapper.selectOne( + new QueryWrapper() + .eq("id", adminId) + .eq("is_delete", 0)); + User user= userMapper.findUserById(authAdmin.getUserId()); + user.setWarehouseId(warehouseId); + userMapper.updateById(user);//绑定仓库 } /** diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index 73ae3e7..5a138dd 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -69,5 +69,8 @@ mybatis-plus: table-prefix: la_ # 设置表前缀 configuration-properties: prefix: la_ # 自定义表前缀标签${prefix} -# configuration: #打印sql日志 -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file + +netty: + port: 8081 + path: /admin + diff --git a/common/src/main/java/com/hcy/common/enums/order/OrderOperateRecordEnum.java b/common/src/main/java/com/hcy/common/enums/order/OrderOperateRecordEnum.java index 1f56213..5fc3d91 100644 --- a/common/src/main/java/com/hcy/common/enums/order/OrderOperateRecordEnum.java +++ b/common/src/main/java/com/hcy/common/enums/order/OrderOperateRecordEnum.java @@ -24,6 +24,7 @@ public enum OrderOperateRecordEnum { RECEIVE_GOODS(8,"收货"), FILL_IN_RECEIPT(10,"填写回单"), FINISH(11,"完成"), + REFUND(11,"退单"), // 描述类型 QUOTATION(0,"报价"), diff --git a/common/src/main/java/com/hcy/common/mapper/plant/PlantMapper.java b/common/src/main/java/com/hcy/common/mapper/plant/PlantMapper.java index 7ff5512..a584faf 100644 --- a/common/src/main/java/com/hcy/common/mapper/plant/PlantMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/plant/PlantMapper.java @@ -14,6 +14,6 @@ import org.apache.ibatis.annotations.Select; @Mapper public interface PlantMapper extends IBaseMapper { - @Select("select * from la_plant where is_delete = 0 and id = #{adminId}") - Plant findPlantByAdminId(@Param("adminId") Integer adminId); + @Select("select * from la_plant where is_delete = 0 and id = #{id}") + Plant findPlantByAdminId(@Param("id") Long id); } diff --git a/common/src/main/java/com/hcy/common/mapper/user/UserMapper.java b/common/src/main/java/com/hcy/common/mapper/user/UserMapper.java index fbc4e46..7a9c6ea 100644 --- a/common/src/main/java/com/hcy/common/mapper/user/UserMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/user/UserMapper.java @@ -35,7 +35,7 @@ public interface UserMapper extends IBaseMapper { * @param phone 手机号 * @return 用户信息 */ - @Select("select * from la_user where mobile = #{phone}") + @Select("select * from la_user where is_delete = 0 and mobile = #{phone}") User getUserByPhone(@Param("phone") String phone); @Select("select * from la_user where is_delete = 0 and id = #{id}") diff --git a/common/src/main/java/com/hcy/common/utils/TimeUtil.java b/common/src/main/java/com/hcy/common/utils/TimeUtil.java index 4cb27e7..e6a3b1c 100644 --- a/common/src/main/java/com/hcy/common/utils/TimeUtil.java +++ b/common/src/main/java/com/hcy/common/utils/TimeUtil.java @@ -19,6 +19,10 @@ public class TimeUtil { private static final SimpleDateFormat SDF_YYYY_MM_DD = new SimpleDateFormat("yyyyMMdd"); + public static String dateTransitionString(Date date) { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + /** * 时间戳转日期(默认格式) * diff --git a/front/src/main/java/com/hcy/front/service/order/IMaintenanceOrderService.java b/front/src/main/java/com/hcy/front/service/order/IMaintenanceOrderService.java index 465114f..660b07a 100644 --- a/front/src/main/java/com/hcy/front/service/order/IMaintenanceOrderService.java +++ b/front/src/main/java/com/hcy/front/service/order/IMaintenanceOrderService.java @@ -106,7 +106,7 @@ public interface IMaintenanceOrderService { /** * 统计工单状态数量 - * @return + * @return OrderStatusCountVo */ OrderStatusCountVo orderStatusCount(MaintenanceOrderParam maintenanceOrderParam); } diff --git a/front/src/main/java/com/hcy/front/service/order/impl/MaintenanceOrderServiceImpl.java b/front/src/main/java/com/hcy/front/service/order/impl/MaintenanceOrderServiceImpl.java index 1afdb9f..24dcdc9 100644 --- a/front/src/main/java/com/hcy/front/service/order/impl/MaintenanceOrderServiceImpl.java +++ b/front/src/main/java/com/hcy/front/service/order/impl/MaintenanceOrderServiceImpl.java @@ -327,6 +327,7 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { } @Override + @Transactional public void refundOrder(MaintenanceOrderParam maintenanceOrderParam) { MaintenanceOrder maintenanceOrder = maintenanceOrderMapper.findMaintenanceOrderById(maintenanceOrderParam.getId()); Assert.notNull(maintenanceOrder, "数据不存在"); @@ -340,6 +341,11 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { maintenanceOrder.getOrderStatus() == MaintenanceOrderStatusEnum.PENDING_ORDER.getStatus()){ maintenanceOrder.setOrderStatus(MaintenanceOrderStatusEnum.CLOSED.getStatus()); maintenanceOrderMapper.updateById(maintenanceOrder); + + //新增检修单操作记录 + orderOperateRecordService.addMaintenanceOrder(maintenanceOrder.getId() + ,OrderOperateRecordEnum.REFUND.getDesc() + ,"客户【"+FrontThreadLocal.get("username")+"】已退单。退单原因:"+maintenanceOrderParam.getCancelCause()); }else{ throw new OperateException("当前订单状态不可退单"); } @@ -354,6 +360,11 @@ public class MaintenanceOrderServiceImpl implements IMaintenanceOrderService { maintenanceOrder.setOrderStatus(MaintenanceOrderStatusEnum.CHARGEBACK.getStatus()); } + //新增检修单操作记录 + orderOperateRecordService.addMaintenanceOrder(maintenanceOrder.getId() + ,OrderOperateRecordEnum.REFUND.getDesc() + ,"【"+FrontThreadLocal.get("username")+"】已退单。退单原因:"+maintenanceOrderParam.getCancelCause()); + maintenanceOrderMapper.updateById(maintenanceOrder); }else{ throw new OperateException("当前订单状态不可退单"); diff --git a/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java index 805363d..5e1ff9c 100644 --- a/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java +++ b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java @@ -133,8 +133,7 @@ public class RepairOrderServiceImpl implements IRepairOrderService { List repairOrderDtoList = repairOrderMapper.list(repairOrderDto); SystemAuthAdmin systemAuthAdmin = systemAuthAdminMapper.findSystemAuthAdminByUserId(FrontThreadLocal.getUserId()); - //获取工厂 - Plant plant = plantMapper.findPlantByAdminId(systemAuthAdmin.getPlantId()); + List returnData = new LinkedList<>(); for (RepairOrderDto item : repairOrderDtoList) { @@ -145,19 +144,14 @@ public class RepairOrderServiceImpl implements IRepairOrderService { , repairOrderParam.getLongitude(), repairOrderParam.getLatitude()); if(item.getReceiverType() == OrderStateEnum.REGIONAL_DISPATCH.getStatus()){ - /*if(item.getEquipmentProvinceId().equals(systemAuthAdmin.getProvinceId()) && - item.getEquipmentCityId().equals(systemAuthAdmin.getCityId()) && - item.getEquipmentDistrictId().equals(systemAuthAdmin.getDistrictId()) ){ - // 计算距离 - RepairOrderListVo vo = new RepairOrderListVo(); - BeanUtils.copyProperties(item, vo); - vo.setDistance(distance); - returnData.add(vo); - }*/ - if(item.getEquipmentProvinceId().equals(plant.getProvinceId()) && - item.getEquipmentCityId().equals(plant.getCityId()) && - item.getEquipmentDistrictId().equals(plant.getDistrictId()) ){ + SystemAuthAdmin systemAuthAdminByUserId = systemAuthAdminMapper.findSystemAuthAdminByUserId(Math.toIntExact(item.getCreatorId())); + //获取工厂 + Plant plant = plantMapper.findPlantByAdminId(Long.valueOf(systemAuthAdminByUserId.getPlantId())); + + if(systemAuthAdmin.getProvinceId().equals(plant.getProvinceId()) && + systemAuthAdmin.getCityId().equals(plant.getCityId()) && + systemAuthAdmin.getDistrictId().equals(plant.getDistrictId()) ){ // 计算距离 RepairOrderListVo vo = new RepairOrderListVo();