Browse Source

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 years ago
parent
commit
52921f3a06

+ 1 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ExpenseTaskRecord.java

@@ -13,5 +13,6 @@ public class ExpenseTaskRecord implements Serializable {
     private Long taskId;
     private String expenseInfoId;
     private Integer expenseInfoType;
+    private Integer isTransfer;
 
 }

+ 18 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskPlanUpdateStatusInfo.java

@@ -1,6 +1,8 @@
 package org.springblade.control.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -11,11 +13,27 @@ import java.util.Date;
 public class TaskPlanUpdateStatusInfo implements Serializable {
 
     private Long id;
+
+    @ApiModelProperty(value = "审批任务id")
     private Long approveTaskId;
+
+    @ApiModelProperty(value = "计划任务id")
     private Long planTaskId;
+
+    @ApiModelProperty(value = "变更类型 1=已完成 2=任务转移")
     private Integer updateType;
+
+    @ApiModelProperty(value = "完成时间(转移时间)")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date completionTime;
+
+    @ApiModelProperty(value = "是谁发起的转移用户id")
+    private Long startTransferObject;
+
+    @ApiModelProperty(value = "转移对象用户id")
     private Long transferObject;
+
+    @ApiModelProperty(value = "转移原因")
     private String transferReason;
 
 }

+ 0 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java

@@ -8,7 +8,6 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springblade.business.vo.TrialContainerClassificationVO;
 import org.springblade.control.entity.*;
 import org.springblade.control.service.impl.*;
 import org.springblade.control.utils.NumberToChinese;

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -49,7 +49,7 @@ public class TaskProcessController extends BladeController {
     @PostMapping("/task/reject")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "审批任务驳回", notes = "传入TaskProcessInfoDTO")
-    public R<Object> taskReject(TaskProcessInfoDTO dto) {
+    public R<Object> taskReject(@RequestBody TaskProcessInfoDTO dto) {
         return R.status(taskProcessService.taskReject(dto));
     }
 

+ 0 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.EMLoanInfoDTO;
 import org.springblade.control.entity.*;
@@ -27,7 +26,6 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;

+ 0 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.EMOutsourcingPayInfoDTO;
 import org.springblade.control.entity.*;

+ 29 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -1,12 +1,10 @@
 package org.springblade.control.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
 import org.springblade.control.dto.LogHistoryInfoDTO;
@@ -27,8 +25,8 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -296,13 +294,23 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 //获取当前日志关联的任务信息
                 List<LogHistoryAndTaskVO> taskVOList = jdbcTemplate.query("select * from c_log_history_task_record where log_id = " + id, new BeanPropertyRowMapper<>(LogHistoryAndTaskVO.class));
                 List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
-                List<String> taskIds = taskVOList.stream().map(LogHistoryAndTaskVO::getTaskId).map(String::valueOf).collect(Collectors.toList());
+                Set<String> taskIds = taskVOList.stream().map(LogHistoryAndTaskVO::getTaskId).map(String::valueOf).collect(Collectors.toSet());
+
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                String logDate = simpleDateFormat.format(vo.getCreateTime());
+                String nowDate = simpleDateFormat.format(new Date());
+                if (vo.getUserId().equals(SecureUtil.getUserId()) && logDate.equals(nowDate)) {
+                    //主动获取(任务转移后,清除了当前任务的关联信息,所以为null,那么主动获取当天的自己的任务)
+                    List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
+                    taskIds.addAll(taskPlanInfoVOS.stream().map(TaskPlanInfoVO::getId).map(String::valueOf).collect(Collectors.toList()));
+                }
+
                 if (taskIds.size() > 0) {
                     //任务逾期关系信息
                     List<TaskPlanOverdueStatusVO> overdueStatusVOS = jdbcTemplate.query("select * from c_task_plan_overdue_status where user_id = " + obj.getUserId(), new BeanPropertyRowMapper<>(TaskPlanOverdueStatusVO.class));
 
                     //获取所有审批任务与计划任务关系
-                    List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+                    List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id,is_transfer from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
                     Map<String, ExpenseTaskRecord> taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
 
                     //预算任务集合
@@ -322,14 +330,18 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                         ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(taskObj.getId()), null);
                         if (record != null) {
                             TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
-                            if (task != null) {
+                            if (task != null && org.springblade.core.tool.utils.ObjectUtil.isNotEmpty(record.getIsTransfer()) && record.getIsTransfer().equals(1) && taskObj.getStatus().equals(2) && taskObj.getTaskApprove().equals(0)) {
+                                //判断这条计划任务在当前用户下是否是转移的
+                                vos.setStatus(0);
+                                vos.setStatusName("未上报");
+                            } else if (task != null) {
                                 vos.setStatus(task.getStatus());
-                                vos.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未提交审批")));
+                                vos.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未上报")));
                             }
                         }
                         if (StringUtils.isEmpty(vos.getStatusName())) {
                             vos.setStatus(0);
-                            vos.setStatusName("未提交审批");
+                            vos.setStatusName("未上报");
                         }
 
                         //只有在当前任务是未提交、已驳回状态下才判断是否逾期
@@ -458,10 +470,18 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
 
             taskProcessService.save(taskProcessInfo);
 
+            //完成时间,当前
+            SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String completionTimeStr = dateFormatter.format(new Date());
+
+            //新增计划任务更改状态记录信息
+            jdbcTemplate.execute("insert into c_task_plan_update_status_info(id,approve_task_id,plan_task_id,update_type,completion_time,start_transfer_object,transfer_object,transfer_reason) " +
+                    "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + taskId + ",1,'" + completionTimeStr + "',null,null,null)");
+
             //新增审批任务关联信息
             jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + task.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + task.getId() + ",1)");
             return true;
-            //}
+
         } else {
             throw new ServiceException("获取部门负责人失败,无法提交任务完成,请联系管理员");
         }

+ 66 - 36
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -2,14 +2,12 @@ package org.springblade.control.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
@@ -23,7 +21,6 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.redis.cache.BladeRedis;
-import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
@@ -44,7 +41,6 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.LocalDate;
-import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
@@ -133,7 +129,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
             }
 
-            vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : "已驳回"));
+            vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
 
             for (DictInfo dictInfo : dictInfoList) {
                 if ((vo.getTaskType()).equals(dictInfo.getDictValue().intValue())) {
@@ -184,7 +180,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 }
 
                                 //获取计划任务更改状态记录信息
-                                data = jdbcTemplate.query("select * from c_task_plan_update_status_info where approve_task_id = " + id, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class));
+                                data = jdbcTemplate.query("select * from c_task_plan_update_status_info where approve_task_id = " + id, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class)).stream().findAny().orElse(null);
                                 TaskPlanUpdateStatusInfoVO voRW = BeanUtil.copyProperties(data, TaskPlanUpdateStatusInfoVO.class);
                                 if (voRW != null) {
                                     voRW.setTransferObjectName(userMap.get(voRW.getTransferObject()));
@@ -385,14 +381,15 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 //修改审批任务状态 =3 已驳回
                 if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
                         .set(TaskProcessInfo::getStatus, 3)
+                        .set(TaskProcessInfo::getAuditDate, new Date())//审核日期
                         .set(TaskProcessInfo::getRejectDesc, StringUtils.isNotEmpty(dto.getRejectDesc()) ? dto.getRejectDesc() : null)
                         .eq(TaskProcessInfo::getId, dto.getId()))) {
                     //修改业务数据状态 =3 已驳回
                     for (ExpenseTaskRecord record : records) {
                         if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
                             Integer businessDataType = record.getExpenseInfoType();
-                            if (businessDataType.equals(dto.getTaskType())) {
-                                this.updateTaskStatus(businessDataType, 3, record.getExpenseInfoId());
+                            if (businessDataType.equals(taskProcessInfo.getTaskType())) {
+                                this.updateTaskStatus(businessDataType, 3, taskProcessInfo.getId(), record.getExpenseInfoId());
                             }
                         }
                     }
@@ -471,6 +468,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             //修改待审批人ids、完成审批人ids
             updateWrapper.set(TaskProcessInfo::getAuditUserIds, ObjectUtil.isNotEmpty(auditUserIdList) ? StringUtils.join(auditUserIdList, ",") : null);
             updateWrapper.set(TaskProcessInfo::getAuditUserIdsComplete, ObjectUtil.isNotEmpty(auditUserIdCompleteList) ? StringUtils.join(auditUserIdCompleteList, ",") : null);
+            updateWrapper.set(TaskProcessInfo::getAuditDate, new Date()); //审核日期
             updateWrapper.eq(TaskProcessInfo::getId, id);
             this.update(updateWrapper);
 
@@ -485,7 +483,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                             Integer businessDataType = record.getExpenseInfoType();
                             if (businessDataType.equals(taskProcessInfo.getTaskType())) {
                                 //修改业务审批状态
-                                this.updateTaskStatus(businessDataType, 2, record.getExpenseInfoId());
+                                this.updateTaskStatus(businessDataType, 2, taskProcessInfo.getId(), record.getExpenseInfoId());
 
                                 //处理审批闭环后的业务数据
                                 this.processTheServiceDataAfterTheApprovalClosedLoop(businessDataType, record.getExpenseInfoId());
@@ -552,10 +550,11 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         //构造page参数
         List<ProjectCostBudget> records = pages.getRecords();
         List<String> taskIds = records.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
+
         //获取所有审批任务与计划任务关系
         Map<String, ExpenseTaskRecord> taskRecordMaps = new LinkedHashMap<>();
         if (taskIds.size() > 0) {
-            List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+            List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id,is_transfer from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
         }
 
@@ -571,14 +570,18 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(vo.getId()), null);
             if (record != null) {
                 TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
-                if (task != null) {
+                if (task != null && ObjectUtil.isNotEmpty(record.getIsTransfer()) && record.getIsTransfer().equals(1) && obj.getStatus().equals(2) && obj.getTaskApprove().equals(0)) {
+                    //判断这条计划任务在当前用户下是否是转移的
+                    vo.setStatus(0);
+                    vo.setStatusName("未上报");
+                } else if (task != null) {
                     vo.setStatus(task.getStatus());
-                    vo.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未提交审批")));
+                    vo.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未上报")));
                 }
             }
             if (StringUtils.isEmpty(vo.getStatusName())) {
                 vo.setStatus(0);
-                vo.setStatusName("未提交审批");
+                vo.setStatusName("未上报");
             }
 
             for (ControlProjectInfo projectInfo : controlProjectInfos) {
@@ -632,12 +635,12 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
                 if (task != null) {
                     vo.setStatus(task.getStatus());
-                    vo.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未提交审批")));
+                    vo.setStatusName(task.getStatus().equals(1) ? "待审批" : (task.getStatus().equals(2) ? "已审批" : (task.getStatus().equals(3) ? "已驳回" : "未上报")));
                 }
             }
             if (StringUtils.isEmpty(vo.getStatusName())) {
                 vo.setStatus(0);
-                vo.setStatusName("未提交审批");
+                vo.setStatusName("未上报");
             }
 
             vos.add(vo);
@@ -648,32 +651,43 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean taskPlanSubmit(TaskPlanStatusUpdateDTO dto) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
+        }
         if (ObjectUtil.isNotEmpty(dto.getTaskIds()) && ObjectUtil.isNotEmpty(dto.getUpdateType()) && ObjectUtil.isNotEmpty(dto.getCompletionTime())) {
             List<String> taskIds = Func.toStrList(dto.getTaskIds());
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             String completionTimeStr = dateFormatter.format(dto.getCompletionTime());
 
-            //获取所有审批任务与计划任务关系
-            Map<String, ExpenseTaskRecord> taskRecordMaps = new LinkedHashMap<>();
-            if (ObjectUtil.isNotEmpty(dto.getTaskIds())) {
-                List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + dto.getTaskIds() + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
-                taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
+            //获取所有审批任务与计划任务关系,判断计划任务状态
+            List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id,is_transfer from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + dto.getTaskIds() + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+            Map<String, ExpenseTaskRecord> taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
+            List<String> planTaskNames = new ArrayList<>();
+            for (String taskId : taskIds) {
+                ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(taskId), null);
+                if (record != null && ObjectUtil.isEmpty(record.getIsTransfer())) { //排除转移任务
+                    TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
+                    if (task != null && (Arrays.asList(1, 2).contains(task.getStatus()))) {
+                        ProjectCostBudget planTaskInfo = projectCostBudgetService.getBaseMapper().selectOne(Wrappers.<ProjectCostBudget>lambdaQuery().select(ProjectCostBudget::getPlanTaskDesc).eq(ProjectCostBudget::getId, taskId));
+                        if (planTaskInfo != null) {
+                            planTaskNames.add(planTaskInfo.getPlanTaskDesc());
+                        }
+                    }
+                }
+            }
+            if (planTaskNames.size() > 0) {
+                throw new ServiceException("当前选择的计划任务【" + (StringUtils.join(planTaskNames, "、")) + "】不是未提交或已驳回状态,操作失败");
             }
 
+            //处理业务
             for (String taskId : taskIds) {
                 ProjectCostBudget planTaskInfo = projectCostBudgetService.getById(taskId);
                 if (planTaskInfo != null) {
-                    //判断计划任务状态
-                    ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(taskId), null);
-                    if (record != null) {
-                        TaskProcessInfo task = jdbcTemplate.query("select status from c_task_process_info where id = " + record.getTaskId(), new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
-                        if (task != null && (Arrays.asList(1, 2).contains(task.getStatus()))) {
-                            throw new ServiceException("计划任务【" + (ObjectUtil.isNotEmpty(planTaskInfo.getPlanTaskDesc()) ? planTaskInfo.getPlanTaskDesc() : null) + "】不是未提交或已驳回状态,操作失败");
-                        }
-                    }
-
                     User departmentHead = this.getDepartmentHead(planTaskInfo.getDeptId());
-                    if (departmentHead != null && dto.getUpdateType().equals("1")) {
+                    if (ObjectUtil.isEmpty(departmentHead)) {
+                        throw new ServiceException("获取部门负责人失败,请联系管理员");
+                    }
+                    if (dto.getUpdateType().equals("1")) {
                         //任务完成
                         TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
                         taskProcessInfo.setId(SnowFlakeUtil.getId());
@@ -710,7 +724,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         //新增审批任务关联信息
                         jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + planTaskInfo.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
 
-                    } else if (departmentHead != null && dto.getUpdateType().equals("2")) {
+                    } else if (dto.getUpdateType().equals("2")) {
                         //任务转移
                         TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
                         taskProcessInfo.setId(SnowFlakeUtil.getId());
@@ -742,7 +756,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
                         //新增计划任务更改状态记录信息
                         jdbcTemplate.execute("insert into c_task_plan_update_status_info(id,approve_task_id,plan_task_id,update_type,completion_time,start_transfer_object,transfer_object,transfer_reason) " +
-                                "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",2,'" + completionTimeStr + "'," + SecureUtil.getUserId() + "," + dto.getTransferObject() + "," + dto.getTransferReason() + ")");
+                                "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",2,'" + completionTimeStr + "'," + SecureUtil.getUserId() + "," + dto.getTransferObject() + ",'" + dto.getTransferReason() + "')");
 
                         //新增审批任务关联信息
                         jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + planTaskInfo.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
@@ -874,15 +888,29 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      *
      * @param businessDataType 业务类型
      * @param taskStatus       计划任务状态
+     * @param approveTaskId    审批任务id
      * @param dataId           业务id
      */
-    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, String dataId) {
+    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long approveTaskId, String dataId) {
         switch (businessDataType) {
             case 1: //计划任务
-                if (taskStatus == 2) {
+                if (taskStatus == 2) { //通过审批
                     //task_approve = 1 已审批 , status = 4 已完成
                     jdbcTemplate.execute("update c_project_cost_budget set task_approve = 1,status = 4 where id = " + dataId);
-                } else if (taskStatus == 3) {
+
+                    //判断是否为转移任务,计划任务转移后,修改计划任务人id
+                    TaskPlanUpdateStatusInfo taskPlanUpdateStatusInfo = jdbcTemplate.query("select * from c_task_plan_update_status_info where update_type = 2 and approve_task_id = " + approveTaskId + " and plan_task_id = " + dataId, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class)).stream().findAny().orElse(null);
+                    if (taskPlanUpdateStatusInfo != null) {
+                        jdbcTemplate.execute("update c_project_cost_budget set task_approve = 0,status = 2,task_user = " + taskPlanUpdateStatusInfo.getTransferObject() + " where id = " + taskPlanUpdateStatusInfo.getPlanTaskId());
+
+                        //任务转移后,标记关系信息为转移任务
+                        jdbcTemplate.execute("update c_expense_task_record set is_transfer = 1 where expense_info_type = 1 and task_id = " + approveTaskId + " and expense_info_id = " + dataId);
+
+                        //删除当前计划任务与日志关系信息(如果任务转移,那么就不属于该用户了,就应该在新用户写日志时,与新用户绑定)
+                        jdbcTemplate.execute("delete from c_log_history_task_record where task_id = " + dataId);
+                    }
+
+                } else if (taskStatus == 3) { //驳回审批
                     //task_approve = 0 未开始 , status = 2 进行中
                     jdbcTemplate.execute("update c_project_cost_budget set task_approve = 0,status = 2 where id = " + dataId);
                 }
@@ -937,9 +965,11 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             case 1:
                 //计划任务
                 ProjectCostBudget projectCostBudget = jdbcTemplate.query("select * from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
-                if (projectCostBudget != null && projectCostBudget.getStatus().equals(4)) {
+                if (projectCostBudget != null && projectCostBudget.getStatus().equals(4) && projectCostBudget.getTaskApprove().equals(1)) {
                     //已完成任务进行金额统计 budget_count_money(预算总金额) = actual_total_money(实际总金额)
                     projectCostBudgetService.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getActualTotalMoney, projectCostBudget.getBudgetCountMoney()).eq(ProjectCostBudget::getId, projectCostBudget.getId()));
+                } else if (projectCostBudget != null && projectCostBudget.getStatus().equals(2) && projectCostBudget.getTaskApprove().equals(0)) {
+                    //驳回的任务,删除关联信息 TODO
                 }
 
                 break;