Prechádzať zdrojové kódy

Merge branch 'wanghaicheng' of lift-manager/lift-server into develop

wanghaicheng 5 rokov pred
rodič
commit
4030dbc064

+ 5 - 2
lift-business-service/src/main/java/cn/com/ty/lift/business/maintenance/controller/MaintenanceRecordController.java

@@ -164,10 +164,13 @@ public class MaintenanceRecordController {
 
     private MtRecordResponse getMtRecordResponse(@RequestBody @Val MtRecordRequest request) {
         MtRecordResponse entity = maintenanceRecordService.infoById(request);
-        String repairDuration = maintenanceRecordService.getRepairDuration(entity.getRepairDiff());
+        String repairDuration = "";
+        if (entity.getRepairDiff() != null) {
+            repairDuration = maintenanceRecordService.getRepairDuration(entity.getRepairDiff());
+        }
         entity.setRepairDuration(repairDuration);
         Validate.notNull(entity, ValuePool.MAINTENANCE_RECORD_NOT_EXIST);
-        /**
+        /*
          * 维保项id:0/1/2, 0:无需保养,1:已保养,2:需要更换
          * 保养项目  用键值对的方式存储,如(1:0,2:1,3:1...)
          */

+ 1 - 1
lift-business-service/src/main/java/cn/com/ty/lift/business/maintenance/dao/entity/model/response/MtRecordResponse.java

@@ -72,7 +72,7 @@ public class MtRecordResponse extends MaintenanceRecord {
     /**
      * 保养时长分钟数
      */
-    private int repairDiff;
+    private Integer repairDiff;
 
     private String repairDuration;
 

+ 15 - 5
lift-business-service/src/main/java/cn/com/ty/lift/business/maintenance/service/MaintenanceRecordService.java

@@ -584,8 +584,12 @@ public class MaintenanceRecordService extends ServiceImpl<MaintenanceRecordMappe
         if (CollUtil.isNotEmpty(page.getRecords())) {
             List<MtRecordResponse> records = page.getRecords();
             for (MtRecordResponse mtRecord : records) {
-                String repairDuration = getRepairDuration(mtRecord.getRepairDiff());
-                mtRecord.setRepairDuration(repairDuration);
+                if (mtRecord.getRepairDiff() != null) {
+                    String repairDuration = getRepairDuration(mtRecord.getRepairDiff());
+                    mtRecord.setRepairDuration(repairDuration);
+                } else {
+                    mtRecord.setRepairDuration("");
+                }
             }
         }
         return page;
@@ -905,10 +909,13 @@ public class MaintenanceRecordService extends ServiceImpl<MaintenanceRecordMappe
                 //处理文件夹路径
                 String projectName = mtRecordResponse.getProjectName();
                 String registrationCode = mtRecordResponse.getRegistrationCode();
+                String useCompanyCode = mtRecordResponse.getUseCompanyCode();
                 projectName = StrUtil.isNotEmpty(projectName) ? projectName.replace(illegalChars, "-") : "[项目]";
                 registrationCode = StrUtil.isNotEmpty(registrationCode) ? registrationCode.replace(illegalChars, "-") : "[电梯注册代码]";
+                useCompanyCode = useCompanyCode != null ? useCompanyCode : "";
                 //保养单及图片文件夹 dir/i.ProjectName-RegistrationCode/
-                String imgDir = StrUtil.format("{}{}{}.{}-{}{}", dir, File.separator, (i + 1), projectName, registrationCode, File.separator);
+                String imgDir = StrUtil.format("{}{}{}.{}-{}-", dir, File.separator, (i + 1), projectName, registrationCode);
+                imgDir += useCompanyCode + File.separator;
                 //生成维保图片
                 List<MtRecordImg> mtRecordImgs = mtRecordResponse.getMtRecordImgs();
                 List<MtRecordImg> imgs = mtRecordImgs.stream().filter(img -> mtRecordResponse.getId().equals(img.getMtRecordId())).collect(Collectors.toList());
@@ -947,8 +954,11 @@ public class MaintenanceRecordService extends ServiceImpl<MaintenanceRecordMappe
         if (entity == null) {
             throw new ValidateException("维保记录不存在");
         }
-        String repairDuration = this.getRepairDuration(entity.getRepairDiff());
-        entity.setRepairDuration(repairDuration);
+        if (entity.getRepairDiff() != null) {
+            String repairDuration = this.getRepairDuration(entity.getRepairDiff());
+            entity.setRepairDuration(repairDuration);
+        }
+        entity.setRepairDuration("");
         Validate.notNull(entity, ValuePool.MAINTENANCE_RECORD_NOT_EXIST);
         /**
          * 维保项id:0/1/2, 0:无需保养,1:已保养,2:需要更换

+ 7 - 43
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/controller/AttendanceController.java

@@ -32,10 +32,7 @@ import javax.validation.Valid;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * <p>
@@ -51,23 +48,10 @@ import java.util.Objects;
 @RequestMapping("/oa/attendance")
 public class AttendanceController {
 
-    private AttendanceService         attendanceService;
-    private AttendanceImgService      attendanceImgService;
+    private AttendanceService attendanceService;
+    private AttendanceImgService attendanceImgService;
     private MaintenanceCompanyService maintenanceCompanyService;
 
-    private static final Map<String, String> headerAlias = new HashMap<>();
-
-    static {
-        headerAlias.put("username", "姓名");
-        headerAlias.put("typeDesc", "打卡类型");
-        headerAlias.put("clockDate", "日期");
-        headerAlias.put("requiredTime", "应打卡时间");
-        headerAlias.put("clockTime", "打卡时间");
-        headerAlias.put("address", "地点");
-        headerAlias.put("remarks", "备注");
-        headerAlias.put("statusDesc", "是否迟到/早退");
-    }
-
     /**
      * 根据id查找
      *
@@ -96,7 +80,7 @@ public class AttendanceController {
         //签到管理: 按日期和打卡时间由近及远排序
         LocalDate begin = request.getBegin();
         LocalDate end = request.getEnd();
-        if(Objects.nonNull(begin) && Objects.nonNull(end)){
+        if (Objects.nonNull(begin) && Objects.nonNull(end)) {
             Validate.isTrue(begin.isBefore(end), ValuePool.beginTimeToEndTimeIllegal(begin, end));
         }
         request.addDesc("create_date");
@@ -193,7 +177,7 @@ public class AttendanceController {
         Integer type = entity.getType();
         //先统计当天是否有对应的打卡记录
         Attendance same = attendanceService.sameByUserAndType(mtCompanyId, userId, type);
-        if(Objects.nonNull(same)){
+        if (Objects.nonNull(same)) {
             LocalDateTime createDate = same.getCreateDate();
             String message = Objects.isNull(createDate) ? "" : String.format("(打卡时间:%tF %tT)", createDate, createDate);
             return RestResponse.fail(ValuePool.ATTEND_HAD_CLOCK + message);
@@ -281,27 +265,7 @@ public class AttendanceController {
     }
 
     @PostMapping("export")
-    public void export(@Val @RequestBody AttendanceRequest request, HttpServletResponse response) {
-        log.info("headerAlias: {}", headerAlias);
-        List<AttendanceResponse> attendances = attendanceService.listByIdList(request);
-        Validate.notNull(attendances, ValuePool.ATTEND_MISSING);
-        try {
-            ExcelWriter writer = ExcelUtil.getWriter();
-            //设置列别名
-            headerAlias.forEach(writer::addHeaderAlias);
-            //只导出配置了别名的列属性
-            writer.setOnlyAlias(true);
-            writer.write(attendances, true);
-            writer.autoSizeColumnAll();
-            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
-            response.setHeader("Content-Disposition", "attachment;filename=" + IdWorker.getIdStr() + ".xlsx");
-            ServletOutputStream out = response.getOutputStream();
-            writer.flush(out, true);
-            writer.close();
-            IoUtil.close(out);
-        } catch (Exception e) {
-            log.error("导出打卡记录异常", e);
-            throw Validate.validateException("导出打卡记录异常");
-        }
+    public void export(@RequestBody AttendanceRequest attendanceRequest, HttpServletResponse response) {
+        attendanceService.export(attendanceRequest, response);
     }
 }

+ 2 - 2
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/dto/AttendanceRequest.java

@@ -111,9 +111,9 @@ public class AttendanceRequest extends PageRequest {
     private Long userId;
 
     /**
-     * 导出记录的id列表
+     * 导出记录的用户id列表
      */
-    private List<Long> ids;
+    private List<Long> userIds;
 
     private String attendanceYearMonth;
 }

+ 9 - 0
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/dto/AttendanceResponse.java

@@ -27,6 +27,11 @@ public class AttendanceResponse extends Attendance{
      */
     private String username;
 
+    /**
+     * 用户手机号
+     */
+    private String userMobile;
+
     /**
      * 签到图片
      */
@@ -77,6 +82,7 @@ public class AttendanceResponse extends Attendance{
         LocalTime localTime;
         int type = ValuePool.nullable(this.getType(), 0);
         switch (type) {
+            case 1:
             case 11:
                 localTime = this.getTopTime();
                 break;
@@ -86,6 +92,7 @@ public class AttendanceResponse extends Attendance{
             case 21:
                 localTime =  this.getTopTimePm();
                 break;
+            case 2:
             case 22:
                 localTime =  this.getDownTimePm();
                 break;
@@ -148,6 +155,8 @@ public class AttendanceResponse extends Attendance{
                 }else {
                     return "--";
                 }
+            case 2:
+                return "早退";
             default:
                 return "--";
         }

+ 4 - 0
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/mapper/AttendanceMapper.java

@@ -7,6 +7,7 @@ import cn.com.ty.lift.enterprise.oa.entity.Attendance;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -23,4 +24,7 @@ public interface AttendanceMapper extends BaseMapper<Attendance>{
 	AttendanceResponse infoById(@Param("cond")AttendanceRequest request);
 
 	List<AttendanceResponse> listByIdList(@Param("cond")AttendanceRequest request);
+
+	@Select("select user_id from mt_company_user where mt_company_id = #{mtCompanyId}")
+	List<Long> selectCompanyUserIdsByMtCompanyId(Long mtCompanyId);
 }

+ 119 - 6
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/service/AttendanceService.java

@@ -1,18 +1,33 @@
 package cn.com.ty.lift.enterprise.oa.service;
 
+import cn.com.ty.lift.common.utils.ValuePool;
+import cn.com.ty.lift.common.verify.Validate;
 import cn.com.ty.lift.enterprise.oa.dto.AttendanceRequest;
 import cn.com.ty.lift.enterprise.oa.dto.AttendanceResponse;
 import cn.com.ty.lift.enterprise.oa.entity.Attendance;
+import cn.com.ty.lift.enterprise.oa.entity.MaintenanceCompany;
 import cn.com.ty.lift.enterprise.oa.mapper.AttendanceMapper;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.io.FileNotFoundException;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.List;
+import java.util.*;
 
 /**
  * <p>
@@ -23,10 +38,14 @@ import java.util.List;
  * @since 2019-12-12
  */
 @Service
-public class AttendanceService extends ServiceImpl<AttendanceMapper,Attendance> {
+@Slf4j
+public class AttendanceService extends ServiceImpl<AttendanceMapper, Attendance> {
+    @Resource
+    MaintenanceCompanyService maintenanceCompanyService;
 
     /**
      * 根据条件分页查找签到记录
+     *
      * @param request AttendanceRequest
      * @return IPage<AttendanceResponse>
      */
@@ -36,6 +55,7 @@ public class AttendanceService extends ServiceImpl<AttendanceMapper,Attendance>
 
     /**
      * 根据用户分页查找记录
+     *
      * @param request AttendanceRequest
      * @return IPage<AttendanceResponse>
      */
@@ -49,9 +69,10 @@ public class AttendanceService extends ServiceImpl<AttendanceMapper,Attendance>
 
     /**
      * 根据用户和打卡类型统计打卡记录条数
+     *
      * @param mtCompanyId 维保公司id
-     * @param userId 用户id
-     * @param type 打卡类型
+     * @param userId      用户id
+     * @param type        打卡类型
      * @return int
      */
     public Attendance sameByUserAndType(Long mtCompanyId, Long userId, Integer type) {
@@ -68,16 +89,108 @@ public class AttendanceService extends ServiceImpl<AttendanceMapper,Attendance>
 
     /**
      * 根据id查询,带关联信息
+     *
      * @param request
      * @return
      */
-    public AttendanceResponse infoById(AttendanceRequest request){
+    public AttendanceResponse infoById(AttendanceRequest request) {
         return baseMapper.infoById(request);
     }
 
-    public long countByMtCompany(Long mtCompanyId){
+    public long countByMtCompany(Long mtCompanyId) {
         LambdaQueryWrapper<Attendance> lambdaQueryWrapper = Wrappers.lambdaQuery();
         lambdaQueryWrapper.eq(Attendance::getMtCompanyId, mtCompanyId);
         return count(lambdaQueryWrapper);
     }
+
+    public void export(AttendanceRequest attendanceRequest, HttpServletResponse response) {
+        if (attendanceRequest.getUserIds()==null||attendanceRequest.getUserIds().isEmpty()) {
+            attendanceRequest.setUserIds(this.baseMapper.selectCompanyUserIdsByMtCompanyId(attendanceRequest.getMtCompanyId()));
+        }
+        attendanceRequest.setUserId(null);
+        List<AttendanceResponse> attendanceResponses = this.listByIdList(attendanceRequest);
+        Validate.notNull(attendanceResponses, ValuePool.ATTEND_MISSING);
+        ExcelWriter writer = ExcelUtil.getWriter(true);
+        HashMap<String, String> attendances = new HashMap<>();
+        Set<String> userIds = new HashSet<>();
+        for (AttendanceResponse attendance : attendanceResponses) {
+            int type = ValuePool.nullable(attendance.getType(), 0);
+            Long userId = attendance.getUserId();
+            int dayOfMonth = attendance.getCreateDate().getDayOfMonth();
+            String attendanceTime = String.format("%tT", attendance.getCreateDate()) + " " + attendance.getStatusDesc();
+            switch (type) {
+                case 1:
+                case 11:
+                    attendances.put(userId + "topTime" + dayOfMonth, attendanceTime);
+                    break;
+                case 12:
+                    attendances.put(userId + "downTime" + dayOfMonth, attendanceTime);
+                    break;
+                case 21:
+                    attendances.put(userId + "topTimePm" + dayOfMonth, attendanceTime);
+                    break;
+                case 2:
+                case 22:
+                    attendances.put(userId + "downTimePm" + dayOfMonth, attendanceTime);
+                    break;
+                case 31:
+                    attendances.put(userId + "topTimeOt" + dayOfMonth, attendanceTime);
+                    break;
+                case 32:
+                    attendances.put(userId + "downTimeOt" + dayOfMonth, attendanceTime);
+                    break;
+            }
+            attendances.put(userId.toString(), attendance.getUsername() + "   " + attendance.getUserMobile());
+            userIds.add(userId.toString());
+        }
+        MaintenanceCompany attendanceTime = maintenanceCompanyService.getById(attendanceRequest.getMtCompanyId());
+        String[] split = attendanceRequest.getAttendanceYearMonth().trim().split("-");
+        log.info("用户数量" + userIds.size());
+        try {
+            writeExcel(Integer.parseInt(split[0]), Integer.parseInt(split[1]), writer, attendances, userIds, attendanceTime);
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + IdWorker.getIdStr() + ".xlsx");
+            ServletOutputStream out = response.getOutputStream();
+            writer.flush(out, true);
+            writer.close();
+            IoUtil.close(out);
+        } catch (Exception e) {
+            log.error("导出打卡记录异常", e);
+            throw Validate.validateException("导出打卡记录异常");
+        }
+    }
+
+    private void writeExcel(int year, int month, ExcelWriter writer, Map<String, String> attendances, Set<String> userIds, MaintenanceCompany attendanceTime) throws FileNotFoundException {
+        int lengthOfMonth = LocalDate.of(year, month, 1).lengthOfMonth();
+        writer.merge(0, 0, 0, lengthOfMonth, year + "年" + month + "月签到记录表", false);
+        writer.setColumnWidth(0, 20);
+        Iterator<String> iterator = userIds.iterator();
+        int i = 0;
+        while (iterator.hasNext()) {
+            String userId = iterator.next();
+            int col = i * 9;
+            int j = 1;
+            for (; j <= lengthOfMonth; j++) {
+                writer.setColumnWidth(j, 15);
+                writer.writeCellValue(j, col + 1, j);
+                //写入每个用户每天的打卡信息
+                writer.writeCellValue(j, col + 3, Optional.ofNullable(attendances.get(userId + "topTime" + j)).orElse(""));
+                writer.writeCellValue(j, col + 4, Optional.ofNullable(attendances.get(userId + "downTime" + j)).orElse(""));
+                writer.writeCellValue(j, col + 5, Optional.ofNullable(attendances.get(userId + "topTimePm" + j)).orElse(""));
+                writer.writeCellValue(j, col + 6, Optional.ofNullable(attendances.get(userId + "downTimePm" + j)).orElse(""));
+                writer.writeCellValue(j, col + 7, Optional.ofNullable(attendances.get(userId + "topTimeOt" + j)).orElse(""));
+                writer.writeCellValue(j, col + 8, Optional.ofNullable(attendances.get(userId + "downTimeOt" + j)).orElse(""));
+            }
+            //写入公司的打卡时间
+            writer.merge(col + 1, col + 2, 0, 0, "应打卡时间", false);
+            writer.writeCellValue(0, col + 3, "上午上班时间" + (attendanceTime.getTopTime() != null ? attendanceTime.getTopTime().toString() : "未设置"));
+            writer.writeCellValue(0, col + 4, "上午下班时间" + (attendanceTime.getDownTime() != null ? attendanceTime.getDownTime().toString() : "未设置"));
+            writer.writeCellValue(0, col + 5, "下午上班时间" + (attendanceTime.getTopTimePm() != null ? attendanceTime.getTopTimePm().toString() : "未设置"));
+            writer.writeCellValue(0, col + 6, "下午下班时间" + (attendanceTime.getDownTimePm() != null ? attendanceTime.getDownTimePm().toString() : "未设置"));
+            writer.writeCellValue(0, col + 7, "加班上班时间" + (attendanceTime.getTopTimeOt() != null ? attendanceTime.getTopTimeOt().toString() : "未设置"));
+            writer.writeCellValue(0, col + 8, "加班下班时间" + (attendanceTime.getDownTimeOt() != null ? attendanceTime.getDownTimeOt().toString() : "未设置"));
+            writer.merge(col + 2, col + 2, 1, j - 1, attendances.get(userId), false);
+            i++;
+        }
+    }
 }

+ 8 - 7
lift-enterprise-service/src/main/resources/mapper/oa/AttendanceMapper.xml

@@ -66,17 +66,18 @@
             mt.down_time_pm,
             mt.top_time_ot,
             mt.down_time_ot,
-            ui.name AS username
+            ui.name AS username,
+            ui.mobile AS userMobile
         FROM attendance att
         LEFT JOIN user_info ui ON att.user_id = ui.user_id
         LEFT JOIN maintenance_company mt ON att.mt_company_id = mt.id
         <where>
-            <if test="cond.ids != null and cond.ids.size > 0">
-                AND att.id IN
-                <foreach collection="cond.ids" item="id" open="(" separator="," close=")">
-                    #{id}
-                </foreach>
-            </if>
+			<if test="cond.userIds != null and cond.userIds.size > 0">
+				AND att.user_id IN
+				<foreach collection="cond.userIds" item="uId" open="(" separator="," close=")">
+					#{uId}
+				</foreach>
+			</if>
             <if test="cond.userId != null and cond.userId != ''">
                 AND att.user_id = #{cond.userId}
             </if>

+ 20 - 16
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/UserApplicationService.java

@@ -83,29 +83,33 @@ public class UserApplicationService extends ServiceImpl<UserApplicationMapper, U
         //申请人id
         long applyUserId = userApplyRequest.getUserId();
         //获取用户原有的申请信息
-        UserApplication userApplication = this.getOne(new QueryWrapper<UserApplication>()
+        List<UserApplication> userApplications = this.list(new QueryWrapper<UserApplication>()
                 .eq("mt_company_id", companyId)
                 .eq("user_id", applyUserId)
                 //去掉申请未通过的判断
                 .ne("status", ApiConstants.ApplicationConstants.APPLY_FAIL)
+                .orderByDesc("apply_date")
         );
-        //设置前校验
-        RestResponse restResponse = applyCheck(userApplyRequest, userApplication, applyTypeTeam);
-        if (restResponse != null) {
-            //校验不通过返回校验信息
-            return restResponse;
+        if (!userApplications.isEmpty()) {
+            RestResponse restResponse = applyCheck(userApplyRequest, userApplications.get(0), applyTypeTeam);
+            if (restResponse != null) {
+                //校验不通过返回校验信息
+                return restResponse;
+            }
         }
+        //设置前校验
+
         //校验通过设置审核信息
-        if (userApplication == null) {
-            userApplication = new UserApplication();
-            userApplication.setUserId(applyUserId);
-            userApplication.setMtCompanyId(companyId);
-            userApplication.setType(applyTypeTeam);
-            //设置审核描述信息
-            userApplication.setDescription(userApplyRequest.getDescription());
-            //申请加入项目时需要设置的信息
-            userApplication.setProjectId(userApplyRequest.getProjectId());
-        }
+
+        UserApplication userApplication = new UserApplication();
+        userApplication.setUserId(applyUserId);
+        userApplication.setMtCompanyId(companyId);
+        userApplication.setType(applyTypeTeam);
+        //设置审核描述信息
+        userApplication.setDescription(userApplyRequest.getDescription());
+        //申请加入项目时需要设置的信息
+        userApplication.setProjectId(userApplyRequest.getProjectId());
+
         //审核状态变为待审核
         userApplication.setStatus(ApiConstants.ApplicationConstants.APPLY_WAIT);
         //申请加入项目时需要设置的信息