若依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 链表功能的实现 链表是一种链式结构,物理结构不连续,逻辑结构是连续的,在计算机中链表的实际存储是按照一个结点内存放…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...