Min 11 달 전
부모
커밋
3bb31fcd52

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -4045,4 +4045,22 @@ public class WeiXinCorpController {
         }
         return msg;
     }
+
+
+    @RequestMapping("/testGetApprovalList")
+    public HttpRespMsg testGetApprovalList(String startDate,String endDate) throws Exception {
+        HttpRespMsg msg=new HttpRespMsg();
+        JSONArray jsonArrayFilter = new JSONArray();
+        JSONObject filter1 = new JSONObject();
+        filter1.put("key","record_type");
+        filter1.put("value",1);
+        jsonArrayFilter.add(filter1);
+        JSONObject filter2 = new JSONObject();
+        filter2.put("key","sp_status ");
+        filter2.put("value",2);
+        jsonArrayFilter.add(filter2);
+        JSONArray approvalInfo = wxCorpInfoService.getApprovalInfo(7, startDate, endDate, "", jsonArrayFilter);
+        msg.setData(approvalInfo.toArray());
+        return msg;
+    }
 }

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -1,5 +1,6 @@
 package com.management.platform.service;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.LeaveSheet;
@@ -81,5 +82,7 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
 
     public String getTemplateDetail(Integer companyId) throws Exception;
 
-    public String applyEvent(HttpServletRequest request,JSONObject data) throws Exception;
+    JSONArray getApprovalInfo(Integer companyId, String startDate, String endDate, String newCursor, JSONArray filterArray) throws Exception;
+
+    public String applyEvent(HttpServletRequest request, JSONObject data) throws Exception;
 }

+ 51 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -89,6 +89,12 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     //提交审批至企业微信
     public static final String APPLY_EVENT = "https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=ACCESS_TOKEN";
 
+    //批量获取企业审批单号
+    public static final String BATCH_GET_APPROVAL_INFO = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
+
+    //获取审批申请详情
+    public static final String GET_APPROVAL_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
+
 
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
@@ -2405,6 +2411,51 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return null;
     }
 
+    /**
+     * 批量获取审批单号
+     * PS:Integer recordType 1-请假;2-打卡补卡;3-出差;4-外出;5-加班; 6- 调班;7-会议室预定;8-退款审批;9-红包报销审批
+     *    Integer sp_status 1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
+     * */
+    @Override
+    public JSONArray getApprovalInfo(Integer companyId, String startDate, String endDate, String newCursor, JSONArray filterArray) throws Exception {
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime startDateTime = LocalDate.parse(startDate, df).atTime(LocalTime.MIN);
+        LocalDateTime endDateTime = LocalDate.parse(endDate, df).atTime(LocalTime.MAX);
+        long startTime = startDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
+                LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        long endTime = endDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
+                LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        String url=BATCH_GET_APPROVAL_INFO.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("starttime",startTime);
+        requestMap.put("endtime",endTime);
+        requestMap.put("new_cursor",newCursor);
+        requestMap.put("size",100);
+        requestMap.put("filters",filterArray);
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            JSONArray jsonArray=new JSONArray();
+            String resp = ResponseEntity.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(resp);
+            JSONArray sp_no_list = jsonObject.getJSONArray("sp_no_list");
+            jsonArray.addAll(sp_no_list);
+            if(jsonObject.containsKey("new_next_cursor")){
+                String new_next_cursor = jsonObject.getString("new_next_cursor");
+                JSONArray approvalInfo = getApprovalInfo(companyId, startDate, endDate, new_next_cursor, filterArray);
+                jsonArray.addAll(approvalInfo);
+            }
+            return jsonArray;
+        }
+        return null;
+    }
+
     /**
      * 提交审批到企业微信
      * */

+ 19 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpInfoController.java

@@ -79,5 +79,24 @@ public class WxCorpInfoController {
     public HttpRespMsg batchTransferLicense(HttpServletRequest request,String handoverId,String takeoverId) throws Exception {
         return wxCorpInfoService.batchTransferLicense(request,handoverId,takeoverId);
     }
+
+
+
+    @RequestMapping("/testGetApprovalList")
+    public HttpRespMsg testGetApprovalList(String startDate,String endDate) throws Exception {
+        HttpRespMsg msg=new HttpRespMsg();
+        JSONArray jsonArrayFilter = new JSONArray();
+        JSONObject filter1 = new JSONObject();
+        filter1.put("key","record_type");
+        filter1.put("value",1);
+        jsonArrayFilter.add(filter1);
+        JSONObject filter2 = new JSONObject();
+        filter2.put("key","sp_status ");
+        filter2.put("value",2);
+        jsonArrayFilter.add(filter2);
+        JSONArray approvalInfo = wxCorpInfoService.getApprovalInfo(7, startDate, endDate, "", jsonArrayFilter);
+        msg.setData(approvalInfo.toArray());
+        return msg;
+    }
 }
 

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

@@ -91,6 +91,9 @@ public class ProdProcedureTeam extends Model<ProdProcedureTeam> {
     @TableField(exist = false)
     private User user;
 
+    @TableField(exist = false)
+    private String planProcedureIds;
+
     /**
      * 是否为更换人员动作
      */

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -1,5 +1,6 @@
 package com.management.platform.service;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.User;
@@ -79,4 +80,8 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
      * @throws Exception
      */
     public String getCorpAgentAccessToken(WxCorpInfo corpInfo) throws Exception;
+
+    JSONArray getApprovalInfo(Integer companyId, String startDate, String endDate,String newCursor, JSONArray jsonArrayFilter) throws Exception;
+
+    String getApprovalInfoDetail(Integer companyId, String spNo) throws Exception;
 }

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

@@ -4112,83 +4112,126 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
 //        totalUser.setPersonWorkHoursWages(totalList);
         personWorkHoursWagesList.addAll(totalList);
-        //获取所有人员在指定日期的分配数据
-        List<ProdProcedureTeam> prodProcedureTeamList = prodProcedureTeamMapper.selectList(new QueryWrapper<ProdProcedureTeam>().select("SUM(work_time) AS workTime,SUM(job_of_money) AS jobOfMoney,user_id as userId,distribute_date as distributeDate").between("distribute_date", startDate, endDate).groupBy("user_id,distribute_date"));
-        userList.forEach(u->{
+        //日期范围内所有分配数据
+        List<ProdProcedureTeam> allProcedureTeamList = prodProcedureTeamMapper.selectList(new LambdaQueryWrapper<ProdProcedureTeam>().between(ProdProcedureTeam::getDistributeDate, startDate, endDate));
+        //日期范围内所有派工数据
+        List<Integer> ids = allProcedureTeamList.stream().map(ProdProcedureTeam::getPlanProcedureId).distinct().collect(Collectors.toList());
+        List<PlanProcedureTotal> planProcedureTotalList = planProcedureTotalMapper.selectList(new LambdaQueryWrapper<PlanProcedureTotal>().in(PlanProcedureTotal::getId, ids));
+        for (User u : userList) {
             List<Map<String, Object>> mapList = personWorkHoursWagesList.stream().filter(pl -> String.valueOf(pl.get("userId")).equals(u.getId())).collect(Collectors.toList());
             for (String date : dataStringList) {
-                Optional<ProdProcedureTeam> first = prodProcedureTeamList.stream().filter(p -> p.getUserId().equals(u.getId()) && p.getDistributeDate().format(dtf1).equals(date)).findFirst();
+                List<ProdProcedureTeam> targetTeams = allProcedureTeamList.stream().filter(a -> a.getDistributeDate().format(dtf1).equals(date) && u.getId().equals(a.getUserId())).collect(Collectors.toList());
+                //找到当前人员分组的
                 Optional<Map<String, Object>> createDateValue = mapList.stream().filter(m -> String.valueOf(m.get("crateDate")).equals(date)).findFirst();
-                if(createDateValue.isPresent()){
+                if (createDateValue.isPresent()) {
                     Map<String, Object> map = createDateValue.get();
-                    if(first.isPresent()){
-                        map.put("planCost",first.get().getJobOfMoney());
-                        map.put("planWorkTime",first.get().getWorkTime());
-                        BigDecimal decimalCost = new BigDecimal(String.valueOf(first.get().getJobOfMoney()));
-                        decimalCost=decimalCost.subtract(new BigDecimal(String.valueOf(map.get("cost")))).setScale(1,RoundingMode.HALF_UP);
-                        if(decimalCost.doubleValue()<0){
-                            decimalCost=new BigDecimal(0);
+                    if (targetTeams.size() > 0) {
+                        //计算本人被分配数据
+                        double workTime = targetTeams.stream().mapToDouble(ProdProcedureTeam::getWorkTime).sum();
+                        double cost = targetTeams.stream().mapToDouble(i -> i.getJobOfMoney().doubleValue()).sum();
+                        map.put("planCost", String.format("%.2f", cost));
+                        map.put("planWorkTime", String.format("%.2f", workTime));
+                        List<Integer> totalIds = targetTeams.stream().map(ProdProcedureTeam::getPlanProcedureId).distinct().collect(Collectors.toList());
+                        //获取与本人分配相关的所有派工数据
+                        List<PlanProcedureTotal> targetPlanTotals = planProcedureTotalList.stream().filter(p -> totalIds.contains(p.getId())).collect(Collectors.toList());
+                        BigDecimal lastWorkTime = new BigDecimal(0);
+                        BigDecimal lastCost = new BigDecimal(0);
+                        for (PlanProcedureTotal targetPlanTotal : targetPlanTotals) {
+                            //不同的分配数据对应派工数据不同 需要分开计算
+                            //分别计算每个派工单的已填报和总预算
+                            List<ProdProcedureTeam> teamList = allProcedureTeamList.stream().filter(a -> targetPlanTotal.getId().equals(a.getPlanProcedureId())).collect(Collectors.toList());
+                            List<String> teamIds = teamList.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.toList());
+                            //获当前分配日期下的所分配人员工时成本总和
+                            double totalWorkingHours = targetPlanTotal.getTotalWorkingHours();
+                            double totalWages = targetPlanTotal.getTotalWages();
+                            //获当前分配日期下的所填报人员工时成本总和
+                            double workTimeSum = targetPlanTotal.getTotalFillTime();
+                            BigDecimal decimal = new BigDecimal(targetPlanTotal.getTotalProgress());
+                            decimal = decimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                            BigDecimal costSum = new BigDecimal(targetPlanTotal.getTotalWages());
+                            costSum = costSum.multiply(decimal).setScale(1, RoundingMode.HALF_UP);
+
+                            BigDecimal decimalCost = new BigDecimal(totalWages);
+                            decimalCost = decimalCost.subtract(costSum).setScale(1, RoundingMode.HALF_UP);
+                            BigDecimal decimalWorkTime = new BigDecimal(totalWorkingHours);
+                            decimalWorkTime = decimalWorkTime.subtract(new BigDecimal(workTimeSum)).setScale(1, RoundingMode.HALF_UP);
+                            //根据分配人数重新计算平均值
+                            decimalCost = decimalCost.divide(new BigDecimal(teamIds.size()), 1, RoundingMode.HALF_UP);
+                            decimalWorkTime = decimalWorkTime.divide(new BigDecimal(teamIds.size()), 1, RoundingMode.HALF_UP);
+                            lastWorkTime=lastWorkTime.add(decimalWorkTime);
+                            lastCost=lastCost.add(decimalCost);
                         }
-                        BigDecimal decimalWorkTime = new BigDecimal(String.valueOf(first.get().getWorkTime()));
-                        decimalWorkTime=decimalWorkTime.subtract(new BigDecimal(String.valueOf(map.get("workTime")))).setScale(1,RoundingMode.HALF_UP);
-                        if(decimalWorkTime.doubleValue()<0){
-                            decimalWorkTime=new BigDecimal(0);
+                        if (lastWorkTime.doubleValue() >0 && lastCost.doubleValue() > 0) {
+                            map.put("surplusCost", lastCost.doubleValue());
+                            map.put("surplusTime", lastWorkTime.doubleValue());
                         }
-                        map.put("surplusCost",decimalCost.doubleValue());
-                        map.put("surplusTime",decimalWorkTime.doubleValue());
-                    }else {
-                        map.put("planCost",0);
-                        map.put("planWorkTime",0);
-                        map.put("surplusCost",0);
-                        map.put("surplusTime",0);
                     }
-                }else {
-                    Map map=new HashMap();
-                    map.put("crateDate",date);
-                    map.put("cost",0);
-                    map.put("workTime",0);
-                    map.put("departmentName",u.getDepartmentName());
-                    if(first.isPresent()){
-                        map.put("planCost",first.get().getJobOfMoney());
-                        map.put("planWorkTime",first.get().getWorkTime());
-                        BigDecimal decimalCost = new BigDecimal(String.valueOf(first.get().getJobOfMoney()));
-                        decimalCost=decimalCost.subtract(new BigDecimal(String.valueOf(map.get("cost")))).setScale(1,RoundingMode.HALF_UP);
-                        if(decimalCost.doubleValue()<0){
-                            decimalCost=new BigDecimal(0);
+                } else {
+                    Map map = new HashMap();
+                    map.put("crateDate", date);
+                    map.put("cost", 0);
+                    map.put("workTime", 0);
+                    map.put("departmentName", u.getDepartmentName());
+                    if (targetTeams.size() > 0) {
+                        double workTime = targetTeams.stream().mapToDouble(ProdProcedureTeam::getWorkTime).sum();
+                        double cost = targetTeams.stream().mapToDouble(i -> i.getJobOfMoney().doubleValue()).sum();
+                        map.put("planCost", String.format("%.2f", cost));
+                        map.put("planWorkTime", String.format("%.2f", workTime));
+                        List<Integer> totalIds = targetTeams.stream().map(ProdProcedureTeam::getPlanProcedureId).distinct().collect(Collectors.toList());
+                        //获取与本人分配相关的所有派工数据
+                        List<PlanProcedureTotal> targetPlanTotals = planProcedureTotalList.stream().filter(p -> totalIds.contains(p.getId())).collect(Collectors.toList());
+                        BigDecimal lastWorkTime = new BigDecimal(0);
+                        BigDecimal lastCost = new BigDecimal(0);
+                        for (PlanProcedureTotal targetPlanTotal : targetPlanTotals) {
+                            //不同的分配数据对应派工数据不同 需要分开计算
+                            //分别计算每个派工单的已填报和总预算
+                            List<ProdProcedureTeam> teamList = allProcedureTeamList.stream().filter(a -> targetPlanTotal.getId().equals(a.getPlanProcedureId())).collect(Collectors.toList());
+                            List<String> teamIds = teamList.stream().map(ProdProcedureTeam::getUserId).distinct().collect(Collectors.toList());
+                            //获当前分配日期下的所分配人员工时成本总和
+                            double totalWorkingHours = targetPlanTotal.getTotalWorkingHours();
+                            double totalWages = targetPlanTotal.getTotalWages();
+                            //获当前分配日期下的所填报人员工时成本总和
+                            double workTimeSum = targetPlanTotal.getTotalFillTime();
+                            BigDecimal decimal = new BigDecimal(targetPlanTotal.getTotalProgress());
+                            decimal = decimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                            BigDecimal costSum = new BigDecimal(targetPlanTotal.getTotalWages());
+                            costSum = costSum.multiply(decimal).setScale(1, RoundingMode.HALF_UP);
+
+                            BigDecimal decimalCost = new BigDecimal(totalWages);
+                            decimalCost = decimalCost.subtract(costSum).setScale(1, RoundingMode.HALF_UP);
+                            BigDecimal decimalWorkTime = new BigDecimal(totalWorkingHours);
+                            decimalWorkTime = decimalWorkTime.subtract(new BigDecimal(workTimeSum)).setScale(1, RoundingMode.HALF_UP);
+                            //根据分配人数重新计算平均值
+                            decimalCost = decimalCost.divide(new BigDecimal(teamIds.size()), 1, RoundingMode.HALF_UP);
+                            decimalWorkTime = decimalWorkTime.divide(new BigDecimal(teamIds.size()), 1, RoundingMode.HALF_UP);
+                            lastWorkTime=lastWorkTime.add(decimalWorkTime);
+                            lastCost=lastCost.add(decimalCost);
                         }
-                        BigDecimal decimalWorkTime = new BigDecimal(String.valueOf(first.get().getWorkTime()));
-                        decimalWorkTime=decimalWorkTime.subtract(new BigDecimal(String.valueOf(map.get("workTime")))).setScale(1,RoundingMode.HALF_UP);
-                        if(decimalWorkTime.doubleValue()<0){
-                            decimalWorkTime=new BigDecimal(0);
+                        if (lastWorkTime.doubleValue() >0 && lastCost.doubleValue() > 0) {
+                            map.put("surplusCost", lastCost.doubleValue());
+                            map.put("surplusTime", lastWorkTime.doubleValue());
                         }
-                        map.put("surplusCost",decimalCost.doubleValue());
-                        map.put("surplusTime",decimalWorkTime.doubleValue());
-                    }else {
-                        map.put("planCost",0);
-                        map.put("planWorkTime",0);
-                        map.put("surplusCost",0);
-                        map.put("surplusTime",0);
                     }
-                    map.put("userId",u.getId());
-                    map.put("userName",u.getName());
+                    map.put("userId", u.getId());
+                    map.put("userName", u.getName());
                     mapList.add(map);
                 }
             }
             u.setPersonWorkHoursWages(mapList);
-            u.setDepartmentCascade(u.getId().equals("0")?"小计":convertDepartmentIdToCascade(u.getDepartmentId(),departmentList));
+            u.setDepartmentCascade(u.getId().equals("0") ? "小计" : convertDepartmentIdToCascade(u.getDepartmentId(), departmentList));
             double workTime = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("workTime")))).sum();
-            BigDecimal bigDecimal=new BigDecimal(workTime);
+            BigDecimal bigDecimal = new BigDecimal(workTime);
             double cost = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("cost")))).sum();
-            double planWorkTime = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("planWorkTime")))).sum();
-            BigDecimal planBigDecimal=new BigDecimal(planWorkTime);
-            double planCost = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("planCost")))).sum();
-            double surplusWorkTime = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusTime")))).sum();
-            BigDecimal surplusBigDecimal=new BigDecimal(surplusWorkTime);
-            double surplusCost = mapList.stream().mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusCost")))).sum();
-            u.setTotalResult(String.valueOf(bigDecimal.doubleValue())+"分钟 "+String.format("%.2f",cost)+"元");
-            u.setTotalPlanResult(String.valueOf(planBigDecimal.doubleValue())+"分钟 "+String.format("%.2f",planCost)+"元");
-            u.setTotalSurplusResult(String.valueOf(surplusBigDecimal.doubleValue())+"分钟 "+String.format("%.2f",surplusCost)+"元");
-        });
+            double planWorkTime = mapList.stream().filter(mt -> mt.get("planWorkTime") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("planWorkTime")))).sum();
+            BigDecimal planBigDecimal = new BigDecimal(planWorkTime);
+            double planCost = mapList.stream().filter(mt -> mt.get("planCost") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("planCost")))).sum();
+            double surplusWorkTime = mapList.stream().filter(mt -> mt.get("surplusTime") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusTime")))).sum();
+            BigDecimal surplusBigDecimal = new BigDecimal(surplusWorkTime);
+            double surplusCost = mapList.stream().filter(mt -> mt.get("surplusCost") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusCost")))).sum();
+            u.setTotalResult(String.valueOf(bigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", cost) + "元");
+            u.setTotalPlanResult(String.valueOf(planBigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", planCost) + "元");
+            u.setTotalSurplusResult(String.valueOf(surplusBigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", surplusCost) + "元");
+        }
         resultMap.put("total",userIPage.getTotal());
         resultMap.put("records",userList);
         httpRespMsg.setData(resultMap);

+ 76 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -76,6 +76,13 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     public static final String GET_CORP_TOKEN = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET";
 
 
+    //批量获取企业审批单号
+    public static final String BATCH_GET_APPROVAL_INFO = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
+
+    //获取审批申请详情
+    public static final String GET_APPROVAL_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
+
+
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
     public static final int TEXT_CARD_MSG_BUSTRIP_DENY = 2;//出差审核驳回
@@ -1980,4 +1987,73 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return msg;
     }
 
+
+
+    /**
+     * 批量获取审批单号
+     * PS:Integer recordType 1-请假;2-打卡补卡;3-出差;4-外出;5-加班; 6- 调班;7-会议室预定;8-退款审批;9-红包报销审批
+     *    Integer sp_status 1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
+     * */
+    @Override
+    public JSONArray getApprovalInfo(Integer companyId, String startDate, String endDate, String newCursor, JSONArray filterArray) throws Exception {
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime startDateTime = LocalDate.parse(startDate, df).atTime(LocalTime.MIN);
+        LocalDateTime endDateTime = LocalDate.parse(endDate, df).atTime(LocalTime.MAX);
+        long startTime = startDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
+                LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        long endTime = endDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
+                LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        String url=BATCH_GET_APPROVAL_INFO.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("starttime",startTime);
+        requestMap.put("endtime",endTime);
+        requestMap.put("new_cursor",newCursor);
+        requestMap.put("size",100);
+        requestMap.put("filters",filterArray);
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            JSONArray jsonArray=new JSONArray();
+            String resp = ResponseEntity.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(resp);
+            JSONArray sp_no_list = jsonObject.getJSONArray("sp_no_list");
+            jsonArray.addAll(sp_no_list);
+            if(jsonObject.containsKey("new_next_cursor")){
+                String new_next_cursor = jsonObject.getString("new_next_cursor");
+                JSONArray approvalInfo = getApprovalInfo(companyId, startDate, endDate, new_next_cursor, filterArray);
+                jsonArray.addAll(approvalInfo);
+            }
+            return jsonArray;
+        }
+        return null;
+    }
+
+
+    @Override
+    public String getApprovalInfoDetail(Integer companyId,String spNo) throws Exception {
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        String url=GET_APPROVAL_DETAIL.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("sp_no",spNo);
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = ResponseEntity.getBody();
+            return resp;
+        }
+        return null;
+    }
+
+
 }

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

@@ -90,19 +90,19 @@
                     <template slot-scope="scope">
                         <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  style="color: black;">{{items.planWorkTime}}分钟  {{items.planCost}}元</div>
-                               <div> {{items.workTime}}分钟  {{items.cost}}元</div> 
-                               <div style="color: red;">{{items.surplusTime}}分钟  {{items.surplusCost}}元</div>
+                              <div  style="color: black;" v-if="items.planWorkTime">平均 {{items.planWorkTime}}分钟  {{items.planCost}}元</div>
+                               <div>已填 {{items.workTime}}分钟  {{items.cost}}元</div> 
+                               <div style="color: red;" v-if="items.surplusTime">剩余 {{items.surplusTime}}分钟  {{items.surplusCost}}元</div>
                             </div>
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column align="center" prop="totalResult" label="合计" min-width="150">
+                <el-table-column align="center" prop="totalResult" label="合计" min-width="180">
                    <template slot-scope="scope" >
                     <div @click="showReportDetail(scope.row,item,1)">
-                      <div  style="color: black;">{{scope.row.totalPlanResult}}</div>
-                      <div style="color: #02a7f0;"  @click="showReportDetail(scope.row,item,1)"> {{scope.row.totalResult}}</div> 
-                      <div style="color: red;">{{scope.row.totalSurplusResult}}</div>
+                      <div  style="color: black;">平均 {{scope.row.totalPlanResult}}</div>
+                      <div style="color: #02a7f0;"  @click="showReportDetail(scope.row,item,1)">已填 {{scope.row.totalResult}}</div> 
+                      <div style="color: red;">剩余 {{scope.row.totalSurplusResult}}</div>
                     </div>
                   </template>
                 </el-table-column>