当前位置: 首页 > news >正文

若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)

idea抽取独立方法快捷键:ctrl+alt+m

TaskDto.java

package com.dkd.manage.service.impl;import java.time.Duration;
import java.util.List;
import java.util.stream.Collectors;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.dkd.common.constant.DkdContants;
import com.dkd.common.exception.ServiceException;
import com.dkd.common.utils.DateUtils;
import com.dkd.common.utils.bean.BeanUtils;
import com.dkd.manage.domain.Emp;
import com.dkd.manage.domain.TaskDetails;
import com.dkd.manage.domain.VendingMachine;
import com.dkd.manage.domain.dto.TaskDetailDto;
import com.dkd.manage.domain.dto.TaskDto;
import com.dkd.manage.domain.vo.TaskVo;
import com.dkd.manage.service.IEmpService;
import com.dkd.manage.service.ITaskDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.dkd.manage.mapper.TaskMapper;
import com.dkd.manage.domain.Task;
import com.dkd.manage.service.ITaskService;/*** 工单管理Service业务层处理* * @author zzq* @date 2024-08-01*/
@Service
public class TaskServiceImpl implements ITaskService 
{@Autowiredprivate TaskMapper taskMapper;
@Autowired
private VendingMachineServiceImpl vendingMachineService;
@Autowired
private IEmpService empService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ITaskDetailsService taskDetailsService;/*** 查询工单管理* * @param taskId 工单管理主键* @return 工单管理*/@Overridepublic Task selectTaskByTaskId(Long taskId){return taskMapper.selectTaskByTaskId(taskId);}/*** 查询工单管理列表* * @param task 工单管理* @return 工单管理*/@Overridepublic List<Task> selectTaskList(Task task){return taskMapper.selectTaskList(task);}/*** 新增工单管理* * @param task 工单管理* @return 结果*/@Overridepublic int insertTask(Task task){task.setCreateTime(DateUtils.getNowDate());return taskMapper.insertTask(task);}/*** 修改工单管理* * @param task 工单管理* @return 结果*/@Overridepublic int updateTask(Task task){task.setUpdateTime(DateUtils.getNowDate());return taskMapper.updateTask(task);}/*** 批量删除工单管理* * @param taskIds 需要删除的工单管理主键* @return 结果*/@Overridepublic int deleteTaskByTaskIds(Long[] taskIds){return taskMapper.deleteTaskByTaskIds(taskIds);}/*** 删除工单管理信息* * @param taskId 工单管理主键* @return 结果*/@Overridepublic int deleteTaskByTaskId(Long taskId){return taskMapper.deleteTaskByTaskId(taskId);}/*** 查询工单类表* @param taskVo*      * @return TaskVo集合*/@Overridepublic List<TaskVo> selectTaskVoList(Task taskVo) {return taskMapper.selectTaskVoList(taskVo);}/***新增运营、运维工单* @param taskDto* @return 结果*/@Overridepublic int insertTaskDto(TaskDto taskDto) {//1、查询售货机是否存在VendingMachine vm = vendingMachineService.selectVendingMachineByInnerCode(taskDto.getInnerCode());if(vm==null){throw new ServiceException("设备不存在");}//2、校验售货机状态与工单类型是否相符checkCreateTask(vm.getVmStatus(), taskDto.getProductTypeId());//3、检查设备是否有未完成的同类型工单hasTask(taskDto);//4、查询并校验员工是否存在Emp emp = empService.selectEmpById(taskDto.getUserId());if(emp==null){throw new ServiceException("员工不存在");}//5、校验员工区域是否匹配if(!emp.getRegionId().equals(vm.getRegionId())){throw new ServiceException("员工区域不匹配");}//6、将Dto转为po并补充属性,保存工单Task task= BeanUtil.copyProperties(taskDto,Task.class);//属性复制task.setTaskStatus(DkdContants.TASK_STATUS_CREATE);//创建工单task.setUserName(emp.getUserName());//执行人名称task.setRegionId(vm.getRegionId());//所属区域idtask.setAddr(vm.getAddr());//地址task.setCreateTime(DateUtils.getNowDate());//创建时间task.setTaskCode(generateTaskCode());//工单编号int taskResult = taskMapper.insertTask(task);//7、判断是否为补货工单if(taskDto.getProductTypeId().equals(DkdContants.TASK_TYPE_SUPPLY)){//8、保存工单详情List<TaskDetailDto>details=taskDto.getDetails();if(CollUtil.isEmpty(details)){throw new ServiceException("补货工单详情不能为空");}//将dto转为po补充属性List<TaskDetails>taskDetailsList=details.stream().map(detail -> {TaskDetails taskDetails=BeanUtil.copyProperties(detail,TaskDetails.class);taskDetails.setTaskId(task.getTaskId());return taskDetails;}).collect(Collectors.toList());//批量新增taskDetailsService.insertTaskDetailsBatch(taskDetailsList);}return taskResult;}//生成并获取当天工单编号(唯一标识)private String generateTaskCode(){//获取当前日期并格式化为“yyyymmdd”String dateStr=DateUtils.getDate().replaceAll("-", "");//根据日期生成redis的键String key="dkd.task.code."+dateStr;//判断key是否存在if(!redisTemplate.hasKey(key)){//如果key不存在,设置初始值为1,并指定过期时间为1天redisTemplate.opsForValue().set(key,1, Duration.ofDays(1));//返回工单编号(日期+0001)return dateStr+"0001";}//如果key存在,计数器+1(0001),确保字符串长度为4位return   StrUtil.padPre(redisTemplate.opsForValue().increment(key).toString(),4,"0");}//检查是否有未完成的同类型的工单private int hasTask(TaskDto taskDto) {//创建task条件对象,并设置编号和工单类型,以及工单状态为进行中Task taskParam = new Task();taskParam.setInnerCode(taskDto.getInnerCode());taskParam.setProductTypeId(taskDto.getProductTypeId());taskParam.setTaskStatus(DkdContants.TASK_STATUS_PROGRESS);//调用taskMapper查询数据库查看是否有符合条件的工单列表List<Task> taskList = taskMapper.selectTaskList(taskParam);//如果存在未完成的同类型工单,抛出异常if(taskList!=null&&taskList.size()>0){throw new ServiceException("设备有未完成的工单,不能重复创建");}return 0;}// 校验售货机状态与工单类型是否相符
private void checkCreateTask(Long vmStatus,Long productTypeId){//如果是投放工单,设备在运行中,抛出异常if(productTypeId ==DkdContants.TASK_TYPE_DEPLOY&&vmStatus==DkdContants.VM_STATUS_RUNNING){throw new ServiceException("设备不在运行中,无法进行投放");}//如果是投放工单,设备不在运行中,抛出异常if(productTypeId ==DkdContants.TASK_TYPE_SUPPLY&&vmStatus!=DkdContants.VM_STATUS_RUNNING){throw new ServiceException("设备不在运行中,无法进行补货");}//如果是补货工单,设备不在运行中,抛出异常if(productTypeId ==DkdContants.TASK_TYPE_REPAIR&&vmStatus!=DkdContants.VM_STATUS_RUNNING){throw new ServiceException("设备不在运行中,无法进行补货");}//如果的撤机工单,设备不在运行中,抛出异常if(productTypeId ==DkdContants.TASK_TYPE_REVOKE&&vmStatus!=DkdContants.VM_STATUS_RUNNING){throw new ServiceException("设备不在运行中,无法进行撤机");}
}
}

TaskController.java

package com.dkd.manage.controller;import java.util.List;
import javax.servlet.http.HttpServletResponse;import com.dkd.manage.domain.dto.TaskDto;
import com.dkd.manage.domain.vo.TaskVo;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.dkd.common.annotation.Log;
import com.dkd.common.core.controller.BaseController;
import com.dkd.common.core.domain.AjaxResult;
import com.dkd.common.enums.BusinessType;
import com.dkd.manage.domain.Task;
import com.dkd.manage.service.ITaskService;
import com.dkd.common.utils.poi.ExcelUtil;
import com.dkd.common.core.page.TableDataInfo;/*** 工单管理Controller* * @author zzq* @date 2024-08-01*/
@RestController
@RequestMapping("/manage/task")
public class TaskController extends BaseController
{@Autowiredprivate ITaskService taskService;/*** 查询工单管理列表*/@PreAuthorize("@ss.hasPermi('manage:task:list')")@GetMapping("/list")public TableDataInfo list(Task task){startPage();List<TaskVo> voList = taskService.selectTaskVoList(task);return getDataTable(voList);}/*** 导出工单管理列表*/@PreAuthorize("@ss.hasPermi('manage:task:export')")@Log(title = "工单管理", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Task task){List<Task> list = taskService.selectTaskList(task);ExcelUtil<Task> util = new ExcelUtil<Task>(Task.class);util.exportExcel(response, list, "工单管理数据");}/*** 获取工单管理详细信息*/@PreAuthorize("@ss.hasPermi('manage:task:query')")@GetMapping(value = "/{taskId}")public AjaxResult getInfo(@PathVariable("taskId") Long taskId){return success(taskService.selectTaskByTaskId(taskId));}/*** 新增工单管理*/@PreAuthorize("@ss.hasPermi('manage:task:add')")@Log(title = "工单管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody TaskDto taskDto){//设置指派人id(登录用户)taskDto.setAssigneeId(getUserId());return toAjax(taskService.insertTaskDto(taskDto));}/*** 修改工单管理*/@PreAuthorize("@ss.hasPermi('manage:task:edit')")@Log(title = "工单管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Task task){return toAjax(taskService.updateTask(task));}/*** 删除工单管理*/@PreAuthorize("@ss.hasPermi('manage:task:remove')")@Log(title = "工单管理", businessType = BusinessType.DELETE)@DeleteMapping("/{taskIds}")public AjaxResult remove(@PathVariable Long[] taskIds){return toAjax(taskService.deleteTaskByTaskIds(taskIds));}
}

相关文章:

若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)

idea抽取独立方法快捷键&#xff1a;ctrlaltm TaskDto.java package com.dkd.manage.service.impl;import java.time.Duration; import java.util.List; import java.util.stream.Collectors;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUti…...

ModuleNotFoundError: No module named ‘keras.layers.core‘怎么解决

问题 ModuleNotFoundError: No module named keras.layers.core&#xff0c;如图所示&#xff1a; 如何解决 将from keras.layers.core import Dense,Activation改为from tensorflow.keras.layers import Dense,Activation&#xff0c;如图所示&#xff1a; 顺利运行&#xf…...

C++(三)----内存管理

1.C/C内存分布 看下面这个问题&#xff08;考考你们之前学的咋样&#xff09;&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pCh…...

使用 ShuffleNet 模型在 CIFAR-100 数据集上的图像分类

简介 在深度学习领域&#xff0c;图像分类任务是衡量算法性能的重要基准。本文将介绍我们如何使用一种高效的卷积神经网络架构——ShuffleNet&#xff0c;来处理 CIFAR-100 数据集上的图像分类问题。 CIFAR-100 数据集简介 CIFAR-100 数据集是一个广泛使用的图像分类数据集&…...

怎么利用短信接口发送文字短信

在当今这个快节奏的数字时代&#xff0c;即时通讯已成为人们日常生活和工作中不可或缺的一部分。而短信接口&#xff08;SMS Interface&#xff09;&#xff0c;作为传统与现代通讯技术结合的典范&#xff0c;凭借其高效、稳定、广泛覆盖的特性&#xff0c;在众多领域发挥着不可…...

【C#生态园】提升C#开发效率:掌握这六款单元测试利器

从xUnit到SpecFlow&#xff1a;C#测试驱动开发全指南 前言 在C#开发中&#xff0c;单元测试和模拟框架是至关重要的工具&#xff0c;它们可以帮助开发人员确保代码的质量和可靠性。本文将介绍一些常用的C#单元测试框架和相关库&#xff0c;包括xUnit、NUnit、Moq、FluentAsse…...

【QT】自制一个简单的小闹钟,能够实现语音播报功能

做了一个自制的小闹钟&#xff0c;能够自己输入时间&#xff0c;以及对应的闹铃&#xff0c;时间到了自动播放设定的闹铃&#xff0c;可以随时取消重新设定&#xff0c;采用分文件编译 注意&#xff1a;需要在.pro文件中加入&#xff1a;QT core gui texttospeech 代码…...

基于深度学习的图像描述生成

基于深度学习的图像描述生成&#xff08;Image Captioning&#xff09;是一种将计算机视觉与自然语言处理结合的任务&#xff0c;其目标是通过自动生成自然语言来描述输入的图像。该技术能够理解图像中的视觉内容&#xff0c;并生成相应的文本描述&#xff0c;广泛应用于视觉问…...

Linux和C语言(Day11)

一、学习内容 讲解有参函数 形参 和 实参 形参——定义时的参数&#xff0c;形式上的参数&#xff0c;没有实际意义&#xff0c;语法上必须带有数据类型 void fun(int a,int b); void fun(int a[],int n); void fun(char *s); 可以是&#xff1a;变量、数组、指针 实参——调用…...

使用Zlib库进行多文件或者多文件夹的压缩解压缩

zlib库可在git上自己clone下来然后使用cmake工具生成解决方案&#xff0c;编译、生成zlib二进制文件。然后将zlib库引入项目&#xff1a; //zlib库支持 #include "../zlib/include/zlib.h" #ifdef _DEBUG #pragma comment(lib, "../zlib/lib/zlibd.lib") …...

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展&#xff0c;大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分&#xff0c;企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战&#xff0c;CSGHub、Nvidia和阿里云计算巢强强联手&a…...

opencv的球面投影

cv::detail::SphericalProjector 在全景图像拼接任务中&#xff0c;可能需要对多个图像进行球面投影以实现无缝拼接。每个cv::detail::SphericalProjector可以负责一个图像的球面投影操作。通过将多个这样的投影器存储在std::vector中&#xff0c;可以对一组图像依次进行投影处…...

5. 去中心化应用(dApp)

去中心化应用&#xff08;dApp&#xff09; 去中心化应用&#xff08;dApp&#xff09;是基于区块链技术构建的应用程序&#xff0c;其核心特性是去中心化、透明和开放。dApp与传统应用有许多显著的区别&#xff0c;它们在实现和功能上都带来了新的变革。以下是对dApp的详细介…...

k8s服务发布Ingress

Kubernetes暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff0c;通俗来讲&#xff0c;ingress和之前提到的Service、Deployment&#xff0c;也是一个k8s的资源类型&#xff0c;ingress用于实现用域名的方式访问k8s内部应用。 In…...

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…...

在 Vite 项目中自动为每个 Vue 文件导入 base.less

在 Vue.js 项目中&#xff0c;使用 Less 作为 CSS 预处理器时&#xff0c;我们通常会创建一个全局的样式文件&#xff08;如 base.less&#xff09;&#xff0c;用于存放一些全局变量、混合、通用样式等。为了避免在每个 Vue 组件中手动导入这个文件&#xff0c;我们可以通过配…...

RUST 学习之全局变量

RUST 全局变量 rust 全局变量编译期初始化的全局变量静态常量静态变量原子类型的静态变量 运行期初始化的全局变量lazy_staticBox::leakOnceCell & OnceLock 参考文档 rust 全局变量 编译期初始化的全局变量 静态常量 在编译期初始化&#xff0c;所以其赋值只能是表达式…...

代码随想录八股训练营第三十九天| C++

前言 一、说一下 lambda函数&#xff1f; 1.1.Lambda 函数的一般语法如下: 1.2.捕获子句&#xff1a; 二、C 怎么实现一个单例模式&#xff1f; 2.1.懒汉式&#xff08;线程不安全&#xff09;: 2.2.饿汉式&#xff08;线程安全&#xff09;: 2.3.双重检查锁定&#xff…...

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…...

单链表的实现(C语言)

目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构&#xff0c;物理结构不连续&#xff0c;逻辑结构是连续的&#xff0c;在计算机中链表的实际存储是按照一个结点内存放…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...