Min 1 year ago
parent
commit
c353fc7346

+ 161 - 85
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4007,10 +4007,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public HttpRespMsg getPersonWorkHoursWagesList(String deptId, String userId, String startDate, String endDate, Integer pageIndex, Integer pageSize) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         HashMap resultMap=new HashMap();
-        Integer pageStart = null;
-        if (pageIndex!=null){
-            pageStart = (pageIndex -1) * pageSize;
-        }
         DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DateTimeFormatter dtf1=DateTimeFormatter.ofPattern("yyyyMMdd");
         List<LocalDate> dateList = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
@@ -4045,7 +4041,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             targetUserIds.add("-1");
             queryWrapper.in("id",targetUserIds);
         }
-        IPage<User> userIPage = userMapper.selectPage(new Page<>(pageStart, pageSize), queryWrapper);
+        IPage<User> userIPage = userMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
         List<User> userList = userIPage.getRecords();
         userList.forEach(u->{
             List<Map<String, Object>> mapList = personWorkHoursWagesList.stream().filter(pl -> pl.get("userId").equals(u.getId())).collect(Collectors.toList());
@@ -4778,7 +4774,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //凑整件数
             Integer rounding=0;
             //拆算件数
-            double converted=0;
+            BigDecimal converted=new BigDecimal(0);
             //找到产品下的工序
             List<ProdProcedure> targetProdProcedures = prodProcedureList.stream().filter(p -> p.getProductId().equals(product.getId())).collect(Collectors.toList());
             //过滤工序id 作为完整件数 需要路过的全部工序
@@ -4790,6 +4786,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //过滤已经填报过的所有钢印号去重
             List<ReportSteelNum> targetReportSteelNums = reportSteelNums.stream().filter(r -> targetReportIds.contains(r.getReportId())).collect(Collectors.toList());
             List<String> steelNums = targetReportSteelNums.stream().map(ReportSteelNum::getSteelNum).distinct().collect(Collectors.toList());
+            //先计算完整件数
             for (String steelNum : steelNums) {
                 //找到该产品下填报了该钢印号的所有日报数据
                 List<Integer> hasReportIds = reportSteelNums.stream().filter(r -> r.getSteelNum().equals(steelNum)).collect(Collectors.toList()).stream().map(ReportSteelNum::getReportId).collect(Collectors.toList());
@@ -4799,9 +4796,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //如果全包含了所需路过的全部工序内容 就算完整件数
                 if(hasReportProdProduceIds.containsAll(targetProdProduceIds)){
                     integrated+=1;
-                }else {
-                    //如果没有包含所需路过的全部工序内容 (有任意工序可以共同完成)-->凑整
-                    //根据当前钢印号已经填报的内容 对比出没有填报的工序内容
+                    List<ReportSteelNum> newReportSteelNums=new ArrayList<>();
+                    //作为完整的钢印号直接去掉
+                    for (int i = 0; i < reportSteelNums.size(); i++) {
+                        if(reportSteelNums.get(i).getSteelNum().equals(steelNum)){
+                            continue;
+                        }
+                        newReportSteelNums.add(reportSteelNums.get(i));
+                    }
+                    reportSteelNums=newReportSteelNums;
+                    List<String> newSteelNums=new ArrayList<>();
+                    for (int i = 0; i < steelNums.size(); i++) {
+                        if(steelNums.get(i).equals(steelNum)){
+                            continue;
+                        }
+                        newSteelNums.add(steelNums.get(i));
+                    }
+                    steelNums=newSteelNums;
+                }
+            }
+            //计算凑整件数
+            for (String steelNum : steelNums) {
+                //找到该产品下填报了该钢印号的所有日报数据
+                List<Integer> hasReportIds = reportSteelNums.stream().filter(r -> r.getSteelNum().equals(steelNum)).collect(Collectors.toList()).stream().map(ReportSteelNum::getReportId).collect(Collectors.toList());
+                List<Report> hasReportList = targetReportList.stream().filter(r->hasReportIds.contains(r.getId())).collect(Collectors.toList());
+                //过滤日报所填了哪些工序
+                List<Integer> hasReportProdProduceIds = hasReportList.stream().map(Report::getProdProcedureId).collect(Collectors.toList());
+                //如果没有包含所需路过的全部工序内容 (有任意工序可以共同完成)-->凑整
+                //根据当前钢印号已经填报的内容 对比出没有填报的工序内容
+                if(hasReportProdProduceIds.containsAll(targetProdProduceIds)){
                     List<Integer> hasNotReportProdProduceIds=new ArrayList<>();
                     targetProdProduceIds.forEach(tp->{
                         if(!hasReportProdProduceIds.contains(tp)){
@@ -4816,7 +4839,46 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     boolean match = targetComparator.containsAll(hasNotReportProdProduceIds);
                     if(match){
                         rounding+=1;
-                    }else {
+                        List<ReportSteelNum> newReportSteelNums=new ArrayList<>();
+                        //作为凑整的钢印号直接去掉
+                        for (int i = 0; i < reportSteelNums.size(); i++) {
+                            if(reportSteelNums.get(i).getSteelNum().equals(steelNum)){
+                                continue;
+                            }
+                            newReportSteelNums.add(reportSteelNums.get(i));
+                        }
+                        reportSteelNums=newReportSteelNums;
+                        List<String> newSteelNums=new ArrayList<>();
+                        for (int i = 0; i < steelNums.size(); i++) {
+                            if(steelNums.get(i).equals(steelNum)){
+                                continue;
+                            }
+                            newSteelNums.add(steelNums.get(i));
+                        }
+                        steelNums=newSteelNums;
+                    }
+                }
+            }
+            for(String steelNum : steelNums){
+                //找到该产品下填报了该钢印号的所有日报数据
+                List<Integer> hasReportIds = reportSteelNums.stream().filter(r -> r.getSteelNum().equals(steelNum)).collect(Collectors.toList()).stream().map(ReportSteelNum::getReportId).collect(Collectors.toList());
+                List<Report> hasReportList = targetReportList.stream().filter(r->hasReportIds.contains(r.getId())).collect(Collectors.toList());
+                //过滤日报所填了哪些工序
+                List<Integer> hasReportProdProduceIds = hasReportList.stream().map(Report::getProdProcedureId).collect(Collectors.toList());
+                if(!hasReportProdProduceIds.containsAll(targetProdProduceIds)){
+                    List<Integer> hasNotReportProdProduceIds=new ArrayList<>();
+                    targetProdProduceIds.forEach(tp->{
+                        if(!hasReportProdProduceIds.contains(tp)){
+                            hasNotReportProdProduceIds.add(tp);
+                        }
+                    });
+                    //所有已填报的钢印号有任意满足 上面未填报工序集合 就算凑整件数
+                    //找到所有填报了未填报其工序日报数据
+                    List<Report> comparatorReportList = targetReportList.stream().filter(r ->r.getProdProcedureId()!=null && hasNotReportProdProduceIds.contains(r.getProdProcedureId())).collect(Collectors.toList());
+                    //过滤这些日报下的工序数据
+                    List<Integer> targetComparator = comparatorReportList.stream().map(Report::getProdProcedureId).distinct().collect(Collectors.toList());
+                    boolean match = targetComparator.containsAll(hasNotReportProdProduceIds);
+                    if(match){
                         //计算当前产品的总预算工时
                         BigDecimal reduce = targetProdProcedures.stream().map(i -> new BigDecimal(i.getWorkingTime())).reduce(BigDecimal.ZERO, BigDecimal::add);
                         //利用上面找到的所填了哪些工序 按照所在工序占比计算
@@ -4825,21 +4887,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         for (ProdProcedure hasReportProcedure : hasReportProcedures) {
                             //找到当前工序所在产品总预算工时
                             BigDecimal decimal = new BigDecimal(hasReportProcedure.getWorkingTime());
-                            BigDecimal divide = decimal.divide(reduce, 2, RoundingMode.HALF_UP);
+                            BigDecimal divide = decimal.divide(reduce, 2,BigDecimal.ROUND_HALF_UP);
                             BigDecimal check = new BigDecimal(1);
-                            check=check.multiply(divide);
-                            bigDecimal=bigDecimal.add(check);
+                            check=check.multiply(divide).setScale(2,BigDecimal.ROUND_HALF_UP);
+                            bigDecimal=bigDecimal.add(check).setScale(2,BigDecimal.ROUND_HALF_UP);
                         }
-                        converted+=bigDecimal.doubleValue();
+                        converted=converted.add(bigDecimal);
                     }
                 }
-
             }
+            converted = converted.setScale(2, BigDecimal.ROUND_HALF_UP);
             resultMap.put("integrated",integrated);
             resultMap.put("rounding",rounding);
             resultMap.put("converted",converted);
             BigDecimal bigDecimal=new BigDecimal(integrated);
-            bigDecimal=bigDecimal.add(new BigDecimal(rounding)).add(new BigDecimal(converted));
+            bigDecimal=bigDecimal.add(new BigDecimal(rounding)).add(converted);
             resultMap.put("total",bigDecimal.doubleValue());
             resultMapList.add(resultMap);
         }
@@ -4939,73 +5001,87 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
 	@Override
-	    public HttpRespMsg getPlanDataWithStation(Integer isFilterDept,Integer stationId, String startDate, String endDate, Integer pageIndex, Integer pageSize) {
-	        HttpRespMsg msg=new HttpRespMsg();
-	        User user = userMapper.selectById(request.getHeader("token"));
-	        NumberFormat format = NumberFormat.getPercentInstance();
-	        format.setMinimumFractionDigits(2);
-	        Integer companyId = user.getCompanyId();
-	        DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-	        DateTimeFormatter dtf1=DateTimeFormatter.ofPattern("yyyyMMdd");
-	        List<LocalDate> dates = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
-	        List<String> dataStringList=new ArrayList<>();
-	        for (LocalDate localDate : dates) {
-	            dataStringList.add(localDate.format(dtf1));
-	        }
-	        Integer pageStart = null;
-	        if (pageIndex!=null){
-	            pageStart = (pageIndex -1) * pageSize;
-	            pageSize=pageStart+pageSize;
-	        }
-	        List<Integer> deptIds=null;
-	        if(isFilterDept!=0){
-	            List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().select(Department::getDepartmentId).eq(Department::getSuperiorId, stationId));
-	            deptIds=departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
-	        }
-	        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部车间工位计划表");
-	        List<Map<String, Object>> mapList;
-	        Integer total;
-	        if(!viewAll){
-	            mapList = reportMapper.getPlanDataWithStation(companyId, startDate, endDate, user.getId(), deptIds, pageStart, pageSize);
-	//            total = reportMapper.getPlanDataWithStationCount(companyId, startDate, endDate, user.getId(), deptIds, null, null);
-	        }else {
-	            mapList = reportMapper.getPlanDataWithStation(companyId,startDate,endDate,null,deptIds,pageStart,pageSize);
-	//            total =reportMapper.getPlanDataWithStationCount(companyId,startDate,endDate,null,deptIds,null,null);
-	        }
-	        List<String> dateList = mapList.stream().map(m -> String.valueOf(m.get("startDate"))).distinct().collect(Collectors.toList());
-	        Map<Object, List<Map<String, Object>>> listMapGroupByDate = mapList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("startDate"))));
-	        Map<String,Object> resultMap=new HashMap<>();
-	        //处理数据 先按照日期 再按照分组重新组装数据
-	        List<Map<String,Object>> resultList=new ArrayList<>();
-	        for (String date : dateList) {
-	            List<Map<String, Object>> maps = listMapGroupByDate.get(date);
-	            if(maps==null||maps.size()<=0){
-	                continue;
-	            }
-	            List<Integer> deptIdList = maps.stream().map(m -> Integer.valueOf(String.valueOf(m.get("deptId")))).distinct().collect(Collectors.toList());
-	            Map<Object, List<Map<String, Object>>> listMapGroupByDept = maps.stream().collect(Collectors.groupingBy(m -> Integer.valueOf(String.valueOf(m.get("deptId")))));
-	            Map<String,Object> item=new HashMap<>();
-	            item.put("startDate",date);
-	            BigDecimal planNum=new BigDecimal(0);
-	            BigDecimal nowNum=new BigDecimal(0);
-	            for (Integer dept : deptIdList) {
-	                List<Map<String, Object>> list = listMapGroupByDept.get(dept);
-	                item.put("deptId",dept);
-	                for (Map<String, Object> map : list) {
-	                    planNum=planNum.add(new BigDecimal((String.valueOf(map.get("planNum")))));
-	                    nowNum=nowNum.add(new BigDecimal((String.valueOf(map.get("nowNum")))));
-	                }
-	                item.put("planNum",planNum.doubleValue());
-	                item.put("nowNum",nowNum.doubleValue());
-	                BigDecimal progress = nowNum.divide(planNum, RoundingMode.HALF_UP);
-	                item.put("progress",format.format(progress.doubleValue()));
-	                resultList.add(item);
-	            }
-	        }
-	        resultMap.put("records",resultList.subList(pageStart,pageSize));
-	        resultMap.put("header",dataStringList);
-	        resultMap.put("total",resultList.size());
-	        msg.setData(resultMap);
-	        return msg;
-	    }
+    public HttpRespMsg getPlanDataWithStation(Integer isFilterDept,Integer stationId, String startDate, String endDate, Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        NumberFormat format = NumberFormat.getPercentInstance();
+        format.setMinimumFractionDigits(2);
+        Integer companyId = user.getCompanyId();
+        DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter dtf1=DateTimeFormatter.ofPattern("yyyyMMdd");
+        List<LocalDate> dates = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
+        List<String> dataStringList=new ArrayList<>();
+        for (LocalDate localDate : dates) {
+            dataStringList.add(localDate.format(dtf1));
+        }
+        Integer pageStart = null;
+        if (pageIndex!=null){
+            pageStart = (pageIndex -1) * pageSize;
+            pageSize=pageStart+pageSize;
+        }
+        List<Integer> deptIds=null;
+        if(isFilterDept!=0){
+            List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().select(Department::getDepartmentId).eq(Department::getSuperiorId, stationId));
+            deptIds=departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+        }
+        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部车间工位计划表");
+        List<Map<String, Object>> mapList;
+        Integer total;
+        if(!viewAll){
+            mapList = reportMapper.getPlanDataWithStation(companyId, startDate, endDate, user.getId(), deptIds, pageStart, pageSize);
+//            total = reportMapper.getPlanDataWithStationCount(companyId, startDate, endDate, user.getId(), deptIds, null, null);
+        }else {
+            mapList = reportMapper.getPlanDataWithStation(companyId,startDate,endDate,null,deptIds,pageStart,pageSize);
+//            total =reportMapper.getPlanDataWithStationCount(companyId,startDate,endDate,null,deptIds,null,null);
+        }
+        List<String> dateList = mapList.stream().map(m -> String.valueOf(m.get("startDate"))).distinct().collect(Collectors.toList());
+        Map<Object, List<Map<String, Object>>> listMapGroupByDate = mapList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("startDate"))));
+        List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
+        Map<String,Object> resultMap=new HashMap<>();
+        //处理数据 先按照日期 再按照分组重新组装数据
+        List<Map<String,Object>> resultList=new ArrayList<>();
+        for (String date : dateList) {
+            List<Map<String, Object>> maps = listMapGroupByDate.get(date);
+            if(maps==null||maps.size()<=0){
+                continue;
+            }
+            List<Integer> deptIdList = maps.stream().map(m -> Integer.valueOf(String.valueOf(m.get("deptId")))).distinct().collect(Collectors.toList());
+            Map<Object, List<Map<String, Object>>> listMapGroupByDept = maps.stream().collect(Collectors.groupingBy(m -> Integer.valueOf(String.valueOf(m.get("deptId")))));
+            BigDecimal planNum=new BigDecimal(0);
+            BigDecimal nowNum=new BigDecimal(0);
+            for (Integer dept : deptIdList) {
+                Map<String,Object> item=new HashMap<>();
+                item.put("startDate",date.replaceAll("-",""));
+                List<Map<String, Object>> list = listMapGroupByDept.get(dept);
+                item.put("deptId",dept);
+                item.put("departmentCascade",convertDepartmentIdToCascade(dept,departmentList));
+                for (Map<String, Object> map : list) {
+                    planNum=planNum.add(new BigDecimal((String.valueOf(map.get("planNum")))));
+                    nowNum=nowNum.add(new BigDecimal((String.valueOf(map.get("nowNum")))));
+                }
+                item.put("planNum",planNum.doubleValue());
+                item.put("nowNum",nowNum.doubleValue());
+                BigDecimal progress = nowNum.divide(planNum, RoundingMode.HALF_UP);
+                item.put("progress",format.format(progress.doubleValue()));
+                resultList.add(item);
+            }
+        }
+        List<String> deptIdList = resultList.stream().map(r -> String.valueOf(r.get("deptId"))).distinct().collect(Collectors.toList());
+        List<Map<String,Object>> lastList=new ArrayList<>();
+        for (String dept : deptIdList) {
+            Map<String,Object> map=new HashMap<>();
+            map.put("departmentCascade",convertDepartmentIdToCascade(Integer.valueOf(dept),departmentList));
+            map.put("deptList",resultList.stream().filter(r->String.valueOf(r.get("deptId")).equals(dept)).collect(Collectors.toList()));
+            lastList.add(map);
+        }
+        //得到的数据再根据部门过滤一下
+        if(pageSize>lastList.size()){
+            pageSize=lastList.size();
+        }
+        resultMap.put("records",lastList.subList(pageStart,pageSize));
+        resultMap.put("header",dataStringList);
+        resultMap.put("total",lastList.size());
+        msg.setData(resultMap);
+        return msg;
+    }
 }

+ 6 - 4
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -196,9 +196,11 @@
                 </el-table-column>
                 <el-table-column v-for="(item, index) in planDataWithStationHead" :key="index" :label="item" align="center" min-width="150">
                     <template slot-scope="scope">
-                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item)" class="colorText">
-                            <div v-if="items.crateDate == item">
-                                {{items.workTime}}分钟  {{items.cost}}元
+                        <div v-for="(items, indexs) in scope.row.deptList" :key="indexs" @click="showReportDetail(scope.row,item)" class="colorText">
+                            <div v-if="items.startDate == item">
+                                计划数:{{items.planNum}}  {{items.cost}}分钟  {{items.cost}}元 
+                                实际数:{{items.nowNum}}  {{items.cost}}分钟  {{items.cost}}元
+                                进度:{{items.progress}}
                             </div>
                         </div>
                     </template>
@@ -211,7 +213,7 @@
             </el-table>
 
         <!--工具条-->
-        <el-col :span="24" class="toolbar" v-if="ins != 6">
+        <el-col :span="24" class="toolbar" v-if="ins != 7">
           <el-pagination
                 v-if="ins == 12"
                 @size-change="groupSizeChange"