Ver Fonte

内控相关

liuyc há 2 anos atrás
pai
commit
83fba14de5
16 ficheiros alterados com 346 adições e 102 exclusões
  1. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java
  2. 3 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/LogHistoryInfo.java
  3. 4 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java
  4. 5 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoVO.java
  5. 9 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java
  6. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/LogHistoryService.java
  7. 12 7
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  8. 7 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  9. 7 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java
  10. 6 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  11. 7 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  12. 8 3
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  13. 6 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  14. 6 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java
  15. 85 34
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  16. 176 43
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java

@@ -55,4 +55,7 @@ public class AttendanceTripInfo extends BaseEntity {
     @ApiModelProperty(value = "备注")
     private String remarks;
 
+    @ApiModelProperty(value = "暂存草稿数据 0=暂存 1=提交")
+    private Integer isTemp;
+
 }

+ 3 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/LogHistoryInfo.java

@@ -6,6 +6,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
+import java.math.BigDecimal;
+
 @Data
 @TableName("c_log_history_info")
 @EqualsAndHashCode(callSuper = true)
@@ -26,6 +28,6 @@ public class LogHistoryInfo extends BaseEntity {
     private String riskWarning;
 
     @ApiModelProperty(value = "报销金额")
-    private String expenseReimbursementAmount;
+    private BigDecimal expenseReimbursementAmount;
 
 }

+ 4 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java

@@ -30,7 +30,7 @@ public class TaskProcessInfo extends BaseEntity {
     @ApiModelProperty(value = "上报类型(任务类型)")
     private Integer taskType;
 
-    @ApiModelProperty(value = "审批状态1=待审批 2=已审批 3=已驳回")
+    @ApiModelProperty(value = "审批状态0=未上报 1=待审批 2=已审批 3=已驳回")
     private Integer status;
 
     @ApiModelProperty(value = "上报人id")
@@ -39,6 +39,9 @@ public class TaskProcessInfo extends BaseEntity {
     @ApiModelProperty(value = "审批人ids")
     private String auditUserIds;
 
+    @ApiModelProperty(value = "审批人ids-完成")
+    private String auditUserIdsComplete;
+
     @ApiModelProperty(value = "抄送人ids")
     private String ccUserIds;
 

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

@@ -13,10 +13,13 @@ public class TaskProcessInfoVO extends TaskProcessInfo {
     @ApiModelProperty(value = "审核状态名称")
     private String statusName;
 
-    @ApiModelProperty(value = "上报人")
+    @ApiModelProperty(value = "上报人名称")
     private String reportUserName;
 
-    @ApiModelProperty(value = "审核人")
+    @ApiModelProperty(value = "审核人名称")
     private String auditUserNames;
 
+    @ApiModelProperty(value = "完成审核人的名称")
+    private String auditUserCompleteNames;
+
 }

+ 9 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java

@@ -43,15 +43,22 @@ public class LogHistoryController extends BladeController {
         return R.data(logHistoryService.logDetail(id));
     }
 
-    @PostMapping("/task/complete")
+    @PostMapping("/remove")
     @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "日志删除", notes = "传入日志id")
+    public R<Object> logRemove(@RequestParam Long id) {
+        return R.status(logHistoryService.logRemove(id));
+    }
+
+    @PostMapping("/task/complete")
+    @ApiOperationSupport(order = 5)
     @ApiOperation(value = "日志任务完成", notes = "传入日志logId、任务taskId")
     public R<Object> logTaskComplete(@RequestParam Long logId, @RequestParam Long taskId) {
         return R.status(logHistoryService.logTaskComplete(logId, taskId));
     }
 
     @PostMapping("/task/list")
-    @ApiOperationSupport(order = 5)
+    @ApiOperationSupport(order = 6)
     @ApiOperation(value = "日志任务列表", notes = "传入日志logId")
     public R<Object> logTaskList(@RequestParam Long logId) {
         return R.data(logHistoryService.logTaskList(logId));

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

@@ -16,6 +16,8 @@ public interface LogHistoryService extends BaseService<LogHistoryInfo> {
 
     LogHistoryInfoVO logDetail(Long id);
 
+    boolean logRemove(Long id);
+
     boolean logTaskComplete(Long logId, Long taskId);
 
     Object logTaskList(Long logId);

+ 12 - 7
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -41,6 +41,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
     @Override
     public IPage<AttendanceTripInfoVO> tripPage(IPage<AttendanceTripInfo> page, AttendanceTripInfoDTO dto) {
         QueryWrapper<AttendanceTripInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(AttendanceTripInfo::getIsTemp, 1); //提交的数据
         IPage<AttendanceTripInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, AttendanceTripInfo::getCreateTime));
         Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
         return pages.convert(obj -> {
@@ -75,7 +76,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
         //计算三个月前的时间
         LocalDateTime threeMonthsAgo = now.minusMonths(3);
         queryWrapper.between(AttendanceTripInfo::getCreateTime, threeMonthsAgo, now);
-        queryWrapper.eq(AttendanceTripInfo::getIsDeleted, 1); //暂存
+        queryWrapper.eq(AttendanceTripInfo::getIsTemp, 0); //暂存
         List<AttendanceTripInfo> list = baseMapper.selectList(queryWrapper);
         Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
         List<EMDraftVO> resultVOS = new ArrayList<>();
@@ -114,7 +115,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                     var = true;
                 }
             }
-            dto.setIsDeleted(1); //暂存
+            dto.setIsTemp(0); //暂存
             dto.setStatus(0); //未上报
             if (var) {
                 this.save(dto);
@@ -164,7 +165,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                 taskProcessService.save(taskProcessInfo);
 
                 //新增信息
-                dto.setIsDeleted(0); //提交
+                dto.setIsTemp(1); //提交
                 dto.setStatus(1); //待审批
                 if (var) {
                     this.save(dto);
@@ -175,7 +176,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                 //新增审批任务关联信息
                 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() + ",9)");
 
-                //关联项目id,项目计划预算等,在任务闭环时计算推送 TODO
+                //关联项目id,项目计划预算等,在任务闭环时计算推送
 
                 return true;
 
@@ -188,14 +189,18 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
 
     @Override
     public boolean tripRemove(Long id) {
-        return this.removeById(id);
+        AttendanceTripInfo attendanceTripInfo = baseMapper.selectById(id);
+        if (attendanceTripInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override
     public boolean tripCancel(Long id) {
         AttendanceTripInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
-            //查询记录任务关联信息
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {
@@ -208,7 +213,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                 }
 
                 //修改当前记录为未上报状态,且暂存
-                this.update(Wrappers.<AttendanceTripInfo>lambdaUpdate().set(AttendanceTripInfo::getStatus, 0).set(AttendanceTripInfo::getIsDeleted, 1).eq(AttendanceTripInfo::getId, id));
+                this.update(Wrappers.<AttendanceTripInfo>lambdaUpdate().set(AttendanceTripInfo::getStatus, 0).set(AttendanceTripInfo::getIsTemp, 0).eq(AttendanceTripInfo::getId, id));
 
                 return true;
             }

+ 7 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -190,7 +190,7 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                 //新增审批任务关联信息
                 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目前只做存储,在审批完成后闭环时再进行计算推送 TODO
+                //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
                 return true;
 
             } else {
@@ -202,7 +202,12 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
 
     @Override
     public boolean financialRemove(Long id) {
-        return this.removeById(id);
+        EMFinancialReimbursementInfo emFinancialReimbursementInfo = baseMapper.selectById(id);
+        if (emFinancialReimbursementInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 7 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java

@@ -185,7 +185,7 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
                 //新增审批任务关联信息
                 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() + ",7)");
 
-                //存储关联项目id,审批闭环后处理项目相关业务 TODO
+                //存储关联项目id,审批闭环后处理项目相关业务
 
                 return true;
 
@@ -198,7 +198,12 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
 
     @Override
     public boolean invoiceRemove(Long id) {
-        return this.removeById(id);
+        EMInvoiceInfo emInvoiceInfo = baseMapper.selectById(id);
+        if (emInvoiceInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 6 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -200,7 +200,12 @@ public class EMLoanServiceImpl extends BaseServiceImpl<ExMLoanMapper, EMLoanInfo
 
     @Override
     public boolean loanRemove(Long id) {
-        return this.removeById(id);
+        EMLoanInfo emLoanInfo = baseMapper.selectById(id);
+        if (emLoanInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 7 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -182,7 +182,7 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
                 //新增审批任务关联信息
                 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() + ",8)");
 
-                //关联项目id只做存储,任务闭环时在进行业务计算 TODO
+                //关联项目id只做存储,任务闭环时在进行业务计算
 
                 return true;
 
@@ -195,7 +195,12 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
 
     @Override
     public boolean outsourcingRemove(Long id) {
-        return this.removeById(id);
+        EMOutsourcingPayInfo emOutsourcingPayInfo = baseMapper.selectById(id);
+        if (emOutsourcingPayInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 8 - 3
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java

@@ -172,9 +172,9 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
                 //新增审批任务关联信息
                 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() + ",3)");
 
-                //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送 TODO
-                return true;
+                //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送
 
+                return true;
             } else {
                 throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
             }
@@ -184,7 +184,12 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
 
     @Override
     public boolean payRemove(Long id) {
-        return this.removeById(id);
+        EMPayInfo emPayInfo = baseMapper.selectById(id);
+        if (emPayInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 6 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -189,7 +189,12 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
 
     @Override
     public boolean purchaseRemove(Long id) {
-        return this.removeById(id);
+        EMPurchaseInfo emPurchaseInfo = baseMapper.selectById(id);
+        if (emPurchaseInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 6 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -178,7 +178,12 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
 
     @Override
     public boolean carRemove(Long id) {
-        return this.removeById(id);
+        EMUseCarInfo emUseCarInfo = baseMapper.selectById(id);
+        if (emUseCarInfo.getIsTemp().equals(0)) {
+            return this.removeById(id);
+        } else {
+            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+        }
     }
 
     @Override

+ 85 - 34
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -2,10 +2,12 @@ package org.springblade.control.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 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;
 import org.springblade.control.entity.LogHistoryInfo;
 import org.springblade.control.mapper.LogHistoryMapper;
@@ -17,6 +19,7 @@ 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;
@@ -36,6 +39,7 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
 
     private final IUserClient iUserClient;
     private final JdbcTemplate jdbcTemplate;
+    private final EMFinancialReimbursementServiceImpl emFinancialReimbursementService;
 
     @Override
     public Map<String, List<LogHistoryInfoVO>> logList(LogHistoryInfoDTO dto) {
@@ -48,17 +52,17 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         }
         if (StringUtils.isNotEmpty(dto.getStartTime()) && StringUtils.isNotEmpty(dto.getEndTime())) {
             String endTime = dto.getEndTime();
-            endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
+            endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM"), 1), "yyyy-MM");
             queryWrapper.between(LogHistoryInfo::getCreateTime, dto.getStartTime(), endTime);
         } else {
-            //默认查询7天内日志
+            //默认查询当月所有日志
             LocalDate today = LocalDate.now();
-            LocalDate tomorrow = today.plusDays(1);
-            LocalDate sevenDaysAgo = today.minusDays(6);
+            LocalDate firstDayOfMonth = today.withDayOfMonth(1);
+            LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            String todayStr = tomorrow.format(formatter);
-            String sevenDaysAgoStr = sevenDaysAgo.format(formatter);
-            queryWrapper.between(LogHistoryInfo::getCreateTime, sevenDaysAgoStr, todayStr);
+            String firstDayOfMonthStr = firstDayOfMonth.format(formatter);
+            String lastDayOfMonthStr = lastDayOfMonth.format(formatter);
+            queryWrapper.between(LogHistoryInfo::getCreateTime, firstDayOfMonthStr, lastDayOfMonthStr);
         }
         queryWrapper.orderByDesc(true, LogHistoryInfo::getCreateTime);
         List<LogHistoryInfo> logHistoryInfos = baseMapper.selectList(queryWrapper);
@@ -71,7 +75,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             for (User user : userList) {
                 userMap.put(user.getId(), user);
             }
-            //7天内已读日志记录信息
+
+            //当月内已读日志记录信息
             List<LogHistoryInfoReadVO> infoReadVOS = jdbcTemplate.query("select * from c_log_history_read_record where log_id in(" + StringUtils.join(logIds, ",") + ")", new BeanPropertyRowMapper<>(LogHistoryInfoReadVO.class));
             Map<String, LogHistoryInfoReadVO> readMap = new HashMap<>();
             for (LogHistoryInfoReadVO readVO : infoReadVOS) {
@@ -92,36 +97,63 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                     vo.setIsRead(0);
                 }
             }
+
+            return voList.stream()
+                    .collect(Collectors.groupingBy(vo -> {
+                        LocalDateTime localDateTime = LocalDateTime.ofInstant(vo.getCreateTime().toInstant(), ZoneId.systemDefault());
+                        return localDateTime.toLocalDate().toString();
+                    }, LinkedHashMap::new, Collectors.toList()));
         }
-        return voList.stream()
-                .collect(Collectors.groupingBy(vo -> {
-                    LocalDateTime localDateTime = LocalDateTime.ofInstant(vo.getCreateTime().toInstant(), ZoneId.systemDefault());
-                    return localDateTime.toLocalDate().toString();
-                }, LinkedHashMap::new, Collectors.toList()));
+        return null;
     }
 
     @Override
     public boolean logSubmit(LogHistoryInfoDTO dto) {
-        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-        dto.setUserId(SecureUtil.getUserId());
-        this.saveOrUpdate(dto);
 
-        if (ObjectUtil.isNotEmpty(dto.getTaskIds())){
-            //新增日志与任务关系信息 TODO
+        //判断今日是否已填写日志信息
+        LocalDate currentDate = LocalDate.now();
+        String formattedDate = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LogHistoryInfo logOne = baseMapper.selectOne(Wrappers.<LogHistoryInfo>lambdaQuery()
+                .select(LogHistoryInfo::getId)
+                .eq(LogHistoryInfo::getUserId, SecureUtil.getUserId())
+                .like(LogHistoryInfo::getCreateTime, formattedDate));
+        if (logOne != null) {
+            throw new ServiceException("当前用户今日已填写过日志信息,请勿重复提交");
         }
 
-        if (ObjectUtil.isNotEmpty(dto.getExpenseReimbursementAmount())) {
-            //报销金额不为空,在财务报销里面新增一条草稿箱内容 TODO
-        }
+        //入库
+        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.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);
+            }
+        }
         return true;
     }
 
     @Override
     public LogHistoryInfoVO logDetail(Long id) {
-        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
         LogHistoryInfo obj = baseMapper.selectById(id);
@@ -134,16 +166,18 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                     vo.setHeadPicture(StringUtils.isNotEmpty(user.getAvatar()) ? user.getAvatar() : "");
                 }
 
-                //处理当前用户查看当前日志信息为已读状态
-                Long row = jdbcTemplate.queryForObject("select count(1) from c_log_history_read_record where log_id = " + vo.getId() + " and user_id = " + SecureUtil.getUserId(), Long.class);
-                if (row == null || row == 0L) {
-                    jdbcTemplate.execute("insert into c_log_history_read_record(id,log_id,user_id) values (" + SnowFlakeUtil.getId() + "," + vo.getId() + "," + SecureUtil.getUserId() + ")");
-                    vo.setIsRead(1);
+                //处理当前用户查看当前日志信息为已读状态(只有不是自己的日志才添加已读记录信息)
+                if (!obj.getUserId().equals(SecureUtil.getUserId())) {
+                    Long row = jdbcTemplate.queryForObject("select count(1) from c_log_history_read_record where log_id = " + vo.getId() + " and user_id = " + SecureUtil.getUserId(), Long.class);
+                    if (row == null || row == 0L) {
+                        jdbcTemplate.execute("insert into c_log_history_read_record(id,log_id,user_id) values (" + SnowFlakeUtil.getId() + "," + vo.getId() + "," + SecureUtil.getUserId() + ")");
+                        vo.setIsRead(1);
+                    }
                 }
 
-                //处理当前日志taskList任务列表 TODO
+                //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());
                 if (userIds.size() > 0) {
@@ -161,13 +195,30 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         return null;
     }
 
+    @Override
+    public boolean logRemove(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LogHistoryInfo logHistoryInfo = baseMapper.selectById(id);
+        if (logHistoryInfo != null && !logHistoryInfo.getUserId().equals(SecureUtil.getUserId())) {
+            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;
+        }
+        return false;
+    }
+
     @Override
     public boolean logTaskComplete(Long logId, Long taskId) {
         if (ObjectUtil.isEmpty(logId)) {
-            throw new ServiceException("请先提交日志后,再变更任务");
+            throw new ServiceException("请先提交日志后,再变更任务状态");
         }
-        //修改计划任务的状态为已完成,推送到对应的当前部门负责人审批(此处修改的任务状态为计划任务,新增推送的任务为审批任务) TODO
-
+        //TODO 修改计划任务的状态为已完成,新增一条审批任务到对应的当前部门的负责人审批(此处修改的任务状态是计划任务的,新增推送的任务是审批任务的)
         return true;
     }
 
@@ -176,8 +227,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
-        //获取当前用户当天的所有任务信息 TODO
-
+        //TODO 获取当前用户当天的所有任务信息
         return null;
     }
+
 }

+ 176 - 43
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -17,9 +17,11 @@ import org.springblade.control.vo.*;
 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.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.core.tool.utils.ObjectUtil;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
@@ -27,10 +29,10 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.time.Duration;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -39,6 +41,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
     private final IUserClient iUserClient;
     private final JdbcTemplate jdbcTemplate;
+    private final BladeRedis bladeRedis;
 
     @Override
     public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
@@ -77,12 +80,19 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         return pages.convert((obj -> {
             TaskProcessInfoVO vo = new TaskProcessInfoVO();
             BeanUtils.copyProperties(obj, vo);
+
             vo.setReportUserName(userMap.get(vo.getReportUserId()));
+
             List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
                     .map(Long::parseLong).map(userMap::get)
                     .collect(Collectors.toList());
             vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
 
+            List<String> auditUserCompleteNames = Arrays.stream(vo.getAuditUserIdsComplete().split(","))
+                    .map(Long::parseLong).map(userMap::get)
+                    .collect(Collectors.toList());
+            vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
+
             vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : "已驳回"));
 
             for (DictInfo dictInfo : dictInfoList) {
@@ -135,7 +145,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 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 (voCW != null) {
                                     for (DictInfo dictInfo : dictInfoList2) {
                                         if (dictInfo.getDictValue().equals(voCW.getFrType() + "")) {
                                             voCW.setFrTypeName(dictInfo.getDictName());
@@ -197,53 +207,176 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
     @Override
     public boolean taskReject(TaskProcessInfoDTO dto) {
-        //修改业务数据状态为已驳回
-        List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from task_id = " + dto.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
-        for (ExpenseTaskRecord record : records) {
-            if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
-                Integer type = record.getExpenseInfoType();
-                switch (type) {
-                    case 1: //计划任务
-                        //TODO 修改计划任务状态
-                        break;
-
-                    case 2: //财务
-                        jdbcTemplate.execute("update c_expense_financial_reimbursement_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 3: //支付
-                        jdbcTemplate.execute("update c_expense_pay_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 4: //借款
-                        jdbcTemplate.execute("update c_expense_loan_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 5: //采购
-                        jdbcTemplate.execute("update c_expense_purchase_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 6: //用车
-                        jdbcTemplate.execute("update c_expense_use_car_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 7: //发票
-                        jdbcTemplate.execute("update c_expense_invoice_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 8: //外包
-                        jdbcTemplate.execute("update c_expense_outsourcing_pay_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
-                    case 9: //出差
-                        jdbcTemplate.execute("update c_attendance_trip_info set status = 3 where id = " + record.getExpenseInfoId());
-                        break;
+        if (ObjectUtil.isEmpty(dto.getId())) {
+            throw new ServiceException("未获取到当前任务信息,请联系管理员");
+        }
+        List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + dto.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+        if (records.size() == 0) {
+            throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+        }
+        //修改审批任务状态 =3 已驳回
+        if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
+                .set(TaskProcessInfo::getStatus, 3)
+                .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());
+                    }
                 }
             }
+            return true;
+        } else {
+            throw new ServiceException("当前任务审批失败,请联系管理员");
         }
-        //修改审批任务状态为已驳回
-        this.update(Wrappers.<TaskProcessInfo>lambdaUpdate().set(TaskProcessInfo::getStatus, 3).set(TaskProcessInfo::getRejectDesc, dto.getRejectDesc()).eq(TaskProcessInfo::getId, dto.getId()));
-        return true;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean taskSubmit(String id) {
-        //TODO
-        return true;
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
+        }
+        TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
+        if (ObjectUtil.isEmpty(taskProcessInfo)) {
+            throw new ServiceException("未获取当前任务信息,请联系管理员");
+        }
+
+        List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+        if (records.size() == 0) {
+            throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+        }
+        if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds()) && taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+            //加锁
+            String redisLock = bladeRedis.get("user:id=" + SecureUtil.getUserId());
+            if (StringUtils.isNotEmpty(redisLock) && redisLock.equals("task:id=" + id)) {
+                throw new ServiceException("当前用户已提交该任务的审批,请勿重复操作!");
+            } else {
+                bladeRedis.setEx("user:id=" + SecureUtil.getUserId(), "task:id=" + id, Duration.ofMinutes(10));//10分钟过期
+            }
+
+            List<String> auditUserIdList = Func.toStrList(taskProcessInfo.getAuditUserIds());
+            Set<String> auditUserIdCompleteList = new HashSet<>(Func.toStrList(taskProcessInfo.getAuditUserIdsComplete()));
+
+            //剔除待审批中当前用户信息
+            if (auditUserIdList.removeIf(next -> next != null && next.equals(SecureUtil.getUserId() + ""))) {
+                //剔除后视为已完成审批
+                auditUserIdCompleteList.add(SecureUtil.getUserId() + "");
+            }
+
+            //修改待审批人ids、完成审批人ids
+            this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
+                    .set(TaskProcessInfo::getAuditUserIds, ObjectUtil.isNotEmpty(auditUserIdList) ? StringUtils.join(auditUserIdList, ",") : null)
+                    .set(TaskProcessInfo::getAuditUserIdsComplete, ObjectUtil.isNotEmpty(auditUserIdCompleteList) ? StringUtils.join(auditUserIdCompleteList, ",") : null)
+                    .eq(TaskProcessInfo::getId, id));
+
+            //如果待审批人已全部审批完毕,那么修改任务状态
+            if (auditUserIdList.size() == 0) {
+
+                //审批任务状态 =2 已审批
+                if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate().set(TaskProcessInfo::getStatus, 2).eq(TaskProcessInfo::getId, id))) {
+                    //业务状态 =2 已审批
+                    for (ExpenseTaskRecord record : records) {
+                        if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
+                            Integer businessDataType = record.getExpenseInfoType();
+                            if (businessDataType.equals(taskProcessInfo.getTaskType())) {
+                                //修改业务审批状态
+                                this.updateTaskStatus(businessDataType, 2, record.getExpenseInfoId());
+
+                                //处理审批闭环后的业务数据
+                                this.processTheServiceDataAfterTheApprovalClosedLoop(businessDataType, record.getExpenseInfoId());
+
+                                //解锁
+                                bladeRedis.del("user:id=" + SecureUtil.getUserId());
+                            }
+                        }
+                    }
+                }
+            }
+            return true;
+        } else {
+            throw new ServiceException("未获取到当前任务的审批人员信息,请联系管理员");
+        }
     }
 
 
+    /**
+     * 修改业务审批状态
+     *
+     * @param businessDataType 业务类型
+     * @param taskStatus       任务状态
+     * @param dataId           业务id
+     */
+    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long dataId) {
+        switch (businessDataType) {
+            case 1: //计划任务
+                //TODO 修改计划任务状态
+                break;
+
+            case 2: //财务
+                jdbcTemplate.execute("update c_expense_financial_reimbursement_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 3: //支付
+                jdbcTemplate.execute("update c_expense_pay_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 4: //借款
+                jdbcTemplate.execute("update c_expense_loan_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 5: //采购
+                jdbcTemplate.execute("update c_expense_purchase_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 6: //用车
+                jdbcTemplate.execute("update c_expense_use_car_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 7: //发票
+                jdbcTemplate.execute("update c_expense_invoice_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 8: //外包
+                jdbcTemplate.execute("update c_expense_outsourcing_pay_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+            case 9: //出差
+                jdbcTemplate.execute("update c_attendance_trip_info set status = " + taskStatus + " where id = " + dataId);
+                break;
+        }
+    }
+
+
+    /**
+     * 处理审批闭环后的业务数据
+     *
+     * @param businessDataType 业务类型
+     * @param dataId           业务id
+     */
+    private void processTheServiceDataAfterTheApprovalClosedLoop(Integer businessDataType, Long dataId) {
+        switch (businessDataType) {
+            case 1: //计划任务
+                //TODO 处理计划任务List
+
+                break;
+            case 2: //财务 TODO 财务与预算计划关联
+                EMFinancialReimbursementInfo emFinancialReimbursementInfo = jdbcTemplate.query("select * from c_expense_financial_reimbursement_info where id = " + dataId, new BeanPropertyRowMapper<>(EMFinancialReimbursementInfo.class)).stream().findAny().orElse(null);
+
+                break;
+            case 3: //支付 TODO 请款金额与项目关联
+                EMPayInfo emPayInfo = jdbcTemplate.query("select * from c_expense_pay_info where id = " + dataId, new BeanPropertyRowMapper<>(EMPayInfo.class)).stream().findAny().orElse(null);
+
+                break;
+            case 4: //借款 TODO 借款与财务报销的抵消关联
+                EMLoanInfo emLoanInfo = jdbcTemplate.query("select * from c_expense_loan_info where id = " + dataId, new BeanPropertyRowMapper<>(EMLoanInfo.class)).stream().findAny().orElse(null);
+
+                break;
+            case 5: //采购 TODO 采购与经营预算关联
+                EMPurchaseInfo emPurchaseInfo = jdbcTemplate.query("select * from c_expense_purchase_info where id = " + dataId, new BeanPropertyRowMapper<>(EMPurchaseInfo.class)).stream().findAny().orElse(null);
+
+                break;
+            case 8: //外包 TODO 外包支付与项目关联
+                EMOutsourcingPayInfo emOutsourcingPayInfo = jdbcTemplate.query("select * from c_expense_outsourcing_pay_info where id = " + dataId, new BeanPropertyRowMapper<>(EMOutsourcingPayInfo.class)).stream().findAny().orElse(null);
+                break;
+        }
+
+    }
+
 }