若依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抽取独立方法快捷键: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,如图所示: 如何解决 将from keras.layers.core import Dense,Activation改为from tensorflow.keras.layers import Dense,Activation,如图所示: 顺利运行…...
C++(三)----内存管理
1.C/C内存分布 看下面这个问题(考考你们之前学的咋样): 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 数据集上的图像分类
简介 在深度学习领域,图像分类任务是衡量算法性能的重要基准。本文将介绍我们如何使用一种高效的卷积神经网络架构——ShuffleNet,来处理 CIFAR-100 数据集上的图像分类问题。 CIFAR-100 数据集简介 CIFAR-100 数据集是一个广泛使用的图像分类数据集&…...
怎么利用短信接口发送文字短信
在当今这个快节奏的数字时代,即时通讯已成为人们日常生活和工作中不可或缺的一部分。而短信接口(SMS Interface),作为传统与现代通讯技术结合的典范,凭借其高效、稳定、广泛覆盖的特性,在众多领域发挥着不可…...
【C#生态园】提升C#开发效率:掌握这六款单元测试利器
从xUnit到SpecFlow:C#测试驱动开发全指南 前言 在C#开发中,单元测试和模拟框架是至关重要的工具,它们可以帮助开发人员确保代码的质量和可靠性。本文将介绍一些常用的C#单元测试框架和相关库,包括xUnit、NUnit、Moq、FluentAsse…...
【QT】自制一个简单的小闹钟,能够实现语音播报功能
做了一个自制的小闹钟,能够自己输入时间,以及对应的闹铃,时间到了自动播放设定的闹铃,可以随时取消重新设定,采用分文件编译 注意:需要在.pro文件中加入:QT core gui texttospeech 代码…...
基于深度学习的图像描述生成
基于深度学习的图像描述生成(Image Captioning)是一种将计算机视觉与自然语言处理结合的任务,其目标是通过自动生成自然语言来描述输入的图像。该技术能够理解图像中的视觉内容,并生成相应的文本描述,广泛应用于视觉问…...
Linux和C语言(Day11)
一、学习内容 讲解有参函数 形参 和 实参 形参——定义时的参数,形式上的参数,没有实际意义,语法上必须带有数据类型 void fun(int a,int b); void fun(int a[],int n); void fun(char *s); 可以是:变量、数组、指针 实参——调用…...
使用Zlib库进行多文件或者多文件夹的压缩解压缩
zlib库可在git上自己clone下来然后使用cmake工具生成解决方案,编译、生成zlib二进制文件。然后将zlib库引入项目: //zlib库支持 #include "../zlib/include/zlib.h" #ifdef _DEBUG #pragma comment(lib, "../zlib/lib/zlibd.lib") …...
CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案
强强联合 人工智能与大数据的迅速发展,大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分,企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战,CSGHub、Nvidia和阿里云计算巢强强联手&a…...
opencv的球面投影
cv::detail::SphericalProjector 在全景图像拼接任务中,可能需要对多个图像进行球面投影以实现无缝拼接。每个cv::detail::SphericalProjector可以负责一个图像的球面投影操作。通过将多个这样的投影器存储在std::vector中,可以对一组图像依次进行投影处…...
5. 去中心化应用(dApp)
去中心化应用(dApp) 去中心化应用(dApp)是基于区块链技术构建的应用程序,其核心特性是去中心化、透明和开放。dApp与传统应用有许多显著的区别,它们在实现和功能上都带来了新的变革。以下是对dApp的详细介…...
k8s服务发布Ingress
Kubernetes暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress,通俗来讲,ingress和之前提到的Service、Deployment,也是一个k8s的资源类型,ingress用于实现用域名的方式访问k8s内部应用。 In…...
区块链学习笔记1--比特币
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…...
在 Vite 项目中自动为每个 Vue 文件导入 base.less
在 Vue.js 项目中,使用 Less 作为 CSS 预处理器时,我们通常会创建一个全局的样式文件(如 base.less),用于存放一些全局变量、混合、通用样式等。为了避免在每个 Vue 组件中手动导入这个文件,我们可以通过配…...
RUST 学习之全局变量
RUST 全局变量 rust 全局变量编译期初始化的全局变量静态常量静态变量原子类型的静态变量 运行期初始化的全局变量lazy_staticBox::leakOnceCell & OnceLock 参考文档 rust 全局变量 编译期初始化的全局变量 静态常量 在编译期初始化,所以其赋值只能是表达式…...
代码随想录八股训练营第三十九天| C++
前言 一、说一下 lambda函数? 1.1.Lambda 函数的一般语法如下: 1.2.捕获子句: 二、C 怎么实现一个单例模式? 2.1.懒汉式(线程不安全): 2.2.饿汉式(线程安全): 2.3.双重检查锁定ÿ…...
服务网关工作原理,如何获取用户真实IP?
文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器(案例:获取用户真实IP地址) (★) 补充1:不同类型的客户端如何设…...
单链表的实现(C语言)
目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构,物理结构不连续,逻辑结构是连续的,在计算机中链表的实际存储是按照一个结点内存放…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
