liuyc 2 年 前
コミット
e6c74360ec
20 ファイル変更737 行追加214 行削除
  1. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/LogHistoryInfoDTO.java
  2. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanDTO.java
  3. 29 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanStatusUpdateDTO.java
  4. 21 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskPlanUpdateStatusInfo.java
  5. 17 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryAndTaskVO.java
  6. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoVO.java
  7. 16 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanAndStatusVO.java
  8. 13 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java
  9. 6 6
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java
  10. 4 3
      blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java
  11. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java
  12. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMFinancialReimbursementService.java
  13. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMPurchaseService.java
  14. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/LogHistoryService.java
  15. 12 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java
  16. 81 80
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  17. 75 73
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  18. 152 33
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  19. 240 7
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  20. 6 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

+ 2 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/LogHistoryInfoDTO.java

@@ -13,7 +13,7 @@ public class LogHistoryInfoDTO extends LogHistoryInfo {
     @ApiModelProperty(value = "结束时间")
     private String endTime;
 
-    @ApiModelProperty(value = "任务ids")
-    private String taskIds;
+    @ApiModelProperty(value = "报销金额的任务id")
+    private String taskId;
 
 }

+ 31 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanDTO.java

@@ -0,0 +1,31 @@
+package org.springblade.control.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.ProjectCostBudget;
+
+import java.util.Date;
+
+
+@Data
+public class TaskPlanDTO extends ProjectCostBudget {
+
+    @ApiModelProperty(value = "选择类型 1=我的计划任务 2=全部计划任务")
+    private String selectType;
+
+    @ApiModelProperty(value = "所属部门id")
+    private Long deptId;
+
+    @ApiModelProperty(value = "计划状态 1=未完成 2=已完成 3=逾期完成 4=逾期未完成 5=已转移")
+    private String taskStatus;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
+    private String endTime;
+
+}

+ 29 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanStatusUpdateDTO.java

@@ -0,0 +1,29 @@
+package org.springblade.control.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class TaskPlanStatusUpdateDTO implements Serializable {
+
+    @ApiModelProperty(value = "任务ids")
+    private String taskIds;
+
+    @ApiModelProperty(value = "更改类别")
+    private String 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 String transferObject;
+
+    @ApiModelProperty(value = "转移原因")
+    private String transferReason;
+
+}

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

@@ -0,0 +1,21 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName(value = "c_task_plan_update_status_info")
+public class TaskPlanUpdateStatusInfo implements Serializable {
+
+    private Long id;
+    private Long approveTaskId;
+    private Long planTaskId;
+    private Integer updateType;
+    private Date completionTime;
+    private Long transferObject;
+    private String transferReason;
+
+}

+ 17 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryAndTaskVO.java

@@ -0,0 +1,17 @@
+package org.springblade.control.vo;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("c_log_history_task_record")
+public class LogHistoryAndTaskVO implements Serializable {
+
+    private Long id;
+    private Long logId;
+    private Long taskId;
+
+}

+ 2 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoVO.java

@@ -18,8 +18,8 @@ public class LogHistoryInfoVO extends LogHistoryInfo {
     @ApiModelProperty(value = "已读状态 0=未读 1=已读")
     private Integer isRead;
 
-   /*@ApiModelProperty(value = "当前日志关联的任务信息List")
-    private List<TaskInfo> taskList;*/
+   @ApiModelProperty(value = "当前日志关联的任务信息List")
+    private List<TaskPlanInfoVO> taskList;
 
     @ApiModelProperty(value = "当前日志所有已读人")
     private List<ReadUser> readUsers;

+ 16 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanAndStatusVO.java

@@ -0,0 +1,16 @@
+package org.springblade.control.vo;
+
+import lombok.Data;
+import org.springblade.control.entity.TaskPlanUpdateStatusInfo;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TaskPlanAndStatusVO implements Serializable {
+
+    private List<TaskPlanInfoVO> taskPlanInfoVOS;
+
+    private TaskPlanUpdateStatusInfo updateStatusInfo;
+
+}

+ 13 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java

@@ -18,7 +18,19 @@ public class TaskPlanInfoVO implements Serializable {
     @ApiModelProperty(value = "计划任务所属项目")
     private String projectName;
 
-    @ApiModelProperty(value = "计划任务描述")
+    @ApiModelProperty(value = "计划状态")
+    private String statusName;
+
+    @ApiModelProperty(value = "计划任务描述(任务内容)")
     private String taskDesc;
 
+    @ApiModelProperty(value = "计划完成指标")
+    private String planTarget;
+
+    @ApiModelProperty(value = "起止日期")
+    private String startAndEndDate;
+
+    @ApiModelProperty(value = "任务人")
+    private String taskUserName;
+
 }

+ 6 - 6
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java

@@ -53,9 +53,9 @@ public class ExpenseManagerController extends BladeController {
 
     @PostMapping("/financial/submit")
     @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "财务报销信息提交", notes = "传入EMFinancialReimbursementInfoDTO")
-    public R<Object> financialSubmit(@RequestBody EMFinancialReimbursementInfoDTO dto) {
-        return R.status(financialReimbursementService.financialSubmit(dto));
+    @ApiOperation(value = "财务报销信息提交", notes = "传入List<EMFinancialReimbursementInfoDTO>集合")
+    public R<Object> financialSubmit(@RequestBody List<EMFinancialReimbursementInfoDTO> dtoList) {
+        return R.status(financialReimbursementService.financialSubmit(dtoList));
     }
 
     @PostMapping("/financial/remove")
@@ -179,9 +179,9 @@ public class ExpenseManagerController extends BladeController {
 
     @PostMapping("/purchase/submit")
     @ApiOperationSupport(order = 22)
-    @ApiOperation(value = "采购申请提交", notes = "传入EMPurchaseInfoDTO")
-    public R<Object> purchaseSubmit(@RequestBody EMPurchaseInfoDTO dto) {
-        return R.status(purchaseService.purchaseSubmit(dto));
+    @ApiOperation(value = "采购申请提交", notes = "传入List<EMPurchaseInfoDTO>集合")
+    public R<Object> purchaseSubmit(@RequestBody List<EMPurchaseInfoDTO> dtoList) {
+        return R.status(purchaseService.purchaseSubmit(dtoList));
     }
 
     @PostMapping("/purchase/remove")

+ 4 - 3
blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.control.dto.LogHistoryInfoDTO;
 import org.springblade.control.service.LogHistoryService;
 import org.springblade.control.vo.LogHistoryInfoVO;
+import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
@@ -59,9 +60,9 @@ public class LogHistoryController extends BladeController {
 
     @PostMapping("/task/list")
     @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "日志任务列表", notes = "传入日志logId")
-    public R<Object> logTaskList(@RequestParam Long logId) {
-        return R.data(logHistoryService.logTaskList(logId));
+    @ApiOperation(value = "日志任务列表-获取当前用户当日的任务信息", notes = "")
+    public R<List<TaskPlanInfoVO>> logTaskList() {
+        return R.data(logHistoryService.logTaskList());
     }
 
 

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

@@ -5,8 +5,11 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.control.dto.TaskPlanDTO;
+import org.springblade.control.dto.TaskPlanStatusUpdateDTO;
 import org.springblade.control.dto.TaskProcessInfoDTO;
 import org.springblade.control.service.TaskProcessService;
+import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.control.vo.TaskProcessInfoDetailVO;
 import org.springblade.control.vo.TaskProcessInfoVO;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -15,6 +18,8 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 
 @RestController
 @AllArgsConstructor
@@ -52,4 +57,25 @@ public class TaskProcessController extends BladeController {
         return R.status(taskProcessService.taskSubmit(id));
     }
 
+    @PostMapping("/task/plan/page")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "计划任务执行分页查询", notes = "传入TaskPlanDTO、Query")
+    public R<IPage<TaskPlanInfoVO>> taskPlanPage(@RequestBody TaskPlanDTO dto, Query query) {
+        return R.data(taskProcessService.taskPlanPage(Condition.getPage(query), dto));
+    }
+
+    @PostMapping("/task/plan/detail")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "计划任务详情", notes = "传入计划任务ids")
+    public R<List<TaskPlanInfoVO>> taskPlanDetail(@RequestParam String ids) {
+        return R.data(taskProcessService.taskPlanDetail(ids));
+    }
+
+    @PostMapping("/task/plan/submit")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "计划任务变更状态", notes = "传入TaskPlanStatusUpdateDTO")
+    public R<Object> taskPlanSubmit(@RequestBody TaskPlanStatusUpdateDTO dto) {
+        return R.status(taskProcessService.taskPlanSubmit(dto));
+    }
+
 }

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

@@ -17,7 +17,7 @@ public interface EMFinancialReimbursementService extends BaseService<EMFinancial
 
     EMFinancialReimbursementInfoVO financialDetail(Long id);
 
-    boolean financialSubmit(EMFinancialReimbursementInfoDTO dto);
+    boolean financialSubmit(List<EMFinancialReimbursementInfoDTO> dtoList);
 
     boolean financialRemove(Long id);
 

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

@@ -17,7 +17,7 @@ public interface EMPurchaseService extends BaseService<EMPurchaseInfo> {
 
     EMPurchaseInfoVO purchaseDetail(Long id);
 
-    boolean purchaseSubmit(EMPurchaseInfoDTO dto);
+    boolean purchaseSubmit(List<EMPurchaseInfoDTO> dtoList);
 
     boolean purchaseRemove(Long id);
 

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/LogHistoryService.java

@@ -3,6 +3,7 @@ package org.springblade.control.service;
 import org.springblade.control.dto.LogHistoryInfoDTO;
 import org.springblade.control.entity.LogHistoryInfo;
 import org.springblade.control.vo.LogHistoryInfoVO;
+import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.mp.base.BaseService;
 
 import java.util.List;
@@ -20,6 +21,6 @@ public interface LogHistoryService extends BaseService<LogHistoryInfo> {
 
     boolean logTaskComplete(Long logId, Long taskId);
 
-    Object logTaskList(Long logId);
+    List<TaskPlanInfoVO> logTaskList();
 
 }

+ 12 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java

@@ -1,12 +1,18 @@
 package org.springblade.control.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.TaskPlanDTO;
+import org.springblade.control.dto.TaskPlanStatusUpdateDTO;
 import org.springblade.control.dto.TaskProcessInfoDTO;
+import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.TaskProcessInfo;
+import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.control.vo.TaskProcessInfoDetailVO;
 import org.springblade.control.vo.TaskProcessInfoVO;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.List;
+
 public interface TaskProcessService extends BaseService<TaskProcessInfo> {
 
     IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto);
@@ -17,4 +23,10 @@ public interface TaskProcessService extends BaseService<TaskProcessInfo> {
 
     boolean taskSubmit(String id);
 
+    IPage<TaskPlanInfoVO> taskPlanPage(IPage<ProjectCostBudget> page, TaskPlanDTO dto);
+
+    List<TaskPlanInfoVO> taskPlanDetail(String ids);
+
+    boolean taskPlanSubmit(TaskPlanStatusUpdateDTO dto);
+
 }

+ 81 - 80
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -109,99 +109,100 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
     }
 
     @Override
-    public boolean financialSubmit(EMFinancialReimbursementInfoDTO dto) {
+    public boolean financialSubmit(List<EMFinancialReimbursementInfoDTO> dtoList) {
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-        boolean var = false;
-        dto.setCreateUser(SecureUtil.getUserId());
-
-        if (("1").equals(dto.getSubmitStatus())) {
-            if (ObjectUtil.isEmpty(dto.getId()) && ObjectUtil.isEmpty(dto.getFrNumber())) {
-                dto.setFrNumber(this.getNumber());
-            } else if (ObjectUtil.isNotEmpty(dto.getId())) {
-                EMFinancialReimbursementInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
-                    dto.setFrNumber(this.getNumber());
-                    var = true;
-                }
-            }
-            dto.setIsTemp(0); //暂存
-            dto.setStatus(0); //未上报
-            if (var) {
-                this.save(dto);
-            } else {
-                this.saveOrUpdate(dto);
-            }
-            return true;
-
-        } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
-            if (ObjectUtil.isNotEmpty(dto.getId())) {
-                EMFinancialReimbursementInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
-                    throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
-                } else if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
+        for (EMFinancialReimbursementInfoDTO dto : dtoList) { //批量提交
+            boolean var = false;
+            dto.setCreateUser(SecureUtil.getUserId());
+            if (("1").equals(dto.getSubmitStatus())) {
+                if (ObjectUtil.isEmpty(dto.getId()) && ObjectUtil.isEmpty(dto.getFrNumber())) {
                     dto.setFrNumber(this.getNumber());
-                    var = true;
-                }
-            } else {
-                if (ObjectUtil.isEmpty(dto.getFrNumber())) {
-                    dto.setFrNumber(this.getNumber());
-                }
-            }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(2); //报销审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【报销审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
-                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                    auditUserIds.add(finalConfirmationObj.getUserId());
-                }
-                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                auditUserIds.add(cashierObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                } else if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    EMFinancialReimbursementInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        dto.setFrNumber(this.getNumber());
+                        var = true;
+                    }
                 }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
+                dto.setIsTemp(0); //暂存
+                dto.setStatus(0); //未上报
                 if (var) {
                     this.save(dto);
                 } else {
                     this.saveOrUpdate(dto);
                 }
+                return true;
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
+            } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
+                if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    EMFinancialReimbursementInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
+                        throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
+                    } else if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        dto.setFrNumber(this.getNumber());
+                        var = true;
+                    }
+                } else {
+                    if (ObjectUtil.isEmpty(dto.getFrNumber())) {
+                        dto.setFrNumber(this.getNumber());
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
+                    //新增审批任务
+                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                    taskProcessInfo.setId(SnowFlakeUtil.getId());
+                    taskProcessInfo.setStatus(1); //待审批
+                    taskProcessInfo.setReportDate(new Date());
+                    taskProcessInfo.setTaskType(2); //报销审批
+                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【报销审批】审批");
+                    //上报人
+                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
 
-                //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
-                return true;
+                    //审批人
+                    List<String> auditUserIds = new LinkedList<>();
+                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                    auditUserIds.add(responsibleObj.getUserId());
+                    EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                    auditUserIds.add(financeObj.getUserId());
+                    if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
+                        EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
+                        auditUserIds.add(finalConfirmationObj.getUserId());
+                    }
+                    EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
+                    auditUserIds.add(cashierObj.getUserId());
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
 
-            } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    //抄送人
+                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
+                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
+                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                    }
+                    taskProcessService.save(taskProcessInfo);
+
+                    //新增信息
+                    dto.setIsTemp(1); //提交
+                    dto.setStatus(1); //待审批
+                    if (var) {
+                        this.save(dto);
+                    } else {
+                        this.saveOrUpdate(dto);
+                    }
+
+                    //新增审批任务关联信息
+                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
+
+                    //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
+                    return true;
+
+                } else {
+                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                }
             }
         }
         return false;

+ 75 - 73
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -98,90 +98,92 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
     }
 
     @Override
-    public boolean purchaseSubmit(EMPurchaseInfoDTO dto) {
+    public boolean purchaseSubmit(List<EMPurchaseInfoDTO> dtoList) {
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-        boolean var = false;
-        dto.setCreateUser(SecureUtil.getUserId());
-
-        if (("1").equals(dto.getSubmitStatus())) {
-            if (ObjectUtil.isNotEmpty(dto.getId())) {
-                EMPurchaseInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
-                    var = true;
+        for (EMPurchaseInfoDTO dto : dtoList) {
+            boolean var = false;
+            dto.setCreateUser(SecureUtil.getUserId());
+
+            if (("1").equals(dto.getSubmitStatus())) {
+                if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    EMPurchaseInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        var = true;
+                    }
                 }
-            }
-            dto.setIsTemp(0); //暂存
-            dto.setStatus(0); //未上报
-            if (var) {
-                this.save(dto);
-            } else {
-                this.saveOrUpdate(dto);
-            }
-            return true;
-
-        } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
-            if (ObjectUtil.isNotEmpty(dto.getId())) {
-                EMPurchaseInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
-                    throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
-                } else if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
-                    var = true;
-                }
-            }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(5); //采购审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【采购审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
-                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                    auditUserIds.add(finalConfirmationObj.getUserId());
-                }
-                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                auditUserIds.add(cashierObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
+                dto.setIsTemp(0); //暂存
+                dto.setStatus(0); //未上报
                 if (var) {
                     this.save(dto);
                 } else {
                     this.saveOrUpdate(dto);
                 }
-
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
-
                 return true;
 
-            } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
+                if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    EMPurchaseInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
+                        throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
+                    } else if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        var = true;
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
+                    //新增审批任务
+                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                    taskProcessInfo.setId(SnowFlakeUtil.getId());
+                    taskProcessInfo.setStatus(1); //待审批
+                    taskProcessInfo.setReportDate(new Date());
+                    taskProcessInfo.setTaskType(5); //采购审批
+                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【采购审批】审批");
+                    //上报人
+                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                    //审批人
+                    List<String> auditUserIds = new LinkedList<>();
+                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                    auditUserIds.add(responsibleObj.getUserId());
+                    EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                    auditUserIds.add(financeObj.getUserId());
+                    if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
+                        EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
+                        auditUserIds.add(finalConfirmationObj.getUserId());
+                    }
+                    EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
+                    auditUserIds.add(cashierObj.getUserId());
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                    //抄送人
+                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
+                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
+                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                    }
+                    taskProcessService.save(taskProcessInfo);
+
+                    //新增信息
+                    dto.setIsTemp(1); //提交
+                    dto.setStatus(1); //待审批
+                    if (var) {
+                        this.save(dto);
+                    } else {
+                        this.saveOrUpdate(dto);
+                    }
+
+                    //新增审批任务关联信息
+                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
+
+                    return true;
+
+                } else {
+                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                }
             }
         }
         return false;

+ 152 - 33
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -9,17 +9,18 @@ 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;
-import org.springblade.control.entity.LogHistoryInfo;
+import org.springblade.control.entity.*;
 import org.springblade.control.mapper.LogHistoryMapper;
 import org.springblade.control.service.LogHistoryService;
+import org.springblade.control.vo.LogHistoryAndTaskVO;
 import org.springblade.control.vo.LogHistoryInfoReadVO;
 import org.springblade.control.vo.LogHistoryInfoVO;
+import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -40,6 +41,9 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
     private final IUserClient iUserClient;
     private final JdbcTemplate jdbcTemplate;
     private final EMFinancialReimbursementServiceImpl emFinancialReimbursementService;
+    private final ProjectCostBudgetServiceImpl projectCostBudgetServiceImpl;
+    private final ProjectInfoServiceImpl projectInfoServiceImpl;
+    private final TaskProcessServiceImpl taskProcessService;
 
     @Override
     public Map<String, List<LogHistoryInfoVO>> logList(LogHistoryInfoDTO dto) {
@@ -124,31 +128,62 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             throw new ServiceException("当前用户今日已填写过日志信息,请勿重复提交");
         }
 
-        //入库
         dto.setUserId(SecureUtil.getUserId());
-        if (this.saveOrUpdate(dto)) {
-            if (ObjectUtil.isNotEmpty(dto.getTaskIds())) {
-                //新增日志与计划任务关系信息
-                List<String> taskIds = Func.toStrList(dto.getTaskIds());
-                for (String taskId : taskIds) {
-                    jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + taskId + ")");
+
+        //新增
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            if (this.save(dto)) {
+                //获取当天,当前用户所有的计划任务信息
+                List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
+                jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
+                for (TaskPlanInfoVO task : taskPlanInfoVOS) {
+                    jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
                 }
-            }
 
-            if (ObjectUtil.isNotEmpty(dto.getExpenseReimbursementAmount())) {
                 //报销金额不为空,在财务报销里新增一条草稿内容
-                EMFinancialReimbursementInfoDTO infoDTO = new EMFinancialReimbursementInfoDTO();
-                infoDTO.setSubmitStatus("1"); //暂存
-                infoDTO.setFrDate(new Date()); //当前时间
-                infoDTO.setProjectId(null); //TODO 从日志勾选的任务获取
-                infoDTO.setBudgetPlanIds(null);
-                infoDTO.setFrType(1); //差旅费
-                infoDTO.setUserIdVesting(SecureUtil.getUserId()); //归属人
-                infoDTO.setFrMoney(dto.getExpenseReimbursementAmount()); //报销金额
-                emFinancialReimbursementService.financialSubmit(infoDTO);
+                if (ObjectUtil.isNotEmpty(dto.getExpenseReimbursementAmount()) && ObjectUtil.isNotEmpty(dto.getTaskId())) {
+                    ProjectCostBudget projectCostBudget = projectCostBudgetServiceImpl.getBaseMapper().selectOne(Wrappers.<ProjectCostBudget>lambdaQuery().select(ProjectCostBudget::getProjectId).eq(ProjectCostBudget::getId, dto.getTaskId()));
+                    if (projectCostBudget != null) {
+                        EMFinancialReimbursementInfoDTO infoDTO = new EMFinancialReimbursementInfoDTO();
+                        infoDTO.setSubmitStatus("1"); //暂存
+                        infoDTO.setFrDate(new Date());
+                        infoDTO.setProjectId(projectCostBudget.getProjectId());
+                        infoDTO.setBudgetPlanIds(null);
+                        infoDTO.setFrType(1); //差旅费
+                        infoDTO.setUserIdVesting(SecureUtil.getUserId());
+                        infoDTO.setFrMoney(dto.getExpenseReimbursementAmount());
+                        emFinancialReimbursementService.financialSubmit(Collections.singletonList(infoDTO));
+                    }
+                }
+                return true;
+            }
+
+            //编辑
+        } else {
+            if (baseMapper.updateById(dto) > 0) {
+                //报销金额不为空,修改财务报销信息
+                if (ObjectUtil.isNotEmpty(dto.getExpenseReimbursementAmount()) && ObjectUtil.isNotEmpty(dto.getTaskId())) {
+                    ProjectCostBudget projectCostBudget = projectCostBudgetServiceImpl.getBaseMapper().selectOne(Wrappers.<ProjectCostBudget>lambdaQuery().select(ProjectCostBudget::getProjectId).eq(ProjectCostBudget::getId, dto.getTaskId()));
+                    if (projectCostBudget != null) {
+                        EMFinancialReimbursementInfo dataObj = emFinancialReimbursementService.getBaseMapper().selectOne(Wrappers.<EMFinancialReimbursementInfo>lambdaQuery()
+                                .eq(EMFinancialReimbursementInfo::getUserIdVesting, SecureUtil.getUserId())
+                                .eq(EMFinancialReimbursementInfo::getFrType, 1)
+                                .eq(EMFinancialReimbursementInfo::getIsTemp, 0)
+                                .eq(EMFinancialReimbursementInfo::getStatus, 0)
+                                .eq(EMFinancialReimbursementInfo::getProjectId, projectCostBudget.getProjectId())
+                        );
+                        if (dataObj != null) {
+                            emFinancialReimbursementService.update(Wrappers.<EMFinancialReimbursementInfo>lambdaUpdate()
+                                    .set(EMFinancialReimbursementInfo::getFrMoney, dto.getExpenseReimbursementAmount())
+                                    .eq(EMFinancialReimbursementInfo::getId, dataObj.getId())
+                            );
+                        }
+                    }
+                }
+                return true;
             }
         }
-        return true;
+        return false;
     }
 
     @Override
@@ -175,8 +210,6 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                     }
                 }
 
-                //TODO 处理当前日志的 计划任务List
-
                 //处理当前日志所有已读人信息
                 List<LogHistoryInfoReadVO> readUsersInfo = jdbcTemplate.query("select * from c_log_history_read_record where log_id = " + vo.getId(), new BeanPropertyRowMapper<>(LogHistoryInfoReadVO.class));
                 List<Long> userIds = readUsersInfo.stream().map(LogHistoryInfoReadVO::getUserId).distinct().collect(Collectors.toList());
@@ -189,6 +222,35 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                     vo.setReadUsers(readUsers);
                 }
 
+                //获取当前日志关联的任务信息
+                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<Long> taskIds = taskVOList.stream().map(LogHistoryAndTaskVO::getTaskId).collect(Collectors.toList());
+                List<ProjectCostBudget> taskObjs = projectCostBudgetServiceImpl.listByIds(taskIds);
+                List<TaskPlanInfoVO> resultList = new ArrayList<>();
+                for (ProjectCostBudget taskObj : taskObjs) {
+                    TaskPlanInfoVO vos = new TaskPlanInfoVO();
+                    vos.setId(taskObj.getId());
+                    for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                        if (projectInfo.getId().equals(taskObj.getProjectId())) {
+                            vos.setProjectName(projectInfo.getName());
+                            break;
+                        }
+                    }
+                    vos.setStatusName(taskObj.getStatus().equals(4) ? "已完成" : "未完成");
+                    vos.setTaskDesc(ObjectUtil.isNotEmpty(taskObj.getPlanTaskDesc()) ? taskObj.getPlanTaskDesc() : "");
+                    if (ObjectUtil.isNotEmpty(taskObj.getPlanStartTime()) && ObjectUtil.isNotEmpty(taskObj.getPlanEndTime())) {
+                        LocalDate planStartTime = taskObj.getPlanStartTime();
+                        LocalDate planEndTime = taskObj.getPlanEndTime();
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                        String planStartTimeStr = planStartTime.format(formatter);
+                        String planEndTimeStr = planEndTime.format(formatter);
+                        vos.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
+                    }
+                    resultList.add(vos);
+                }
+                vo.setTaskList(resultList);
+
                 return vo;
             }
         }
@@ -205,8 +267,7 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             throw new ServiceException("只能删除自己编写的日志,操作失败");
         }
         if (this.removeById(id)) {
-            //删除关联信息、已读信息
-            jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + id);
+            //删除已读信息
             jdbcTemplate.execute("delete from c_log_history_read_record where log_id = " + id);
             return true;
         }
@@ -215,20 +276,78 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
 
     @Override
     public boolean logTaskComplete(Long logId, Long taskId) {
-        if (ObjectUtil.isEmpty(logId)) {
-            throw new ServiceException("请先提交日志后,再变更任务状态");
+        ProjectCostBudget task = projectCostBudgetServiceImpl.getBaseMapper().selectById(taskId);
+        if (ObjectUtil.isEmpty(task.getDeptId())) {
+            throw new ServiceException("获取部门信息失败,请联系管理员");
+        }
+        //修改计划任务的状态为已完成
+        boolean updated = projectCostBudgetServiceImpl.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getStatus, 4).eq(ProjectCostBudget::getId, taskId));
+
+        //获取部门负责人信息
+        User departmentHead = taskProcessService.getDepartmentHead(task.getDeptId());
+        if (updated && departmentHead != null) {
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessInfo.setId(SnowFlakeUtil.getId());
+            taskProcessInfo.setStatus(1); //待审批
+            taskProcessInfo.setReportDate(new Date());
+            taskProcessInfo.setTaskType(1); //任务审批
+            taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
+
+            //上报人
+            taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+            //审批人
+            List<String> auditUserIds = new LinkedList<>();
+            EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
+            responsibleObj.setUserId(departmentHead.getId() + "");
+            responsibleObj.setUserName(departmentHead.getRealName());
+            auditUserIds.add(responsibleObj.getUserId());
+
+            taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+            taskProcessService.save(taskProcessInfo);
+
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " 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;
         }
-        //TODO 修改计划任务的状态为已完成,新增一条审批任务到对应的当前部门的负责人审批(此处修改的任务状态是计划任务的,新增推送的任务是审批任务的)
-        return true;
+        return false;
     }
 
     @Override
-    public Object logTaskList(Long logId) {
-        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+    public List<TaskPlanInfoVO> logTaskList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-        //TODO 获取当前用户当天的所有任务信息
-        return null;
+        //获取当天,当前用户所有的计划任务信息
+        List<ProjectCostBudget> projectCostBudgets = jdbcTemplate.query("SELECT * FROM c_project_cost_budget WHERE CURDATE() BETWEEN plan_start_time AND plan_end_time AND task_user = " + SecureUtil.getUserId(), new BeanPropertyRowMapper<>(ProjectCostBudget.class));
+
+        List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
+        List<TaskPlanInfoVO> resultList = new ArrayList<>();
+        for (ProjectCostBudget obj : projectCostBudgets) {
+            TaskPlanInfoVO vo = new TaskPlanInfoVO();
+            vo.setId(obj.getId());
+            for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                if (projectInfo.getId().equals(obj.getProjectId())) {
+                    vo.setProjectName(projectInfo.getName());
+                    break;
+                }
+            }
+            vo.setStatusName(obj.getStatus().equals(4) ? "已完成" : "未完成");
+            vo.setTaskDesc(ObjectUtil.isNotEmpty(obj.getPlanTaskDesc()) ? obj.getPlanTaskDesc() : "");
+            if (ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
+                LocalDate planStartTime = obj.getPlanStartTime();
+                LocalDate planEndTime = obj.getPlanEndTime();
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                String planStartTimeStr = planStartTime.format(formatter);
+                String planEndTimeStr = planEndTime.format(formatter);
+                vo.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
+            }
+            resultList.add(vo);
+        }
+        return resultList;
     }
 
 }

+ 240 - 7
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -3,12 +3,17 @@ package org.springblade.control.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.TaskPlanDTO;
+import org.springblade.control.dto.TaskPlanStatusUpdateDTO;
 import org.springblade.control.dto.TaskProcessInfoDTO;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.TaskProcessMapper;
@@ -31,7 +36,10 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
 import java.time.Duration;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -42,6 +50,8 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private final IUserClient iUserClient;
     private final JdbcTemplate jdbcTemplate;
     private final BladeRedis bladeRedis;
+    private final ProjectCostBudgetServiceImpl projectCostBudgetService;
+    private final ProjectInfoServiceImpl projectInfoServiceImpl;
 
     @Override
     public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
@@ -120,6 +130,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
             List<DictInfo> dictInfoList1 = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'report_type'", new BeanPropertyRowMapper<>(DictInfo.class));
             List<DictInfo> dictInfoList2 = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'expense_fr_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+            List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
             TaskProcessDetailBasicsVO basicsVO = new TaskProcessDetailBasicsVO();
             basicsVO.setTaskId(taskProcessInfo.getId());
             basicsVO.setTaskName(taskProcessInfo.getTaskName());
@@ -143,15 +154,25 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         Integer type = record.getExpenseInfoType();
                         switch (type) {
                             case 1: //计划任务
-                                //TODO 处理计划任务List
-                                vo.setPlanTaskInfoList(null);
+                                TaskPlanInfoVO planTaskInfoList1 = this.getPlanTaskInfoList(record.getExpenseInfoId(), controlProjectInfos);
+                                if (planTaskInfoList1 != null) {
+                                    vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList1));
+                                }
+
+                                //获取计划任务更改状态记录信息
+                                data = jdbcTemplate.query("select * from c_task_plan_update_status_info where approve_task_id = " + id, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class));
                                 break;
 
                             case 2: //财务
                                 data = jdbcTemplate.query("select * from c_expense_financial_reimbursement_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMFinancialReimbursementInfo.class)).stream().findAny().orElse(null);
-
                                 EMFinancialReimbursementInfoVO voCW = BeanUtil.copyProperties(data, EMFinancialReimbursementInfoVO.class);
                                 if (voCW != null) {
+                                    if (ObjectUtil.isNotEmpty(voCW.getProjectId()) && ObjectUtil.isNotEmpty(voCW.getBudgetPlanIds())) { //如果预算ids不为空,那么证明有关联计划任务(单关联)
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(Long.parseLong(voCW.getBudgetPlanIds()), controlProjectInfos);
+                                        if (planTaskInfoList2 != null) {
+                                            vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
+                                        }
+                                    }
                                     for (DictInfo dictInfo : dictInfoList2) {
                                         if (dictInfo.getDictValue().equals(voCW.getFrType() + "")) {
                                             voCW.setFrTypeName(dictInfo.getDictName());
@@ -162,8 +183,6 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                     data = voCW;
                                 }
 
-                                vo.setPlanTaskInfoList(null); //TODO 处理计划任务List
-
                                 break;
                             case 3: //支付
                                 data = jdbcTemplate.query("select * from c_expense_pay_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMPayInfo.class)).stream().findAny().orElse(null);
@@ -189,8 +208,17 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                             case 9: //出差
                                 data = jdbcTemplate.query("select * from c_attendance_trip_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(AttendanceTripInfo.class)).stream().findAny().orElse(null);
 
-                                vo.setPlanTaskInfoList(null); //TODO 处理计划任务List
+                                AttendanceTripInfoVO voCC = BeanUtil.copyProperties(data, AttendanceTripInfoVO.class);
+                                if (voCC != null) {
+                                    if (ObjectUtil.isNotEmpty(voCC.getProjectId()) && ObjectUtil.isNotEmpty(voCC.getBudgetPlanIds())) { //如果预算ids不为空,那么证明有关联计划任务(单关联)
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(Long.parseLong(voCC.getBudgetPlanIds()), controlProjectInfos);
+                                        if (planTaskInfoList2 != null) {
+                                            vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
+                                        }
+                                    }
 
+                                    data = voCC;
+                                }
                                 break;
                         }
                     }
@@ -327,6 +355,165 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         }
     }
 
+    @Override
+    public IPage<TaskPlanInfoVO> taskPlanPage(IPage<ProjectCostBudget> page, TaskPlanDTO dto) {
+        QueryWrapper<ProjectCostBudget> queryWrapper = Condition.getQueryWrapper(dto);
+        if (dto.getSelectType().equals("1")) { //我的计划任务
+            if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+                throw new ServiceException("未获取到当前用户信息,请联系管理员");
+            }
+            queryWrapper.lambda().eq(ProjectCostBudget::getTaskUser, SecureUtil.getUserId());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getDeptId())) {
+            queryWrapper.lambda().eq(ProjectCostBudget::getDeptId, dto.getDeptId());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getTaskStatus())) {
+            queryWrapper.lambda().eq(ProjectCostBudget::getStatus, dto.getTaskStatus());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getStartTime()) && ObjectUtil.isNotEmpty(dto.getEndTime())) {
+            queryWrapper.lambda().ge(ProjectCostBudget::getPlanStartTime, dto.getStartTime()).le(ProjectCostBudget::getPlanEndTime, dto.getEndTime());
+        }
+        IPage<ProjectCostBudget> pages = projectCostBudgetService.page(page, queryWrapper.lambda().orderBy(true, true, ProjectCostBudget::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
+
+        //封装page对象
+        IPage<TaskPlanInfoVO> vosPage = new Page<>();
+        vosPage.setCurrent(pages.getCurrent());
+        vosPage.setSize(pages.getSize());
+        vosPage.setTotal(pages.getTotal());
+
+        //构造page参数
+        List<ProjectCostBudget> records = pages.getRecords();
+        List<TaskPlanInfoVO> vos = new ArrayList<>();
+        for (ProjectCostBudget obj : records) {
+            TaskPlanInfoVO vo = new TaskPlanInfoVO();
+            vo.setId(obj.getId());
+            vo.setTaskUserName(ObjectUtil.isNotEmpty(userMap.get(obj.getTaskUser())) ? userMap.get(obj.getTaskUser()) : "");
+            vo.setTaskDesc(obj.getPlanTaskDesc());
+            vo.setPlanTarget(obj.getPlanTarget());
+
+            vo.setStatusName(null); //TODO 任务状态 多种
+
+            for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                if (projectInfo.getId().equals(obj.getProjectId())) {
+                    vo.setProjectName(projectInfo.getName());
+                    break;
+                }
+            }
+
+            if (ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
+                LocalDate planStartTime = obj.getPlanStartTime();
+                LocalDate planEndTime = obj.getPlanEndTime();
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                String planStartTimeStr = planStartTime.format(formatter);
+                String planEndTimeStr = planEndTime.format(formatter);
+                vo.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
+            }
+            vos.add(vo);
+        }
+        vosPage.setRecords(vos);
+        return vosPage;
+    }
+
+    @Override
+    public List<TaskPlanInfoVO> taskPlanDetail(String ids) {
+        List<ProjectCostBudget> taskList = projectCostBudgetService.getBaseMapper().selectBatchIds(Func.toStrList(ids));
+        List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
+        List<TaskPlanInfoVO> vos = new ArrayList<>();
+        for (ProjectCostBudget obj : taskList) {
+            TaskPlanInfoVO vo = new TaskPlanInfoVO();
+            vo.setId(obj.getId());
+            vo.setTaskDesc(obj.getPlanTaskDesc());
+            for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                if (projectInfo.getId().equals(obj.getProjectId())) {
+                    vo.setProjectName(projectInfo.getName());
+                    break;
+                }
+            }
+            vo.setStatusName(""); //TODO 任务状态 多种
+            vos.add(vo);
+        }
+        return vos;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean taskPlanSubmit(TaskPlanStatusUpdateDTO dto) {
+        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());
+            for (String taskId : taskIds) {
+                ProjectCostBudget planTaskInfo = projectCostBudgetService.getById(taskId);
+                if (planTaskInfo != null) {
+                    User departmentHead = this.getDepartmentHead(planTaskInfo.getDeptId());
+                    if (departmentHead != null && dto.getUpdateType().equals("1")) {
+                        //任务完成
+                        TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                        taskProcessInfo.setId(SnowFlakeUtil.getId());
+                        taskProcessInfo.setStatus(1); //待审批
+                        taskProcessInfo.setReportDate(new Date());
+                        taskProcessInfo.setTaskType(1); //任务审批
+                        taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
+
+                        //上报人
+                        taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                        //审批人
+                        List<String> auditUserIds = new LinkedList<>();
+                        EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
+                        responsibleObj.setUserId(departmentHead.getId() + "");
+                        responsibleObj.setUserName(departmentHead.getRealName());
+                        auditUserIds.add(responsibleObj.getUserId());
+
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                        this.save(taskProcessInfo);
+
+                        //新增计划任务更改状态记录信息
+                        jdbcTemplate.execute("insert into c_task_plan_update_status_info(id,approve_task_id,plan_task_id,update_type,completion_time,transfer_object,transfer_reason) " +
+                                "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1,'" + completionTimeStr + "',null,null)");
+
+                        //新增审批任务关联信息
+                        jdbcTemplate.execute("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")) {
+                        //任务转移
+                        TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                        taskProcessInfo.setId(SnowFlakeUtil.getId());
+                        taskProcessInfo.setStatus(1); //待审批
+                        taskProcessInfo.setReportDate(new Date());
+                        taskProcessInfo.setTaskType(1); //任务审批
+                        taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务转移】审批");
+
+                        //上报人
+                        taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                        //审批人
+                        List<String> auditUserIds = new LinkedList<>();
+                        EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
+                        responsibleObj.setUserId(departmentHead.getId() + "");
+                        responsibleObj.setUserName(departmentHead.getRealName());
+                        auditUserIds.add(responsibleObj.getUserId());
+
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                        this.save(taskProcessInfo);
+
+                        //新增计划任务更改状态记录信息
+                        jdbcTemplate.execute("insert into c_task_plan_update_status_info(id,approve_task_id,plan_task_id,update_type,completion_time,transfer_object,transfer_reason) " +
+                                "values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",2,'" + completionTimeStr + "'," + dto.getTransferObject() + "," + dto.getTransferReason() + ")");
+
+                        //新增审批任务关联信息
+                        jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
 
     /**
      * 修改业务审批状态
@@ -338,7 +525,13 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long dataId) {
         switch (businessDataType) {
             case 1: //计划任务
-                //TODO 修改计划任务状态
+                if (taskStatus == 2) {
+                    //已完成 = 已完成
+                    jdbcTemplate.execute("update c_project_cost_budget set status = 4 where id = " + dataId);
+                } else if (taskStatus == 3) {
+                    //已驳回 = 未开始
+                    jdbcTemplate.execute("update c_project_cost_budget set status = 1 where id = " + dataId);
+                }
                 break;
 
             case 2: //财务
@@ -401,7 +594,47 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 EMOutsourcingPayInfo emOutsourcingPayInfo = jdbcTemplate.query("select * from c_expense_outsourcing_pay_info where id = " + dataId, new BeanPropertyRowMapper<>(EMOutsourcingPayInfo.class)).stream().findAny().orElse(null);
                 break;
         }
+    }
 
+    /**
+     * 根据部门id获取部门负责人信息
+     *
+     * @param deptId
+     * @return
+     */
+    public User getDepartmentHead(Long deptId) {
+        if (ObjectUtil.isNotEmpty(deptId)) {
+            //TODO 根据部门id获取部门负责人信息
+            User user = new User();
+            user.setId(SnowFlakeUtil.getId());
+            user.setDeptId("123456789");
+            return user;
+        }
+        return null;
     }
 
+    /**
+     * 获取计划任务List
+     *
+     * @param id
+     * @param controlProjectInfos
+     * @return
+     */
+    private TaskPlanInfoVO getPlanTaskInfoList(Long id, List<ControlProjectInfo> controlProjectInfos) {
+        ProjectCostBudget planTask = jdbcTemplate.query("select * from c_project_cost_budget where id = " + id, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
+        if (planTask != null) {
+            TaskPlanInfoVO planInfoVO = new TaskPlanInfoVO();
+            planInfoVO.setId(planTask.getId());
+            for (ControlProjectInfo controlProjectInfo : controlProjectInfos) {
+                if (planTask.getProjectId().equals(controlProjectInfo.getId())) {
+                    planInfoVO.setProjectName(controlProjectInfo.getName());
+                }
+            }
+            planInfoVO.setTaskDesc(planTask.getPlanTaskDesc());
+            return planInfoVO;
+        }
+        return null;
+    }
+
+
 }

+ 6 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -446,10 +446,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
      */
     private void recursiveGetParentNodes(Set<WbsTreeContract> resultNodes, List<WbsTreeContract> nodes, String contractId) {
         Set<String> parentIds = nodes.stream().map(WbsTreeContract::getParentId).map(String::valueOf).filter(ObjectUtils::isNotEmpty).collect(Collectors.toSet());
-        List<WbsTreeContract> parentNodes = jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and status = 1 and type = 1 and id in(" + org.apache.commons.lang.StringUtils.join(parentIds, ",") + ") and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-        if (parentNodes.size() > 0) {
-            resultNodes.addAll(parentNodes);
-            this.recursiveGetParentNodes(resultNodes, parentNodes, contractId);
+        if (parentIds.size() > 0) {
+            List<WbsTreeContract> parentNodes = jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and status = 1 and type = 1 and id in(" + org.apache.commons.lang.StringUtils.join(parentIds, ",") + ") and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if (parentNodes.size() > 0) {
+                resultNodes.addAll(parentNodes);
+                this.recursiveGetParentNodes(resultNodes, parentNodes, contractId);
+            }
         }
     }