Ver Fonte

成本测算审批

liuyc há 2 anos atrás
pai
commit
856069004d

+ 1 - 6
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanDTO.java

@@ -1,12 +1,9 @@
 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 {
@@ -21,11 +18,9 @@ public class TaskPlanDTO extends ProjectCostBudget {
     private String taskStatus;
 
     @ApiModelProperty(value = "开始时间")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
-    private Date startTime;
+    private String startTime;
 
     @ApiModelProperty(value = "结束时间")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
     private String endTime;
 
 }

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

@@ -11,7 +11,7 @@ public class ExpenseTaskRecord implements Serializable {
 
     private Long id;
     private Long taskId;
-    private Long expenseInfoId;
+    private String expenseInfoId;
     private Integer expenseInfoType;
 
 }

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java

@@ -25,4 +25,7 @@ public class EMFinancialReimbursementInfoVO extends EMFinancialReimbursementInfo
     @ApiModelProperty(value = "审批结果")
     private String approvalResultName;
 
+    @ApiModelProperty(value = "是否是财务人员 1=是")
+    private Integer isFinancialPersonnel;
+
 }

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

@@ -0,0 +1,17 @@
+package org.springblade.control.vo;
+
+import lombok.Data;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.ProjectCostBudgetStats;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TaskProjectCostBudgetVO implements Serializable {
+
+    private ProjectCostBudgetStats projectCostBudgetStats;
+
+    private List<ProjectCostBudget> projectCostBudgetList;
+
+}

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

@@ -28,7 +28,7 @@ public class AttendanceManagerController extends BladeController {
     @PostMapping("/trip/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "出差信息分页查询", notes = "传入AttendanceTripInfoDTO、Query")
-    public R<IPage<AttendanceTripInfoVO>> tripPage(AttendanceTripInfoDTO dto, Query query) {
+    public R<IPage<AttendanceTripInfoVO>> tripPage(AttendanceTripInfoDTO dto,@RequestBody Query query) {
         return R.data(attendanceTripService.tripPage(Condition.getPage(query), dto));
     }
 

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

@@ -149,7 +149,7 @@ public class ExMaTwoController extends BladeController {
 
     @GetMapping("/getUserList")
     @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "获取管控系统用户列表(财务报销-归属人、发票管理-开票人)")
+    @ApiOperation(value = "获取管控系统用户列表", notes = "(财务报销-归属人、发票管理-开票人、支付-申请人)")
     public R<List<UserControlVO>> getUserList() {
         List<User> query = jdbcTemplate.query("select id,name,real_name from blade_user where tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
         List<UserControlVO> result = new ArrayList<>();

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

@@ -33,7 +33,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/financial/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "财务报销分页查询", notes = "传入EMFinancialReimbursementInfoDTO、Query")
-    public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(@RequestBody EMFinancialReimbursementInfoDTO dto, Query query) {
+    public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(@RequestBody EMFinancialReimbursementInfoDTO dto,@RequestBody Query query) {
         return R.data(financialReimbursementService.financialPage(Condition.getPage(query), dto));
     }
 
@@ -82,7 +82,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/pay/page")
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "支付申请分页查询", notes = "传入EMPayInfoDTO、Query")
-    public R<IPage<EMPayInfoVO>> payPage(@RequestBody EMPayInfoDTO dto, Query query) {
+    public R<IPage<EMPayInfoVO>> payPage(@RequestBody EMPayInfoDTO dto,@RequestBody Query query) {
         return R.data(payService.payPage(Condition.getPage(query), dto));
     }
 
@@ -124,7 +124,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/loan/page")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "借款申请分页查询", notes = "传入EMLoanInfoDTO、Query")
-    public R<IPage<EMLoanInfoVO>> loanPage(@RequestBody EMLoanInfoDTO dto, Query query) {
+    public R<IPage<EMLoanInfoVO>> loanPage(@RequestBody EMLoanInfoDTO dto,@RequestBody Query query) {
         return R.data(loanService.loanPage(Condition.getPage(query), dto));
     }
 
@@ -166,7 +166,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/purchase/page")
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "采购申请分页查询", notes = "传入EMPurchaseInfoDTO、Query")
-    public R<IPage<EMPurchaseInfoVO>> purchasePage(@RequestBody EMPurchaseInfoDTO dto, Query query) {
+    public R<IPage<EMPurchaseInfoVO>> purchasePage(@RequestBody EMPurchaseInfoDTO dto,@RequestBody Query query) {
         return R.data(purchaseService.purchasePage(Condition.getPage(query), dto));
     }
 
@@ -215,7 +215,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/car/page")
     @ApiOperationSupport(order = 25)
     @ApiOperation(value = "用车申请分页查询", notes = "传入EMUseCarInfoDTO、Query")
-    public R<IPage<EMUseCarInfoVO>> carPage(@RequestBody EMUseCarInfoDTO dto, Query query) {
+    public R<IPage<EMUseCarInfoVO>> carPage(@RequestBody EMUseCarInfoDTO dto,@RequestBody Query query) {
         return R.data(useCarService.carPage(Condition.getPage(query), dto));
     }
 
@@ -264,7 +264,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/invoice/page")
     @ApiOperationSupport(order = 31)
     @ApiOperation(value = "发票申请分页查询", notes = "传入EMInvoiceInfoDTO、Query")
-    public R<IPage<EMInvoiceInfoVO>> invoicePage(@RequestBody EMInvoiceInfoDTO dto, Query query) {
+    public R<IPage<EMInvoiceInfoVO>> invoicePage(@RequestBody EMInvoiceInfoDTO dto,@RequestBody Query query) {
         return R.data(invoiceService.invoicePage(Condition.getPage(query), dto));
     }
 
@@ -320,7 +320,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/outsourcing/page")
     @ApiOperationSupport(order = 39)
     @ApiOperation(value = "外包支付申请分页查询", notes = "传入EMOutsourcingPayInfoDTO、Query")
-    public R<IPage<EMOutsourcingPayInfoVO>> outsourcingPage(@RequestBody EMOutsourcingPayInfoDTO dto, Query query) {
+    public R<IPage<EMOutsourcingPayInfoVO>> outsourcingPage(@RequestBody EMOutsourcingPayInfoDTO dto,@RequestBody Query query) {
         return R.data(outsourcingPayService.outsourcingPage(Condition.getPage(query), dto));
     }
 

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

@@ -35,7 +35,7 @@ public class TaskProcessController extends BladeController {
     @PostMapping("/task/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "审批管理任务分页查询", notes = "传入TaskProcessInfoDTO、Query")
-    public R<IPage<TaskProcessInfoVO>> taskPage(@RequestBody TaskProcessInfoDTO dto, Query query) {
+    public R<IPage<TaskProcessInfoVO>> taskPage(@RequestBody TaskProcessInfoDTO dto, @RequestBody Query query) {
         return R.data(taskProcessService.taskPage(Condition.getPage(query), dto));
     }
 
@@ -63,7 +63,7 @@ public class TaskProcessController extends BladeController {
     @PostMapping("/task/plan/page")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "计划任务执行分页查询", notes = "传入TaskPlanDTO、Query")
-    public R<IPage<TaskPlanInfoVO>> taskPlanPage(@RequestBody TaskPlanDTO dto, Query query) {
+    public R<IPage<TaskPlanInfoVO>> taskPlanPage(@RequestBody TaskPlanDTO dto, @RequestBody Query query) {
         return R.data(taskProcessService.taskPlanPage(Condition.getPage(query), dto));
     }
 
@@ -95,4 +95,11 @@ public class TaskProcessController extends BladeController {
         return R.data(taskProcessService.dataDictList(id));
     }
 
+    @GetMapping("/cost/budget/submit")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "项目成本测算审批提交", notes = "传入成本测算id")
+    public R<Object> approveCostBudgetSubmit(@RequestParam String id) {
+        return R.status(taskProcessService.approveCostBudgetSubmit(id));
+    }
+
 }

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

@@ -35,4 +35,7 @@ public interface TaskProcessService extends BaseService<TaskProcessInfo> {
     boolean dataDictSubmit(TaskDataDictDTO dto);
 
     Map<String, List<TaskProcessRecordDictInfo>> dataDictList(String id);
+
+    boolean approveCostBudgetSubmit(String id);
+
 }

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

@@ -22,6 +22,7 @@ public class PublicScheduledTaskServiceImpl {
     private final EMPayServiceImpl emPayService;
     private final EMPurchaseServiceImpl emPurchaseService;
     private final EMUseCarServiceImpl emUseCarService;
+    private final AttendanceTripServiceImpl attendanceTripService;
 
     /**
      * 定时删除费用管理的草稿数据信息
@@ -43,6 +44,7 @@ public class PublicScheduledTaskServiceImpl {
         emPayService.remove(Wrappers.<EMPayInfo>lambdaQuery().eq(EMPayInfo::getIsTemp, 0).le(EMPayInfo::getCreateTime, formattedDateTime));
         emPurchaseService.remove(Wrappers.<EMPurchaseInfo>lambdaQuery().eq(EMPurchaseInfo::getIsTemp, 0).le(EMPurchaseInfo::getCreateTime, formattedDateTime));
         emUseCarService.remove(Wrappers.<EMUseCarInfo>lambdaQuery().eq(EMUseCarInfo::getIsTemp, 0).le(EMUseCarInfo::getCreateTime, formattedDateTime));
+        attendanceTripService.remove(Wrappers.<AttendanceTripInfo>lambdaQuery().eq(AttendanceTripInfo::getIsTemp, 0).le(AttendanceTripInfo::getCreateTime, formattedDateTime));
     }
 
 }

+ 95 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -58,6 +58,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private final BladeRedis bladeRedis;
     private final ProjectCostBudgetServiceImpl projectCostBudgetService;
     private final ProjectInfoServiceImpl projectInfoServiceImpl;
+    private final ProjectCostBudgetStatsServiceImpl projectCostBudgetStatsService;
 
     @Override
     public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
@@ -177,7 +178,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 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);
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(voCW.getBudgetPlanIds(), controlProjectInfos);
                                         if (planTaskInfoList2 != null) {
                                             vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
                                         }
@@ -189,10 +190,21 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                         }
                                     }
                                     voCW.setUserNameVesting(userMap.get(voCW.getCreateUser()));
+                                    //获取当前用户是否为财务人员,财务人员修改是否支付状态
+                                    if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+                                        throw new ServiceException("获取当前用户信息失败,请联系管理员");
+                                    }
+                                    R<Dept> dept = iSysClient.getDept(Long.parseLong(SecureUtil.getDeptId()));
+                                    if (dept != null && dept.getData() != null) {
+                                        Dept deptObj = dept.getData();
+                                        if (deptObj != null && (deptObj.getDeptName().contains("财务") || deptObj.getDeptName().contains("人事"))) {
+                                            voCW.setIsFinancialPersonnel(1); //财务人员
+                                        }
+                                    }
                                     data = voCW;
                                 }
-
                                 break;
+
                             case 3: //支付
                                 data = jdbcTemplate.query("select * from c_expense_pay_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMPayInfo.class)).stream().findAny().orElse(null);
                                 break;
@@ -208,8 +220,6 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                             case 7: //发票
                                 data = jdbcTemplate.query("select * from c_expense_invoice_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMInvoiceInfo.class)).stream().findAny().orElse(null);
 
-                                //TODO 此处根据invoiceContentType查询发票字典,封装vo
-
                                 break;
                             case 8: //外包
                                 data = jdbcTemplate.query("select * from c_expense_outsourcing_pay_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMOutsourcingPayInfo.class)).stream().findAny().orElse(null);
@@ -220,15 +230,27 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 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);
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(voCC.getBudgetPlanIds(), controlProjectInfos);
                                         if (planTaskInfoList2 != null) {
                                             vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
                                         }
                                     }
-
                                     data = voCC;
                                 }
                                 break;
+                            case 10: //成本测算
+                                List<ProjectCostBudget> query = jdbcTemplate.query("select * from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
+                                if (query.size() > 0) {
+                                    Long projectId = query.stream().map(ProjectCostBudget::getProjectId).collect(Collectors.toList()).stream().findAny().orElse(null);
+                                    if (projectId != null) {
+                                        ProjectCostBudgetStats projectCostBudgetStats = jdbcTemplate.query("select * from c_project_cost_budget_stats where project_id = " + projectId, new BeanPropertyRowMapper<>(ProjectCostBudgetStats.class)).stream().findAny().orElse(null);
+                                        TaskProjectCostBudgetVO voCbCs = new TaskProjectCostBudgetVO();
+                                        voCbCs.setProjectCostBudgetList(query);
+                                        voCbCs.setProjectCostBudgetStats(projectCostBudgetStats);
+                                        data = voCbCs;
+                                    }
+                                }
+                                break;
                         }
                     }
                 }
@@ -600,6 +622,60 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         return resultMap;
     }
 
+    @Override
+    public boolean approveCostBudgetSubmit(String id) {
+        ProjectCostBudgetStats projectCostBudgetStats = projectCostBudgetStatsService.getBaseMapper().selectById(id);
+        if (projectCostBudgetStats != null) {
+            List<ProjectCostBudget> projectCostBudgetList = projectCostBudgetService.getBaseMapper().selectList(Wrappers.<ProjectCostBudget>lambdaQuery()
+                    .eq(ProjectCostBudget::getProjectId, projectCostBudgetStats.getProjectId())
+                    .eq(ProjectCostBudget::getApprove, 0));//未上报
+            if (projectCostBudgetList.size() > 0) {
+                //审批人(总经理)
+                List<String> auditUserIds = new LinkedList<>();
+                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = 003077 and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+                if (query.size() == 1) {
+                    Dept dept = query.get(0);
+                    List<User> users = jdbcTemplate.query("select id from blade_user where dept_id like '%" + dept.getId() + "%' and tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
+                    if (users.size() > 0) {
+                        List<Long> ids = users.stream().map(User::getId).collect(Collectors.toList());
+                        auditUserIds.add(StringUtils.join(ids, ","));
+                    } else {
+                        throw new ServiceException("未获取到总经理岗位人员信息,请联系管理员");
+                    }
+                } else {
+                    throw new ServiceException("未获取到总经理岗位信息,请联系管理员");
+                }
+
+                //创建审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessInfo.setId(SnowFlakeUtil.getId());
+                taskProcessInfo.setStatus(1); //待审批
+                taskProcessInfo.setReportDate(new Date());
+                taskProcessInfo.setTaskType(10); //成本测算审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【成本测算】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+
+                this.save(taskProcessInfo);
+
+                //新增审批任务关联信息
+                List<String> ids = projectCostBudgetList.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
+                String budgetIds = StringUtils.join(ids, ",");
+                jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + budgetIds + ",10)");
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * 修改业务审批状态
      *
@@ -607,7 +683,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param taskStatus       计划任务状态
      * @param dataId           业务id
      */
-    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long dataId) {
+    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, String dataId) {
         switch (businessDataType) {
             case 1: //计划任务
                 if (taskStatus == 2) {
@@ -643,6 +719,16 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             case 9: //出差
                 jdbcTemplate.execute("update c_attendance_trip_info set status = " + taskStatus + " where id = " + dataId);
                 break;
+            case 10: //成本测算
+                if (taskStatus == 2) {
+                    //已完成 = 已完成(修改成本测算的数据状态)dataId = ids
+                    jdbcTemplate.execute("update c_project_cost_budget set approve = 1 where id in(" + dataId + ")");
+
+                } else if (taskStatus == 3) {
+                    //已驳回 = 不做处理,驳回后依然是未上报
+                    break;
+                }
+                break;
         }
     }
 
@@ -652,7 +738,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param businessDataType 业务类型
      * @param dataId           业务id
      */
-    private void processTheServiceDataAfterTheApprovalClosedLoop(Integer businessDataType, Long dataId) {
+    private void processTheServiceDataAfterTheApprovalClosedLoop(Integer businessDataType, String dataId) {
         switch (businessDataType) {
             case 1:
                 //计划任务
@@ -717,7 +803,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param controlProjectInfos
      * @return
      */
-    private TaskPlanInfoVO getPlanTaskInfoList(Long id, List<ControlProjectInfo> controlProjectInfos) {
+    private TaskPlanInfoVO getPlanTaskInfoList(String 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();