Explorar o código

Merge remote-tracking branch 'origin/master' into master

yangyj %!s(int64=2) %!d(string=hai) anos
pai
achega
8d685e0787

+ 10 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IOSSClient.java

@@ -22,6 +22,7 @@ import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -38,6 +39,8 @@ public interface IOSSClient {
     String API_PREFIX = "/client";
     String SEND_MESSAGE = API_PREFIX + "/addFileInfo";
 
+    String SEND_MESSAG1E = API_PREFIX + "/getAllFileSizeByFileUrl";
+
 
     /**
      * 通用短信发送
@@ -47,4 +50,11 @@ public interface IOSSClient {
     @PostMapping(value = SEND_MESSAGE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     R<BladeFile> addFileInfo(@RequestPart MultipartFile file);
 
+    /**
+     * // 根据文件路径,获取当前路径下所有文件的大小
+     * @return 文件大小,单位-字节B
+     */
+    @PostMapping(value = SEND_MESSAG1E, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public Long getAllFileSizeByFileUrl(@RequestBody String fileUrl);
+
 }

+ 28 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java

@@ -1,5 +1,6 @@
 package org.springblade.resource.builder.ossre;
 
+import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.aliyun.oss.model.*;
@@ -318,6 +319,15 @@ public class AliossTemplateRe implements OssTemplateRe {
         return initResult;
     }
 
+    // 根据文件路径,获取当前路径下所有文件的大小
+    public Long getAllFileSizeByFileUrl(String fileUrl){
+        ListObjectsV2Request request = new ListObjectsV2Request(this.getBucketName()).withDelimiter("/").withPrefix(fileUrl);
+        ListObjectsV2Result result = this.ossClient.listObjectsV2(request);
+        List<String> folders = result.getCommonPrefixes();
+        String folder = folders.get(0);
+        return calculateFolderLength(ossClient, this.getBucketName(), folder);
+    }
+
     //不使用
 //    public BladeFile putFileWithPath(String fileName, String filePath,Long projectId, InputStream stream) {
 //
@@ -373,6 +383,24 @@ public class AliossTemplateRe implements OssTemplateRe {
 //        }
 //    }
 
+    // 获取某个存储空间下指定目录(文件夹)下的文件大小。
+    private static long calculateFolderLength(OSS ossClient, String bucketName, String folder) {
+        long size = 0L;
+        ListObjectsV2Result result = null;
+        do {
+            // MaxKey默认值为100,最大值为1000。
+            ListObjectsV2Request request = new ListObjectsV2Request(bucketName).withPrefix(folder).withMaxKeys(1000);
+            if (result != null) {
+                request.setContinuationToken(result.getNextContinuationToken());
+            }
+            result = ossClient.listObjectsV2(request);
+            List<OSSObjectSummary> sums = result.getObjectSummaries();
+            for (OSSObjectSummary s : sums) {
+                size += s.getSize();
+            }
+        } while (result.isTruncated());
+        return size;
+    }
 
     //判断文件的格式
     public String getcontentType(String filenameExtension) {

+ 3 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java

@@ -18,6 +18,9 @@ public interface OssTemplateRe extends OssTemplate {
     // OSS 分片上传 初始化
     InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request);
 
+    // 根据文件路径,获取当前路径下所有文件的大小
+    Long getAllFileSizeByFileUrl(String fileUrl);
+
     //指定路径上传
 //    BladeFile putFileWithPath(String fileName, String filePath,Long projectId, InputStream stream);
 }

+ 5 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/OssClient.java

@@ -48,5 +48,10 @@ public class OssClient implements IOSSClient {
         return R.data(bladeFile);
     }
 
+    @Override
+    public Long getAllFileSizeByFileUrl(String fileUrl) {
+        return ossBuilder.template().getAllFileSizeByFileUrl(fileUrl);
+    }
+
 
 }

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java

@@ -100,4 +100,10 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ProjectCostBudget> getAllMaintainPlan3(@Param("projectId")Long projectId,@Param("costType")Integer costType);
 
     void updateByBudgetId(@Param("budget") ProjectCostBudget budget);
+
+    Integer getChangePlanTotal(@Param("userId") Long userId, @Param("start") LocalDate startDate,@Param("end") LocalDate endDate);
+
+    LocalDate getUserCreatTime(@Param("userId") Long userId);
+
+    Integer getUserMonthLog(@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
 }

+ 11 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -301,6 +301,17 @@
         from c_project_cost_budget
         WHERE project_id = #{projectId} and cost_type = #{costType} and plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
     </select>
+    <select id="getChangePlanTotal" resultType="java.lang.Integer">
+        select COUNT(1) from c_task_plan_update_status_info
+        WHERE start_transfer_object = #{userId} and completion_time BETWEEN #{start} and #{end}
+    </select>
+    <select id="getUserCreatTime" resultType="java.time.LocalDate">
+        SELECT create_time FROM blade_user WHERE id = #{userId}
+    </select>
+    <select id="getUserMonthLog" resultType="java.lang.Integer">
+        select COUNT(1) from c_log_history_info
+        WHERE user_id = #{userId} and DATE_FORMAT(create_time ,'%Y-%m-%d') BETWEEN #{start} and #{end}
+    </select>
 
 
 </mapper>

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

@@ -109,6 +109,9 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //根据项目id获取项目截至目前-某个费用分类的的维护支出,按项目环节返回
     Map<Long,BigDecimal> getAllMaintainCost7(Long projectId,Integer costType);
 
+    //根据项目id获取项目截至目前-项目环节的维护支出,按项目环节返回
+    Map<Long,BigDecimal> getAllMaintainCost8(Long projectId);
+
     //获取项目的维护预算
     Set<Long> getAllMaintainBudgetId(Long projectId);
 }

+ 36 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -792,6 +792,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }else {
             isPlan = false;
         }
+        //项目每个进程的维护支出
+        Map<Long, BigDecimal> maintainMap = budgetService.getAllMaintainCost8(projectId);
+        Boolean isMaintain = true;
+        if (maintainMap == null || maintainMap.size() <= 0){
+            isMaintain = false;
+        }
+
         //项目每个进程的报销支出
         Map<Long, BigDecimal> reimburseMap = projectInfoService.getProjectReimburseByProcess(projectId);
         Boolean isReimburse = true;
@@ -837,8 +844,10 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 //未设置时间默认未开始
                 vo.setProcessProgressBar(0);
             }
-            //设置进程支出金额,目前只统计人工支出
+            //设置进程支出金额,统计人工支出,维护支出,报销支出
             if (!isPlan){
+                //没有完成的任务就不用设置人工支出
+                //报销支出
                 if (isReimburse){
                     if (reimburseMap.get(process.getId()) != null){
                         vo.setProcessCostCount(reimburseMap.get(process.getId()));
@@ -846,7 +855,17 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 }else {
                     vo.setProcessCostCount(new BigDecimal(0));
                 }
+
+                //维护支出
+                if (isMaintain && maintainMap.get(process.getId()) != null){
+                    if (vo.getProcessCostCount() == null) {
+                        vo.setProcessCostCount(maintainMap.get(process.getId()));
+                    }else {
+                        vo.setProcessCostCount(vo.getProcessCostCount().add(maintainMap.get(process.getId())));
+                    }
+                }
             }else {
+                //有完成的任务,设置人工支出
                 List<ProjectCostBudget> budgets = collect.get(process.getId());
                 if (budgets != null && budgets.size() > 0){
                     //计算所有任务支出总和
@@ -854,13 +873,20 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     for (ProjectCostBudget budget : budgets) {
                         big = big.add(budget.getActualTotalMoney());
                     }
+                    //设置报销支出
                     if (isReimburse){
                         if (reimburseMap.get(process.getId()) != null){
                             big = big.add(reimburseMap.get(process.getId()));
                         }
                     }
+                    //设置维护支出
+                    if (isMaintain && maintainMap.get(process.getId()) != null){
+                           big = big.add(maintainMap.get(process.getId()));
+                    }
                     vo.setProcessCostCount(big);
                 }else {
+                    //没有人工支出
+                    //设置报销支出
                     if (isReimburse){
                         if (reimburseMap.get(process.getId()) != null){
                             vo.setProcessCostCount(reimburseMap.get(process.getId()));
@@ -868,6 +894,15 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }else {
                         vo.setProcessCostCount(new BigDecimal(0));
                     }
+
+                    //维护支出
+                    if (isMaintain && maintainMap.get(process.getId()) != null){
+                        if (vo.getProcessCostCount() == null) {
+                            vo.setProcessCostCount(maintainMap.get(process.getId()));
+                        }else {
+                            vo.setProcessCostCount(vo.getProcessCostCount().add(maintainMap.get(process.getId())));
+                        }
+                    }
                 }
             }
             //设置进程支出金额百分比,统计实际支出和预算的百分比

+ 104 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -558,7 +558,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
      */
     @Override
     public ProjectCostBudgetVO3 MonthPlanOverview(String planDate) {
-        //没有用户
         Long userId = SecureUtil.getUserId();
         //初始化时间段
         String[] split = planDate.split("-");
@@ -567,7 +566,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         LocalDate startDate;
         LocalDate endDate;
         startDate =  LocalDate.of(year,month,1);
-        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)){
+        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month+"")){
             endDate =  LocalDate.of(year,month,31);
         }else {
             if (month != 2) {
@@ -581,6 +580,41 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             }
         }
         ProjectCostBudgetVO3 vo3 = baseMapper.MonthPlanOverview(userId, startDate, endDate);
+        //获取转移任务总数
+        Integer total = baseMapper.getChangePlanTotal(userId, startDate, endDate);
+        vo3.setTransferPlan(total);
+        //获取日志未填写总数,获取创建时间,从创建时间当天开始填写日志
+        LocalDate creatTime =baseMapper.getUserCreatTime(userId);
+        LocalDate start;
+        LocalDate end;
+        Integer days = 0;
+        if (startDate.isAfter(LocalDate.now())){
+            return vo3;
+        }
+        //如果创建时间大于查询结束时间,就不用计算日志
+        if (!creatTime.isAfter(endDate)){
+            //创建时间小于查询结束时间,则判断判断时间是否大于查询开始时间
+            if (creatTime.isAfter(startDate)){
+                //创建时间大于查询开始时间,则查询开始时间变成创建时间
+                start = creatTime;
+            }else {
+                //创建时间小于查询开始时间,则开始时间变成查询开始时间
+                start = startDate;
+            }
+            //如果查询结束时间大于今天,则今天为查询结束时间
+            if (endDate.isAfter(LocalDate.now())){
+                end = LocalDate.now();
+            }else {
+                //查询结束时间小于今天,则查询结束时间为结束时间
+                end = endDate;
+            }
+            //获取用户当月填写的日志
+            Integer logTotal = baseMapper.getUserMonthLog(userId,start,end);
+            //根据开始时间,结束时间获取工作日应该填写
+            days = CommonUtil.getWorkDays(start, end);
+            //计算 应该填写-实际填写
+            vo3.setNotFilledLog(days - logTotal);
+        }
         return vo3;
     }
 
@@ -1889,6 +1923,74 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * //根据项目id获取项目截至目前-每个项目环节的维护支出,按项目环节返回
+     * @return
+     */
+    @Override
+    public Map<Long,BigDecimal> getAllMaintainCost8(Long projectId) {
+        //获取当前项目-指定费用分类的-维护支出,如果没有返回null
+        List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan2(projectId);
+        if (plans != null && plans.size() > 0) {
+            //分离出主计划和子计划,建立主计划的id,set集合
+            Set<Long> bab = new HashSet<>();
+            for (ProjectCostBudget plan : plans) {
+                if (plan.getParentId() == 0) {
+                    bab.add(plan.getId());
+                } else {
+                    bab.add(plan.getParentId());
+                }
+            }
+            //查询出所有维护计划
+            List<ProjectCostBudget> budgets = this.listByIds(bab);
+            //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
+            ControlContractInfo contract = contractService.getOne(
+                    new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, projectId));
+            if (contract == null){
+                return null;
+            }
+            //返回值
+            Map<Long,BigDecimal> map = new HashMap<>();
+            //获取合同时间,获取多少个月
+            LocalDate startTime = contract.getStartTime();
+            LocalDate endTime = contract.getEndTime();
+            // 当前日期和合同开始时间比较,相差多少月  月 * 每个月维护费 = 当前项目截至当前的所有维护费
+            if (LocalDate.now().compareTo(startTime) < 0){
+                return null;
+            }
+            int years = endTime.getYear() - startTime.getYear();
+            int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
+            //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
+            BigDecimal big = new BigDecimal(0);
+            for (ProjectCostBudget l : budgets) {
+                big = big.add(l.getBudgetStaffCost());
+                if (map.get(l.getProjectProcess()) == null){
+                    map.put(l.getProjectProcess(),l.getBudgetStaffCost());
+                }else {
+                    map.put(l.getProjectProcess(),map.get(l.getProjectProcess()).add(l.getBudgetStaffCost()));
+                }
+            }
+            if (big.compareTo(new BigDecimal(0)) == 0){
+                return null;
+            }
+            //如果合同结束时间比当前大,就用当前时间
+            if (endTime.compareTo(LocalDate.now()) > 0){
+                endTime = LocalDate.now();
+            }
+            int year = LocalDate.now().getYear() - startTime.getYear();
+            int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
+            //目前是每个部门总金额,先计算每个月的总费用,再乘以month个月
+            for (Long process: map.keySet()) {
+                BigDecimal count = map.get(process);
+                //获得每个月的维护费
+                BigDecimal scale = count.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                map.put(process,scale.multiply(new BigDecimal(month)));
+            }
+            return map;
+        }
+        return null;
+    }
+
     /**
      * //获取项目的维护预算
      * @return

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

@@ -225,7 +225,7 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         //获取项目所有的维护预算
         Set<Long> set = budgetService.getAllMaintainBudgetId(id);
         //从预算中排除维护预算
-        budgets = budgets.stream().filter(l->!set.contains(l.getId())).collect(Collectors.toList());
+//        budgets = budgets.stream().filter(l->!set.contains(l.getId())).collect(Collectors.toList());
         //获取项目所有维护预算
         Map<Integer, BigDecimal> map = budgetService.getAllMaintainCost6(id);
         Boolean isMaintain = true;
@@ -249,7 +249,7 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                 vo.setProjectId(id);
                 vo.setCostType(i);
                 vo.setCostTypeValue(costTypeDict.get(i-1).getDictName());
-                List<ProjectCostBudget> costBudgets = budgetMap.get(i-1);
+                List<ProjectCostBudget> costBudgets = budgetMap.get(i);
                 BigDecimal bigDecimal = new BigDecimal(0);
                 if (costBudgets != null && costBudgets.size() > 0){
                     for (ProjectCostBudget budget : costBudgets) {
@@ -257,14 +257,14 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                     }
                 }
                 //加上每个部门的维护预算
-                if (isMaintain){
-                    BigDecimal decimal = map.get(i);
-                    if (decimal != null){
-                        bigDecimal = bigDecimal.add(decimal);
-                    }
-                }
+//                if (isMaintain){
+//                    BigDecimal decimal = map.get(i);
+//                    if (decimal != null){
+//                        bigDecimal = bigDecimal.add(decimal);
+//                    }
+//                }
                 vo.setBudgetCost(bigDecimal);
-                //设置费用分类实际费用,目前设置人工
+                //设置费用分类实际费用,目前设置人工,维护支出,报销支出
                 BigDecimal practicalCost = new BigDecimal(0);
                 if (practicalList != null && practicalList.size() > 0){
                     for (ProjectCostBudget budget : practicalList) {

+ 9 - 9
blade-service/blade-desk/src/main/java/org/springblade/desk/controller/LeaveController.java

@@ -54,14 +54,14 @@ public class LeaveController extends BladeController implements CacheNames {
         return R.data(detail);
     }
 
-    /**
-     * 新增或修改
-     *
-     * @param leave 请假信息
-     */
-    @PostMapping("start-process")
-    public R startProcess(@RequestBody ProcessLeave leave) {
-        return R.status(leaveService.startProcess(leave));
-    }
+//    /**
+//     * 新增或修改
+//     *
+//     * @param leave 请假信息
+//     */
+//    @PostMapping("start-process")
+//    public R startProcess(@RequestBody ProcessLeave leave) {
+//        return R.status(leaveService.startProcess(leave));
+//    }
 
 }