Browse Source

车间开发 工时管家开发

Min 1 year ago
parent
commit
dfa0884007

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -961,13 +961,13 @@ public class TaskController {
             }
         }
         if(projectId!=null){
-            queryWrapper.ge("task.project_id",projectId);
+            queryWrapper.eq("task.project_id",projectId);
         }
         if(groupId!=null){
-            queryWrapper.ge("task.group_id",groupId);
+            queryWrapper.eq("task.group_id",groupId);
         }
-        if(targetUserId!=null){
-            queryWrapper.ge("task.creater_id",targetUserId);
+        if(!StringUtils.isEmpty(targetUserId)){
+            queryWrapper.eq("task.creater_id",targetUserId);
         }
 //        else if (viewId == 3) {
 //            //今天的任务

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -551,7 +551,7 @@
             AND ((a.is_dept_audit = 0 and a.project_auditor_id = #{auditorId} and a.project_audit_state = 0)
             or (a.is_dept_audit = 1 and a.audit_dept_managerid = #{auditorId}))
         </if>
-        <if test="auditUserId != null">
+        <if test="auditUserId != null auditUserId !=''">
             AND ((a.is_dept_audit = 0 and a.project_auditor_id = #{auditUserId} and a.project_audit_state = 0)
             or (a.is_dept_audit = 1 and a.audit_dept_managerid = #{auditUserId}))
         </if>

+ 7 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -71,6 +71,11 @@ public class PlanController {
         return planService.allocationPlan(ids,planType);
     }
 
+    @RequestMapping("/allocationUser")
+    public HttpRespMsg allocationUser(Integer planId){
+        return planService.allocationUser(planId);
+    }
+
     //设置今明日计划部门
     @RequestMapping("/deptSet")
     @Transactional
@@ -94,8 +99,8 @@ public class PlanController {
     }
 
     @RequestMapping("/exportData")
-    public HttpRespMsg exportData(String date,Integer planType,String steelStampNumber){
-        return planService.exportData(date,planType,steelStampNumber);
+    public HttpRespMsg exportData(String startDate,String endDate,Integer planType,Integer productId,Integer deptId){
+        return planService.exportData(startDate,endDate,planType,productId,deptId);
     }
     /*计划下产品工序组员分配*/
     @RequestMapping("/teamAllocation")

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java

@@ -1630,6 +1630,11 @@ public class ReportController {
         return reportService.getPlanDataWithUserId(userId,startDate,endDate);
     }
 
+    @RequestMapping("/exportPlanDataWithUserId")
+    public HttpRespMsg exportPlanDataWithUserId(String userId,String startDate,String endDate){
+        return reportService.exportPlanDataWithUserId(userId,startDate,endDate);
+    }
+
     @RequestMapping("/getUserCommentPlanResult")
     public HttpRespMsg getUserCommentPlanResult(String pptIds){
         return reportService.getUserCommentPlanResult(pptIds);

+ 3 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java

@@ -259,6 +259,9 @@ public class Plan extends Model<Plan> {
     @TableField(exist = false)
     private List<PlanSteelStampNumber> steelStampNumberList;
 
+    @TableField(exist = false)
+    private Integer hasAllocation;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 3 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanService.java

@@ -27,7 +27,7 @@ public interface PlanService extends IService<Plan> {
 
     HttpRespMsg importData(MultipartFile multipartFile, Integer planType);
 
-    HttpRespMsg exportData(String date, Integer planType,String steelStampNumber);
+    HttpRespMsg exportData(String startDate,String endDate,Integer planType,Integer productId,Integer deptId);
 
     HttpRespMsg deptSet(String deptIds);
 
@@ -56,4 +56,6 @@ public interface PlanService extends IService<Plan> {
     HttpRespMsg allPlanList(HttpServletRequest request);
 
     HttpRespMsg deletePlan(Integer id);
+
+    HttpRespMsg allocationUser(Integer planId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -156,4 +156,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getPlanDataWithUserId(String userId, String startDate, String endDate);
 
     HttpRespMsg getUserCommentPlanResult(String pptIds);
+
+    HttpRespMsg exportPlanDataWithUserId(String userId, String startDate, String endDate);
 }

+ 108 - 55
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -165,22 +165,23 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
             List<Integer> otherDeptIds = otherManagers.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
             deptIds.addAll(otherDeptIds);
             /*作为部门负责人看到的数据*/
-            if(departmentMapper.selectCount(new LambdaQueryWrapper<Department>().eq(Department::getManagerId,user.getId()))>0
-                    ||departmentOtherManagerService.count(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getOtherManagerId,user.getId()))>0){
-                queryWrapper.and(wrapper->wrapper.and(wr->wr.in(Plan::getStationId,deptIds).eq(Plan::getStatus,1)).or().eq(Plan::getCreateId,user.getId()));
-            }else {
-                /*作为组员可以查看的数据*/
-                List<ProdProcedureTeam> prodProcedureTeams = prodProcedureTeamService.list(new QueryWrapper<ProdProcedureTeam>().eq("company_id", companyId).eq("user_id", user.getId()));
-                List<Integer> collect=new ArrayList<>();
-                if(prodProcedureTeams!=null&&prodProcedureTeams.size()>0){
-                    List<Integer> ids = prodProcedureTeams.stream().map(ProdProcedureTeam::getPlanProcedureId).collect(Collectors.toList());
-                    List<PlanProcedureTotal> list = planProcedureTotalService.list(new QueryWrapper<PlanProcedureTotal>().in("id", ids));
-                    collect = list.stream().map(PlanProcedureTotal::getPlanId).distinct().collect(Collectors.toList());
-                }
-                collect.add(-1);
-                List<Integer> finalCollect = collect;
-                queryWrapper.and(wrapper->wrapper.in(Plan::getId, finalCollect).or().eq(Plan::getCreateId,user.getId())).eq(Plan::getStatus,1);
+//            if(departmentMapper.selectCount(new LambdaQueryWrapper<Department>().eq(Department::getManagerId,user.getId()))>0
+//                    ||departmentOtherManagerService.count(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getOtherManagerId,user.getId()))>0){
+////                queryWrapper.and(wrapper->wrapper.and(wr->wr.in(Plan::getStationId,deptIds).eq(Plan::getStatus,1)).or().eq(Plan::getCreateId,user.getId()));
+//                queryWrapper.and(wrapper->wrapper.and(wr->wr.in(Plan::getStationId,deptIds)).or().eq(Plan::getCreateId,user.getId()));
+//            }else {
+//
+//            }
+            List<ProdProcedureTeam> prodProcedureTeams = prodProcedureTeamService.list(new QueryWrapper<ProdProcedureTeam>().eq("company_id", companyId).eq("user_id", user.getId()));
+            List<Integer> collect=new ArrayList<>();
+            if(prodProcedureTeams!=null&&prodProcedureTeams.size()>0){
+                List<Integer> ids = prodProcedureTeams.stream().map(ProdProcedureTeam::getPlanProcedureId).collect(Collectors.toList());
+                List<PlanProcedureTotal> list = planProcedureTotalService.list(new QueryWrapper<PlanProcedureTotal>().in("id", ids));
+                collect = list.stream().map(PlanProcedureTotal::getPlanId).distinct().collect(Collectors.toList());
             }
+            collect.add(-1);
+            List<Integer> finalCollect = collect;
+            queryWrapper.and(wrapper->wrapper.in(Plan::getId, finalCollect).or().eq(Plan::getCreateId,user.getId()).or().in(Plan::getStationId,deptIds)).eq(Plan::getStatus,1);
         }
         if(!StringUtils.isEmpty(steelStampNumber)){
             QueryWrapper<PlanSteelStampNumber> queryWrapperSSN=new QueryWrapper<>();
@@ -220,6 +221,9 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
                 if(totals.size()>0){
                     double sum = totals.stream().filter(t->t.getTotalWages()!=null).mapToDouble(PlanProcedureTotal::getTotalWages).sum();
                     rs.setTotalMoney(sum);
+                    List<Integer> totalIds = totals.stream().map(PlanProcedureTotal::getId).collect(Collectors.toList());
+                    boolean b = procedureTeams.stream().anyMatch(p -> totalIds.contains(p.getPlanProcedureId()));
+                    rs.setHasAllocation(b?1:0);
                 }
                 if(planType==2){
                     totals.forEach(ps->{
@@ -275,7 +279,6 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
     @Override
     public HttpRespMsg addOrUpdatePlan(Plan plan) {
         User user = userMapper.selectById(request.getHeader("token"));
-        List<Plan> plans = planMapper.selectList(new LambdaQueryWrapper<Plan>().eq(Plan::getStationId, plan.getStationId()).eq(Plan::getProductId, plan.getProductId()).orderByDesc(Plan::getCreateTime));
         boolean isNew=true;
         Integer companyId = user.getCompanyId();
         HttpRespMsg msg=new HttpRespMsg();
@@ -287,6 +290,14 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         }
         if(plan.getProductId()!=null){
             Product product = productMapper.selectById(plan.getProductId());
+            List<Plan> plans = planMapper.selectList(new LambdaQueryWrapper<Plan>().select(Plan::getNum));
+            double sum = plans.stream().mapToDouble(Plan::getNum).sum();
+            BigDecimal decimal = new BigDecimal(sum);
+            decimal=decimal.add(new BigDecimal(plan.getNum())).setScale(2,BigDecimal.ROUND_HALF_UP);
+            if(decimal.doubleValue()>product.getOrderNumber()){
+                msg.setError("创建失败,该产品下的排产计划总数量大于当前产品下的订单数量");
+                return msg;
+            }
             plan.setProductName(product.getName());
         }
         if(plan.getTaskTypeId()!=null){
@@ -427,31 +438,31 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         }
         planProcedureTotalService.saveOrUpdateBatch(planProcedureTotals);
         //新增的时候 计划相同的产品 分配到相同的班组的时候 组员自动分配到上次分配到的人员上
-        if(isNew){
-            if(plans.size()>0){
-                Plan oldPlan = plans.get(0);
-                List<PlanProcedureTotal> oldTotalList = planProcedureTotalService.list(new LambdaQueryWrapper<PlanProcedureTotal>().eq(PlanProcedureTotal::getPlanId, oldPlan.getId()));
-                List<Integer> ids = oldTotalList.stream().map(PlanProcedureTotal::getId).distinct().collect(Collectors.toList());
-                ids.add(-1);
-                List<ProdProcedureTeam> procedureTeams = prodProcedureTeamService.list(new LambdaQueryWrapper<ProdProcedureTeam>().in(ProdProcedureTeam::getPlanProcedureId, ids));
-                for (PlanProcedureTotal planProcedureTotal : planProcedureTotals) {
-                    Optional<PlanProcedureTotal> first = oldTotalList.stream().filter(ot -> ot.getProdProcedureId().equals(planProcedureTotal.getProdProcedureId())).findFirst();
-                    if(!first.isPresent()){
-                        continue;
-                    }
-                    List<ProdProcedureTeam> teams = procedureTeams.stream().filter(ps -> ps.getPlanProcedureId().equals(first.get().getId())).collect(Collectors.toList());
-                    if(teams!=null&&teams.size()>0){
-                        String teamIds = teams.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.joining(","));
-                        try {
-                            teamAllocation(planProcedureTotal,teamIds,plan.getPlanType());
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-
-            }
-        }
+//        if(isNew){
+//            if(plans.size()>0){
+//                Plan oldPlan = plans.get(0);
+//                List<PlanProcedureTotal> oldTotalList = planProcedureTotalService.list(new LambdaQueryWrapper<PlanProcedureTotal>().eq(PlanProcedureTotal::getPlanId, oldPlan.getId()));
+//                List<Integer> ids = oldTotalList.stream().map(PlanProcedureTotal::getId).distinct().collect(Collectors.toList());
+//                ids.add(-1);
+//                List<ProdProcedureTeam> procedureTeams = prodProcedureTeamService.list(new LambdaQueryWrapper<ProdProcedureTeam>().in(ProdProcedureTeam::getPlanProcedureId, ids));
+//                for (PlanProcedureTotal planProcedureTotal : planProcedureTotals) {
+//                    Optional<PlanProcedureTotal> first = oldTotalList.stream().filter(ot -> ot.getProdProcedureId().equals(planProcedureTotal.getProdProcedureId())).findFirst();
+//                    if(!first.isPresent()){
+//                        continue;
+//                    }
+//                    List<ProdProcedureTeam> teams = procedureTeams.stream().filter(ps -> ps.getPlanProcedureId().equals(first.get().getId())).collect(Collectors.toList());
+//                    if(teams!=null&&teams.size()>0){
+//                        String teamIds = teams.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.joining(","));
+//                        try {
+//                            teamAllocation(planProcedureTotal,teamIds,plan.getPlanType());
+//                        } catch (Exception e) {
+//                            e.printStackTrace();
+//                        }
+//                    }
+//                }
+//
+//            }
+//        }
         List<PlanProcedureTotal> totals = planProcedureTotals.stream().filter(ps -> ps.getPlanId().equals(plan.getId())).collect(Collectors.toList());
         if(totals.size()>0){
             double sum = totals.stream().filter(t->t.getTotalWages()!=null).mapToDouble(PlanProcedureTotal::getTotalWages).sum();
@@ -870,7 +881,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
     }
 
     @Override
-    public HttpRespMsg exportData(String date, Integer planType,String steelStampNumber) {
+    public HttpRespMsg exportData(String startDate,String endDate,Integer planType,Integer productId,Integer deptId) {
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         QueryWrapper<Plan> queryWrapper=new QueryWrapper();
@@ -881,27 +892,37 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         }else {
             queryWrapper.eq("plan_type",1);
         }
-        if(!StringUtils.isEmpty(date)){
-            LocalDate parse = LocalDate.parse(date,df);
-            queryWrapper.eq("start_date",parse);
+        if(!StringUtils.isEmpty(startDate)&&!StringUtils.isEmpty(endDate)){
+            LocalDate parse1 = LocalDate.parse(startDate,df);
+            LocalDate parse2 = LocalDate.parse(endDate,df);
+            queryWrapper.between("start_date",parse1,parse2);
         }else {
             if(planType!=2){
                 LocalDate now = LocalDate.now();
                 queryWrapper.eq("start_date",planType==0?now:now.plusDays(1));
             }
         }
+        if(productId!=null){
+            queryWrapper.eq("product_id",productId);
+        }
+        if(deptId!=null){
+            List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getDepartmentId, deptId).or().eq(Department::getSuperiorId, deptId));
+            List<Integer> list = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+            list.add(-1);
+            queryWrapper.in("station_id",list);
+        }
+////        if(!StringUtils.isEmpty(steelStampNumber)){
+////            queryWrapper.gt("steel_stamp_number_start",steelStampNumber);
+////            queryWrapper.lt("steel_stamp_number_end",steelStampNumber);
+////        }
 //        if(!StringUtils.isEmpty(steelStampNumber)){
-//            queryWrapper.gt("steel_stamp_number_start",steelStampNumber);
-//            queryWrapper.lt("steel_stamp_number_end",steelStampNumber);
+//            QueryWrapper<PlanSteelStampNumber> queryWrapperSSN=new QueryWrapper<>();
+//            queryWrapperSSN.apply("'"+steelStampNumber+"'"+" between steel_stamp_number_start AND steel_stamp_number_end");
+//            List<PlanSteelStampNumber> list = planSteelStampNumberService.list(queryWrapperSSN);
+//            List<Integer> ids = list.stream().map(PlanSteelStampNumber::getPlanId).collect(Collectors.toList());
+//            ids.add(-1);
+//            queryWrapper.in("id",ids);
 //        }
-        if(!StringUtils.isEmpty(steelStampNumber)){
-            QueryWrapper<PlanSteelStampNumber> queryWrapperSSN=new QueryWrapper<>();
-            queryWrapperSSN.apply("'"+steelStampNumber+"'"+" between steel_stamp_number_start AND steel_stamp_number_end");
-            List<PlanSteelStampNumber> list = planSteelStampNumberService.list(queryWrapperSSN);
-            List<Integer> ids = list.stream().map(PlanSteelStampNumber::getPlanId).collect(Collectors.toList());
-            ids.add(-1);
-            queryWrapper.in("id",ids);
-        }
         List<Plan> planList = planMapper.selectList(queryWrapper);
         List<String> titleList=new ArrayList<>();
         if(planType!=2){
@@ -1387,4 +1408,36 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         msg.setError("‘已有员工报工,删除失败");
         return msg;
     }
+
+    @Override
+    public HttpRespMsg allocationUser(Integer planId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Plan plan = planMapper.selectById(planId);
+        List<Plan> plans = planMapper.selectList(new LambdaQueryWrapper<Plan>().eq(Plan::getStationId, plan.getStationId()).ne(Plan::getId,plan.getId()).eq(Plan::getProductId, plan.getProductId()).orderByDesc(Plan::getCreateTime));
+        List<PlanProcedureTotal> planProcedureTotals = planProcedureTotalService.list(new LambdaQueryWrapper<PlanProcedureTotal>().eq(PlanProcedureTotal::getPlanId, plan.getId()));
+        if(plans.size()>0){
+            Plan oldPlan = plans.get(0);
+            List<PlanProcedureTotal> oldTotalList = planProcedureTotalService.list(new LambdaQueryWrapper<PlanProcedureTotal>().eq(PlanProcedureTotal::getPlanId, oldPlan.getId()));
+            List<Integer> ids = oldTotalList.stream().map(PlanProcedureTotal::getId).distinct().collect(Collectors.toList());
+            ids.add(-1);
+            List<ProdProcedureTeam> procedureTeams = prodProcedureTeamService.list(new LambdaQueryWrapper<ProdProcedureTeam>().in(ProdProcedureTeam::getPlanProcedureId, ids));
+            for (PlanProcedureTotal planProcedureTotal : planProcedureTotals) {
+                Optional<PlanProcedureTotal> first = oldTotalList.stream().filter(ot -> ot.getProdProcedureId().equals(planProcedureTotal.getProdProcedureId())).findFirst();
+                if(!first.isPresent()){
+                    continue;
+                }
+                List<ProdProcedureTeam> teams = procedureTeams.stream().filter(ps -> ps.getPlanProcedureId().equals(first.get().getId())).collect(Collectors.toList());
+                if(teams!=null&&teams.size()>0){
+                    String teamIds = teams.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.joining(","));
+                    try {
+                        teamAllocation(planProcedureTotal,teamIds,plan.getPlanType());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+
+        }
+        return msg;
+    }
 }

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

@@ -4060,9 +4060,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         IPage<User> userIPage = userMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
         List<User> userList = userIPage.getRecords();
-        User totalUser=new User();
-        totalUser.setId("0");
-        userList.add(totalUser);
+        if(userList.size()>0){
+            User totalUser=new User();
+            totalUser.setId("0");
+            userList.add(totalUser);
+        }
         List<Map<String,Object>> totalList=new ArrayList<>();
         for (String date : dataStringList) {
             Map<String,Object> map=new HashMap<>();
@@ -5679,4 +5681,175 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         httpRespMsg.setData(sb.toString());
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg exportPlanDataWithUserId(String userId, String startDate, String endDate) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        Company company = companyMapper.selectById(companyId);
+        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));
+        }
+        HttpRespMsg respMsg = getPlanDataWithUserId(userId, startDate, endDate);
+        List<Map<String, Object>> msgData = (List<Map<String, Object>>) respMsg.getData();
+        //1.创建一个workbook,对应一个excel文件
+        SXSSFWorkbook workBook = new SXSSFWorkbook();
+        //2.在workbook中添加一个sheet,对应Excel中的sheet
+        SXSSFSheet sheet = workBook.createSheet("车间工位计划表");
+        //设置每一列的列宽
+        sheet.setColumnWidth(0,256*15);
+        sheet.setColumnWidth(1,256*15);
+        //3.设置样式以及字体样式
+        //设置首行冻结
+        sheet.createFreezePane(0, 1);
+        sheet.setDefaultColumnWidth(16);
+        //设置字体样式
+        Font headFont = workBook.createFont();
+        headFont.setBold(true);
+        headFont.setFontHeightInPoints((short) 10);
+        headFont.setFontName("黑体");
+
+        Font titleFont = workBook.createFont();
+        titleFont.setBold(true);
+        titleFont.setFontHeightInPoints((short) 10);
+        titleFont.setFontName("黑体");
+
+        Font font = workBook.createFont();
+        font.setFontHeightInPoints((short) 10);
+        font.setFontName("宋体");
+
+        //设置单元格样式
+        XSSFCellStyle  headStyle = (XSSFCellStyle) workBook.createCellStyle();
+        headStyle.setFont(headFont);
+        headStyle.setAlignment(HorizontalAlignment.CENTER);
+        headStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        headStyle.setWrapText(true);
+        headStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        headStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        headStyle.setBorderTop(BorderStyle.THIN);//上边框
+        headStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+        String color = "c0c0c0";    //此处得到的color为16进制的字符串
+        //转为RGB码
+        int r = Integer.parseInt((color.substring(0,2)),16);   //转为16进制
+        int g = Integer.parseInt((color.substring(2,4)),16);
+        int b = Integer.parseInt((color.substring(4,6)),16);
+
+        //设置自定义颜色
+        XSSFColor xssfColor = new XSSFColor();
+        byte[] colorRgb = { (short)9, (byte) r, (byte) g, (byte) b };
+        xssfColor.setRGB(colorRgb);
+
+        headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);
+        headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式(和背景颜色成对使用)
+        /*headStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());*/ //设置自带的颜色
+
+        CellStyle titleStyle = workBook.createCellStyle();
+        titleStyle.setFont(titleFont);
+        titleStyle.setAlignment(HorizontalAlignment.CENTER);
+        titleStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);  //填充单元格
+        titleStyle.setFillForegroundColor((short)9);    //填色
+        titleStyle.setWrapText(true);
+        titleStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        titleStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        titleStyle.setBorderTop(BorderStyle.THIN);//上边框
+        titleStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+        CellStyle cellStyle = workBook.createCellStyle();
+        cellStyle.setFont(font);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+        cellStyle.setWrapText(true);
+        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
+        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
+        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
+        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
+        //行号
+        int rowNum = 0;
+        //第一行
+        SXSSFRow row0 = sheet.createRow(rowNum++);
+        row0.setHeight((short)500);
+        List<String> row_first =new ArrayList<>();
+        row_first.add("产品名称");
+        for (String date : dataStringList) {
+            row_first.add(date);
+        }
+        for (int i = 0; i < row_first.size(); i++) {
+            SXSSFCell tempCell = row0.createCell(i);
+            tempCell.setCellValue(row_first.get(i));
+            tempCell.setCellStyle(headStyle);
+        }
+        List<String> list=new ArrayList<>();
+        Map<String, List<Map<String, Object>>> listMap = msgData.stream().collect(Collectors.groupingBy(d -> String.valueOf(d.get("productId"))));
+        List<String> productIdList = msgData.stream().map(m -> String.valueOf(m.get("productId"))).distinct().collect(Collectors.toList());
+        int startIndex=1;
+        for (int i = 0; i < productIdList.size(); i++) {
+            List<Map<String, Object>> mapList = listMap.get(productIdList.get(i));
+            //判断是否需要合并
+            if(mapList.size()>1){
+                sheet.addMergedRegion(new CellRangeAddress(startIndex,startIndex+mapList.size()-1,0,0));
+                startIndex+=mapList.size();
+            }
+            for (int j = 0; j < mapList.size(); j++) {
+                if(j==0){
+                    list.add(String.valueOf(mapList.get(j).get("productName")));
+                }else {
+                    list.add("");
+                }
+                List<Map<String, Object>> targetList = (List<Map<String, Object>>) mapList.get(j).get("dataList");
+                for (String date : dataStringList) {
+                    Optional<Map<String, Object>> first = targetList.stream().filter(l -> String.valueOf(l.get("createDate")).equals(date)).findFirst();
+                    if(first.isPresent()){
+                        list.add((first.get().get("procedureName")==null?"":first.get().get("procedureName")+"\n")+
+                                first.get().get("workingTime")+"分钟"+first.get().get("cost")+"元"+"\n"+
+                                first.get().get("finishNum")+"件");
+                    }else {
+                        list.add("");
+                    }
+                }
+            }
+        }
+        int k=0;
+        for(int i = 0;i<msgData.size();i++){
+            SXSSFRow tempRow = sheet.createRow(rowNum++);
+            tempRow.setHeight((short)500);
+            for(int j=0;j<dataStringList.size()+1;j++){
+                SXSSFCell tempCell = tempRow.createCell(j);
+                String cellValue = "";
+                tempCell.setCellStyle(cellStyle);
+                if(k>=list.size()){
+                    continue;
+                }
+                cellValue=list.get(k);
+                tempCell.setCellValue(cellValue);
+                k++;
+            }
+        }
+
+        //导出excel
+        String result="系统提示:Excel文件导出成功!";
+        String title= "车间工位计划表_"+company.getCompanyName()+System.currentTimeMillis();
+        String fileName= title+".xlsx";
+        try {
+            File dir = null;
+            dir = new File(path);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            FileOutputStream os = new FileOutputStream(path+fileName);//保存到本地
+            workBook.write(os);
+            os.flush();
+            os.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.data ="/upload/"+fileName;
+        return httpRespMsg;
+    }
 }

+ 16 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue

@@ -48,6 +48,7 @@
                     {{ item.progress==null||item.progress==0 ? '中止计划' : ''}}
                   </span>
                   <van-button type="info" size="small" @click="toDistribution(item)">派工单</van-button>
+                  <van-button v-if="item.hasAllocation==0" type="info" size="small" @click="allocationUser(item)">下发</van-button>
                 </div>
               </div>
             </div>
@@ -157,6 +158,21 @@ export default {
             this.$toast.fail(res.msg);
           }
         }).catch(err => { this.$toast.clear(); })
+    },
+    allocationUser(item){
+      this.$axios.post(
+          "/plan/allocationUser",
+            {
+              planId:item.id,
+            },
+        ).then(res => {
+          if (res.code == "ok") {
+             this.$toast.success('下发成功');
+          } else {
+            this.$toast.clear();
+            this.$toast.fail(res.msg);
+          }
+        }).catch(err => { this.$toast.clear(); })
     }
   },
 };

+ 59 - 10
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue

@@ -26,10 +26,7 @@
             `新增${titleText}`
           }}</el-link>
           <el-link type="primary" :underline="false" @click="importDataDialog = true">{{ "导入" }}</el-link>
-          <el-link type="primary" :underline="false" @click="exportData()"
-            :download="this.planType == 0 ? '今日计划' : this.planType == 1 ? '明日计划' : this.planType == 2 ? '插单计划' : '' + '.xlsx'">{{
-              "导出"
-            }}</el-link>
+          <el-link type="primary" :underline="false" @click="exportDialog=true">{{"导出"}}</el-link>
         </div>
       </div>
     </div>
@@ -104,14 +101,14 @@
           <el-form-item label="排产工单号" style="width: 100%" prop="productSchedulingNum">
             <el-input v-model="todayPlanForm.productSchedulingNum" maxlength="50"></el-input>
           </el-form-item>
-          <el-form-item label="产品名称" style="width: 100%" prop="productId">
+          <el-form-item label="项目代码" style="width: 100%" prop="productId">
             <el-select v-model="todayPlanForm.productId" placeholder="请选择" class="w100" @change="setProductCode">
-              <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id">
+              <el-option v-for="item in productList" :key="item.id" :label="item.code" :value="item.id">
               </el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="项目代码" style="width: 100%" prop="projectCode">
-            <el-input v-model="todayPlanForm.projectCode" maxlength="50" readonly></el-input>
+          <el-form-item label="产品名称" style="width: 100%" prop="productName">
+            <el-input v-model="todayPlanForm.productName" maxlength="50" readonly></el-input>
           </el-form-item>
 
           <div v-for="(item, index) in todayPlanForm.steelStampNumberList" style="width: 100%;margin-bottom: 10px;">
@@ -243,6 +240,38 @@
         </el-upload>
       </p>
     </el-dialog>
+
+    <!--导出计划 -->
+    <el-dialog :title="this.titleText + '导出'" :visible.sync="exportDialog" width="500px">
+        <el-form ref="form3" :model="exportParam">
+            <el-form-item prop="rangeDatas" :label="$t('time.dateRange')">
+                <el-date-picker
+                    v-model="exportParam.rangeDatas" :editable="false" 
+                    format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
+                    :clearable="true" 
+                    :range-separator="$t('other.to')"
+                    type="daterange" 
+                    :start-placeholder="$t('time.startDate')"
+                    :end-placeholder="$t('time.endDate')"
+                ></el-date-picker>
+            </el-form-item>
+            <el-form-item prop="departmentId" :label="'选择部门'">
+                <el-cascader  v-model="departmentIdArray" :options="departmentList" :placeholder="'全部部门'"
+                :props="{ checkStrictly: true,expandTrigger: 'hover' }" collapse-tags :show-all-levels="false" clearable
+                size="small" style="margin-bottom: 10px;width:180px"
+              ></el-cascader>
+            </el-form-item>
+            <el-form-item prop="departmentId" :label="'选择产品'">
+              <!-- 产品筛选 -->
+              <el-select   v-model="exportParam.productId" :placeholder="'全部产品'" clearable filterable size="small" style="width:180px">
+                <el-option v-for="(item, index) in productList" :key="index" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="exportData" style="width:100%;" :loading="listLoading">{{$t('export.export')}}</el-button>
+        </div>
+    </el-dialog>
   </div>
 </template>
   
@@ -350,6 +379,8 @@ export default {
         startDate: [{ required: true, message: "开工时间", trigger: "blur" }],
         // endDate: [{ required: true, message: "完工时间", trigger: "blur" }],
       },
+      exportDialog:false,
+      exportParam:{productId: null, rangeDatas:this.getCurrentRangeTime()},
     };
   },
   computed: {},
@@ -411,6 +442,7 @@ export default {
       let arrList = this.productList.filter(item => item.id == this.todayPlanForm.productId)
       console.log('====>', arrList)
       this.todayPlanForm.projectCode = arrList[0].code
+      this.todayPlanForm.productName = arrList[0].name
     },
     today() {
       let date = new Date();
@@ -459,6 +491,17 @@ export default {
       }
       return arr;
     },
+    // 日期
+    getCurrentRangeTime() {
+        var _this = this;
+        let yy = new Date().getFullYear();
+        let mm = new Date().getMonth()+1;
+        let dd = new Date().getDate();
+        let time1 = yy + '-' + (mm < 10 ? '0' + mm : mm) + '-' + '01'
+        let time2 = yy + '-' + (mm < 10 ? '0' + mm : mm) + '-' + (dd < 10 ? '0' + dd : dd)
+        _this.gettime = [time1 , time2];
+        return  _this.gettime
+    },
     deptSet() {
       console.log(
         this.departmentIdArray,
@@ -759,6 +802,10 @@ export default {
               steelStampNumber: JSON.stringify(steelStampNumberListArr)
             },
             (res) => {
+              this.todayPlanForm={
+                ...this.todayPlanForm,
+                steelStampNumberList:steelStampNumberListArr
+              }
               if (res.code == "ok") {
                 this.$message({
                   message:
@@ -915,8 +962,10 @@ export default {
     exportData() {
       let param = {
         planType: this.planType,
-        date: this.planDate,
-        steelStampNumber: this.steelStampNumber,
+        startDate:this.exportParam.rangeDatas[0],
+        endDate:this.exportParam.rangeDatas[1],
+        productId: this.exportParam.productId,
+        deptId: this.departmentIdArray[this.departmentIdArray.length-1]
       }
       this.http.post('/plan/exportData', param,
         res => {

+ 39 - 18
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -71,7 +71,8 @@
           <el-input v-if="ins == 2" v-model="steelNum" placeholder="请输入钢印号" @change="selcts()" size="small" style="width:140px"></el-input>
           
       </div>
-      <p  v-if="!personnelFlag" :style="`${ins == 9 ? 'width:20%' : ins == 14 ? 'width: 20%' : 'width: 10%'}`" class="tableRightBtn">
+      <!-- <p  v-if="!personnelFlag" :style="`${ins == 9 ? 'width:20%' : ins == 14 ? 'width: 20%' : 'width: 10%'}`" class="tableRightBtn"> -->
+      <p  :style="`${ins == 9 ? 'width:20%' : ins == 14 ? 'width: 20%' : 'width: 10%'}`" class="tableRightBtn">
         <el-button type="primary" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button>
       </p>
     </div>
@@ -87,7 +88,7 @@
                 <el-table-column align="center" prop="name" label="人员" min-width="100" fixed="left"></el-table-column>
                 <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :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="`${scope.row.departmentCascade== '小计' ? '' : 'colorText'}`">
+                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item,0)" :class="`${scope.row.departmentCascade== '小计' ? '' : 'colorText'}`">
                             <div v-if="items.crateDate == item">
                                <div> {{items.workTime}}分钟 </div> 
                                <div>{{items.cost}}元</div>
@@ -96,8 +97,8 @@
                     </template>
                 </el-table-column>
                 <el-table-column align="center" prop="totalResult" label="合计" min-width="150">
-                   <template slot-scope="scope">
-                    {{scope.row.totalResult}}
+                   <template slot-scope="scope" >
+                    <span :class="`${'colorText'}`" @click="showReportDetail(scope.row,item,1)">{{scope.row.totalResult}}</span>
                   </template>
                 </el-table-column>
             </el-table>
@@ -261,7 +262,7 @@
                               <div v-if="items.createDate == item">
                                   <div>{{items.procedureName}}</div>
                                   <div>{{items.workingTime}}分钟 {{items.cost}}元</div>
-                                  <div>{{items.finishNum}}件</div>
+                                  <div>{{items.finishNum}}件</div>
                               </div>
                           </div>
                       </template>
@@ -307,7 +308,7 @@
   </div>
 
   <el-dialog :title="'详情'" :visible.sync="reportDetailDialog" width="1480px">
-          <div>
+          <div> 
             日期:<el-select v-model="simpleDateChoose" placeholder="请选择" @change="getPersonWorkHoursWagesDetail(simpleDateChoose)">
                 <el-option
                   v-for="(item,index) in personWorkHoursWagesHead"
@@ -672,7 +673,8 @@ export default {
 
       sumObject: { english_achievements: 1000, math_achievements: 888 }, // 合计数据
 
-      hasMoreUserResult:""
+      hasMoreUserResult:"",
+      exportTargetUserId:null,
     };
   },
   computed: {},
@@ -745,14 +747,14 @@ export default {
       this.taskName=item.taskName
       this.getPlanDetail(item);
     },
-    showReportDetail(row,item){
+    showReportDetail(row,item,viewAll){
       if(row.departmentCascade=='小计'){
           return
       }
       console.log(item)
       this.reportDetailDialog=true
       this.detailUserId=row.id
-      this.getPersonWorkHoursWagesDetail(item)
+      this.getPersonWorkHoursWagesDetail(item,viewAll)
     },
     authorityToJudge() {
     //   if(this.permissions.reportProject || this.permissions.reportAllProject) {this.ssl(0);this.defaultActive = '1-1';return} else
@@ -900,7 +902,7 @@ export default {
           if (res.code == "ok") {
             this.personWorkHoursWagesList=res.data.records
             this.personWorkHoursWagesHead=res.data.header
-            this.simpleDateChoose=this.personWorkHoursWagesHead[0]
+            // this.simpleDateChoose=this.personWorkHoursWagesHead[0]
             this.total=res.data.total
             this.plondelas++
           } else {
@@ -918,13 +920,26 @@ export default {
         });
     },
     //点击详情(人员工时工价表)
-    getPersonWorkHoursWagesDetail(item){
-      this.simpleDateChoose=item
+    getPersonWorkHoursWagesDetail(item,viewAll){
       this.listLoading=true
-      this.http.post( "/report/getPersonWorkHoursWagesDetail", {
+      let param={
+        userId:this.detailUserId
+      }
+      if(viewAll==1){
+        this.simpleDateChoose=''
+        param={
+          ...param,
+          startDate:this.rangeDatas[0],
+          endDate:this.rangeDatas[1]
+        }
+      }else{
+        this.simpleDateChoose=item
+        param={
+          ...param,
           date: this.simpleDateChoose.substring(0,4)+"-"+this.simpleDateChoose.substring(4,6)+"-"+this.simpleDateChoose.substring(6,this.simpleDateChoose.length),
-          userId:this.detailUserId
-      },
+        }
+      }
+      this.http.post( "/report/getPersonWorkHoursWagesDetail", param,
       res => {
         if (res.code == "ok") {
           this.personWorkHoursWagesDetail=res.data.record
@@ -1129,6 +1144,7 @@ export default {
     },
     //获取人员填报数据
     getPlanDataWithUserId(userId){
+      this.exportTargetUserId=userId;
       this.listLoading=true
         this.http.post( "/report/getPlanDataWithUserId", {
             startDate:this.rangeDatas[0],
@@ -1358,13 +1374,18 @@ export default {
     }
     else if (this.ins == 6) {
         fName = '车间工位计划表_' + '.xlsx';
-        url += "/exportPlanDataWithStation";
         sl.startDate=this.rangeDatas[0];
         sl.endDate=this.rangeDatas[1];
-        sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
-        if(this.exportDeptId){
+        if(!this.personnelFlag){
+          url += "/exportPlanDataWithStation";
+          sl.deptId=this.departmentIdArray[this.departmentIdArray.length-1];
+          if(this.exportDeptId){
           sl.filterDeptId=this.exportDeptId;
           sl.isFilterDept=1
+          }
+        }else{
+          url += "/exportPlanDataWithUserId";
+          sl.userId=this.exportTargetUserId
         }
     }
         this.http.post(url, sl,