Browse Source

[chg] 签到和公告修复细节

wcz 5 years ago
parent
commit
c322001b8b
15 changed files with 183 additions and 125 deletions
  1. 4 3
      lift-business-service/src/main/java/cn/com/ty/lift/business/annualinspection/dto/InspectionRequest.java
  2. 14 14
      lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/controller/EmergencyRepairController.java
  3. 0 1
      lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/dto/RepairRequest.java
  4. 11 9
      lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/entity/EmergencyRepair.java
  5. 25 0
      lift-common/src/main/java/cn.com.ty.lift.common/model/PushMessage.java
  6. 2 0
      lift-common/src/main/java/cn.com.ty.lift.common/utils/ValuePool.java
  7. 6 6
      lift-common/src/main/java/cn.com.ty.lift.common/verify/Verify.java
  8. 6 6
      lift-common/src/main/java/cn.com.ty.lift.common/verify/VerifyProcessor.java
  9. 9 7
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/controller/AnnouncementController.java
  10. 49 47
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/controller/AttendanceController.java
  11. 5 3
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/entity/Announcement.java
  12. 14 5
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/service/AnnouncementService.java
  13. 8 7
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/service/AttendanceService.java
  14. 15 14
      lift-enterprise-service/src/main/resources/mapper/oa/AttendanceMapper.xml
  15. 15 3
      lift-push/src/main/java/cn/com/ty/lift/push/app/XingePush.java

+ 4 - 3
lift-business-service/src/main/java/cn/com/ty/lift/business/annualinspection/dto/InspectionRequest.java

@@ -1,6 +1,7 @@
 package cn.com.ty.lift.business.annualinspection.dto;
 
 import cn.com.ty.lift.common.model.PageRequest;
+import cn.com.ty.lift.common.utils.ValuePool;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -124,21 +125,21 @@ public class InspectionRequest extends PageRequest {
      * 政府质检人员
      */
     @NotBlank(message = "请设置政府质检人员")
-    @Pattern(regexp = "^[\u4e00-\u9fa5a-zA-Z0-9·.。;&\\s]{1,20}$", message = "政府质检人员只能包含中英文数字,空格和·.。;&")
+    @Pattern(regexp = ValuePool.PATTERN_NAME, message = "政府质检人员只能包含中英文数字,空格和·.。;&")
     private String inspector;
 
     /**
      * 联系电话
      */
     @NotBlank(message = "请设置联系电话")
-    @Pattern(regexp = "^1[345789]\\d{9}|0[1-9](\\d{1,2}\\-?)[1-9]\\d{6,7}$",message = "联系电话格式有误")
+    @Pattern(regexp = ValuePool.PATTERN_TELEPHONE,message = "联系电话格式有误")
     private String telephone;
 
     /**
      * 公司年检人员
      */
     @NotBlank(message = "请设置公司年检人员")
-    @Pattern(regexp = "^[\u4e00-\u9fa5a-zA-Z0-9·.。;&\\s]{1,20}$", message = "公司年检人员只能包含中英文数字,空格和·.。;&")
+    @Pattern(regexp = ValuePool.PATTERN_NAME, message = "公司年检人员只能包含中英文数字,空格和·.。;&")
     private String operator;
 
     /**

+ 14 - 14
lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/controller/EmergencyRepairController.java

@@ -1,7 +1,6 @@
 package cn.com.ty.lift.business.emergency.controller;
 
 
-import cn.com.ty.lift.business.push.PushUserService;
 import cn.com.ty.lift.business.emergency.dto.*;
 import cn.com.ty.lift.business.emergency.entity.EmergencyRepair;
 import cn.com.ty.lift.business.emergency.entity.ErRecordCost;
@@ -13,6 +12,7 @@ import cn.com.ty.lift.business.evaluation.service.EvaluationService;
 import cn.com.ty.lift.business.library.dao.entity.PlatformCompanyLiftRelevance;
 import cn.com.ty.lift.business.library.service.PlatformCompanyLiftRelevanceService;
 import cn.com.ty.lift.business.project.dao.entity.Region;
+import cn.com.ty.lift.business.push.PushUserService;
 import cn.com.ty.lift.common.constants.CommonEnum;
 import cn.com.ty.lift.common.model.CountPage;
 import cn.com.ty.lift.common.model.PushMessage;
@@ -311,7 +311,7 @@ public class EmergencyRepairController {
             //【原被派单人】收到消息:
             if(Objects.nonNull(originId)){
                 PushUserInfo originWorker = pushUserService.listByUserId(mtCompanyId, originId);
-                PushMessage.emergencyTransferForOriginal(info.getAreaName(), info.getProjectName(), info.getDevicePosition(), info.getRegistrationCode(), info.getWorkerName()).sendTokenOnPlatform(jmsMessagingTemplate, Arrays.asList(originWorker));
+                PushMessage.emergencyTransferForOriginal(info.getAreaName(), info.getProjectName(), info.getDevicePosition(), info.getRegistrationCode(), info.getWorkerName()).sendTokenOnPlatform(jmsMessagingTemplate, originWorker);
             }
         }
         return RestResponse.success(result);
@@ -493,25 +493,25 @@ public class EmergencyRepairController {
 
         BigDecimal costTotal = repair.getCostTotal();
         BigDecimal costMoney = erRecordCost.getCostMoney();
-        Verify.notNull(costTotal, Verify.Repair.incorrectAmount);
-        Verify.notNull(costMoney, Verify.Repair.incorrectAmount);
         //收费项的金额不能大于急修单的总金额
-        Verify.notTrue(costTotal.compareTo(costMoney) == -1, Verify.Repair.incorrectAmount);
-        repair.setCostTotal(costTotal.subtract(costMoney));
+        if (Objects.nonNull(costTotal) && Objects.nonNull(costMoney)) {
+            Verify.notTrue(costTotal.compareTo(costMoney) < 0, Verify.Repair.incorrectAmount);
+            repair.setCostTotal(costTotal.subtract(costMoney));
+        }
 
         BigDecimal payTotal = repair.getPayTotal();
         BigDecimal payMoney = erRecordCost.getPayMoney();
-        Verify.notNull(payTotal, Verify.Repair.incorrectAmount);
-        Verify.notNull(payMoney, Verify.Repair.incorrectAmount);
-        Verify.notTrue(payTotal.compareTo(payMoney) == -1, Verify.Repair.incorrectAmount);
-        repair.setPayTotal(payTotal.subtract(payMoney));
+        if (Objects.nonNull(payTotal) && Objects.nonNull(payMoney)) {
+            Verify.notTrue(payTotal.compareTo(payMoney) < 0, Verify.Repair.incorrectAmount);
+            repair.setPayTotal(payTotal.subtract(payMoney));
+        }
 
         BigDecimal invoiceTotal = repair.getInvoiceTotal();
         BigDecimal invoiceMoney = erRecordCost.getInvoiceMoney();
-        Verify.notNull(invoiceTotal, Verify.Repair.incorrectAmount);
-        Verify.notNull(invoiceMoney, Verify.Repair.incorrectAmount);
-        Verify.notTrue(invoiceTotal.compareTo(invoiceMoney) == -1, Verify.Repair.incorrectAmount);
-        repair.setInvoiceTotal(invoiceTotal.subtract(invoiceMoney));
+        if (Objects.nonNull(invoiceTotal) && Objects.nonNull(invoiceMoney)) {
+            Verify.notTrue(invoiceTotal.compareTo(invoiceMoney) < 0, Verify.Repair.incorrectAmount);
+            repair.setInvoiceTotal(invoiceTotal.subtract(invoiceMoney));
+        }
 
         return emergencyRepairService.deleteCost(repair, erRecordCost);
     }

+ 0 - 1
lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/dto/RepairRequest.java

@@ -84,7 +84,6 @@ public class RepairRequest extends PageRequest {
      */
     private Integer source;
 
-
     /**
      * 接单时间 app端维保工确认
      */

+ 11 - 9
lift-business-service/src/main/java/cn/com/ty/lift/business/emergency/entity/EmergencyRepair.java

@@ -1,6 +1,7 @@
 package cn.com.ty.lift.business.emergency.entity;
 
 import cn.com.ty.lift.business.common.BaseEntity;
+import cn.com.ty.lift.common.utils.ValuePool;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -85,48 +86,49 @@ public class EmergencyRepair extends BaseEntity {
      * 报修人名
      */
     @NotBlank(message = "报修人不能为空")
+    @Pattern(regexp = ValuePool.PATTERN_NAME, message = "报修人只能包含中英文数字和·.。;&")
     private String callerName;
     /**
      * 报修人电话
      */
     @NotBlank(message = "报修人电话不能为空")
-    @Pattern(regexp = "^1[345789]\\d{9}|0[1-9](\\d{1,2}\\-?)[1-9]\\d{6,7}$", message = "请输入有效的电话")
+    @Pattern(regexp = ValuePool.PATTERN_TELEPHONE, message = "请输入有效的电话")
     private String callerTel;
 
     /**
      * 报修时间 手动填写
      */
     @NotNull(message = "报修时间不能为空")
-    @Past(message = "报修时间不能超过标准北京时间")
+    @PastOrPresent(message = "报修时间不能早于标准北京时间")
     private LocalDateTime callerDate;
 
     /**
      * 停梯时间
      */
-    @Past(message = "停梯时间不合法")
+    @PastOrPresent(message = "停梯时间不能早于标准北京时间")
     private LocalDateTime stopDate;
 
     /**
      * 派单时间 急修单创建时间
      */
-    @Past(message = "派单时间不合法")
+    @PastOrPresent(message = "派单时间不能早于标准北京时间")
     private LocalDateTime assignTime;
 
     /**
      * 接单时间 app端维保工确认
      */
-    @Past(message = "接单时间不合法")
+    @PastOrPresent(message = "接单时间不能早于标准北京时间")
     private LocalDateTime takingTime;
 
     /**
      * 到达时间 app端维保工打卡
      */
-    @Past(message = "到达时间不合法")
+    @PastOrPresent(message = "到达时间不能早于标准北京时间")
     private LocalDateTime arriveTime;
     /**
      * 恢复时间
      */
-    @Past(message = "恢复时间不合法")
+    @PastOrPresent(message = "恢复时间不能早于标准北京时间")
     private LocalDateTime recoveryDate;
 
     /**
@@ -165,7 +167,7 @@ public class EmergencyRepair extends BaseEntity {
     private String workerTel;
 
     /**
-     * 到位置
+     * 到位置
      */
     private String position;
 
@@ -206,7 +208,7 @@ public class EmergencyRepair extends BaseEntity {
      * 当前维修的维保工
      */
     @NotNull(message = "急修工不能为空")
-    @Range(min = 1, message = "急修工有误")
+    @Range(min = 1, message = "急修工ID有误")
     private Long workerId1;
 
     /**

+ 25 - 0
lift-common/src/main/java/cn.com.ty.lift.common/model/PushMessage.java

@@ -563,6 +563,31 @@ public class PushMessage implements Serializable {
         }
     }
 
+    public boolean sendTokenOnPlatform(JmsMessagingTemplate jmsMessagingTemplate, PushUserInfo pushUserInfo) {
+        try {
+            if (Objects.isNull(pushUserInfo)) {
+                return false;
+            }
+            Integer deviceModel = pushUserInfo.getDeviceModel();
+            String deviceFlag = pushUserInfo.getDeviceFlag();
+            if(Objects.isNull(deviceModel) || StrUtil.isBlank(deviceFlag)){
+                return false;
+            }
+            this.setToList(Arrays.asList(deviceFlag));
+            if (1 == deviceModel) {
+                jmsMessagingTemplate.send(ValuePool.QUEUE_ANDROID_TOKEN, new GenericMessage<>(this));
+            } else if (2 == deviceModel) {
+                jmsMessagingTemplate.send(ValuePool.QUEUE_IOS_TOKEN, new GenericMessage<>(this));
+            } else {
+                return false;
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("Failed to Send pushMessage to ANDROID & IOS TOKEN Message Queue: ", e);
+            return false;
+        }
+    }
+
     /**
      * 同时推送android和ios全平台
      *

+ 2 - 0
lift-common/src/main/java/cn.com.ty.lift.common/utils/ValuePool.java

@@ -114,4 +114,6 @@ public interface ValuePool {
     int      PUSH_MAX_SIZE       = 1000;
     //消息推送失败后重新尝试的最多次数
     int      PUSH_TRY_MAX_TIMES  = 100;
+    String PATTERN_NAME = "^[\u4e00-\u9fa5a-zA-Z0-9·.。;&\\s]{1,20}$";
+    String PATTERN_TELEPHONE = "^1[345789]\\d{9}|0[1-9](\\d{1,2}\\-?)[1-9]\\d{6,7}$";
 }

+ 6 - 6
lift-common/src/main/java/cn.com.ty.lift.common/verify/Verify.java

@@ -748,20 +748,20 @@ public interface Verify {
         String SetAmTime            = "请设置上午的上/下班时间";
         String SetPmTime            = "请设置下午的上/下班时间";
         String SetOtTime            = "请设置加班的上/下班时间";
-        String InvalidAmTime        = "上午的上/下班时间有误";
-        String InvalidPmTime        = "下午的上/下班时间有误";
-        String InvalidOtTime        = "加班的上/下班时间有误";
+        String InvalidAmTime        = "上午的上(%tT)/下班(%tT)时间有误";
+        String InvalidPmTime        = "下午的上(%tT)/下班(%tT)时间有误";
+        String InvalidOtTime        = "加班的上(%tT)/下班(%tT)时间有误";
         String AmTopClock           = "上午上班打卡";
         String AmDownClock          = "上午下班打卡";
         String PmTopClock           = "下午上班打卡";
         String PmDownClock          = "下午下班打卡";
         String OtTopClock           = "加班上班打卡";
         String OtDownClock          = "加班下班打卡";
-        String hadClock             = "打卡记录已存在";
+        String hadClock             = "记录已存在(打卡时间:%tF %tT)";
         String missingTime          = "请至少设置一组打卡时间";
 
-        String AmDownPmTop = "下午的上班时间不得早于上午的下班时间";
-        String PmDownOtTop = "加班的上班时间不得早于下午的下班时间";
+        String AmDownPmTop = "下午的上班(%tT)时间不得早于上午的下班(%tT)时间";
+        String PmDownOtTop = "加班的上班(%tT)时间不得早于下午的下班(%tT)时间";
     }
 
     interface Excel{

+ 6 - 6
lift-common/src/main/java/cn.com.ty.lift.common/verify/VerifyProcessor.java

@@ -1398,7 +1398,7 @@ public class VerifyProcessor {
                     boolean invoke = invokeMethod(this, method, value, verifyAnno);
                     if (invoke) continue;
                     if (logWrite) {
-                        info(verifyField, value, method, verifyAnno);
+                        write(verifyField, value, method, verifyAnno);
                     }
                     if (1 == code) {
                         throw newVerifyException(message);
@@ -1455,7 +1455,7 @@ public class VerifyProcessor {
         //get all annotation of the field
         Annotation[] annotations = field.getDeclaredAnnotations();
         //filter the validation annotation
-        if (annotations != null && annotations.length > 0) {
+        if (Objects.nonNull(annotations) && annotations.length > 0) {
             List<Annotation> verifyAnnos = Arrays.stream(annotations).filter(anno -> ClassMethodCache.keySet().contains(anno.annotationType())).collect(Collectors.toList());
             annotations = verifyAnnos.toArray(new Annotation[verifyAnnos.size()]);
         }
@@ -1566,10 +1566,10 @@ public class VerifyProcessor {
      * @param method     the method to action
      * @param verifyAnno the validation annotation of the field.
      */
-    private static void info(Field verifyField, Object value, Method method, Annotation verifyAnno) {
-        log.info("###| FIELD       : {}", verifyField);
-        log.info("###| FIELD_VALUE : {}", value);
-        log.info("###| METHOD      : (false) {}(Object,{})", method.getName(), verifyAnno.annotationType().getName());
+    private static void write(Field verifyField, Object value, Method method, Annotation verifyAnno) {
+        log.warn("###| FIELD       : {}", verifyField);
+        log.warn("###| FIELD_VALUE : {}", value);
+        log.warn("###| METHOD      : (false) {}(Object,{})", method.getName(), verifyAnno.annotationType().getName());
     }
     /**
      * create a {@link IllegalArgumentException} with the message.

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

@@ -29,6 +29,7 @@ import javax.validation.Valid;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 
@@ -62,7 +63,7 @@ public class AnnouncementController {
     @Verifier(fields = {"id"})
     public RestResponse findOne(@Ver @RequestBody AnnouncementRequest request) {
         AnnouncementResponse result = announcementService.infoById(request);
-        if(null != result){
+        if(Objects.nonNull(result)){
             result.setImgs(announcementImgService.listByAnnouncement(request.getId()));
         }
         return RestResponse.success(result);
@@ -78,7 +79,7 @@ public class AnnouncementController {
     public RestResponse list(@Ver @RequestBody AnnouncementRequest request) {
         IPage<AnnouncementResponse> pages = announcementService.pageByCondition(request);
         List<AnnouncementResponse> records = pages.getRecords();
-        long count = announcementService.count();
+        long count = announcementService.countByMtCompany(request.getMtCompanyId());
         if(records.size() > 0){
             List<Long> idList = records.stream().map(Announcement::getId).collect(Collectors.toList());
             List<AnnouncementImg> imgList = announcementImgService.listByAnnouncementIds(idList);
@@ -98,18 +99,19 @@ public class AnnouncementController {
     @PostMapping("add")
     public RestResponse add(@Valid @RequestBody Announcement entity) {
         entity.setPostDate(LocalDateTime.now());
-        boolean result = announcementService.add(entity);
-        if(result){
-            List<MtCompanyUser> mtCompanyUsers = mtCompanyUserService.listByMtCompany(entity.getMtCompanyId());
+        RestResponse result = announcementService.add(entity);
+        if(Objects.equals("1", result.getStatusCode())){
+            Long mtCompanyId = entity.getMtCompanyId();
+            List<MtCompanyUser> mtCompanyUsers = mtCompanyUserService.listByMtCompany(mtCompanyId);
             if (IterUtil.isNotEmpty(mtCompanyUsers)) {
                 List<Long> userIds = mtCompanyUsers.stream().map(MtCompanyUser::getUserId).collect(Collectors.toList());
                 if(IterUtil.isNotEmpty(userIds)){
-                    List<PushUserInfo> pushUserInfos = pushUserService.listByUserIds(entity.getMtCompanyId(), userIds);
+                    List<PushUserInfo> pushUserInfos = pushUserService.listByUserIds(mtCompanyId, userIds);
                     PushMessage.announcementNotice().sendTokenOnPlatform(jmsMessagingTemplate, pushUserInfos);
                 }
             }
         }
-        return RestResponse.success(result);
+        return result;
     }
 
     /**

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

@@ -1,6 +1,7 @@
 package cn.com.ty.lift.enterprise.oa.controller;
 
 import cn.com.ty.lift.common.model.CountPage;
+import cn.com.ty.lift.common.utils.DateUtils;
 import cn.com.ty.lift.common.verify.Ver;
 import cn.com.ty.lift.common.verify.Verifier;
 import cn.com.ty.lift.common.verify.Verify;
@@ -13,7 +14,6 @@ import cn.com.ty.lift.enterprise.oa.service.AttendanceService;
 import cn.com.ty.lift.enterprise.oa.service.MaintenanceCompanyService;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -28,14 +28,16 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.time.LocalDate;
 import java.time.LocalTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
- *      打卡签到记录 前端控制器
+ * 打卡签到记录 前端控制器
  * </p>
  *
  * @author wcz
@@ -54,18 +56,19 @@ public class AttendanceController {
     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","是否迟到/早退");
+        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查找
+     *
      * @param request AttendanceRequest
      * @return RestResponse
      */
@@ -73,7 +76,7 @@ public class AttendanceController {
     @Verifier(fields = {"id"})
     public RestResponse findOne(@Ver @RequestBody AttendanceRequest request) {
         AttendanceResponse result = attendanceService.infoById(request);
-        if(null != result){
+        if (Objects.nonNull(result)) {
             result.setImgs(attendanceImgService.listByAttendance(request.getId()));
         }
         return RestResponse.success(result);
@@ -81,25 +84,17 @@ public class AttendanceController {
 
     /**
      * 根据条件查询
+     *
      * @param request AttendanceRequest
      * @return RestResponse
      */
     @PostMapping("list")
     @Verifier(fields = "mtCompanyId")
     public RestResponse list(@Ver @RequestBody AttendanceRequest request) {
-//        LocalDate begin = request.getBegin();
-//        LocalDate end = request.getEnd();
-//        if(null != begin && null != end){
-//            long until = end.until(begin, ChronoUnit.DAYS);
-//            Verify.notTrue(until > ValuePool.QUERY_MAX_DAYS, "最多只允许查询间隔" + ValuePool.QUERY_MAX_DAYS + "天的记录");
-//        }else if(null != begin && null == end){
-//            request.setEnd(begin.plusDays(ValuePool.QUERY_MAX_DAYS));
-//        }else if(null == begin && null != end){
-//            request.setBegin(end.plusDays(0 - ValuePool.QUERY_MAX_DAYS));
-//        }else{
-//            request.setBegin(LocalDate.now().plusDays(0 - ValuePool.QUERY_MAX_DAYS));
-//            request.setEnd(LocalDate.now());
-//        }
+        if (Objects.isNull(request.getClockTime())) {
+            request.setBegin(LocalDate.now().plusDays(0 - DateUtils.daysOfYear()));
+            request.setEnd(LocalDate.now());
+        }
         IPage<AttendanceResponse> pages = attendanceService.pageByCondition(request);
         long count = attendanceService.count();
         return RestResponse.success(CountPage.getCountPage(count, pages));
@@ -107,6 +102,7 @@ public class AttendanceController {
 
     /**
      * 设置打卡时间
+     *
      * @param request AttendanceRequest
      * @return RestResponse
      */
@@ -115,41 +111,41 @@ public class AttendanceController {
     public RestResponse setupTime(@Ver @RequestBody AttendanceRequest request) {
         LocalTime topTime = request.getTopTime();
         LocalTime downTime = request.getDownTime();
-        boolean top = ObjectUtil.isNotNull(topTime);
-        boolean down = ObjectUtil.isNotNull(downTime);
+        boolean top = Objects.nonNull(topTime);
+        boolean down = Objects.nonNull(downTime);
         boolean am = top && down;
         //上下班时间成对设置
         Verify.notTrue(top ^ down, Verify.Attend.SetAmTime);
-        if(am){
-            Verify.notTrue(topTime.isAfter(downTime), Verify.Attend.InvalidAmTime);
+        if (am) {
+            Verify.notTrue(topTime.isAfter(downTime), String.format(Verify.Attend.InvalidAmTime, topTime, downTime));
         }
 
         LocalTime topTimePm = request.getTopTimePm();
         LocalTime downTimePm = request.getDownTimePm();
-        boolean toppm = ObjectUtil.isNotNull(topTimePm);
-        boolean downpm = ObjectUtil.isNotNull(downTimePm);
+        boolean toppm = Objects.nonNull(topTimePm);
+        boolean downpm = Objects.nonNull(downTimePm);
         boolean pm = toppm && downpm;
         Verify.notTrue(toppm ^ downpm, Verify.Attend.SetPmTime);
-        if(pm){
-            Verify.notTrue(topTimePm.isAfter(downTimePm), Verify.Attend.InvalidPmTime);
+        if (pm) {
+            Verify.notTrue(topTimePm.isAfter(downTimePm), String.format(Verify.Attend.InvalidPmTime, topTimePm, downTimePm));
         }
         //上午下班 < 下午上班
-        if(down && toppm){
-            Verify.notTrue(downTime.isAfter(topTimePm),Verify.Attend.AmDownPmTop);
+        if (down && toppm) {
+            Verify.notTrue(downTime.isAfter(topTimePm), String.format(Verify.Attend.AmDownPmTop, topTimePm, downTime));
         }
 
         LocalTime topTimeOt = request.getTopTimeOt();
         LocalTime downTimeOt = request.getDownTimeOt();
-        boolean topot = ObjectUtil.isNotNull(topTimeOt);
-        boolean downot = ObjectUtil.isNotNull(downTimeOt);
+        boolean topot = Objects.nonNull(topTimeOt);
+        boolean downot = Objects.nonNull(downTimeOt);
         boolean ot = topot && downot;
         Verify.notTrue(topot ^ downot, Verify.Attend.SetOtTime);
-        if(ot){
-            Verify.notTrue(topTimeOt.isAfter(downTimeOt), Verify.Attend.InvalidOtTime);
+        if (ot) {
+            Verify.notTrue(topTimeOt.isAfter(downTimeOt), String.format(Verify.Attend.InvalidOtTime, topTimeOt, downTimeOt));
         }
         // 下午下班 < 加班上班
-        if(downpm && topot){
-            Verify.notTrue(downTimePm.isAfter(topTimeOt), Verify.Attend.PmDownOtTop);
+        if (downpm && topot) {
+            Verify.notTrue(downTimePm.isAfter(topTimeOt), String.format(Verify.Attend.PmDownOtTop, topTimeOt, downTimePm));
         }
         //三组时间至少设置一组
         Verify.isTrue(am || pm || ot, Verify.Attend.missingTime);
@@ -183,8 +179,8 @@ public class AttendanceController {
         Long userId = entity.getUserId();
         Integer type = entity.getType();
         //先统计当天是否有对应的打卡记录
-        int count = attendanceService.countByUserAndType(mtCompanyId,userId,type);
-        Verify.nogt0(count,Verify.Attend.hadClock);
+        Attendance same = attendanceService.sameByUserAndType(mtCompanyId, userId, type);
+        Verify.notTrue(Objects.nonNull(same), String.format(Verify.Attend.hadClock, same.getCreateDate(), same.getCreateDate()));
         MaintenanceCompany maintenanceCompany = maintenanceCompanyService.getById(mtCompanyId);
         Verify.notNull(maintenanceCompany);
 
@@ -238,6 +234,7 @@ public class AttendanceController {
 
     /**
      * 返回维保公司打卡时间信息
+     *
      * @param request AttendanceRequest
      * @return RestResponse
      */
@@ -250,20 +247,25 @@ public class AttendanceController {
 
     /**
      * 根据用户查询打卡记录
+     *
      * @param request AttendanceRequest
      * @return RestResponse
      */
     @PostMapping("pageByUser")
-    @Verifier(fields = {"userId","clockTime"})
+    @Verifier(fields = {"userId", "clockTime"})
     public RestResponse pageByUser(@Ver @RequestBody AttendanceRequest request) {
+        if (Objects.isNull(request.getClockTime())) {
+            request.setBegin(LocalDate.now().plusDays(0 - DateUtils.daysOfYear()));
+            request.setEnd(LocalDate.now());
+        }
         IPage<AttendanceResponse> pages = attendanceService.pageByUser(request);
         return RestResponse.success(pages);
     }
 
     @PostMapping("export")
     @Verifier(fields = {"ids"})
-    public void export(@Ver @RequestBody AttendanceRequest request, HttpServletResponse response){
-        log.info("headerAlias: {}",headerAlias);
+    public void export(@Ver @RequestBody AttendanceRequest request, HttpServletResponse response) {
+        log.info("headerAlias: {}", headerAlias);
         List<AttendanceResponse> attendances = attendanceService.listByIdList(request);
         Verify.notNull(attendances);
         try {
@@ -275,12 +277,12 @@ public class AttendanceController {
             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");
+            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){
+        } catch (Exception e) {
             log.error("导出打卡记录异常", e);
             throw Verify.verifyException("导出打卡记录异常");
         }

+ 5 - 3
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/entity/Announcement.java

@@ -9,8 +9,9 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
 import javax.validation.constraints.Min;
-import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -42,13 +43,14 @@ public class Announcement extends BaseEntity {
     /**
      * 标题
      */
-    @NotEmpty(message = "公告标题不能为空")
+    @NotBlank(message = "公告标题不能为空")
     private String title;
 
     /**
      * 内容
      */
-    @NotEmpty(message = "公告内容不能为空")
+    @NotBlank(message = "公告内容不能为空")
+    @Size(min = 1, max = 500, message = "公告内容最多1-500个字")
     private String content;
 
     /**

+ 14 - 5
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/service/AnnouncementService.java

@@ -5,8 +5,11 @@ import cn.com.ty.lift.enterprise.oa.dto.AnnouncementResponse;
 import cn.com.ty.lift.enterprise.oa.entity.Announcement;
 import cn.com.ty.lift.enterprise.oa.entity.AnnouncementImg;
 import cn.com.ty.lift.enterprise.oa.mapper.AnnouncementMapper;
+import cn.com.xwy.boot.web.dto.RestResponse;
 import cn.hutool.core.collection.IterUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -38,6 +41,12 @@ public class AnnouncementService extends ServiceImpl<AnnouncementMapper,Announce
         return baseMapper.pageByCondition(request.getPage(),request);
     }
 
+    public int countByMtCompany(Long mtCompanyId){
+        LambdaQueryWrapper<Announcement> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(Announcement::getMtCompanyId, mtCompanyId);
+        return count(lambdaQueryWrapper);
+    }
+
     /**
      * 根据id查询,带全部关联信息
      * @param request AnnouncementRequest
@@ -53,16 +62,16 @@ public class AnnouncementService extends ServiceImpl<AnnouncementMapper,Announce
      * @return boolean
      */
     @Transactional(rollbackFor = Exception.class)
-    public boolean add(Announcement entity){
+    public RestResponse add(Announcement entity){
         boolean an = saveOrUpdate(entity);
         //插入公告失败,直接返回false
         if(!an){
-            return false;
+            return RestResponse.fail("新增公告失败,请稍后重试");
         }
         //没有图片,直接返回true
         List<String> imgUrls = entity.getImgUrls();
         if(IterUtil.isEmpty(imgUrls)){
-            return true;
+            return RestResponse.success(true);
         }
         //循环处理,批量插入图片
         List<AnnouncementImg> imgList = new ArrayList<>();
@@ -75,11 +84,11 @@ public class AnnouncementService extends ServiceImpl<AnnouncementMapper,Announce
         }
         boolean ais = announcementImgService.saveBatch(imgList);
         if(ais){
-            return true;
+            return RestResponse.success(true);
         }else{
             //强制手动事务回滚
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return false;
+            return RestResponse.fail("插入公告图片失败,请稍后重试");
         }
     }
 }

+ 8 - 7
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/oa/service/AttendanceService.java

@@ -55,16 +55,17 @@ public class AttendanceService extends ServiceImpl<AttendanceMapper,Attendance>
      * @param type 打卡类型
      * @return int
      */
-    public int countByUserAndType(Long mtCompanyId,Long userId,Integer type){
+    public Attendance sameByUserAndType(Long mtCompanyId, Long userId, Integer type) {
         LambdaQueryWrapper<Attendance> lambdaQueryWrapper = Wrappers.lambdaQuery();
-        lambdaQueryWrapper.eq(Attendance::getMtCompanyId,mtCompanyId);
-        lambdaQueryWrapper.eq(Attendance::getUserId,userId);
-        lambdaQueryWrapper.eq(Attendance::getType,type);
+        lambdaQueryWrapper.eq(Attendance::getMtCompanyId, mtCompanyId);
+        lambdaQueryWrapper.eq(Attendance::getUserId, userId);
+        lambdaQueryWrapper.eq(Attendance::getType, type);
         //查询当天的打卡记录
         LocalDateTime begin = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
-        LocalDateTime end = LocalDateTime.of(LocalDate.now(),LocalTime.MAX);
-        lambdaQueryWrapper.between(Attendance::getCreateDate,begin,end);
-        return count(lambdaQueryWrapper);
+        LocalDateTime end = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+        lambdaQueryWrapper.between(Attendance::getCreateDate, begin, end);
+        lambdaQueryWrapper.last("LIMIT 1");
+        return getOne(lambdaQueryWrapper);
     }
 
     /**

+ 15 - 14
lift-enterprise-service/src/main/resources/mapper/oa/AttendanceMapper.xml

@@ -48,12 +48,12 @@
 			<if test="cond.clockTime != null">
 				AND date(att.create_date) = #{cond.clockTime}
 			</if>
-			<!--<if test="cond.begin != null">-->
-				<!--AND date(att.create_date) &gt;= #{cond.begin}-->
-			<!--</if>-->
-			<!--<if test="cond.end != null">-->
-				<!--AND date(att.create_date) &lt;= #{cond.end}-->
-			<!--</if>-->
+			<if test="cond.begin != null">
+				AND date(att.create_date) &gt;= #{cond.begin}
+			</if>
+			<if test="cond.end != null">
+				AND date(att.create_date) &lt;= #{cond.end}
+			</if>
 		</where>
 	</select>
 
@@ -71,7 +71,7 @@
         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">
+            <if test="cond.ids != null and cond.ids.size > 0">
                 AND att.id IN
                 <foreach collection="cond.ids" item="id" open="(" separator="," close=")">
                     #{id}
@@ -85,7 +85,7 @@
 			att.*,
 			ui.name AS username
 		FROM attendance att
-		LEFT JOIN user_info ui ON att.user_id = ui.user_id
+		    LEFT JOIN user_info ui ON att.user_id = ui.user_id
 		<where>
 			<if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">
 				AND att.mt_company_id = #{cond.mtCompanyId}
@@ -96,14 +96,15 @@
 			<if test="cond.clockTime != null">
 				AND date(att.create_date) = #{cond.clockTime}
 			</if>
-			<!--<if test="cond.begin != null">-->
-				<!--AND att.create_date &gt; #{cond.begin}-->
-			<!--</if>-->
-			<!--<if test="cond.end != null">-->
-				<!--AND att.create_date &lt; #{cond.end}-->
-			<!--</if>-->
+			<if test="cond.begin != null">
+				AND att.create_date &gt; #{cond.begin}
+			</if>
+			<if test="cond.end != null">
+				AND att.create_date &lt; #{cond.end}
+			</if>
 		</where>
 	</select>
+
 	<select id="infoById" resultMap="BaseResultMap" parameterType="cn.com.ty.lift.enterprise.oa.dto.AttendanceRequest">
 		SELECT
 			att.*,

+ 15 - 3
lift-push/src/main/java/cn/com/ty/lift/push/app/XingePush.java

@@ -165,6 +165,18 @@ public class XingePush {
             return this.getPlatform() == Platform.ios.getType();
         }
 
+        public boolean isToken(){
+            return this.audienceType == AudienceType.token.getType();
+        }
+
+        public boolean isAccount(){
+            return this.audienceType == AudienceType.account.getType();
+        }
+
+        public boolean isAll(){
+            return this.audienceType == AudienceType.all.getType();
+        }
+
         public PushAppRequest createPushAppRequest() {
             /**
              * https://xg.qq.com/docs/server_api/v3/push_api_v3.html#message%EF%BC%9A%E6%B6%88%E6%81%AF%E4%BD%93
@@ -252,7 +264,7 @@ public class XingePush {
              5)account:单账号推送
              6)account_list:账号列表推送,最多1000 个account
              */
-            if (this.audienceType == AudienceType.all.getType()) {
+            if (this.isAll()) {
                 pushAppRequest.setAudience_type(AudienceType.all);
                 return pushAppRequest;
             } else {
@@ -264,7 +276,7 @@ public class XingePush {
                     log.error("Failed to Create PushAppRequest: the max size of 'toList' is 1000.");
                     return null;
                 }
-                if (this.audienceType == AudienceType.token.getType()) {
+                if (this.isToken()) {
                     if (toList.size() == 1) {
                         pushAppRequest.setAudience_type(AudienceType.token);
                     } else {
@@ -272,7 +284,7 @@ public class XingePush {
                     }
                     pushAppRequest.setToken_list(new ArrayList<>(toList));
                     return pushAppRequest;
-                } else if (this.audienceType == AudienceType.account.getType()) {
+                } else if (this.isAccount()) {
                     if (toList.size() == 1) {
                         pushAppRequest.setAudience_type(AudienceType.account);
                     } else {