From 78273d58a1028249fee0ebc812ec914c9a32d61e Mon Sep 17 00:00:00 2001 From: "459816669@qq.com" <459816669@qq.com> Date: Sun, 29 May 2022 19:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=B3=BB=E7=BB=9F=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysDictDataController.java | 2 +- .../system/SysDictTypeController.java | 2 +- .../system/SysOaTaskController.java | 373 +++---- snow-admin/src/main/resources/application.yml | 2 +- .../resources/templates/system/task/add.html | 11 +- .../resources/templates/system/task/edit.html | 40 +- .../resources/templates/system/task/task.html | 41 +- .../com/snow/common/annotation/Excel.java | 46 +- .../snow/common/core}/domain/SysDictData.java | 2 +- .../snow/common/core}/domain/SysDictType.java | 2 +- .../snow/common/enums/DingFlowTaskType.java | 6 +- .../java/com/snow/common/utils/DateUtils.java | 18 + .../com/snow/common}/utils/DictUtils.java | 37 +- .../common/utils/file/FileUploadUtils.java | 4 +- .../com/snow/common/utils/file/FileUtils.java | 199 ++-- .../snow/common/utils/file/ImageUtils.java | 86 ++ .../common/utils/poi/ExcelHandlerAdapter.java | 19 + .../com/snow/common/utils/poi/ExcelUtil.java | 963 +++++++++++++----- .../listener/WorkRecodeEventService.java | 9 +- .../dingtalk/service/WorkRecodeService.java | 2 +- .../service/impl/WorkRecodeServiceImpl.java | 45 +- .../framework/web/service/DictService.java | 2 +- .../quartz/controller/SysJobController.java | 21 +- .../com/snow/quartz/task/SyncSysDingTask.java | 2 +- .../com/snow/system/domain/SysOaTask.java | 35 +- .../system/domain/SysOaTaskDistribute.java | 9 + .../java/com/snow/system/event/SyncEvent.java | 2 + .../snow/system/mapper/SysDictDataMapper.java | 2 +- .../snow/system/mapper/SysDictTypeMapper.java | 2 +- .../mapper/SysOaTaskDistributeMapper.java | 60 +- .../snow/system/mapper/SysOaTaskMapper.java | 5 +- .../system/service/ISysDictDataService.java | 2 +- .../system/service/ISysDictTypeService.java | 4 +- .../service/ISysOaTaskDistributeService.java | 38 +- .../system/service/ISysOaTaskService.java | 37 +- .../impl/DingtalkCallBackServiceImpl.java | 1 - .../service/impl/SysDictDataServiceImpl.java | 4 +- .../service/impl/SysDictTypeServiceImpl.java | 6 +- .../impl/SysOaTaskDistributeServiceImpl.java | 117 +-- .../service/impl/SysOaTaskServiceImpl.java | 137 +-- .../system/SysOaTaskDistributeMapper.xml | 99 -- .../mapper/system/SysOaTaskMapper.xml | 94 -- 42 files changed, 1448 insertions(+), 1140 deletions(-) rename {snow-system/src/main/java/com/snow/system => snow-common/src/main/java/com/snow/common/core}/domain/SysDictData.java (99%) rename {snow-system/src/main/java/com/snow/system => snow-common/src/main/java/com/snow/common/core}/domain/SysDictType.java (98%) rename {snow-system/src/main/java/com/snow/system => snow-common/src/main/java/com/snow/common}/utils/DictUtils.java (91%) create mode 100644 snow-common/src/main/java/com/snow/common/utils/file/ImageUtils.java create mode 100644 snow-common/src/main/java/com/snow/common/utils/poi/ExcelHandlerAdapter.java diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysDictDataController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysDictDataController.java index 6bc6ca1..6b17b0a 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysDictDataController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysDictDataController.java @@ -18,7 +18,7 @@ import com.snow.common.core.page.TableDataInfo; import com.snow.common.enums.BusinessType; import com.snow.common.utils.poi.ExcelUtil; import com.snow.framework.util.ShiroUtils; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; import com.snow.system.service.ISysDictDataService; /** diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysDictTypeController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysDictTypeController.java index a0b78f3..9828b3f 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysDictTypeController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysDictTypeController.java @@ -20,7 +20,7 @@ import com.snow.common.core.page.TableDataInfo; import com.snow.common.enums.BusinessType; import com.snow.common.utils.poi.ExcelUtil; import com.snow.framework.util.ShiroUtils; -import com.snow.system.domain.SysDictType; +import com.snow.common.core.domain.SysDictType; import com.snow.system.service.ISysDictTypeService; /** diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaTaskController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaTaskController.java index 207af35..4ce4a30 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaTaskController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaTaskController.java @@ -1,45 +1,42 @@ package com.snow.web.controller.system; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.collect.Lists; +import com.snow.common.annotation.Log; +import com.snow.common.annotation.RepeatSubmit; +import com.snow.common.constant.MessageConstants; +import com.snow.common.core.controller.BaseController; +import com.snow.common.core.domain.AjaxResult; +import com.snow.common.core.domain.MessageEventRequest; +import com.snow.common.core.page.TableDataInfo; +import com.snow.common.enums.BusinessType; +import com.snow.common.enums.DingFlowTaskType; +import com.snow.common.enums.MessageEventType; +import com.snow.common.utils.poi.ExcelUtil; +import com.snow.dingtalk.service.WorkRecodeService; +import com.snow.framework.util.ShiroUtils; +import com.snow.system.domain.SysOaTask; +import com.snow.system.domain.SysOaTaskDistribute; +import com.snow.system.domain.SysUser; +import com.snow.system.service.ISysOaTaskDistributeService; +import com.snow.system.service.ISysOaTaskService; +import org.apache.commons.compress.utils.Sets; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.BetweenFormater; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import com.google.common.collect.Lists; -import com.snow.common.constant.MessageConstants; -import com.snow.common.core.domain.MessageEventRequest; -import com.snow.common.enums.DingFlowTaskType; -import com.snow.common.enums.DingTalkListenerType; -import com.snow.common.enums.MessageEventType; -import com.snow.framework.util.ShiroUtils; -import com.snow.system.domain.*; -import com.snow.system.domain.SysOaTaskDistribute; -import com.snow.system.event.SyncEvent; -import com.snow.system.service.ISysOaTaskDistributeService; -import com.snow.system.service.ISysUserService; -import org.apache.commons.compress.utils.Sets; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import com.snow.common.annotation.Log; -import com.snow.common.enums.BusinessType; -import org.springframework.stereotype.Controller; -import com.snow.system.service.ISysOaTaskService; -import com.snow.common.core.controller.BaseController; -import com.snow.common.core.domain.AjaxResult; -import com.snow.common.utils.poi.ExcelUtil; -import com.snow.common.core.page.TableDataInfo; - /** * 系统任务Controller * 当任务被分配后,判断是否同步到钉钉系统 @@ -48,8 +45,7 @@ import com.snow.common.core.page.TableDataInfo; */ @Controller @RequestMapping("/system/task") -public class SysOaTaskController extends BaseController -{ +public class SysOaTaskController extends BaseController { private String prefix = "system/task"; @Autowired @@ -59,10 +55,10 @@ public class SysOaTaskController extends BaseController private ISysOaTaskDistributeService sysOaTaskDistributeService; @Autowired - private ISysUserService sysUserService; + private ApplicationContext applicationContext; @Autowired - private ApplicationContext applicationContext; + private WorkRecodeService workRecodeService; @RequiresPermissions("system:task:view") @GetMapping() @@ -71,18 +67,6 @@ public class SysOaTaskController extends BaseController return prefix + "/task"; } - /** - * 查询系统任务列表 - */ - @RequiresPermissions("system:task:list") - @PostMapping("/list") - @ResponseBody - public TableDataInfo list(SysOaTask sysOaTask) - { - startPage(); - List list = sysOaTaskService.selectSysOaTaskList(sysOaTask); - return getDataTable(list); - } /** * 任务分配列表 @@ -90,13 +74,13 @@ public class SysOaTaskController extends BaseController @RequiresPermissions("system:task:taskDistributeList") @PostMapping("/taskDistributeList") @ResponseBody - public TableDataInfo taskDistributeList(SysOaTaskDistribute sysOaTaskDistribute) - { + public TableDataInfo taskDistributeList(SysOaTaskDistribute sysOaTaskDistribute) { startPage(); List list = sysOaTaskDistributeService.selectSysOaTaskDistributeList(sysOaTaskDistribute); - if(CollUtil.isNotEmpty(list)){ - warpSysOaTask(list); + if(CollUtil.isEmpty(list)){ + return getDataTable(list); } + sysOaTaskDistributeService.warpSysOaTask(list); return getDataTable(list); } /** @@ -105,54 +89,38 @@ public class SysOaTaskController extends BaseController @RequiresPermissions("system:task:myList") @PostMapping("/myList") @ResponseBody - public TableDataInfo myList(SysOaTask sysOaTask) - { + public TableDataInfo myList(SysOaTask sysOaTask) { startPage(); - SysUser sysUser = ShiroUtils.getSysUser(); - sysOaTask.setCreateBy(String.valueOf(sysUser.getUserId())); + sysOaTask.setCreateBy(String.valueOf(ShiroUtils.getUserId())); List list = sysOaTaskService.selectSysOaTaskList(sysOaTask); return getDataTable(list); } /** * 我的待处理任务 - * @param sysOaTaskDistribute - * @return */ @RequiresPermissions("system:task:waitList") @PostMapping("/waitList") @ResponseBody - public TableDataInfo waitList(SysOaTaskDistribute sysOaTaskDistribute) - { + public TableDataInfo waitList(SysOaTaskDistribute sysOaTaskDistribute) { startPage(); - SysUser sysUser = ShiroUtils.getSysUser(); - sysOaTaskDistribute.setTaskExecuteStatusList(Lists.newArrayList(DingFlowTaskType.RUNNING.getCode(),DingFlowTaskType.PROCESSING.getCode())); - sysOaTaskDistribute.setTaskDistributeId(String.valueOf(sysUser.getUserId())); - List sysOaTaskDistributes = sysOaTaskDistributeService.selectSysOaTaskDistributeList(sysOaTaskDistribute); - if(CollUtil.isNotEmpty(sysOaTaskDistributes)){ - warpSysOaTask(sysOaTaskDistributes); - } - return getDataTable(sysOaTaskDistributes); + sysOaTaskDistribute.setTaskDistributeId(String.valueOf(ShiroUtils.getUserId())); + sysOaTaskDistribute.setTaskExecuteStatusList(Lists.newArrayList(DingFlowTaskType.NEW.getCode(),DingFlowTaskType.RUNNING.getCode())); + return getDataTable(sysOaTaskDistributeService.getSysOaTaskDistribute(sysOaTaskDistribute)); } /** * 我处理的任务 - * @param sysOaTaskDistribute - * @return */ @RequiresPermissions("system:task:handleList") @PostMapping("/handleList") @ResponseBody - public TableDataInfo handleList(SysOaTaskDistribute sysOaTaskDistribute) - { + public TableDataInfo handleList(SysOaTaskDistribute sysOaTaskDistribute) { startPage(); SysUser sysUser = ShiroUtils.getSysUser(); sysOaTaskDistribute.setTaskExecuteId(String.valueOf(sysUser.getUserId())); sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.COMPLETED.getCode()); - List sysOaTaskDistributes = sysOaTaskDistributeService.selectSysOaTaskDistributeList(sysOaTaskDistribute); - if(CollUtil.isNotEmpty(sysOaTaskDistributes)){ - warpSysOaTask(sysOaTaskDistributes); - } + List sysOaTaskDistributes = sysOaTaskDistributeService.getSysOaTaskDistribute(sysOaTaskDistribute); return getDataTable(sysOaTaskDistributes); } @@ -163,19 +131,18 @@ public class SysOaTaskController extends BaseController @Log(title = "系统任务", businessType = BusinessType.EXPORT) @PostMapping("/export") @ResponseBody - public AjaxResult export(SysOaTask sysOaTask) - { + public AjaxResult export(SysOaTask sysOaTask) { List list = sysOaTaskService.selectSysOaTaskList(sysOaTask); ExcelUtil util = new ExcelUtil(SysOaTask.class); - return util.exportExcel(list, "task"); + + return util.exportExcel(list, "task","系统任务"); } /** * 新增系统任务 */ @GetMapping("/add") - public String add() - { + public String add() { return prefix + "/add"; } @@ -186,32 +153,45 @@ public class SysOaTaskController extends BaseController @Log(title = "系统任务", businessType = BusinessType.INSERT) @PostMapping("/add") @ResponseBody - public AjaxResult addSave(SysOaTask sysOaTask) - { + @RepeatSubmit + @Transactional(rollbackFor = Exception.class) + public AjaxResult addSave(SysOaTask sysOaTask) { SysUser sysUser = ShiroUtils.getSysUser(); sysOaTask.setCreateBy(String.valueOf(sysUser.getUserId())); - return toAjax(sysOaTaskService.insertSysOaTask(sysOaTask)); + SysOaTask task= sysOaTaskService.insertSysOaTask(sysOaTask); + //是否同步到钉钉待办,然后把钉钉taskId反写表中 + if(sysOaTask.getSyncDingtalk()==1){ + String taskId = workRecodeService.createTodoTask(task); + SysOaTask updateTask=new SysOaTask(); + updateTask.setTaskNo(task.getTaskNo()); + updateTask.setTaskOutsideId(taskId); + sysOaTaskService.updateById(updateTask); + } + return AjaxResult.success(); } @RequiresPermissions("system:task:start") @PostMapping("/start") @ResponseBody - public AjaxResult start(Long id) - { + public AjaxResult start(Long id) { + SysOaTaskDistribute taskDistribute = sysOaTaskDistributeService.getById(id); + SysOaTask task = sysOaTaskService.getById(taskDistribute.getTaskNo()); SysOaTaskDistribute sysOaTaskDistribute =new SysOaTaskDistribute(); sysOaTaskDistribute.setId(id); sysOaTaskDistribute.setTaskStartTime(new Date()); - sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.PROCESSING.getCode()); - return toAjax(sysOaTaskDistributeService.updateSysOaTaskDistribute(sysOaTaskDistribute)); + sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.RUNNING.getCode()); + if(task.getSyncDingtalk()==1){ + workRecodeService.updateTodoTaskExecutorStatus(ShiroUtils.getUserId(),sysOaTaskService.getOutTaskOutsideId(task.getTaskNo()),false); + } + return toAjax(sysOaTaskDistributeService.updateById(sysOaTaskDistribute)); } /** * 处理系统任务 */ @GetMapping("/handle/{id}") - public String handle(@PathVariable("id") Long id, ModelMap mmap) - { + public String handle(@PathVariable("id") Long id, ModelMap mmap) { SysOaTaskDistribute sysOaTaskDistribute = sysOaTaskDistributeService.selectSysOaTaskDistributeById(id); - warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); + sysOaTaskDistributeService.warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); mmap.put("sysOaTaskDistribute", sysOaTaskDistribute); return prefix + "/handle"; } @@ -224,19 +204,103 @@ public class SysOaTaskController extends BaseController @Log(title = "系统任务", businessType = BusinessType.UPDATE) @PostMapping("/handle") @ResponseBody - public AjaxResult handleSave(SysOaTaskDistribute sysOaTaskDistribute) - { + public AjaxResult handleSave(SysOaTaskDistribute sysOaTaskDistribute) { + SysOaTaskDistribute taskDistribute = sysOaTaskDistributeService.getById(sysOaTaskDistribute.getId()); + SysOaTask task = sysOaTaskService.getById(taskDistribute.getTaskNo()); sysOaTaskDistribute.setTaskCompleteTime(new Date()); sysOaTaskDistribute.setTaskExecuteId(String.valueOf(ShiroUtils.getUserId())); - sysOaTaskDistribute.setUpdateBy(String.valueOf(ShiroUtils.getUserId())); sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.COMPLETED.getCode()); + //发送站内信 sendInnerMessage(sysOaTaskDistribute); - //事件发送 - SyncEvent syncEvent = new SyncEvent(sysOaTaskDistribute, DingTalkListenerType.UPDATE_TODO_TASK_EXECUTOR_STATUS); - applicationContext.publishEvent(syncEvent); - return toAjax(sysOaTaskDistributeService.updateSysOaTaskDistribute(sysOaTaskDistribute)); + //更新钉钉任务状态 + if(task.getSyncDingtalk()==1){ + workRecodeService.updateTodoTaskExecutorStatus(ShiroUtils.getUserId(),task.getTaskOutsideId(),true); + } + return toAjax(sysOaTaskDistributeService.updateById(sysOaTaskDistribute)); } + + /** + * 修改系统任务 + */ + @GetMapping("/edit/{taskNo}") + public String edit(@PathVariable("taskNo") String taskNo, ModelMap mmap) { + SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(taskNo); + mmap.put("sysOaTask", sysOaTask); + return prefix + "/edit"; + } + + /** + * 修改保存系统任务 + */ + @RequiresPermissions("system:task:edit") + @Log(title = "系统任务", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(SysOaTask sysOaTask) { + LambdaQueryWrapper eq = new QueryWrapper().lambda().ne(SysOaTaskDistribute::getTaskExecuteStatus, DingFlowTaskType.NEW.getCode()) + .eq(SysOaTaskDistribute::getTaskNo, sysOaTask.getTaskNo()); + if(CollUtil.isNotEmpty(sysOaTaskDistributeService.list(eq))){ + return AjaxResult.error("只有待执行任务,才能编辑任务"); + } + sysOaTask.setUpdateBy(ShiroUtils.getUserId().toString()); + if(sysOaTask.getSyncDingtalk()==1){ + workRecodeService.updateTodoTask(sysOaTask); + } + return toAjax(sysOaTaskService.updateById(sysOaTask)); + } + + + + /** + * 任务详情 + * @param taskNo 任务编码 + * @param mmap + * @return + */ + @GetMapping("/detail/{id}") + @RequiresPermissions("system:task:detail") + public String detail(@PathVariable("id") String taskNo, ModelMap mmap) { + SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(taskNo); + SysOaTaskDistribute sysOaTaskDistribute=new SysOaTaskDistribute(); + sysOaTaskDistribute.setTaskNo(taskNo); + List sysOaTaskDistributes = sysOaTaskDistributeService.selectSysOaTaskDistributeList(sysOaTaskDistribute); + mmap.put("sysOaTask", sysOaTask); + mmap.put("sysOaTaskDistributes", sysOaTaskDistributes); + return prefix + "/detail"; + } + + + /** + * 我处理的详情 + * @param id + * @param mmap + * @return + */ + @GetMapping("/taskDistributedDetail/{id}") + @RequiresPermissions("system:task:taskDistributedDetail") + public String taskDistributedDetail(@PathVariable("id") Long id, ModelMap mmap) { + SysOaTaskDistribute sysOaTaskDistribute = sysOaTaskDistributeService.selectSysOaTaskDistributeById(id); + sysOaTaskDistributeService.warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); + mmap.put("sysOaTask", sysOaTaskDistribute); + return prefix + "/taskDistributedDetail"; + } + /** + * 任务分配详情 + * @param id + * @param mmap + * @return + */ + @GetMapping("/taskDistribute/detail/{id}") + @RequiresPermissions("system:taskDistribute:detail") + public String taskDistributeDetail(@PathVariable("id") Long id, ModelMap mmap) { + SysOaTaskDistribute sysOaTaskDistribute = sysOaTaskDistributeService.selectSysOaTaskDistributeById(id); + sysOaTaskDistributeService.warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); + mmap.put("sysOaTask", sysOaTaskDistribute); + return prefix + "/taskDistributeDetail"; + } + + /** * 发送站内信 * @param sysOaTaskDistribute 参数 @@ -256,112 +320,5 @@ public class SysOaTaskController extends BaseController messageEventDTO.setTemplateCode(MessageConstants.INNER_SYS_TASK_COMPLETE); applicationContext.publishEvent(messageEventDTO); } - /** - * 修改系统任务 - */ - @GetMapping("/edit/{taskNo}") - public String edit(@PathVariable("taskNo") String taskNo, ModelMap mmap) - { - SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(taskNo); - mmap.put("sysOaTask", sysOaTask); - return prefix + "/edit"; - } - /** - * 修改保存系统任务 - */ - @RequiresPermissions("system:task:edit") - @Log(title = "系统任务", businessType = BusinessType.UPDATE) - @PostMapping("/edit") - @ResponseBody - public AjaxResult editSave(SysOaTask sysOaTask) - { - - SysOaTaskDistribute sysOaTaskDistribute=new SysOaTaskDistribute(); - sysOaTaskDistribute.setSysOaTask(sysOaTask); - SyncEvent syncEvent = new SyncEvent(sysOaTaskDistribute, DingTalkListenerType.WORK_RECORD_UPDATE); - applicationContext.publishEvent(syncEvent); - return toAjax(sysOaTaskService.updateSysOaTask(sysOaTask)); - } - - /** - * 删除系统任务 - */ - @RequiresPermissions("system:task:remove") - @Log(title = "系统任务", businessType = BusinessType.DELETE) - @PostMapping( "/remove") - @ResponseBody - public AjaxResult remove(String ids) - { - return toAjax(sysOaTaskService.deleteSysOaTaskByIds(ids)); - } - - /** - * 任务详情 - * @param taskNo 任务编码 - * @param mmap - * @return - */ - @GetMapping("/detail/{id}") - @RequiresPermissions("system:task:detail") - public String detail(@PathVariable("id") String taskNo, ModelMap mmap) - { - SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(taskNo); - SysOaTaskDistribute sysOaTaskDistribute=new SysOaTaskDistribute(); - sysOaTaskDistribute.setTaskNo(taskNo); - List sysOaTaskDistributes = sysOaTaskDistributeService.selectSysOaTaskDistributeList(sysOaTaskDistribute); - mmap.put("sysOaTask", sysOaTask); - mmap.put("sysOaTaskDistributes", sysOaTaskDistributes); - return prefix + "/detail"; - } - - - /** - * 我处理的详情 - * @param taskNo - * @param mmap - * @return - */ - @GetMapping("/taskDistributedDetail/{id}") - @RequiresPermissions("system:task:taskDistributedDetail") - public String taskDistributedDetail(@PathVariable("id") Long id, ModelMap mmap) - { - SysOaTaskDistribute sysOaTaskDistribute = sysOaTaskDistributeService.selectSysOaTaskDistributeById(id); - warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); - mmap.put("sysOaTask", sysOaTaskDistribute); - return prefix + "/taskDistributedDetail"; - } - /** - * 任务分配详情 - * @param id - * @param mmap - * @return - */ - @GetMapping("/taskDistribute/detail/{id}") - @RequiresPermissions("system:taskDistribute:detail") - public String taskDistributeDetail(@PathVariable("id") Long id, ModelMap mmap) - { - SysOaTaskDistribute sysOaTaskDistribute = sysOaTaskDistributeService.selectSysOaTaskDistributeById(id); - warpSysOaTask(Lists.newArrayList(sysOaTaskDistribute)); - mmap.put("sysOaTask", sysOaTaskDistribute); - return prefix + "/taskDistributeDetail"; - } - - private void warpSysOaTask(List sysOaTaskDistributes){ - sysOaTaskDistributes.forEach(t->{ - SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(t.getTaskNo()); - sysOaTask.setCreateBy(sysUserService.selectUserById(Long.parseLong(sysOaTask.getCreateBy())).getUserName()); - if(ObjectUtil.isNotNull(t.getTaskDistributeId())){ - t.setTaskDistributeId(sysUserService.selectUserById(Long.parseLong(t.getTaskDistributeId())).getUserName()); - } - if(ObjectUtil.isNotNull(t.getTaskExecuteId())){ - t.setTaskExecuteId(sysUserService.selectUserById(Long.parseLong(t.getTaskExecuteId())).getUserName()); - } - if(ObjectUtil.isNotNull(t.getTaskStartTime())&&ObjectUtil.isNotNull(t.getTaskCompleteTime())){ - t.setSpendTime(DateUtil.formatBetween(t.getTaskStartTime(),t.getTaskCompleteTime(), BetweenFormater.Level.SECOND)); - } - t.setSysOaTask(sysOaTask); - t.setCreateBy(sysUserService.selectUserById(Long.parseLong(t.getCreateBy())).getUserName()); - }); - } } diff --git a/snow-admin/src/main/resources/application.yml b/snow-admin/src/main/resources/application.yml index 9f09d8d..7fe4769 100644 --- a/snow-admin/src/main/resources/application.yml +++ b/snow-admin/src/main/resources/application.yml @@ -5,7 +5,7 @@ snow: # 版本 version: 2.0.0 # 版权年份 - copyrightYear: 2021 + copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 获取ip地址开关 diff --git a/snow-admin/src/main/resources/templates/system/task/add.html b/snow-admin/src/main/resources/templates/system/task/add.html index 2394848..b945518 100644 --- a/snow-admin/src/main/resources/templates/system/task/add.html +++ b/snow-admin/src/main/resources/templates/system/task/add.html @@ -50,7 +50,7 @@
-
+
@@ -61,12 +61,13 @@
- +
diff --git a/snow-admin/src/main/resources/templates/system/task/edit.html b/snow-admin/src/main/resources/templates/system/task/edit.html index 322e9de..8dc153c 100644 --- a/snow-admin/src/main/resources/templates/system/task/edit.html +++ b/snow-admin/src/main/resources/templates/system/task/edit.html @@ -6,6 +6,7 @@
+
@@ -42,30 +43,19 @@
-
- -
-
- - - -
-
-
-
- -
- -
-
+
+ +
+ + +
+
@@ -74,24 +64,12 @@ $("#form-task-edit").validate({ focusCleanup: true }); - function selectUserInfo() { - var url = "/system/user/selectMultiUser"; - $.modal.open("选择用户",url,"","",doSubmit); - } + function submitHandler() { if ($.validate.form()) { $.operate.save(prefix + "/edit", $('#form-task-edit').serialize()); } } - - function doSubmit(index, layero){ - var body = layer.getChildFrame('body', index); - var iframeWin = layero.find('iframe')[0]; - iframeWin.contentWindow.submitHandler(index, layero); - $("#taskDistributeId").val(body.find('#id').val()); - $("#transitionPersonName").val(body.find('#userName').val()); - layer.close(index); - } \ No newline at end of file diff --git a/snow-admin/src/main/resources/templates/system/task/task.html b/snow-admin/src/main/resources/templates/system/task/task.html index 9958b64..5fbc838 100644 --- a/snow-admin/src/main/resources/templates/system/task/task.html +++ b/snow-admin/src/main/resources/templates/system/task/task.html @@ -10,17 +10,19 @@
- + 添加 @@ -188,6 +190,7 @@ return row.sysOaTask.taskName; } }, + { field: 'taskType', title: '任务类型', @@ -195,6 +198,13 @@ return $.table.selectDictLabel(taskTypeDatas, row.sysOaTask.taskType); } }, + { + field: 'taskExecuteStatus', + title: '执行状态', + formatter: function(value, row, index) { + return $.table.selectDictLabel(taskStatusDatas, row.sysOaTask.taskType); + } + }, { field: 'createBy', title: '指派人', @@ -218,10 +228,10 @@ align: 'center', formatter: function(value, row, index) { var actions = []; - if(row.taskExecuteStatus=='RUNNING') { + if(row.taskExecuteStatus=='NEW') { actions.push('开始 '); } - if(row.taskExecuteStatus=='PROCESSING') { + if(row.taskExecuteStatus=='RUNNING') { actions.push('处理'); } return actions.join(''); @@ -234,7 +244,6 @@ search.taskNo = $("#myTaskNo").val(); search.taskStatus = $("#myTaskStatus").val(); return search; - } @@ -251,7 +260,6 @@ onExpandRow : function(index, row, $detail) { initChildTable(index, row, $detail); }, - modalName: "我创建", columns: [{ checkbox: true @@ -263,22 +271,25 @@ }, { field: 'taskName', - title: '任务名称' + title: '任务名称', + formatter: function(value, row, index) { + return $.table.tooltip(value); + } }, { field: 'taskContent', title: '任务内容', formatter: function(value, row, index) { - return row.taskContent.substring(0,20)+"..."; + return $.table.tooltip(value); } }, - /* { + { field: 'taskStatus', title: '任务状态', formatter: function(value, row, index) { return $.table.selectDictLabel(taskStatusDatas, value); } - },*/ + }, { field: 'taskType', title: '任务类型', @@ -286,10 +297,6 @@ return $.table.selectDictLabel(taskTypeDatas, value); } }, - { - field: 'taskSource', - title: '任务来源' - }, { title: '操作', align: 'center', @@ -297,7 +304,7 @@ var actions = []; actions.push('详情 '); actions.push('编辑 '); - actions.push('删除'); +/* actions.push('删除');*/ return actions.join(''); } }] diff --git a/snow-common/src/main/java/com/snow/common/annotation/Excel.java b/snow-common/src/main/java/com/snow/common/annotation/Excel.java index ddda516..5690644 100644 --- a/snow-common/src/main/java/com/snow/common/annotation/Excel.java +++ b/snow-common/src/main/java/com/snow/common/annotation/Excel.java @@ -1,9 +1,14 @@ package com.snow.common.annotation; +import com.snow.common.utils.poi.ExcelHandlerAdapter; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.math.BigDecimal; /** * 自定义导出Excel数据注解 @@ -45,9 +50,14 @@ public @interface Excel public String separator() default ","; /** - * 导出类型(0数字 1字符串) + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) */ - public ColumnType cellType() default ColumnType.STRING; + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; /** * 导出时在excel中每个列的高度 单位为字符 @@ -89,6 +99,36 @@ public @interface Excel */ public String targetAttr() default ""; + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + /** * 字段类型(0:导出导入;1:仅导出;2:仅导入) */ @@ -112,7 +152,7 @@ public @interface Excel public enum ColumnType { - NUMERIC(0), STRING(1); + NUMERIC(0), STRING(1), IMAGE(2); private final int value; ColumnType(int value) diff --git a/snow-system/src/main/java/com/snow/system/domain/SysDictData.java b/snow-common/src/main/java/com/snow/common/core/domain/SysDictData.java similarity index 99% rename from snow-system/src/main/java/com/snow/system/domain/SysDictData.java rename to snow-common/src/main/java/com/snow/common/core/domain/SysDictData.java index 9f40c25..dec2756 100644 --- a/snow-system/src/main/java/com/snow/system/domain/SysDictData.java +++ b/snow-common/src/main/java/com/snow/common/core/domain/SysDictData.java @@ -1,4 +1,4 @@ -package com.snow.system.domain; +package com.snow.common.core.domain; import javax.validation.constraints.*; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/snow-system/src/main/java/com/snow/system/domain/SysDictType.java b/snow-common/src/main/java/com/snow/common/core/domain/SysDictType.java similarity index 98% rename from snow-system/src/main/java/com/snow/system/domain/SysDictType.java rename to snow-common/src/main/java/com/snow/common/core/domain/SysDictType.java index 8d4b251..7f98b06 100644 --- a/snow-system/src/main/java/com/snow/system/domain/SysDictType.java +++ b/snow-common/src/main/java/com/snow/common/core/domain/SysDictType.java @@ -1,4 +1,4 @@ -package com.snow.system.domain; +package com.snow.common.core.domain; import javax.validation.constraints.*; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/snow-common/src/main/java/com/snow/common/enums/DingFlowTaskType.java b/snow-common/src/main/java/com/snow/common/enums/DingFlowTaskType.java index d828348..03a4523 100644 --- a/snow-common/src/main/java/com/snow/common/enums/DingFlowTaskType.java +++ b/snow-common/src/main/java/com/snow/common/enums/DingFlowTaskType.java @@ -9,15 +9,11 @@ package com.snow.common.enums; public enum DingFlowTaskType { NEW("NEW", "未启动"), - RUNNING("RUNNING", "待处理"), + RUNNING("RUNNING", "处理中"), PAUSED("PAUSED", "暂停"), CANCELED("CANCELED", "取消"), COMPLETED("COMPLETED", "完成"), TERMINATED("TERMINATED", "终止"), - - //20211015 - PROCESSING("PROCESSING","处理中") - ; private final String code; diff --git a/snow-common/src/main/java/com/snow/common/utils/DateUtils.java b/snow-common/src/main/java/com/snow/common/utils/DateUtils.java index e87f461..2dd2236 100644 --- a/snow-common/src/main/java/com/snow/common/utils/DateUtils.java +++ b/snow-common/src/main/java/com/snow/common/utils/DateUtils.java @@ -3,6 +3,7 @@ package com.snow.common.utils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.*; import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; @@ -159,5 +160,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return day + "天" + hour + "小时" + min + "分钟"; } + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } } diff --git a/snow-system/src/main/java/com/snow/system/utils/DictUtils.java b/snow-common/src/main/java/com/snow/common/utils/DictUtils.java similarity index 91% rename from snow-system/src/main/java/com/snow/system/utils/DictUtils.java rename to snow-common/src/main/java/com/snow/common/utils/DictUtils.java index a5c89db..02a4b95 100644 --- a/snow-system/src/main/java/com/snow/system/utils/DictUtils.java +++ b/snow-common/src/main/java/com/snow/common/utils/DictUtils.java @@ -1,11 +1,11 @@ -package com.snow.system.utils; +package com.snow.common.utils; import java.util.List; import org.springframework.stereotype.Component; import com.snow.common.constant.Constants; import com.snow.common.utils.CacheUtils; import com.snow.common.utils.StringUtils; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; /** * 字典工具类 @@ -22,7 +22,7 @@ public class DictUtils /** * 设置字典缓存 - * + * * @param key 参数键 * @param dictDatas 字典数据列表 */ @@ -33,7 +33,7 @@ public class DictUtils /** * 获取字典缓存 - * + * * @param key 参数键 * @return dictDatas 字典数据列表 */ @@ -42,15 +42,14 @@ public class DictUtils Object cacheObj = CacheUtils.get(getCacheName(), getCacheKey(key)); if (StringUtils.isNotNull(cacheObj)) { - List DictDatas = StringUtils.cast(cacheObj); - return DictDatas; + return StringUtils.cast(cacheObj); } return null; } /** * 根据字典类型和字典值获取字典标签 - * + * * @param dictType 字典类型 * @param dictValue 字典值 * @return 字典标签 @@ -62,7 +61,7 @@ public class DictUtils /** * 根据字典类型和字典标签获取字典值 - * + * * @param dictType 字典类型 * @param dictLabel 字典标签 * @return 字典值 @@ -74,7 +73,7 @@ public class DictUtils /** * 根据字典类型和字典值获取字典标签 - * + * * @param dictType 字典类型 * @param dictValue 字典值 * @param separator 分隔符 @@ -93,7 +92,7 @@ public class DictUtils { if (value.equals(dict.getDictValue())) { - propertyString.append(dict.getDictLabel() + separator); + propertyString.append(dict.getDictLabel()).append(separator); break; } } @@ -114,7 +113,7 @@ public class DictUtils /** * 根据字典类型和字典标签获取字典值 - * + * * @param dictType 字典类型 * @param dictLabel 字典标签 * @param separator 分隔符 @@ -133,7 +132,7 @@ public class DictUtils { if (label.equals(dict.getDictLabel())) { - propertyString.append(dict.getDictValue() + separator); + propertyString.append(dict.getDictValue()).append(separator); break; } } @@ -152,6 +151,16 @@ public class DictUtils return StringUtils.stripEnd(propertyString.toString(), separator); } + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + CacheUtils.remove(getCacheName(), getCacheKey(key)); + } + /** * 清空字典缓存 */ @@ -162,7 +171,7 @@ public class DictUtils /** * 获取cache name - * + * * @return 缓存名 */ public static String getCacheName() @@ -172,7 +181,7 @@ public class DictUtils /** * 设置cache key - * + * * @param configKey 参数键 * @return 缓存键key */ diff --git a/snow-common/src/main/java/com/snow/common/utils/file/FileUploadUtils.java b/snow-common/src/main/java/com/snow/common/utils/file/FileUploadUtils.java index fc79a27..6c301a9 100644 --- a/snow-common/src/main/java/com/snow/common/utils/file/FileUploadUtils.java +++ b/snow-common/src/main/java/com/snow/common/utils/file/FileUploadUtils.java @@ -132,7 +132,7 @@ public class FileUploadUtils * @return * @throws IOException */ - private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + public static File getAbsoluteFile(String uploadDir, String fileName) throws IOException { File desc = new File(uploadDir + File.separator + fileName); @@ -146,7 +146,7 @@ public class FileUploadUtils return desc; } - private static final String getPathFileName(String uploadDir, String fileName) throws IOException + public static final String getPathFileName(String uploadDir, String fileName) throws IOException { int dirLastIndex = defaultBaseDir.length() + 1; String currentDir = StringUtils.substring(uploadDir, dirLastIndex); diff --git a/snow-common/src/main/java/com/snow/common/utils/file/FileUtils.java b/snow-common/src/main/java/com/snow/common/utils/file/FileUtils.java index da51d73..5efaae2 100644 --- a/snow-common/src/main/java/com/snow/common/utils/file/FileUtils.java +++ b/snow-common/src/main/java/com/snow/common/utils/file/FileUtils.java @@ -1,14 +1,14 @@ package com.snow.common.utils.file; +import com.snow.common.config.Global; +import com.snow.common.utils.DateUtils; +import com.snow.common.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; @@ -19,66 +19,46 @@ import javax.servlet.http.HttpServletResponse; * * @author snow */ -public class FileUtils extends org.apache.commons.io.FileUtils -{ +public class FileUtils extends org.apache.commons.io.FileUtils { public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + /** - * 输出指定文件的byte数组 - * - * @param filePath 文件路径 - * @param os 输出流 - * @return + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 */ - public static void writeBytes(String filePath, OutputStream os) throws IOException + public static String writeImportBytes(byte[] data) throws IOException { - FileInputStream fis = null; - try - { - File file = new File(filePath); - if (!file.exists()) - { - throw new FileNotFoundException(filePath); - } - fis = new FileInputStream(file); - byte[] b = new byte[1024]; - int length; - while ((length = fis.read(b)) > 0) - { - os.write(b, 0, length); - } - } - catch (IOException e) - { - throw e; - } - finally - { - if (os != null) - { - try - { - os.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - if (fis != null) - { - try - { - fis.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - } - } + return writeBytes(data, Global.getDownloadPath()); } + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + + FileOutputStream fos = null; + String pathName = ""; + try { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } finally { + IOUtils.closeQuietly(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } /** * 删除文件 * @@ -205,4 +185,105 @@ public class FileUtils extends org.apache.commons.io.FileUtils String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); return encode.replaceAll("\\+", "%20"); } + + + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.closeQuietly(os); + IOUtils.closeQuietly(fis); + } + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } } diff --git a/snow-common/src/main/java/com/snow/common/utils/file/ImageUtils.java b/snow-common/src/main/java/com/snow/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..65ebf4c --- /dev/null +++ b/snow-common/src/main/java/com/snow/common/utils/file/ImageUtils.java @@ -0,0 +1,86 @@ +package com.snow.common.utils.file; + +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +@Slf4j +public class ImageUtils +{ + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("访问文件异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/snow-common/src/main/java/com/snow/common/utils/poi/ExcelHandlerAdapter.java b/snow-common/src/main/java/com/snow/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..77fa5a6 --- /dev/null +++ b/snow-common/src/main/java/com/snow/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.snow.common.utils.poi; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/snow-common/src/main/java/com/snow/common/utils/poi/ExcelUtil.java b/snow-common/src/main/java/com/snow/common/utils/poi/ExcelUtil.java index e490e9b..352a4f5 100644 --- a/snow-common/src/main/java/com/snow/common/utils/poi/ExcelUtil.java +++ b/snow-common/src/main/java/com/snow/common/utils/poi/ExcelUtil.java @@ -1,69 +1,56 @@ package com.snow.common.utils.poi; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.stream.Collectors; - import com.snow.common.annotation.Excel; import com.snow.common.annotation.Excels; import com.snow.common.config.Global; -import com.snow.common.constant.Constants; import com.snow.common.core.domain.AjaxResult; import com.snow.common.core.text.Convert; -import com.snow.common.exception.BusinessException; -import com.snow.common.utils.CacheUtils; +import com.snow.common.exception.UtilException; +import com.snow.common.utils.DateUtils; +import com.snow.common.utils.DictUtils; +import com.snow.common.utils.StringUtils; +import com.snow.common.utils.file.FileTypeUtils; +import com.snow.common.utils.file.FileUtils; +import com.snow.common.utils.file.ImageUtils; import com.snow.common.utils.reflect.ReflectUtils; -import com.snow.common.utils.spring.SpringUtils; -import org.apache.poi.hssf.usermodel.HSSFDateUtil; -import org.apache.poi.ss.usermodel.BorderStyle; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.DataValidation; -import org.apache.poi.ss.usermodel.DataValidationConstraint; -import org.apache.poi.ss.usermodel.DataValidationHelper; -import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.ss.usermodel.FillPatternType; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.VerticalAlignment; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.commons.lang3.RegExUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.snow.common.utils.DateUtils; -import com.snow.common.utils.StringUtils; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + /** * Excel相关处理 - * - * @author snow + * + * @author ruoyi */ public class ExcelUtil { private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + /** * Excel sheet最大行数,默认65536 */ @@ -104,6 +91,31 @@ public class ExcelUtil */ private List fields; + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + /** * 实体对象 */ @@ -114,7 +126,7 @@ public class ExcelUtil this.clazz = clazz; } - public void init(List list, String sheetName, Excel.Type type) + public void init(List list, String sheetName, String title, Excel.Type type) { if (list == null) { @@ -123,58 +135,90 @@ public class ExcelUtil this.list = list; this.sheetName = sheetName; this.type = type; + this.title = title; createExcelField(); createWorkbook(); + createTitle(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), + this.fields.size() - 1)); + } } /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ public List importExcel(InputStream is) throws Exception { - return importExcel(StringUtils.EMPTY, is); + return importExcel(is, 0); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); } /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 * @param is 输入流 * @return 转换后集合 */ - public List importExcel(String sheetName, InputStream is) throws Exception + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception { this.type = Excel.Type.IMPORT; this.wb = WorkbookFactory.create(is); List list = new ArrayList(); - Sheet sheet = null; - if (StringUtils.isNotEmpty(sheetName)) - { - // 如果指定sheet名,则取指定sheet中的内容. - sheet = wb.getSheet(sheetName); - } - else - { - // 如果传入的sheet名不存在则默认指向第1个sheet. - sheet = wb.getSheetAt(0); - } - + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); if (sheet == null) { throw new IOException("文件sheet不存在"); } - - int rows = sheet.getPhysicalNumberOfRows(); + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); if (rows > 0) { // 定义一个map用于存放excel列的序号和field. Map cellMap = new HashMap(); // 获取表头 - Row heard = sheet.getRow(0); + Row heard = sheet.getRow(titleNum); for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); @@ -189,34 +233,36 @@ public class ExcelUtil } } // 有数据时才处理 得到类的所有field. - Field[] allFields = clazz.getDeclaredFields(); - // 定义一个map用于存放列的序号和field. - Map fieldsMap = new HashMap(); - for (int col = 0; col < allFields.length; col++) + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) { - Field field = allFields[col]; - Excel attr = field.getAnnotation(Excel.class); - if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) { - // 设置类的私有字段属性可访问. - field.setAccessible(true); - Integer column = cellMap.get(attr.name()); - fieldsMap.put(column, field); + fieldsMap.put(column, objects); } } - for (int i = 1; i < rows; i++) + for (int i = titleNum + 1; i <= rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } T entity = null; - for (Map.Entry entry : fieldsMap.entrySet()) + for (Map.Entry entry : fieldsMap.entrySet()) { Object val = this.getCellValue(row, entry.getKey()); // 如果不存在实例则新建. entity = (entity == null ? clazz.newInstance() : entity); // 从map中得到对应列的field. - Field field = fieldsMap.get(entry.getKey()); + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; // 取得类型,并根据对象类型设置值. Class fieldType = field.getType(); if (String.class == fieldType) @@ -231,7 +277,7 @@ public class ExcelUtil String dateFormat = field.getAnnotation(Excel.class).dateFormat(); if (StringUtils.isNotEmpty(dateFormat)) { - val = DateUtils.parseDateToStr(dateFormat, (Date) val); + val = parseDateToStr(dateFormat, val); } else { @@ -239,19 +285,19 @@ public class ExcelUtil } } } - else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toInt(val); } - else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toLong(val); } - else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) + else if (Double.TYPE == fieldType || Double.class == fieldType) { val = Convert.toDouble(val); } - else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) + else if (Float.TYPE == fieldType || Float.class == fieldType) { val = Convert.toFloat(val); } @@ -270,9 +316,12 @@ public class ExcelUtil val = DateUtil.getJavaDate((Double) val); } } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } if (StringUtils.isNotNull(fieldType)) { - Excel attr = field.getAnnotation(Excel.class); String propertyName = field.getName(); if (StringUtils.isNotEmpty(attr.targetAttr())) { @@ -286,6 +335,23 @@ public class ExcelUtil { val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + else if (Excel.ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } ReflectUtils.invokeSetter(entity, propertyName, val); } } @@ -297,32 +363,135 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 */ public AjaxResult exportExcel(List list, String sheetName) { - this.init(list, sheetName, Excel.Type.EXPORT); + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Excel.Type.EXPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Excel.Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * * @param sheetName 工作表的名称 * @return 结果 */ public AjaxResult importTemplateExcel(String sheetName) { - this.init(null, sheetName, Excel.Type.IMPORT); + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Excel.Type.IMPORT); return exportExcel(); } /** * 对list数据源将其里面的数据导入到excel表单 - * + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Excel.Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * * @return 结果 */ public AjaxResult exportExcel() @@ -330,26 +499,7 @@ public class ExcelUtil OutputStream out = null; try { - // 取出一共有多少个sheet. - double sheetNo = Math.ceil(list.size() / sheetSize); - for (int index = 0; index <= sheetNo; index++) - { - createSheet(sheetNo, index); - - // 产生一行 - Row row = sheet.createRow(0); - int column = 0; - // 写入各个字段的列头名称 - for (Object[] os : fields) - { - Excel excel = (Excel) os[1]; - this.createCell(excel, row, column++); - } - if (Excel.Type.EXPORT.equals(type)) - { - fillExcelData(index, row); - } - } + writeSheet(); String filename = encodingFilename(sheetName); out = new FileOutputStream(getAbsoluteFile(filename)); wb.write(out); @@ -358,38 +508,46 @@ public class ExcelUtil catch (Exception e) { log.error("导出Excel异常{}", e.getMessage()); - throw new BusinessException("导出Excel失败,请联系网站管理员!"); + throw new UtilException("导出Excel失败,请联系网站管理员!"); } finally { - if (wb != null) + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) { - try - { - wb.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); } - if (out != null) + if (Excel.Type.EXPORT.equals(type)) { - try - { - out.close(); - } - catch (IOException e1) - { - e1.printStackTrace(); - } + fillExcelData(index, row); + addStatisticsRow(); } } } /** * 填充excel数据 - * + * * @param index 序号 * @param row 单元格行 */ @@ -399,7 +557,7 @@ public class ExcelUtil int endNo = Math.min(startNo + sheetSize, list.size()); for (int i = startNo; i < endNo; i++) { - row = sheet.createRow(i + 1 - startNo); + row = sheet.createRow(i + 1 + rownum - startNo); // 得到导出对象. T vo = (T) list.get(i); int column = 0; @@ -407,8 +565,6 @@ public class ExcelUtil { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - // 设置实体类私有属性可访问 - field.setAccessible(true); this.addCell(excel, row, vo, field, column++); } } @@ -416,7 +572,7 @@ public class ExcelUtil /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ @@ -427,6 +583,16 @@ public class ExcelUtil CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN); @@ -455,6 +621,55 @@ public class ExcelUtil style.setFont(headerFont); styles.put("header", style); + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = "data_" + excel.align() + "_" + excel.color(); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } return styles; } @@ -474,7 +689,7 @@ public class ExcelUtil /** * 设置单元格信息 - * + * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 @@ -483,14 +698,61 @@ public class ExcelUtil { if (Excel.ColumnType.STRING == attr.cellType()) { - cell.setCellType(CellType.NUMERIC); - cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); } else if (Excel.ColumnType.NUMERIC == attr.cellType()) { - cell.setCellType(CellType.NUMERIC); - cell.setCellValue(Integer.parseInt(value + "")); + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } } + else if (Excel.ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; } /** @@ -506,19 +768,11 @@ public class ExcelUtil { // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); - row.setHeight((short) (attr.height() * 20)); } - // 如果设置了提示信息则鼠标放上去提示. - if (StringUtils.isNotEmpty(attr.prompt())) + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) { - // 这里默认设了2-101列提示. - setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); - } - // 如果设置了combo属性则本列只能选择不能输入 - if (attr.combo().length > 0) - { - // 这里默认设了2-101列只能选择不能输入. - setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } } @@ -531,13 +785,13 @@ public class ExcelUtil try { // 设置行高 - row.setHeight((short) (attr.height() * 20)); + row.setHeight(maxHeight); // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. if (attr.isExport()) { // 创建cell cell = row.createCell(column); - cell.setCellStyle(styles.get("data")); + cell.setCellStyle(styles.get("data_" + attr.align() + "_" + attr.color())); // 用于读取对象中的属性 Object value = getTargetValue(vo, field, attr); @@ -547,21 +801,30 @@ public class ExcelUtil String dictType = attr.dictType(); if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { - cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + cell.setCellValue(parseDateToStr(dateFormat, value)); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); } - else if (StringUtils.isNotEmpty(dictType)) + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } else { // 设置列类型 setCellVo(value, attr, cell); } + addStatisticsData(column, Convert.toStr(value), attr); } } catch (Exception e) @@ -572,48 +835,29 @@ public class ExcelUtil } /** - * 设置 POI XSSFSheet 单元格提示 - * + * 设置 POI XSSFSheet 单元格提示或选择框 + * * @param sheet 表单 - * @param promptTitle 提示标题 + * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 * @param firstRow 开始行 * @param endRow 结束行 * @param firstCol 开始列 * @param endCol 结束列 */ - public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, - int firstCol, int endCol) + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); - DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); DataValidation dataValidation = helper.createValidation(constraint, regions); - dataValidation.createPromptBox(promptTitle, promptContent); - dataValidation.setShowPromptBox(true); - sheet.addValidationData(dataValidation); - } - - /** - * 设置某些列的值只能输入预制的数据,显示下拉框. - * - * @param sheet 要设置的sheet. - * @param textlist 下拉框显示的内容 - * @param firstRow 开始行 - * @param endRow 结束行 - * @param firstCol 开始列 - * @param endCol 结束列 - * @return 设置好的sheet. - */ - public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) - { - DataValidationHelper helper = sheet.getDataValidationHelper(); - // 加载下拉列表内容 - DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); - // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 - CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); - // 数据有效性对象 - DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } // 处理Excel兼容性问题 if (dataValidation instanceof XSSFDataValidation) { @@ -624,65 +868,55 @@ public class ExcelUtil { dataValidation.setSuppressDropDownArrow(false); } - sheet.addValidationData(dataValidation); } /** * 解析导出值 0=男,1=女,2=未知 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 * @return 解析后值 - * @throws Exception */ - public static String convertByExp(String propertyValue, String converterExp, String separator) throws Exception + public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); - try + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { - String[] convertSource = converterExp.split(","); - for (String item : convertSource) + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { - String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) + for (String value : propertyValue.split(separator)) { - for (String value : propertyValue.split(separator)) + if (itemArray[0].equals(value)) { - if (itemArray[0].equals(value)) - { - propertyString.append(itemArray[1] + separator); - break; - } - } - } - else - { - if (itemArray[0].equals(propertyValue)) - { - return itemArray[1]; + propertyString.append(itemArray[1] + separator); + break; } } } - } - catch (Exception e) - { - throw e; + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * 反向解析值 男=0,女=1,未知=2 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 * @return 解析后值 - * @throws Exception */ - public static String reverseByExp(String propertyValue, String converterExp, String separator) throws Exception + public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); @@ -713,34 +947,96 @@ public class ExcelUtil /** * 解析字典值 - * + * * @param dictValue 字典值 * @param dictType 字典类型 * @param separator 分隔符 * @return 字典标签 */ - public static String convertDictByExp(String dictValue, String dictType, String separator) throws Exception + public static String convertDictByExp(String dictValue, String dictType, String separator) { - Object bean = SpringUtils.getBean("dictUtils"); - String methodName = "getDictLabel"; - Method method = bean.getClass().getDeclaredMethod(methodName, String.class, String.class, String.class); - return Convert.toStr(method.invoke(bean, dictType, dictValue, separator)); + return DictUtils.getDictLabel(dictType, dictValue, separator); } /** * 反向解析值字典值 - * + * * @param dictLabel 字典标签 * @param dictType 字典类型 * @param separator 分隔符 * @return 字典值 */ - public static String reverseDictByExp(String dictLabel, String dictType, String separator) throws Exception + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { - Object bean = SpringUtils.getBean("dictUtils"); - String methodName = "getDictValue"; - Method method = bean.getClass().getDeclaredMethod(methodName, String.class, String.class, String.class); - return Convert.toStr(method.invoke(bean, dictType, dictLabel, separator)); + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } } /** @@ -754,12 +1050,11 @@ public class ExcelUtil /** * 获取下载路径 - * + * * @param filename 文件名称 */ public String getAbsoluteFile(String filename) { - Object path = CacheUtils.getSysConfig("sys_config:" + Constants.LOCAL_ADDRESS); String downloadPath = Global.getDownloadPath() + filename; File desc = new File(downloadPath); if (!desc.getParentFile().exists()) @@ -771,7 +1066,7 @@ public class ExcelUtil /** * 获取bean中的属性值 - * + * * @param vo 实体对象 * @param field 字段 * @param excel 注解 @@ -784,7 +1079,7 @@ public class ExcelUtil if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); - if (target.indexOf(".") > -1) + if (target.contains(".")) { String[] targets = target.split("[.]"); for (String name : targets) @@ -802,7 +1097,7 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value @@ -810,12 +1105,12 @@ public class ExcelUtil */ private Object getValue(Object o, String name) throws Exception { - if (StringUtils.isNotEmpty(name)) + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { Class clazz = o.getClass(); - String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); - Method method = clazz.getMethod(methodName); - o = method.invoke(o); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); } return o; } @@ -825,7 +1120,17 @@ public class ExcelUtil */ private void createExcelField() { - this.fields = new ArrayList(); + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); List tempFields = new ArrayList<>(); tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); @@ -834,7 +1139,12 @@ public class ExcelUtil // 单注解 if (field.isAnnotationPresent(Excel.class)) { - putToField(field, field.getAnnotation(Excel.class)); + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } } // 多注解 @@ -842,24 +1152,31 @@ public class ExcelUtil { Excels attrs = field.getAnnotation(Excels.class); Excel[] excels = attrs.value(); - for (Excel excel : excels) + for (Excel attr : excels) { - putToField(field, excel); + if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } } } } - this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + return fields; } /** - * 放到字段集合中 + * 根据注解获取最大行高 */ - private void putToField(Field field, Excel attr) + public short getRowHeight() { - if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) + double maxHeight = 0; + for (Object[] os : this.fields) { - this.fields.add(new Object[] { field, attr }); + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); } + return (short) (maxHeight * 20); } /** @@ -868,32 +1185,31 @@ public class ExcelUtil public void createWorkbook() { this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); } /** * 创建工作表 - * + * * @param sheetNo sheet数量 * @param index 序号 */ - public void createSheet(double sheetNo, int index) + public void createSheet(int sheetNo, int index) { - this.sheet = wb.createSheet(); - this.styles = createStyles(wb); // 设置工作表的名称. - if (sheetNo == 0) - { - wb.setSheetName(index, sheetName); - } - else + if (sheetNo > 1 && index > 0) { + this.sheet = wb.createSheet(); + this.createTitle(); wb.setSheetName(index, sheetName + index); } } /** * 获取单元格值 - * + * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 @@ -910,18 +1226,18 @@ public class ExcelUtil Cell cell = row.getCell(column); if (StringUtils.isNotNull(cell)) { - if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { val = cell.getNumericCellValue(); - if (HSSFDateUtil.isCellDateFormatted(cell)) + if (DateUtil.isCellDateFormatted(cell)) { val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 } else { - if ((Double) val % 1 > 0) + if ((Double) val % 1 != 0) { - val = new DecimalFormat("0.00").format(val); + val = new BigDecimal(val.toString()); } else { @@ -929,15 +1245,15 @@ public class ExcelUtil } } } - else if (cell.getCellTypeEnum() == CellType.STRING) + else if (cell.getCellType() == CellType.STRING) { val = cell.getStringCellValue(); } - else if (cell.getCellTypeEnum() == CellType.BOOLEAN) + else if (cell.getCellType() == CellType.BOOLEAN) { val = cell.getBooleanCellValue(); } - else if (cell.getCellTypeEnum() == CellType.ERROR) + else if (cell.getCellType() == CellType.ERROR) { val = cell.getErrorCellValue(); } @@ -950,4 +1266,125 @@ public class ExcelUtil } return val; } -} \ No newline at end of file + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } +} diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeEventService.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeEventService.java index fa22a35..0395ad6 100644 --- a/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeEventService.java +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeEventService.java @@ -1,6 +1,7 @@ package com.snow.dingtalk.listener; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.aliyun.dingtalktodo_1_0.models.GetTodoTaskBySourceIdResponseBody; import com.snow.common.enums.DingTalkListenerType; @@ -36,9 +37,9 @@ public class WorkRecodeEventService implements ISyncDingTalkInfo { Integer code = eventType.getCode(); //钉钉创建待办 if(code.equals(DingTalkListenerType.WORK_RECODE_CREATE.getCode())){ - SysOaTask sysOaTask=(SysOaTask)syncEvent.getSource(); + String sysOaTask=(String)syncEvent.getSource(); log.info("@@创建钉钉待办系统传入的参数:{}",JSON.toJSONString(sysOaTask)); - workRecodeService.createTodoTask(sysOaTask); + workRecodeService.createTodoTask(JSONUtil.toBean(sysOaTask,SysOaTask.class)); } //更新钉钉待办 if(code.equals(DingTalkListenerType.WORK_RECORD_UPDATE.getCode())){ @@ -55,12 +56,12 @@ public class WorkRecodeEventService implements ISyncDingTalkInfo { //更新任务状态 if(code.equals(DingTalkListenerType.UPDATE_TODO_TASK_EXECUTOR_STATUS.getCode())){ SysOaTaskDistribute sysOaTaskDistribute=(SysOaTaskDistribute)syncEvent.getSource(); - GetTodoTaskBySourceIdResponseBody body = workRecodeService.getTodoTaskByBusinessId(String.valueOf(sysOaTaskDistribute.getId())); + GetTodoTaskBySourceIdResponseBody body = workRecodeService.getTodoTaskByBusinessId(String.valueOf(sysOaTaskDistribute.getTaskNo())); boolean isComplete=false; if(ObjectUtil.isNotNull(sysOaTaskDistribute.getTaskCompleteTime())){ isComplete=true; } - workRecodeService.updateTodoTaskExecutorStatus(body.getId(),isComplete); + workRecodeService.updateTodoTaskExecutorStatus(Long.parseLong(sysOaTaskDistribute.getTaskExecuteId()),body.getId(),isComplete); } //钉钉发送普通消息 if(code.equals(DingTalkListenerType.ASYNCSEND_V2.getCode())){ diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java index ae01517..b1a9362 100644 --- a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java @@ -52,7 +52,7 @@ public interface WorkRecodeService { * @param status 是否 * @return */ - Boolean updateTodoTaskExecutorStatus(String taskId,Boolean status); + Boolean updateTodoTaskExecutorStatus(Long userId,String taskId,Boolean status); /** * 根据业务id获取待办详情(新) diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java index cf33339..3fb7f1e 100644 --- a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java @@ -1,7 +1,9 @@ package com.snow.dingtalk.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.aliyun.dingtalktodo_1_0.Client; import com.aliyun.dingtalktodo_1_0.models.*; @@ -28,9 +30,7 @@ import com.snow.dingtalk.service.UserService; import com.snow.dingtalk.service.WorkRecodeService; import com.snow.framework.util.ShiroUtils; import com.snow.system.domain.SysOaTask; -import com.snow.system.service.ISysMessageTemplateService; -import com.snow.system.service.ISysUserService; -import com.snow.system.service.impl.SysConfigServiceImpl; +import com.snow.system.domain.SysOaTaskDistribute; import com.taobao.api.ApiException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -51,14 +51,9 @@ import java.util.stream.Collectors; @Service public class WorkRecodeServiceImpl extends BaseService implements WorkRecodeService { - private SysConfigServiceImpl isysConfigService=SpringUtils.getBean(SysConfigServiceImpl.class); - - - private ISysMessageTemplateService sysMessageTemplateService=SpringUtils.getBean(ISysMessageTemplateService.class); private UserService userService=SpringUtils.getBean(UserService.class); - private ISysUserService sysUserService=SpringUtils.getBean(ISysUserService.class); /** * 创建工作待办 @@ -120,6 +115,7 @@ public class WorkRecodeServiceImpl extends BaseService implements WorkRecodeServ } try { CreateTodoTaskResponse response = createTodoClient().createTodoTaskWithOptions(userService.getUnionIdBySysUserId(Long.parseLong(sysOaTask.getCreateBy())), createTodoTaskRequest, createTodoTaskHeaders, new RuntimeOptions()); + log.info("@@创建钉钉待办返回参数:{}", JSONUtil.toJsonStr(response)); return response.getBody().id; } catch (Exception err) { log.error("@@调用钉钉创建待办的时候出现异常,异常信息为:{}",err.getMessage()); @@ -150,21 +146,23 @@ public class WorkRecodeServiceImpl extends BaseService implements WorkRecodeServ updateTodoTaskHeaders.xAcsDingtalkAccessToken = getDingTalkTokenV2(); UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest() .setSubject(sysOaTask.getTaskName()) - .setDescription(sysOaTask.getTaskContent()) - .setExecutorIds(Arrays.asList( - "" - )); - //设置是否完成 - if(ObjectUtil.isNotNull(sysOaTask.getTaskCompleteTime())){ - updateTodoTaskRequest.setDone(true); - }else { - updateTodoTaskRequest.setDone(false); + .setDescription(sysOaTask.getTaskContent()); + List taskDistributeId = sysOaTask.getTaskDistributeId(); + //执行者id + if(CollUtil.isNotEmpty(taskDistributeId)){ + List executorIds = taskDistributeId.stream().map(t -> { + return userService.getUnionIdBySysUserId(Long.parseLong(t)); + }).collect(Collectors.toList()); + updateTodoTaskRequest.setExecutorIds(executorIds); } + //设置是否完成 + updateTodoTaskRequest.setDone(ObjectUtil.isNotNull(sysOaTask.getTaskCompleteTime())); if(ObjectUtil.isNotNull(sysOaTask.getExpectedTime())){ updateTodoTaskRequest.setDueTime(sysOaTask.getExpectedTime().getTime()); } try { - UpdateTodoTaskResponse updateTodoTaskResponse = createTodoClient().updateTodoTaskWithOptions(userService.getUnionIdBySysUserId(Long.parseLong(sysOaTask.getUpdateBy())), sysOaTask.getDingTaskId(), updateTodoTaskRequest, updateTodoTaskHeaders, new RuntimeOptions()); + String unionId=userService.getUnionIdBySysUserId(Long.parseLong(sysOaTask.getUpdateBy())); + UpdateTodoTaskResponse updateTodoTaskResponse = createTodoClient().updateTodoTaskWithOptions(unionId, sysOaTask.getTaskOutsideId(), updateTodoTaskRequest, updateTodoTaskHeaders, new RuntimeOptions()); return updateTodoTaskResponse.getBody().result; }catch (Exception err) { log.error("@@调用钉钉更新待办的时候出现异常,异常信息为:{}",err.getMessage()); @@ -173,18 +171,17 @@ public class WorkRecodeServiceImpl extends BaseService implements WorkRecodeServ } @Override - public Boolean updateTodoTaskExecutorStatus(String taskId,Boolean status) { + public Boolean updateTodoTaskExecutorStatus(Long userId,String taskId,Boolean status) { + String unionId= userService.getUnionIdBySysUserId(userId); UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders(); updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = getDingTalkTokenV2(); UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList() - .setId(taskId) + .setId(unionId) .setIsDone(status); UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest() - .setExecutorStatusList(Arrays.asList( - executorStatusList0 - )); + .setExecutorStatusList(CollUtil.newArrayList(executorStatusList0)); try { - UpdateTodoTaskExecutorStatusResponse response = createTodoClient().updateTodoTaskExecutorStatusWithOptions("PUoiinWIpa2yH2ymhiiGiP6g", taskId, updateTodoTaskExecutorStatusRequest, updateTodoTaskExecutorStatusHeaders, new RuntimeOptions()); + UpdateTodoTaskExecutorStatusResponse response = createTodoClient().updateTodoTaskExecutorStatusWithOptions(unionId, taskId, updateTodoTaskExecutorStatusRequest, updateTodoTaskExecutorStatusHeaders, new RuntimeOptions()); return response.getBody().result; } catch (Exception err) { log.error("@@调用钉钉更新办状态的时候出现异常,异常信息为:{}",err.getMessage()); diff --git a/snow-framework/src/main/java/com/snow/framework/web/service/DictService.java b/snow-framework/src/main/java/com/snow/framework/web/service/DictService.java index 534dce9..f804afd 100644 --- a/snow-framework/src/main/java/com/snow/framework/web/service/DictService.java +++ b/snow-framework/src/main/java/com/snow/framework/web/service/DictService.java @@ -3,7 +3,7 @@ package com.snow.framework.web.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; import com.snow.system.service.ISysDictDataService; import com.snow.system.service.ISysDictTypeService; diff --git a/snow-quartz/src/main/java/com/snow/quartz/controller/SysJobController.java b/snow-quartz/src/main/java/com/snow/quartz/controller/SysJobController.java index f145625..8d3aef6 100644 --- a/snow-quartz/src/main/java/com/snow/quartz/controller/SysJobController.java +++ b/snow-quartz/src/main/java/com/snow/quartz/controller/SysJobController.java @@ -1,17 +1,5 @@ package com.snow.quartz.controller; -import java.util.List; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.quartz.SchedulerException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import com.snow.common.annotation.Log; import com.snow.common.core.controller.BaseController; import com.snow.common.core.domain.AjaxResult; @@ -22,6 +10,15 @@ import com.snow.common.utils.poi.ExcelUtil; import com.snow.quartz.domain.SysJob; import com.snow.quartz.service.ISysJobService; import com.snow.quartz.util.CronUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 调度任务信息操作处理 diff --git a/snow-quartz/src/main/java/com/snow/quartz/task/SyncSysDingTask.java b/snow-quartz/src/main/java/com/snow/quartz/task/SyncSysDingTask.java index 5deec3a..8f75ec6 100644 --- a/snow-quartz/src/main/java/com/snow/quartz/task/SyncSysDingTask.java +++ b/snow-quartz/src/main/java/com/snow/quartz/task/SyncSysDingTask.java @@ -49,7 +49,7 @@ public class SyncSysDingTask { SysOaTask upSysOaTask=new SysOaTask(); upSysOaTask.setTaskNo(t.getTaskNo()); upSysOaTask.setTaskStatus(TaskStatus.FINISH.getCode()); - sysOaTaskService.updateSysOaTask(upSysOaTask); + sysOaTaskService.updateById(upSysOaTask); } }); } diff --git a/snow-system/src/main/java/com/snow/system/domain/SysOaTask.java b/snow-system/src/main/java/com/snow/system/domain/SysOaTask.java index 450df2c..5808d27 100644 --- a/snow-system/src/main/java/com/snow/system/domain/SysOaTask.java +++ b/snow-system/src/main/java/com/snow/system/domain/SysOaTask.java @@ -1,5 +1,9 @@ package com.snow.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.fasterxml.jackson.annotation.JsonFormat; import com.snow.common.annotation.Excel; import com.snow.common.core.domain.BaseEntity; @@ -20,12 +24,10 @@ public class SysOaTask extends BaseEntity private static final long serialVersionUID = 1L; /** 任务编号 */ + @TableId(type = IdType.NONE) + @Excel(name = "任务编号") private String taskNo; - /** - * 钉钉待办taskId - */ - private String dingTaskId; /** 任务名称 */ @Excel(name = "任务名称") @@ -35,26 +37,29 @@ public class SysOaTask extends BaseEntity @Excel(name = "任务内容") private String taskContent; - @Excel(name = "紧急程度") + @Excel(name = "紧急程度",dictType = "sys_oa_task_priority") private Integer priority; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "任务期望完成时间",dateFormat = "yyyy-MM-dd HH:mm:ss") private Date expectedTime; /** 任务状态(详见数据字典) */ - @Excel(name = "任务状态", readConverterExp = "详=见数据字典") + @Excel(name = "任务状态", readConverterExp = "un_finish=执行中,finish=结束") private String taskStatus; /** 任务类型(详见数据字典) */ - @Excel(name = "任务类型", readConverterExp = "详=见数据字典") + @Excel(name = "任务类型", dictType = "sys_task_type") private String taskType; /** 任务来源 */ @Excel(name = "任务来源") private String taskSource; - /** 任务外部id */ - @Excel(name = "任务外部id") + @Excel(name = "任务状态", readConverterExp = "0=不同步,1=同步") + private Integer syncDingtalk; + + /** 任务外部id即钉钉id*/ private String taskOutsideId; /** 任务跳转URL */ @@ -62,21 +67,23 @@ public class SysOaTask extends BaseEntity private String taskUrl; /** 任务分配人 */ - @Excel(name = "任务分配人") + @Excel(name = "任务执行人") + @TableField(exist = false) private List taskDistributeId; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(exist = false) private Date taskCompleteTime; - /** 乐观锁 */ - @Excel(name = "乐观锁") private Long revision; - /** 删除标识 */ - @Excel(name = "删除标识") + + @TableLogic private Long isDelete; + @TableField(exist = false) private List sysOaTaskDistributeList; + } diff --git a/snow-system/src/main/java/com/snow/system/domain/SysOaTaskDistribute.java b/snow-system/src/main/java/com/snow/system/domain/SysOaTaskDistribute.java index bbeb3c4..0a229fc 100644 --- a/snow-system/src/main/java/com/snow/system/domain/SysOaTaskDistribute.java +++ b/snow-system/src/main/java/com/snow/system/domain/SysOaTaskDistribute.java @@ -1,5 +1,9 @@ package com.snow.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.fasterxml.jackson.annotation.JsonFormat; import com.snow.common.annotation.Excel; import com.snow.common.core.domain.BaseEntity; @@ -20,6 +24,7 @@ public class SysOaTaskDistribute extends BaseEntity private static final long serialVersionUID = 1L; /** 主键ID */ + @TableId(type = IdType.AUTO) private Long id; /** 任务编号 */ @@ -38,6 +43,7 @@ public class SysOaTaskDistribute extends BaseEntity @Excel(name = "任务执行状态") private String taskExecuteStatus; + @TableField(exist = false) private List taskExecuteStatusList; /** 任务完成时间 */ @@ -65,16 +71,19 @@ public class SysOaTaskDistribute extends BaseEntity /** 删除标识 */ @Excel(name = "删除标识") + @TableLogic private Long isDelete; /** * 任务花费时间 */ + @TableField(exist = false) private String spendTime; /** * 任务主表 */ + @TableField(exist = false) private SysOaTask sysOaTask; } diff --git a/snow-system/src/main/java/com/snow/system/event/SyncEvent.java b/snow-system/src/main/java/com/snow/system/event/SyncEvent.java index e6ec572..add616d 100644 --- a/snow-system/src/main/java/com/snow/system/event/SyncEvent.java +++ b/snow-system/src/main/java/com/snow/system/event/SyncEvent.java @@ -10,6 +10,8 @@ import org.springframework.context.ApplicationEvent; */ public class SyncEvent extends ApplicationEvent { + private static final long serialVersionUID = 2315510470385496950L; + private Integer eventType; private T t; diff --git a/snow-system/src/main/java/com/snow/system/mapper/SysDictDataMapper.java b/snow-system/src/main/java/com/snow/system/mapper/SysDictDataMapper.java index f7230ce..eae3e76 100644 --- a/snow-system/src/main/java/com/snow/system/mapper/SysDictDataMapper.java +++ b/snow-system/src/main/java/com/snow/system/mapper/SysDictDataMapper.java @@ -2,7 +2,7 @@ package com.snow.system.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; /** * 字典表 数据层 diff --git a/snow-system/src/main/java/com/snow/system/mapper/SysDictTypeMapper.java b/snow-system/src/main/java/com/snow/system/mapper/SysDictTypeMapper.java index 9a8bdae..cfac294 100644 --- a/snow-system/src/main/java/com/snow/system/mapper/SysDictTypeMapper.java +++ b/snow-system/src/main/java/com/snow/system/mapper/SysDictTypeMapper.java @@ -1,7 +1,7 @@ package com.snow.system.mapper; import java.util.List; -import com.snow.system.domain.SysDictType; +import com.snow.common.core.domain.SysDictType; /** * 字典表 数据层 diff --git a/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskDistributeMapper.java b/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskDistributeMapper.java index 0da73b9..9475c98 100644 --- a/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskDistributeMapper.java +++ b/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskDistributeMapper.java @@ -1,6 +1,6 @@ package com.snow.system.mapper; -import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.snow.system.domain.SysOaTaskDistribute; /** @@ -9,61 +9,5 @@ import com.snow.system.domain.SysOaTaskDistribute; * @author 没用的阿吉 * @date 2021-08-15 */ -public interface SysOaTaskDistributeMapper -{ - /** - * 查询任务分配 - * - * @param id 任务分配ID - * @return 任务分配 - */ - public SysOaTaskDistribute selectSysOaTaskDistributeById(Long id); - - - /** - * 根据任务编号查询 - * @param taskNo 任务编号 - * @return 任务分配 - */ - List selectSysOaTaskDistributeByTaskNo(String taskNo); - - /** - * 查询任务分配列表 - * - * @param sysOaTaskDistribute 任务分配 - * @return 任务分配集合 - */ - public List selectSysOaTaskDistributeList(SysOaTaskDistribute sysOaTaskDistribute); - - /** - * 新增任务分配 - * - * @param sysOaTaskDistribute 任务分配 - * @return 结果 - */ - public int insertSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute); - - /** - * 修改任务分配 - * - * @param sysOaTaskDistribute 任务分配 - * @return 结果 - */ - public int updateSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute); - - /** - * 删除任务分配 - * - * @param id 任务分配ID - * @return 结果 - */ - public int deleteSysOaTaskDistributeById(Long id); - - /** - * 批量删除任务分配 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - public int deleteSysOaTaskDistributeByIds(String[] ids); +public interface SysOaTaskDistributeMapper extends BaseMapper { } diff --git a/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskMapper.java b/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskMapper.java index 7e00cc1..27217ab 100644 --- a/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskMapper.java +++ b/snow-system/src/main/java/com/snow/system/mapper/SysOaTaskMapper.java @@ -1,6 +1,8 @@ package com.snow.system.mapper; import java.util.List; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.snow.system.domain.SysOaTask; /** @@ -9,8 +11,7 @@ import com.snow.system.domain.SysOaTask; * @author 没用的阿吉 * @date 2021-07-29 */ -public interface SysOaTaskMapper -{ +public interface SysOaTaskMapper extends BaseMapper { /** * 查询系统任务 * diff --git a/snow-system/src/main/java/com/snow/system/service/ISysDictDataService.java b/snow-system/src/main/java/com/snow/system/service/ISysDictDataService.java index 1531247..0c3deae 100644 --- a/snow-system/src/main/java/com/snow/system/service/ISysDictDataService.java +++ b/snow-system/src/main/java/com/snow/system/service/ISysDictDataService.java @@ -1,7 +1,7 @@ package com.snow.system.service; import java.util.List; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; /** * 字典 业务层 diff --git a/snow-system/src/main/java/com/snow/system/service/ISysDictTypeService.java b/snow-system/src/main/java/com/snow/system/service/ISysDictTypeService.java index 5c77220..f51d631 100644 --- a/snow-system/src/main/java/com/snow/system/service/ISysDictTypeService.java +++ b/snow-system/src/main/java/com/snow/system/service/ISysDictTypeService.java @@ -2,8 +2,8 @@ package com.snow.system.service; import java.util.List; import com.snow.common.core.domain.Ztree; -import com.snow.system.domain.SysDictData; -import com.snow.system.domain.SysDictType; +import com.snow.common.core.domain.SysDictData; +import com.snow.common.core.domain.SysDictType; /** * 字典 业务层 diff --git a/snow-system/src/main/java/com/snow/system/service/ISysOaTaskDistributeService.java b/snow-system/src/main/java/com/snow/system/service/ISysOaTaskDistributeService.java index 4c1920c..69b7347 100644 --- a/snow-system/src/main/java/com/snow/system/service/ISysOaTaskDistributeService.java +++ b/snow-system/src/main/java/com/snow/system/service/ISysOaTaskDistributeService.java @@ -1,6 +1,9 @@ package com.snow.system.service; import java.util.List; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.service.IService; import com.snow.system.domain.SysOaTaskDistribute; /** @@ -9,7 +12,7 @@ import com.snow.system.domain.SysOaTaskDistribute; * @author 没用的阿吉 * @date 2021-08-15 */ -public interface ISysOaTaskDistributeService +public interface ISysOaTaskDistributeService extends IService { /** * 查询任务分配 @@ -17,7 +20,7 @@ public interface ISysOaTaskDistributeService * @param id 任务分配ID * @return 任务分配 */ - public SysOaTaskDistribute selectSysOaTaskDistributeById(Long id); + SysOaTaskDistribute selectSysOaTaskDistributeById(Long id); /** * 查询任务分配列表 @@ -25,37 +28,16 @@ public interface ISysOaTaskDistributeService * @param sysOaTaskDistribute 任务分配 * @return 任务分配集合 */ - public List selectSysOaTaskDistributeList(SysOaTaskDistribute sysOaTaskDistribute); + List selectSysOaTaskDistributeList(SysOaTaskDistribute sysOaTaskDistribute); + /** - * 新增任务分配 - * + * 获取我处理的和我待处理任务 * @param sysOaTaskDistribute 任务分配 * @return 结果 */ - public int insertSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute); + List getSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute); - /** - * 修改任务分配 - * - * @param sysOaTaskDistribute 任务分配 - * @return 结果 - */ - public int updateSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute); + void warpSysOaTask(List sysOaTaskDistributes); - /** - * 批量删除任务分配 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - public int deleteSysOaTaskDistributeByIds(String ids); - - /** - * 删除任务分配信息 - * - * @param id 任务分配ID - * @return 结果 - */ - public int deleteSysOaTaskDistributeById(Long id); } diff --git a/snow-system/src/main/java/com/snow/system/service/ISysOaTaskService.java b/snow-system/src/main/java/com/snow/system/service/ISysOaTaskService.java index 178f99f..7133b7c 100644 --- a/snow-system/src/main/java/com/snow/system/service/ISysOaTaskService.java +++ b/snow-system/src/main/java/com/snow/system/service/ISysOaTaskService.java @@ -1,6 +1,8 @@ package com.snow.system.service; import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; import com.snow.system.domain.SysOaTask; /** @@ -9,15 +11,14 @@ import com.snow.system.domain.SysOaTask; * @author 没用的阿吉 * @date 2021-07-29 */ -public interface ISysOaTaskService -{ +public interface ISysOaTaskService extends IService { /** * 查询系统任务 * * @param taskNo 系统任务ID * @return 系统任务 */ - public SysOaTask selectSysOaTaskById(String taskNo); + SysOaTask selectSysOaTaskById(String taskNo); /** * 查询系统任务列表 @@ -25,7 +26,7 @@ public interface ISysOaTaskService * @param sysOaTask 系统任务 * @return 系统任务集合 */ - public List selectSysOaTaskList(SysOaTask sysOaTask); + List selectSysOaTaskList(SysOaTask sysOaTask); /** * 新增系统任务 @@ -33,29 +34,13 @@ public interface ISysOaTaskService * @param sysOaTask 系统任务 * @return 结果 */ - public int insertSysOaTask(SysOaTask sysOaTask); + SysOaTask insertSysOaTask(SysOaTask sysOaTask); + /** - * 修改系统任务 - * - * @param sysOaTask 系统任务 - * @return 结果 + * 根据任务编号获取三方id + * @param taskNo 任务id + * @return */ - public int updateSysOaTask(SysOaTask sysOaTask); - - /** - * 批量删除系统任务 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - public int deleteSysOaTaskByIds(String ids); - - /** - * 删除系统任务信息 - * - * @param taskNo 系统任务ID - * @return 结果 - */ - public int deleteSysOaTaskById(String taskNo); + String getOutTaskOutsideId(String taskNo); } diff --git a/snow-system/src/main/java/com/snow/system/service/impl/DingtalkCallBackServiceImpl.java b/snow-system/src/main/java/com/snow/system/service/impl/DingtalkCallBackServiceImpl.java index dea718b..0421000 100644 --- a/snow-system/src/main/java/com/snow/system/service/impl/DingtalkCallBackServiceImpl.java +++ b/snow-system/src/main/java/com/snow/system/service/impl/DingtalkCallBackServiceImpl.java @@ -9,7 +9,6 @@ import com.snow.common.enums.DingTalkListenerType; import com.snow.common.utils.DateUtils; import com.snow.common.utils.StringUtils; import com.snow.system.domain.DingtalkCallBackEvent; -import com.snow.system.domain.SysDictData; import com.snow.system.event.SyncEvent; import com.snow.system.mapper.DingtalkCallBackEventMapper; import org.springframework.beans.BeanUtils; diff --git a/snow-system/src/main/java/com/snow/system/service/impl/SysDictDataServiceImpl.java b/snow-system/src/main/java/com/snow/system/service/impl/SysDictDataServiceImpl.java index 7734681..2af878f 100644 --- a/snow-system/src/main/java/com/snow/system/service/impl/SysDictDataServiceImpl.java +++ b/snow-system/src/main/java/com/snow/system/service/impl/SysDictDataServiceImpl.java @@ -2,11 +2,11 @@ package com.snow.system.service.impl; import java.util.List; -import com.snow.system.utils.DictUtils; +import com.snow.common.utils.DictUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.snow.common.core.text.Convert; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; import com.snow.system.mapper.SysDictDataMapper; import com.snow.system.service.ISysDictDataService; diff --git a/snow-system/src/main/java/com/snow/system/service/impl/SysDictTypeServiceImpl.java b/snow-system/src/main/java/com/snow/system/service/impl/SysDictTypeServiceImpl.java index fdb4307..120545a 100644 --- a/snow-system/src/main/java/com/snow/system/service/impl/SysDictTypeServiceImpl.java +++ b/snow-system/src/main/java/com/snow/system/service/impl/SysDictTypeServiceImpl.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; -import com.snow.system.domain.SysDictType; -import com.snow.system.utils.DictUtils; +import com.snow.common.core.domain.SysDictType; +import com.snow.common.utils.DictUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,7 +14,7 @@ import com.snow.common.core.domain.Ztree; import com.snow.common.core.text.Convert; import com.snow.common.exception.BusinessException; import com.snow.common.utils.StringUtils; -import com.snow.system.domain.SysDictData; +import com.snow.common.core.domain.SysDictData; import com.snow.system.mapper.SysDictDataMapper; import com.snow.system.mapper.SysDictTypeMapper; import com.snow.system.service.ISysDictTypeService; diff --git a/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskDistributeServiceImpl.java b/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskDistributeServiceImpl.java index 7c71f62..03150b9 100644 --- a/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskDistributeServiceImpl.java +++ b/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskDistributeServiceImpl.java @@ -1,13 +1,24 @@ package com.snow.system.service.impl; -import java.util.List; -import com.snow.common.utils.DateUtils; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.BetweenFormater; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.snow.common.enums.DingFlowTaskType; +import com.snow.system.domain.SysOaTask; +import com.snow.system.domain.SysOaTaskDistribute; +import com.snow.system.domain.SysUser; +import com.snow.system.mapper.SysOaTaskDistributeMapper; +import com.snow.system.service.ISysOaTaskDistributeService; +import com.snow.system.service.ISysOaTaskService; +import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.snow.system.mapper.SysOaTaskDistributeMapper; -import com.snow.system.domain.SysOaTaskDistribute; -import com.snow.system.service.ISysOaTaskDistributeService; -import com.snow.common.core.text.Convert; + +import java.util.List; /** * 任务分配Service业务层处理 @@ -16,11 +27,14 @@ import com.snow.common.core.text.Convert; * @date 2021-08-15 */ @Service -public class SysOaTaskDistributeServiceImpl implements ISysOaTaskDistributeService -{ - @Autowired - private SysOaTaskDistributeMapper sysOaTaskDistributeMapper; +public class SysOaTaskDistributeServiceImpl extends ServiceImpl implements ISysOaTaskDistributeService { + + @Autowired + private ISysOaTaskService sysOaTaskService; + + @Autowired + private SysUserServiceImpl sysUserService; /** * 查询任务分配 * @@ -30,7 +44,7 @@ public class SysOaTaskDistributeServiceImpl implements ISysOaTaskDistributeServi @Override public SysOaTaskDistribute selectSysOaTaskDistributeById(Long id) { - return sysOaTaskDistributeMapper.selectSysOaTaskDistributeById(id); + return this.getById(id); } /** @@ -40,58 +54,45 @@ public class SysOaTaskDistributeServiceImpl implements ISysOaTaskDistributeServi * @return 任务分配 */ @Override - public List selectSysOaTaskDistributeList(SysOaTaskDistribute sysOaTaskDistribute) - { - return sysOaTaskDistributeMapper.selectSysOaTaskDistributeList(sysOaTaskDistribute); + public List selectSysOaTaskDistributeList(SysOaTaskDistribute sysOaTaskDistribute) { + LambdaQueryWrapper lambda = new QueryWrapper().lambda(); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskNo()),SysOaTaskDistribute::getTaskNo,sysOaTaskDistribute.getTaskNo()); + lambda.in(CollUtil.isNotEmpty(sysOaTaskDistribute.getTaskExecuteStatusList()),SysOaTaskDistribute::getTaskExecuteStatus,sysOaTaskDistribute.getTaskExecuteStatusList()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskDistributeId()),SysOaTaskDistribute::getTaskDistributeId,sysOaTaskDistribute.getTaskDistributeId()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskExecuteId()),SysOaTaskDistribute::getTaskExecuteId,sysOaTaskDistribute.getTaskExecuteId()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskExecuteStatus()),SysOaTaskDistribute::getTaskExecuteStatus,sysOaTaskDistribute.getTaskExecuteStatus()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskCompleteTime()),SysOaTaskDistribute::getTaskCompleteTime,sysOaTaskDistribute.getTaskCompleteTime()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskStartTime()),SysOaTaskDistribute::getTaskStartTime,sysOaTaskDistribute.getTaskStartTime()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTaskDistribute.getTaskSuspendTime()),SysOaTaskDistribute::getTaskSuspendTime,sysOaTaskDistribute.getTaskSuspendTime()); + return this.list(lambda); } - /** - * 新增任务分配 - * - * @param sysOaTaskDistribute 任务分配 - * @return 结果 - */ @Override - public int insertSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute) - { - sysOaTaskDistribute.setCreateTime(DateUtils.getNowDate()); - return sysOaTaskDistributeMapper.insertSysOaTaskDistribute(sysOaTaskDistribute); + public List getSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute) { + List sysOaTaskDistributes = this.selectSysOaTaskDistributeList(sysOaTaskDistribute); + if(CollUtil.isEmpty(sysOaTaskDistributes)){ + return sysOaTaskDistributes; + } + warpSysOaTask(sysOaTaskDistributes); + return sysOaTaskDistributes; } - /** - * 修改任务分配 - * - * @param sysOaTaskDistribute 任务分配 - * @return 结果 - */ - @Override - public int updateSysOaTaskDistribute(SysOaTaskDistribute sysOaTaskDistribute) - { - sysOaTaskDistribute.setUpdateTime(DateUtils.getNowDate()); - return sysOaTaskDistributeMapper.updateSysOaTaskDistribute(sysOaTaskDistribute); + public void warpSysOaTask(List sysOaTaskDistributes){ + sysOaTaskDistributes.forEach(t->{ + SysOaTask sysOaTask = sysOaTaskService.selectSysOaTaskById(t.getTaskNo()); + sysOaTask.setCreateBy(sysUserService.selectUserById(Long.parseLong(sysOaTask.getCreateBy())).getUserName()); + if(ObjectUtil.isNotNull(t.getTaskDistributeId())){ + t.setTaskDistributeId(sysUserService.selectUserById(Long.parseLong(t.getTaskDistributeId())).getUserName()); + } + if(ObjectUtil.isNotNull(t.getTaskExecuteId())){ + t.setTaskExecuteId(sysUserService.selectUserById(Long.parseLong(t.getTaskExecuteId())).getUserName()); + } + if(ObjectUtil.isNotNull(t.getTaskStartTime())&&ObjectUtil.isNotNull(t.getTaskCompleteTime())){ + t.setSpendTime(DateUtil.formatBetween(t.getTaskStartTime(),t.getTaskCompleteTime(), BetweenFormater.Level.SECOND)); + } + t.setSysOaTask(sysOaTask); + t.setCreateBy(sysUserService.selectUserById(Long.parseLong(t.getCreateBy())).getUserName()); + }); } - /** - * 删除任务分配对象 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - @Override - public int deleteSysOaTaskDistributeByIds(String ids) - { - return sysOaTaskDistributeMapper.deleteSysOaTaskDistributeByIds(Convert.toStrArray(ids)); - } - - /** - * 删除任务分配信息 - * - * @param id 任务分配ID - * @return 结果 - */ - @Override - public int deleteSysOaTaskDistributeById(Long id) - { - return sysOaTaskDistributeMapper.deleteSysOaTaskDistributeById(id); - } } diff --git a/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskServiceImpl.java b/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskServiceImpl.java index f000d76..5259239 100644 --- a/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskServiceImpl.java +++ b/snow-system/src/main/java/com/snow/system/service/impl/SysOaTaskServiceImpl.java @@ -2,20 +2,17 @@ package com.snow.system.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.snow.common.constant.MessageConstants; import com.snow.common.constant.SequenceConstants; import com.snow.common.core.domain.MessageEventRequest; -import com.snow.common.core.text.Convert; import com.snow.common.enums.DingFlowTaskType; -import com.snow.common.enums.DingTalkListenerType; import com.snow.common.enums.MessageEventType; -import com.snow.common.enums.TaskStatus; -import com.snow.common.exception.BusinessException; -import com.snow.common.utils.DateUtils; import com.snow.system.domain.SysOaTask; import com.snow.system.domain.SysOaTaskDistribute; -import com.snow.system.event.SyncEvent; -import com.snow.system.mapper.SysOaTaskDistributeMapper; import com.snow.system.mapper.SysOaTaskMapper; import com.snow.system.service.ISysOaTaskDistributeService; import com.snow.system.service.ISysOaTaskService; @@ -25,10 +22,10 @@ import org.apache.commons.compress.utils.Sets; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 系统任务Service业务层处理 @@ -37,17 +34,11 @@ import java.util.*; * @date 2021-07-29 */ @Service -public class SysOaTaskServiceImpl implements ISysOaTaskService -{ - @Autowired - private SysOaTaskMapper sysOaTaskMapper; +public class SysOaTaskServiceImpl extends ServiceImpl implements ISysOaTaskService { @Autowired private ISysOaTaskDistributeService sysOaTaskDistributeService; - @Resource - private SysOaTaskDistributeMapper sysOaTaskDistributeMapper; - @Autowired private ISysUserService sysUserService; @@ -57,6 +48,7 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService @Autowired private ApplicationContext applicationContext; + /** * 查询系统任务 * @@ -64,9 +56,8 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService * @return 系统任务 */ @Override - public SysOaTask selectSysOaTaskById(String taskNo) - { - return sysOaTaskMapper.selectSysOaTaskById(taskNo); + public SysOaTask selectSysOaTaskById(String taskNo) { + return this.getById(taskNo); } /** @@ -76,9 +67,13 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService * @return 系统任务 */ @Override - public List selectSysOaTaskList(SysOaTask sysOaTask) - { - return sysOaTaskMapper.selectSysOaTaskList(sysOaTask); + public List selectSysOaTaskList(SysOaTask sysOaTask) { + LambdaQueryWrapper lambda = new QueryWrapper().lambda(); + lambda.like(ObjectUtil.isNotEmpty(sysOaTask.getTaskNo()),SysOaTask::getTaskNo,sysOaTask.getTaskNo()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTask.getTaskStatus()),SysOaTask::getTaskStatus,sysOaTask.getTaskStatus()); + lambda.eq(ObjectUtil.isNotEmpty(sysOaTask.getPriority()),SysOaTask::getPriority,sysOaTask.getPriority()); + lambda.like(ObjectUtil.isNotEmpty(sysOaTask.getTaskName()),SysOaTask::getTaskName,sysOaTask.getTaskName()); + return this.list(lambda); } /** @@ -88,86 +83,38 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService * @return 结果 */ @Override - @Transactional(rollbackFor = Exception.class) - public int insertSysOaTask(SysOaTask sysOaTask) - { - sysOaTask.setCreateTime(DateUtils.getNowDate()); + public SysOaTask insertSysOaTask(SysOaTask sysOaTask) { String newSequenceNo = sequenceService.getNewSequenceNo(SequenceConstants.OA_TASK_SEQUENCE); sysOaTask.setTaskNo(newSequenceNo); - sysOaTask.setTaskStatus(TaskStatus.UN_FINISH.getCode()); + sysOaTask.setTaskStatus(DingFlowTaskType.NEW.getCode()); + //任务执行人 List taskDistributeIdList= sysOaTask.getTaskDistributeId(); + this.save(sysOaTask); + if(CollUtil.isEmpty(taskDistributeIdList)){ + return sysOaTask; + } List sysOaTaskDistributeList= Lists.newArrayList(); - if(CollUtil.isNotEmpty(taskDistributeIdList)){ - taskDistributeIdList.forEach(t->{ - SysOaTaskDistribute sysOaTaskDistribute=new SysOaTaskDistribute(); - sysOaTaskDistribute.setTaskDistributeId(t); - sysOaTaskDistribute.setTaskNo(newSequenceNo); - sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.RUNNING.getCode()); - sysOaTaskDistribute.setCreateBy(sysOaTask.getCreateBy()); - sysOaTaskDistributeService.insertSysOaTaskDistribute(sysOaTaskDistribute); - sysOaTaskDistribute.setSysOaTask(sysOaTask); - //发送消息 - sendInnerMessage(sysOaTaskDistribute); - sysOaTaskDistributeList.add(sysOaTaskDistribute); - }); - } - sysOaTask.setSysOaTaskDistributeList(sysOaTaskDistributeList); - //事件发送 - SyncEvent syncEvent = new SyncEvent(sysOaTask, DingTalkListenerType.WORK_RECODE_CREATE); - applicationContext.publishEvent(syncEvent); - return sysOaTaskMapper.insertSysOaTask(sysOaTask); - } - - - /** - * 修改系统任务 - * - * @param sysOaTask 系统任务 - * @return 结果 - */ - @Override - public int updateSysOaTask(SysOaTask sysOaTask) - { - sysOaTask.setUpdateTime(DateUtils.getNowDate()); - return sysOaTaskMapper.updateSysOaTask(sysOaTask); - } - - /** - * 删除系统任务对象 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - @Override - public int deleteSysOaTaskByIds(String ids) - { - List list = Arrays.asList(Convert.toStrArray(ids)); - list.forEach(t->{ - List sysOaTaskDistributes = sysOaTaskDistributeMapper.selectSysOaTaskDistributeByTaskNo(t); - if(CollUtil.isNotEmpty(sysOaTaskDistributes)){ - throw new BusinessException("任务编号:"+t+"已分配,不允许删除操作"); - } + taskDistributeIdList.forEach(t->{ + SysOaTaskDistribute sysOaTaskDistribute=new SysOaTaskDistribute(); + sysOaTaskDistribute.setTaskDistributeId(t); + sysOaTaskDistribute.setTaskNo(newSequenceNo); + sysOaTaskDistribute.setTaskExecuteStatus(DingFlowTaskType.NEW.getCode()); + sysOaTaskDistribute.setCreateBy(sysOaTask.getCreateBy()); + sysOaTaskDistributeService.save(sysOaTaskDistribute); + //发送站内信 + sendInnerMessage(sysOaTaskDistribute); + sysOaTaskDistributeList.add(sysOaTaskDistribute); }); - return sysOaTaskMapper.deleteSysOaTaskByIds(Convert.toStrArray(ids)); + sysOaTask.setSysOaTaskDistributeList(sysOaTaskDistributeList); + return sysOaTask; } - /** - * 删除系统任务信息 - * - * @param taskNo 系统任务ID - * @return 结果 - */ + + + @Override - public int deleteSysOaTaskById(String taskNo) - { - List sysOaTaskDistributes = sysOaTaskDistributeMapper.selectSysOaTaskDistributeByTaskNo(taskNo); - if(CollUtil.isNotEmpty(sysOaTaskDistributes)){ - throw new BusinessException("任务编号:"+taskNo+"已分配,不允许删除操作"); - } - //发送事件 - SyncEvent syncEvent = new SyncEvent(taskNo, DingTalkListenerType.WORK_RECODE_CREATE); - applicationContext.publishEvent(syncEvent); - return sysOaTaskMapper.deleteSysOaTaskById(taskNo); + public String getOutTaskOutsideId(String taskNo) { + return this.getOne(new QueryWrapper().lambda().eq(SysOaTask::getTaskNo,taskNo)).getTaskOutsideId(); } /** diff --git a/snow-system/src/main/resources/mapper/system/SysOaTaskDistributeMapper.xml b/snow-system/src/main/resources/mapper/system/SysOaTaskDistributeMapper.xml index 1179660..2316928 100644 --- a/snow-system/src/main/resources/mapper/system/SysOaTaskDistributeMapper.xml +++ b/snow-system/src/main/resources/mapper/system/SysOaTaskDistributeMapper.xml @@ -26,104 +26,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, task_no, task_distribute_id, task_execute_id, task_execute_status, task_complete_time, task_start_time, task_suspend_time, task_feedback, revision, create_by, is_delete, create_time, update_by, update_time from sys_oa_task_distribute - - - - - - - - insert into sys_oa_task_distribute - - task_no, - task_distribute_id, - task_execute_id, - task_execute_status, - task_complete_time, - task_start_time, - task_suspend_time, - task_feedback, - revision, - create_by, - is_delete, - create_time, - update_by, - update_time, - - - #{taskNo}, - #{taskDistributeId}, - #{taskExecuteId}, - #{taskExecuteStatus}, - #{taskCompleteTime}, - #{taskStartTime}, - #{taskSuspendTime}, - #{taskFeedback}, - #{revision}, - #{createBy}, - #{isDelete}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update sys_oa_task_distribute - - task_no = #{taskNo}, - task_distribute_id = #{taskDistributeId}, - task_execute_id = #{taskExecuteId}, - task_execute_status = #{taskExecuteStatus}, - task_complete_time = #{taskCompleteTime}, - task_start_time = #{taskStartTime}, - task_suspend_time = #{taskSuspendTime}, - task_feedback = #{taskFeedback}, - revision = #{revision}, - create_by = #{createBy}, - is_delete = #{isDelete}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where id = #{id} - - - - delete from sys_oa_task_distribute where id = #{id} - - - - delete from sys_oa_task_distribute where id in - - #{id} - - \ No newline at end of file diff --git a/snow-system/src/main/resources/mapper/system/SysOaTaskMapper.xml b/snow-system/src/main/resources/mapper/system/SysOaTaskMapper.xml index 81479da..03dd3fc 100644 --- a/snow-system/src/main/resources/mapper/system/SysOaTaskMapper.xml +++ b/snow-system/src/main/resources/mapper/system/SysOaTaskMapper.xml @@ -26,98 +26,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select task_no, task_name, expected_time,priority,task_content, task_status, task_type, task_source, task_outside_id, task_url, revision, create_by, is_delete, create_time, update_by, update_time from sys_oa_task - - - - - - - insert into sys_oa_task - - task_no, - task_name, - task_content, - task_status, - task_type, - priority, - expected_time, - task_source, - task_outside_id, - task_url, - revision, - create_by, - is_delete, - create_time, - update_by, - update_time, - - - #{taskNo}, - #{taskName}, - #{taskContent}, - #{taskStatus}, - #{taskType}, - #{priority}, - #{expectedTime}, - #{taskSource}, - #{taskOutsideId}, - #{taskUrl}, - #{revision}, - #{createBy}, - #{isDelete}, - #{createTime}, - #{updateBy}, - #{updateTime}, - - - - - update sys_oa_task - - task_name = #{taskName}, - task_content = #{taskContent}, - task_status = #{taskStatus}, - task_type = #{taskType}, - priority=#{priority}, - expected_time=#{expectedTime}, - task_source = #{taskSource}, - task_outside_id = #{taskOutsideId}, - task_url = #{taskUrl}, - revision = #{revision}, - create_by = #{createBy}, - is_delete = #{isDelete}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - - where task_no = #{taskNo} - - - - delete from sys_oa_task where task_no = #{taskNo} - - - - delete from sys_oa_task where task_no in - - #{taskNo} - - - \ No newline at end of file