Browse Source

公出月份统计

anderx 9 months ago
parent
commit
2819476e03

+ 7 - 0
src/main/java/com/goafanti/admin/bo/AdminPublicDuration.java

@@ -1,16 +1,23 @@
 package com.goafanti.admin.bo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.goafanti.common.constant.AFTConstants;
+import com.goafanti.common.utils.excel.Excel;
 
 import java.util.Date;
 
 public class AdminPublicDuration {
 
     private String id;
+    @Excel(name = "姓名")
     private String name;
+    @Excel(name = "时长")
     private Double duration;
+    @Excel(name = "日期", dateFormat = AFTConstants.YYYYMMDD)
     private Date date;
+    @Excel(name = "天数")
     private Integer countNumber;
+    @Excel(name = "平均天数")
     private double days;
 
     public Integer getCountNumber() {

+ 33 - 1
src/main/java/com/goafanti/admin/controller/AdminStatisticsController.java

@@ -1,14 +1,20 @@
 package com.goafanti.admin.controller;
 
+import com.goafanti.admin.bo.AdminPublicDuration;
 import com.goafanti.admin.service.AdminStatisticsService;
 import com.goafanti.common.bo.Result;
 import com.goafanti.common.controller.CertifyApiController;
+import com.goafanti.common.utils.excel.NewExcelUtil;
 import com.goafanti.core.shiro.token.TokenManager;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
+import java.util.List;
+import java.util.Map;
+
 @Controller
 @RequestMapping(value = "/api/admin/statistics")
 public class AdminStatisticsController extends CertifyApiController {
@@ -16,6 +22,9 @@ public class AdminStatisticsController extends CertifyApiController {
     @Autowired
     private AdminStatisticsService adminStatisticsService;
 
+    @Value(value = "${upload.path}")
+    private final String	uploadPath			= null;
+
     /**
      * 营销首页信息
      * @param startTime  开始时间
@@ -125,7 +134,30 @@ public class AdminStatisticsController extends CertifyApiController {
     @RequestMapping(value = "/month/data", method = RequestMethod.GET)
     public Result monthData(String date) {
         Result res =new Result();
-        res.setData(adminStatisticsService.monthData(date));
+        Map<String, Object> map = adminStatisticsService.monthData(date);
+        res.setData(map);
+        return res;
+    }
+
+
+    /**
+     * 统计月份打卡数据
+     */
+    @RequestMapping(value = "/month/data/export", method = RequestMethod.GET)
+    public Result monthDataExport(String date,Integer type) {
+        Result res =new Result();
+        NewExcelUtil<AdminPublicDuration> newExcelUtil=new NewExcelUtil<>(AdminPublicDuration.class);
+        Map<String, Object> map = adminStatisticsService.monthData(date);
+        List<AdminPublicDuration> o;
+        String sheetName;
+        if (type==null||type==1){
+            sheetName="统计月份打卡数据(详情)";
+            o = (List<AdminPublicDuration>) map.get("date");
+        }else {
+            sheetName="统计月份打卡数据(总计)";
+            o = (List<AdminPublicDuration>) map.get("count");
+        }
+        newExcelUtil.exportExcel(o,sheetName,uploadPath);
         return res;
     }
 

+ 40 - 10
src/main/java/com/goafanti/admin/service/impl/AdminStatisticsServiceImpl.java

@@ -539,10 +539,13 @@ public class AdminStatisticsServiceImpl implements AdminStatisticsService {
     public Map<String,Object>  monthData(String  dateStr) {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate localDate =LocalDate.parse(dateStr,formatter);
-        LocalDate newDate = localDate.plusMonths(1);
-        List<PublicRelease> publicReleases = publicReleaseMapper.selectByMonth(localDate, newDate);
+        LocalDate endDate = localDate.plusMonths(1);
+        List<PublicRelease> publicReleases = publicReleaseMapper.selectByMonth(localDate, endDate,null);
+        List<PublicRelease> publicReleases2 = publicReleaseMapper.selectByMonth(localDate, endDate,1);
         List<AdminPublicDuration> list=new ArrayList<>();
+        List<String> errors=new ArrayList<>();
         for (PublicRelease e : publicReleases) {
+            String adminName = getAdminName(e.getAid());
             //计算时间差,再加一天就是一共多少天
             long daysBetween = DateUtils.getDaysBetween(e.getReleaseStart(), e.getReleaseEnd());
             daysBetween+=1;
@@ -551,22 +554,48 @@ public class AdminStatisticsServiceImpl implements AdminStatisticsService {
                 a.setId(e.getAid());
                 a.setDate(e.getReleaseStart());
                 a.setDuration(e.getDuration());
-
-                a.setName(getAdminName(e.getAid()));
+                a.setName(adminName);
                 list.add(a);
             }else if(daysBetween>0){
                 double v = e.getDuration() / daysBetween;
                 for (int i = 0; i < daysBetween; i++) {
-                    AdminPublicDuration a = new AdminPublicDuration();
-                    a.setId(e.getAid());
                     LocalDate localDate1 = e.getReleaseStart().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(i);
-                    a.setDate(Date.from(localDate1.atStartOfDay(ZoneId.systemDefault()).toInstant()));
-                    a.setDuration(v);
-                    a.setName(getAdminName(e.getAid()));
-                    list.add(a);
+                    if (localDate1.isBefore(endDate)){
+                        AdminPublicDuration a = new AdminPublicDuration();
+                        a.setId(e.getAid());
+                        a.setDate(Date.from(localDate1.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+                        a.setDuration(v);
+                        a.setName(adminName);
+                        list.add(a);
+                    }else{
+                        errors.add(String.format("用户[%s]公出时间[%s]超出[%s],不计入本月公出",adminName,localDate1.format(formatter),endDate.format(formatter)));
+                    }
+
                 }
             }
         }
+        for (PublicRelease e : publicReleases2) {
+            String adminName = getAdminName(e.getAid());
+            long daysBetween = DateUtils.getDaysBetween(e.getReleaseStart(), e.getReleaseEnd());
+            if(daysBetween>0){
+                double v = e.getDuration() / daysBetween;
+                for (int i = 0; i < daysBetween; i++) {
+                    LocalDate localDate1 = e.getReleaseStart().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(i);
+                    if (localDate1.isAfter(localDate)){
+                        AdminPublicDuration a = new AdminPublicDuration();
+                        a.setId(e.getAid());
+                        a.setDate(Date.from(localDate1.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+                        a.setDuration(v);
+                        a.setName(adminName);
+                        list.add(a);
+                    }else{
+                        errors.add(String.format("用户[%s]公出时间[%s]小于[%s],不计入本月公出",adminName,localDate1.format(formatter),endDate.format(formatter)));
+                    }
+
+                }
+            }
+
+        }
         //将数据统计到人
         Map<String, BigDecimal> durationMap = new HashMap<>();
         Map<String, String> nameMap = new HashMap<>();
@@ -590,6 +619,7 @@ public class AdminStatisticsServiceImpl implements AdminStatisticsService {
         Map<String,Object> map=new HashMap<>();
         map.put("date",list);
         map.put("count",list2);
+        map.put("errors",errors);
         return map;
     }
 

+ 8 - 1
src/main/java/com/goafanti/common/dao/PublicReleaseMapper.java

@@ -150,6 +150,13 @@ public interface PublicReleaseMapper {
 
     List<MyUserDetailsBo> selectCountByUid(String id);
 
-    List<PublicRelease> selectByMonth(@Param("start") LocalDate start, @Param("end") LocalDate end);
+    /**
+     * 获取时间内打卡数据,主要用于获取月份
+     * @param start 开始时间
+     * @param end  结束时间
+     * @param type null =获取发起时间在时间段内,1=获取发起时间不在时间段内,但结束时间在的
+     * @return
+     */
+    List<PublicRelease> selectByMonth(@Param("start") LocalDate start, @Param("end") LocalDate end, @Param("type") Integer type);
 }
 

+ 6 - 1
src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml

@@ -1234,7 +1234,12 @@
         select
         <include refid="PublicReleaseAllSql"/>
         from public_release where status in (2) and clock_in=1
-        and (release_start &gt; #{start} and release_start &lt; #{end})
+        <if test="type==null">
+            and (release_start &gt; #{start} and release_start &lt; #{end})
+        </if>
+        <if test="type==1">
+            and (release_start &lt; #{start} and release_end &gt; #{start})
+        </if>
     </select>