Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

xiao547607 4 gadi atpakaļ
vecāks
revīzija
36766e1bb1
24 mainītis faili ar 531 papildinājumiem un 370 dzēšanām
  1. 7 0
      common/src/main/java/com/jpsoft/shinestar/modules/base/dao/MeetingPersonDAO.java
  2. 1 0
      common/src/main/java/com/jpsoft/shinestar/modules/base/dao/MeetingTimeDAO.java
  3. 1 1
      common/src/main/java/com/jpsoft/shinestar/modules/base/dao/PersonInfoDAO.java
  4. 4 1
      common/src/main/java/com/jpsoft/shinestar/modules/base/entity/MeetingPerson.java
  5. 4 1
      common/src/main/java/com/jpsoft/shinestar/modules/base/entity/WorkOver.java
  6. 3 0
      common/src/main/java/com/jpsoft/shinestar/modules/base/service/MeetingPersonService.java
  7. 1 1
      common/src/main/java/com/jpsoft/shinestar/modules/base/service/PersonInfoService.java
  8. 38 21
      common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/MeetingInfoServiceImpl.java
  9. 27 0
      common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/MeetingPersonServiceImpl.java
  10. 2 2
      common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/PersonInfoServiceImpl.java
  11. 1 7
      common/src/main/java/com/jpsoft/shinestar/modules/business/dao/MeetingPersonRecodeDAO.java
  12. 1 6
      common/src/main/java/com/jpsoft/shinestar/modules/business/service/MeetingPersonRecodeService.java
  13. 51 43
      common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/MeetingPersonRecodeServiceImpl.java
  14. 1 1
      common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/RequestForLeaveInfoServiceImpl.java
  15. 11 1
      common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/WorkScheduleAttendanceServiceImpl.java
  16. 1 1
      common/src/main/java/com/jpsoft/shinestar/modules/pacs/service/impl/GuardServiceImpl.java
  17. 192 92
      common/src/main/resources/mapper/base/MeetingPerson.xml
  18. 14 1
      common/src/main/resources/mapper/base/MeetingTime.xml
  19. 6 2
      common/src/main/resources/mapper/base/PersonInfo.xml
  20. 10 61
      common/src/main/resources/mapper/business/MeetingPersonRecode.xml
  21. 31 36
      web/src/main/java/com/jpsoft/shinestar/modules/base/controller/MeetingInfoController.java
  22. 17 0
      web/src/main/java/com/jpsoft/shinestar/modules/base/controller/WorkOverController.java
  23. 103 88
      web/src/main/java/com/jpsoft/shinestar/modules/business/controller/MeetingPersonRecodeController.java
  24. 4 4
      web/src/main/java/com/jpsoft/shinestar/mq/listener/PersonNotificationListener.java

+ 7 - 0
common/src/main/java/com/jpsoft/shinestar/modules/base/dao/MeetingPersonDAO.java

@@ -1,6 +1,8 @@
 package com.jpsoft.shinestar.modules.base.dao;
 
 import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import com.jpsoft.shinestar.modules.base.entity.MeetingPerson;
 import java.util.Map;
@@ -15,5 +17,10 @@ public interface MeetingPersonDAO {
 	int delete(String id);
 	List<MeetingPerson> list();
 	List<MeetingPerson> findByMeetingId(String meetingId);
+	MeetingPerson findByMeetingIdAndPersonId(@Param("meetingId") String meetingId, @Param("personId")Long personId);
 	List<MeetingPerson> search(Map<String, Object> searchParams, List<Sort> sortList);
+    List<Map> realToSearch(Map<String, Object> searchParams, List<Sort> sortList);
+	List<MeetingPerson> absentSearch(Map<String, Object> searchParams, List<Sort> sortList);
+	List<Map> lateSearch(Map<String, Object> searchParams, List<Sort> sortList);
+    int deleteByMeetingId(String meetingId);
 }

+ 1 - 0
common/src/main/java/com/jpsoft/shinestar/modules/base/dao/MeetingTimeDAO.java

@@ -17,6 +17,7 @@ public interface MeetingTimeDAO {
 	MeetingTime get(String id);
 	int delete(String id);
 	List<MeetingTime> list();
+	List<MeetingTime> findByMeetingIdAndStatus(String meetingId,String status);
 	List<MeetingTime> findByMeetingId(String meetingId);
 	List<MeetingTime> search(Map<String, Object> searchParams, List<Sort> sortList);
 }

+ 1 - 1
common/src/main/java/com/jpsoft/shinestar/modules/base/dao/PersonInfoDAO.java

@@ -24,7 +24,7 @@ public interface PersonInfoDAO {
     PersonInfo findByNameAndPhone(String name, String phone);
 	PersonInfo findByOpenId(String openId);
     List<PersonInfo> findByCompanyId(String companyId);
-	List<PersonInfo> findListByCompanyCode(String companyId);
+	List<PersonInfo> findListByCompanyCode(String companyCode);
 	List<PersonInfo> findByCompanyIdAndPopedom(@Param("type") String type, @Param("companyId") String companyId);
     long countByCompanyCode(String code, Long personId);
 

+ 4 - 1
common/src/main/java/com/jpsoft/shinestar/modules/base/entity/MeetingPerson.java

@@ -22,5 +22,8 @@ public class MeetingPerson {
 	private String updateBy;
 	private Date updateTime;
 	private Boolean delFlag;
-
+	private Date signTime;
+	private String signType;
+	private String personName;
+	private String companyName;
 }

+ 4 - 1
common/src/main/java/com/jpsoft/shinestar/modules/base/entity/WorkOver.java

@@ -4,6 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import java.text.SimpleDateFormat;
 import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
 
 import com.jpsoft.shinestar.modules.common.utils.TypeNameUtil;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -97,5 +99,6 @@ public class WorkOver {
     }
 
     private String overPersonNames;
-
+    private String overPersonIds;
+    private List<Map> overPerson;
 }

+ 3 - 0
common/src/main/java/com/jpsoft/shinestar/modules/base/service/MeetingPersonService.java

@@ -15,4 +15,7 @@ public interface MeetingPersonService {
 	List<MeetingPerson> list();
 	List<MeetingPerson> findByMeetingId(String meetingId);
 	Page<MeetingPerson> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+	Page<Map> realToSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList);
+	Page<MeetingPerson> absentSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList);
+	Page<Map> lateSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList);
 }

+ 1 - 1
common/src/main/java/com/jpsoft/shinestar/modules/base/service/PersonInfoService.java

@@ -25,7 +25,7 @@ public interface PersonInfoService {
 	PersonInfo findByOpenId(String openId);
 
     List<PersonInfo> findByCompanyId(String companyId);
-	List<PersonInfo> findListByCompanyCode(String companyId);
+	List<PersonInfo> findListByCompanyCode(String companyCode);
 	List<PersonInfo> findByCompanyIdAndPopedom(String type, String companyId);
 
 	PersonInfo getIgnoreDelFlag(Long id);

+ 38 - 21
common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/MeetingInfoServiceImpl.java

@@ -1,8 +1,6 @@
 package com.jpsoft.shinestar.modules.base.service.impl;
 
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 import javax.annotation.Resource;
 
 import com.jpsoft.shinestar.modules.base.dao.MeetingAddressDAO;
@@ -201,30 +199,49 @@ public class MeetingInfoServiceImpl implements MeetingInfoService {
 				meetingTimeDAO.insert(meetingTime);
 			}
 
+			//原参会人员
+			List<MeetingPerson> meetingPersonList = meetingPersonDAO.findByMeetingId(model.getId());
 
+			//新参会人员
+			Set<Long> selectPersonSet = new HashSet<>();
 
-			//人员相关
-			List<MeetingPerson> meetingPersonList = meetingPersonDAO.findByMeetingId(model.getId());
+			if(StringUtils.isNotEmpty(model.getSelectPersonKey())) {
+				String[] selectPersonKeyArray = model.getSelectPersonKey().split(",");
+
+				for (String key : selectPersonKeyArray) {
+					selectPersonSet.add(Long.valueOf(key));
+				}
+			}
+
+			Set<Long> meetingPersonSet = new HashSet<>();
 
-			//先删除原绑定人员
-			for (MeetingPerson meetingPerson:meetingPersonList) {
-				meetingPerson.setDelFlag(true);
-				meetingPerson.setUpdateBy(model.getUpdateBy());
-				meetingPerson.setUpdateTime(model.getUpdateTime());
-				meetingPersonDAO.update(meetingPerson);
+			for (MeetingPerson meetingPerson : meetingPersonList) {
+				//原先参会人员被删除
+				if(!selectPersonSet.contains(meetingPerson.getPersonId())){
+					meetingPerson.setDelFlag(true);
+					meetingPerson.setUpdateBy(model.getUpdateBy());
+					meetingPerson.setUpdateTime(model.getUpdateTime());
+					meetingPersonDAO.update(meetingPerson);
+				}
+				else {
+					//当前参会人员
+					meetingPersonSet.add(meetingPerson.getPersonId());
+				}
 			}
 
 			if(StringUtils.isNotEmpty(model.getSelectPersonKey())){
-				String[] selectPersonKeyArray = model.getSelectPersonKey().split(",");
-				for (String key :selectPersonKeyArray) {
-					MeetingPerson meetingPerson = new MeetingPerson();
-					meetingPerson.setId(UUID.randomUUID().toString());
-					meetingPerson.setCreateBy(model.getCreateBy());
-					meetingPerson.setCreateTime(model.getCreateTime());
-					meetingPerson.setDelFlag(false);
-					meetingPerson.setPersonId(Long.parseLong(key));
-					meetingPerson.setMeetingInfoId(model.getId());
-					meetingPersonDAO.insert(meetingPerson);
+				for (Long personId : selectPersonSet) {
+					//新参会人员
+					if(!meetingPersonSet.contains(personId)) {
+						MeetingPerson meetingPerson = new MeetingPerson();
+						meetingPerson.setId(UUID.randomUUID().toString());
+						meetingPerson.setCreateBy(model.getCreateBy());
+						meetingPerson.setCreateTime(model.getCreateTime());
+						meetingPerson.setDelFlag(false);
+						meetingPerson.setPersonId(personId);
+						meetingPerson.setMeetingInfoId(model.getId());
+						meetingPersonDAO.insert(meetingPerson);
+					}
 				}
 			}
 

+ 27 - 0
common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/MeetingPersonServiceImpl.java

@@ -73,4 +73,31 @@ public class MeetingPersonServiceImpl implements MeetingPersonService {
         return page;
 	}
 
+
+	@Override
+	public Page<Map> realToSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList) {
+		Page<Map> page = PageHelper.startPage(pageIndex,pageSize,count).doSelectPage(()->{
+			meetingPersonDAO.realToSearch(searchParams,sortList);
+		});
+
+		return page;
+	}
+
+	@Override
+	public Page<MeetingPerson> absentSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList) {
+		Page<MeetingPerson> page = PageHelper.startPage(pageIndex,pageSize,count).doSelectPage(()->{
+			meetingPersonDAO.absentSearch(searchParams,sortList);
+		});
+
+		return page;
+	}
+
+	@Override
+	public Page<Map> lateSearch(Map<String, Object> searchParams, int pageIndex, int pageSize, boolean count, List<Sort> sortList) {
+		Page<Map> page = PageHelper.startPage(pageIndex,pageSize,count).doSelectPage(()->{
+			meetingPersonDAO.lateSearch(searchParams,sortList);
+		});
+
+		return page;
+	}
 }

+ 2 - 2
common/src/main/java/com/jpsoft/shinestar/modules/base/service/impl/PersonInfoServiceImpl.java

@@ -130,8 +130,8 @@ public class PersonInfoServiceImpl implements PersonInfoService {
     }
 
     @Override
-    public List<PersonInfo> findListByCompanyCode(String companyId){
-        return personInfoDAO.findListByCompanyCode(companyId);
+    public List<PersonInfo> findListByCompanyCode(String companyCode){
+        return personInfoDAO.findListByCompanyCode(companyCode);
     }
 
     @Override

+ 1 - 7
common/src/main/java/com/jpsoft/shinestar/modules/business/dao/MeetingPersonRecodeDAO.java

@@ -19,13 +19,7 @@ public interface MeetingPersonRecodeDAO {
 	List<MeetingPersonRecode> list();
 	MeetingPersonRecode findByMeetingIdAndSignTime(@Param("meetingId") String meetingId, @Param("personId") Long personId,@Param("startTime")Date startTime, @Param("endTime")Date endTime,@Param("signType")String signType);
 	List<MeetingPersonRecode> search(Map<String, Object> searchParams, List<Sort> sortList);
-
-	List<Map> realToSearch(Map<String, Object> searchParams, List<Sort> sortList);
-	List<Map> noAbsentSearch(Map<String, Object> searchParams, List<Sort> sortList);
-
-
-	List<Map> lateSearch(Map<String, Object> searchParams, List<Sort> sortList);
-	List<Map> leaveEarlySearch(Map<String, Object> searchParams, List<Sort> sortList);
+//	List<Map> leaveEarlySearch(Map<String, Object> searchParams, List<Sort> sortList);
 	List<Map> meetingRecordPageList(Map<String, Object> searchParams, List<Sort> sortList);
     List<MeetingPersonRecode> findByPersonIdAndSignTime(Long personId, Date startDate, Date endDate);
 }

+ 1 - 6
common/src/main/java/com/jpsoft/shinestar/modules/business/service/MeetingPersonRecodeService.java

@@ -17,12 +17,7 @@ public interface MeetingPersonRecodeService {
 	List<MeetingPersonRecode> list();
 	boolean punchIn(String deviceNo, Long personId, Date recordTime) throws ParseException;
 	Page<MeetingPersonRecode> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
-	Page<Map> realToSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList);
-	Page<Map> noAbsentSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList);
-	Page<Map> lateSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList);
-	Page<Map> leaveEarlySearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList);
-
+//	Page<Map> leaveEarlySearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList);
 	Page<Map> meetingRecordPageList(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
-
     Map<String, Object> findByPersonIdAndDate(Long personId, Date attendanceDate);
 }

+ 51 - 43
common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/MeetingPersonRecodeServiceImpl.java

@@ -102,29 +102,33 @@ public class MeetingPersonRecodeServiceImpl implements MeetingPersonRecodeServic
 			List<MeetingAddress> list = meetingAddressDAO.findByAddressId(addressId);
 
 			for (MeetingAddress meetingAddress:list) {
-				List<MeetingTime> meetingTimeList = meetingTimeDAO.findByMeetingId(meetingAddress.getMeetingId());
+				List<MeetingTime> meetingTimeList = meetingTimeDAO.findByMeetingIdAndStatus(meetingAddress.getMeetingId(),"1,2");
 
 				for (MeetingTime meetingTime:meetingTimeList) {
 					Date meetingDate = meetingTime.getMeetingDate();
 					String meetingDateStr = sdf.format(meetingDate);
 
 					String startTimeStr = meetingTime.getStartSignInTime();
+                    String meetingTimeStr =  meetingTime.getMeetingTime();
+
 					if(StringUtils.isNotEmpty(startTimeStr)) {
 						Boolean flag = isInSignInTime(meetingTime.getMeetingId(),personId,"0",startTimeStr,meetingDateStr,recordTime);
 						//如果在签到时间范围内
 						if(flag){
-							List<MeetingPerson> meetingPersonList = meetingPersonDAO.findByMeetingId(meetingTime.getMeetingId());
-
-							boolean isSignPerson = false;
+							MeetingPerson meetingPerson = meetingPersonDAO.findByMeetingIdAndPersonId(meetingTime.getMeetingId(),personId);
 
-							for (MeetingPerson meetingPerson:meetingPersonList) {
-								if(meetingPerson.getPersonId() == personId){
-									isSignPerson = true;
-									break;
+							if(meetingPerson !=null){
+								if(meetingPerson.getSignTime()==null){
+									meetingPerson.setSignTime(recordTime);
+								}
+								else if(recordTime.before(meetingPerson.getSignTime())){
+									meetingPerson.setSignTime(recordTime);
 								}
-							}
 
-							if(isSignPerson) {
+								meetingPerson.setUpdateTime(new Date());
+								meetingPerson.setSignType("0");
+								meetingPersonDAO.update(meetingPerson);
+
 								MeetingPersonRecode meetingPersonRecode = new MeetingPersonRecode();
 								meetingPersonRecode.setId(UUID.randomUUID().toString());
 								meetingPersonRecode.setMeetingInfoId(meetingTime.getMeetingId());
@@ -140,20 +144,49 @@ public class MeetingPersonRecodeServiceImpl implements MeetingPersonRecodeServic
 						}
 					}
 
+					//会议中打卡
+                    if(StringUtils.isNotEmpty(meetingTimeStr)) {
+                        Boolean flag = isInSignInTime(meetingTime.getMeetingId(),personId,"2",meetingTimeStr,meetingDateStr,recordTime);
+                        //如果在会议中时间范围内
+                        if(flag){
+                            MeetingPerson meetingPerson = meetingPersonDAO.findByMeetingIdAndPersonId(meetingTime.getMeetingId(),personId);
+
+                            if(meetingPerson !=null){
+								if(meetingPerson.getSignTime()==null){
+									meetingPerson.setSignTime(recordTime);
+									meetingPerson.setUpdateTime(new Date());
+									meetingPerson.setSignType("2");
+
+									meetingPersonDAO.update(meetingPerson);
+
+									MeetingPersonRecode meetingPersonRecode = new MeetingPersonRecode();
+									meetingPersonRecode.setId(UUID.randomUUID().toString());
+									meetingPersonRecode.setMeetingInfoId(meetingTime.getMeetingId());
+									meetingPersonRecode.setCreateTime(new Date());
+									meetingPersonRecode.setDelFlag(false);
+									meetingPersonRecode.setPersonId(personId);
+									meetingPersonRecode.setSignTime(recordTime);
+									meetingPersonRecode.setSignType("2");
+									meetingPersonRecodeDAO.insert(meetingPersonRecode);
+									result = true;
+									break;
+								}
+                            }
+                        }
+                    }
+
 					String endTimeStr = meetingTime.getEndSignInTime();
+
 					if(StringUtils.isNotEmpty(endTimeStr)) {
 						Boolean flag = isInSignInTime(meetingTime.getMeetingId(),personId,"1",endTimeStr,meetingDateStr,recordTime);
 						//如果在签到时间范围内
 						if(flag){
-							List<MeetingPerson> meetingPersonList = meetingPersonDAO.findByMeetingId(meetingTime.getMeetingId());
+							MeetingPerson meetingPerson = meetingPersonDAO.findByMeetingIdAndPersonId(meetingTime.getMeetingId(),personId);
 
 							boolean isSignPerson = false;
 
-							for (MeetingPerson meetingPerson:meetingPersonList) {
-								if(meetingPerson.getPersonId() == personId){
-									isSignPerson = true;
-									break;
-								}
+							if(meetingPerson !=null){
+								isSignPerson = true;
 							}
 
 							if(isSignPerson) {
@@ -215,38 +248,13 @@ public class MeetingPersonRecodeServiceImpl implements MeetingPersonRecodeServic
         return page;
 	}
 
-	@Override
-	public Page<Map> realToSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
-		Page<Map> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
-			meetingPersonRecodeDAO.realToSearch(searchParams,sortList);
-		});
-		return page;
-	}
-
-	@Override
-	public Page<Map> noAbsentSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
-		Page<Map> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
-			meetingPersonRecodeDAO.noAbsentSearch(searchParams,sortList);
-		});
-		return page;
-	}
-
-
-	@Override
-	public Page<Map> lateSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
-		Page<Map> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
-			meetingPersonRecodeDAO.lateSearch(searchParams,sortList);
-		});
-		return page;
-	}
-
-	@Override
+/*	@Override
 	public Page<Map> leaveEarlySearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
 		Page<Map> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
 			meetingPersonRecodeDAO.leaveEarlySearch(searchParams,sortList);
 		});
 		return page;
-	}
+	}*/
 
 	@Override
 	public Page<Map> meetingRecordPageList(Map<String, Object> searchParams, int pageNumber, int pageSize, boolean count, List<Sort> sortList){

+ 1 - 1
common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/RequestForLeaveInfoServiceImpl.java

@@ -652,7 +652,7 @@ public class RequestForLeaveInfoServiceImpl implements RequestForLeaveInfoServic
 						return message;
 					});
 
-			Long millisecond2  = DateUtil.betweenMs(DateUtil.date(),end);
+			Long millisecond2  = DateUtil.betweenMs(DateUtil.date(),end)+60000;
 			rabbitTemplate.convertAndSend("requestForLeaveDelayExchange", "submit",
 					requestForLeaveInfo.getId(), (message)->{
 						message.getMessageProperties().setHeader("x-delay",millisecond2);

+ 11 - 1
common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/WorkScheduleAttendanceServiceImpl.java

@@ -384,6 +384,11 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
                 }
             }
 
+            //如果是状态是请假,但正常打卡则工作状态算上班
+            if("4".equals(workStatus)){
+                workStatus = "1";
+            }
+
             //记录上班打卡
             saveWorkAttendance(personId, temperature, recordTime, date.toString("yyyy-MM-dd"), workPersonScheduling.getId(),
                     workBeginShift.getId(), result, minutes, "1", workStatus);
@@ -437,7 +442,7 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
             //说明下班后被安排了加班
              workOver = workOverService.get(workOverPerson.getWorkOverId());
 
-            if(workOver!=null && "1".equals(workOver.getStatus()) && workOver.getHours()!=null) {
+            if(workOver!=null && workOver.getHours()!=null) {
                 endTime = endTime.plusHours(workOver.getHours());
             }
         }
@@ -515,6 +520,11 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
                 }
             }
 
+            //如果是状态是请假,但正常打卡则工作状态算上班
+            if("4".equals(workStatus)){
+                workStatus = "1";
+            }
+
             saveWorkAttendance(personId, temperature, recordTime, date.toString("yyyy-MM-dd"), workPersonScheduling.getId(),
                     workEndShift.getId(), result, minutes, "2", workStatus,workOverPerson);
 

+ 1 - 1
common/src/main/java/com/jpsoft/shinestar/modules/pacs/service/impl/GuardServiceImpl.java

@@ -366,7 +366,7 @@ public class GuardServiceImpl implements IGuardService {
 
                 pacsMsgResults.add(pacsMsgResult);
             } catch (OfflineException e) {
-                log.error(e.getMessage());
+                log.error(e.getMessage() + ",personId={},deviceIds={}",personId,deviceIds);
                 pacsMsgResult.setSuccess(false);
                 pacsMsgResult.setMsg(e.getMessage());
 

+ 192 - 92
common/src/main/resources/mapper/base/MeetingPerson.xml

@@ -1,102 +1,202 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.shinestar.modules.base.dao.MeetingPersonDAO">
-	<resultMap id="MeetingPersonMap" type="com.jpsoft.shinestar.modules.base.entity.MeetingPerson">
-		<id property="id" column="id_" />
-			<result property="personId" column="person_id" />
-			<result property="meetingInfoId" column="meetingInfo_id" />
-			<result property="createBy" column="create_by" />
-			<result property="createTime" column="create_time" />
-			<result property="updateBy" column="update_by" />
-			<result property="updateTime" column="update_time" />
-			<result property="delFlag" column="del_flag" />
-			</resultMap>
-	<insert id="insert" parameterType="MeetingPerson">
-	<!--
-	<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
-		select sys_guid() from dual
-	</selectKey>
-	-->
-	<![CDATA[
+    <resultMap id="MeetingPersonMap" type="com.jpsoft.shinestar.modules.base.entity.MeetingPerson">
+        <id property="id" column="id_"/>
+        <result property="personId" column="person_id"/>
+        <result property="meetingInfoId" column="meetingInfo_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="signTime" column="sign_time"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="signType" column="sign_type"/>
+        <result property="personName" column="person_name"/>
+        <result property="companyName" column="company_name"/>
+    </resultMap>
+    <insert id="insert" parameterType="com.jpsoft.shinestar.modules.base.entity.MeetingPerson">
+        <!--
+        <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
+            select sys_guid() from dual
+        </selectKey>
+        -->
+        <![CDATA[
 		insert into base_meeting_person
-	    (id_,person_id,meetingInfo_id,create_by,create_time,update_by,update_time,del_flag)
+	    (id_,person_id,meetingInfo_id,create_by,create_time,update_by,update_time,del_flag,sign_time,sign_type)
 		values
 		(
-#{id,jdbcType=VARCHAR}
-,#{personId,jdbcType= NUMERIC }
-,#{meetingInfoId,jdbcType=VARCHAR}
-,#{createBy,jdbcType=VARCHAR}
-,#{createTime,jdbcType= TIMESTAMP }
-,#{updateBy,jdbcType=VARCHAR}
-,#{updateTime,jdbcType= TIMESTAMP }
-,#{delFlag,jdbcType= NUMERIC }
+            #{id,jdbcType=VARCHAR}
+            ,#{personId,jdbcType= NUMERIC }
+            ,#{meetingInfoId,jdbcType=VARCHAR}
+            ,#{createBy,jdbcType=VARCHAR}
+            ,#{createTime,jdbcType= TIMESTAMP }
+            ,#{updateBy,jdbcType=VARCHAR}
+            ,#{updateTime,jdbcType= TIMESTAMP }
+            ,#{delFlag,jdbcType= NUMERIC }
+            ,#{signTime,jdbcType= TIMESTAMP }
+            ,#{signType,jdbcType=VARCHAR}
 		)
 	]]>
-	</insert>
-	<delete id="delete" parameterType="string">
-		delete from base_meeting_person where id_=#{id,jdbcType=VARCHAR}
-	</delete>
-	<update id="update" parameterType="MeetingPerson">
-		update base_meeting_person
-		<set>
-				<if test="personId!=null">
-		person_id=#{personId,jdbcType= NUMERIC },
-		</if>
-				<if test="meetingInfoId!=null">
-		meetingInfo_id=#{meetingInfoId,jdbcType=VARCHAR},
-		</if>
-				<if test="createBy!=null">
-		create_by=#{createBy,jdbcType=VARCHAR},
-		</if>
-				<if test="createTime!=null">
-		create_time=#{createTime,jdbcType= TIMESTAMP },
-		</if>
-				<if test="updateBy!=null">
-		update_by=#{updateBy,jdbcType=VARCHAR},
-		</if>
-				<if test="updateTime!=null">
-		update_time=#{updateTime,jdbcType= TIMESTAMP },
-		</if>
-				<if test="delFlag!=null">
-		del_flag=#{delFlag,jdbcType= NUMERIC },
-		</if>
-		</set>
-	where id_=#{id}
-	</update>
-	<select id="get" parameterType="string" resultMap="MeetingPersonMap">
-		select 
-id_,person_id,meetingInfo_id,create_by,create_time,update_by,update_time,del_flag		from base_meeting_person where id_=#{0}
-	</select>
-	<select id="exist" parameterType="string" resultType="int">
-		select count(*) from base_meeting_person where id_=#{0}
-	</select>
-	<select id="list" resultMap="MeetingPersonMap">
-		select * from base_meeting_person
-	</select>
-	<select id="findByMeetingId" resultMap="MeetingPersonMap">
-		select * from base_meeting_person where del_flag=false and meetingInfo_id=#{0}
-	</select>
-	<select id="search" parameterType="hashmap" resultMap="MeetingPersonMap">
-		<![CDATA[
-			select * from base_meeting_person
+    </insert>
+    <delete id="delete" parameterType="string">
+        delete from base_meeting_person where id_=#{id,jdbcType=VARCHAR}
+    </delete>
+    <update id="deleteByMeetingId">
+        update base_meeting_person set del_flag=1
+        where
+        meetingInfo_id=#{meetingId,jdbcType=VARCHAR}
+    </update>
+    <update id="update" parameterType="com.jpsoft.shinestar.modules.base.entity.MeetingPerson">
+        update base_meeting_person
+        <set>
+            <if test="personId!=null">
+                person_id=#{personId,jdbcType= NUMERIC },
+            </if>
+            <if test="meetingInfoId!=null">
+                meetingInfo_id=#{meetingInfoId,jdbcType=VARCHAR},
+            </if>
+            <if test="createBy!=null">
+                create_by=#{createBy,jdbcType=VARCHAR},
+            </if>
+            <if test="createTime!=null">
+                create_time=#{createTime,jdbcType= TIMESTAMP },
+            </if>
+            <if test="updateBy!=null">
+                update_by=#{updateBy,jdbcType=VARCHAR},
+            </if>
+            <if test="updateTime!=null">
+                update_time=#{updateTime,jdbcType= TIMESTAMP },
+            </if>
+            <if test="delFlag!=null">
+                del_flag=#{delFlag,jdbcType= NUMERIC },
+            </if>
+            <if test="signTime!=null">
+                sign_time=#{signTime,jdbcType= TIMESTAMP },
+            </if>
+            <if test="signType!=null">
+                sign_type=#{signType,jdbcType= VARCHAR },
+            </if>
+        </set>
+        where id_=#{id}
+    </update>
+    <select id="get" parameterType="string" resultMap="MeetingPersonMap">
+        select * from base_meeting_person where id_=#{0}
+    </select>
+    <select id="exist" parameterType="string" resultType="int">
+        select count(*) from base_meeting_person where id_=#{0}
+    </select>
+    <select id="list" resultMap="MeetingPersonMap">
+        select * from base_meeting_person
+    </select>
+    <select id="findByMeetingId" resultMap="MeetingPersonMap">
+        select a.*,
+        b.name_ as person_name,
+        c.name_ as company_name
+        from base_meeting_person a
+        inner join base_person_info b on a.person_id = b.id_
+        inner join base_company_info c on b.company_id = c.id_
+        where a.del_flag=false
+        and a.meetingInfo_id=#{0}
+    </select>
+    <select id="findByMeetingIdAndPersonId" resultMap="MeetingPersonMap">
+        select * from base_meeting_person where del_flag=false and meetingInfo_id = #{meetingId} and person_id =
+        #{personId} limit 1
+    </select>
+    <select id="search" parameterType="hashmap" resultMap="MeetingPersonMap">
+        <![CDATA[
+			select a.* from base_meeting_person a inner join base_person_info b on a.person_id = b.id_
 		]]>
-		<where>
-			del_flag = false
-			<if test="searchParams.meetingId != null">
-				and meetingInfo_id = #{searchParams.meetingId}
-			</if>
-			<if test="searchParams.personIdList!=null">
-				<foreach collection="searchParams.personIdList" index="index" item="item" open=" and person_id not in (" separator="," close=")">
-					#{item}
-				</foreach>
-			</if>
-		</where>
-		<foreach item="sort" collection="sortList"  open="order by" separator=",">
-	        ${sort.name} ${sort.order}
-	 	</foreach>
-	</select>
-
-
+        <where>
+            a.del_flag = false and b.del_flag = false
+            <if test="searchParams.meetingId != null">
+                and a.meetingInfo_id = #{searchParams.meetingId}
+            </if>
+            <if test="searchParams.name != null">
+                and b.name_ like #{searchParams.name}
+            </if>
+            <if test="searchParams.jobNumber != null">
+                and b.job_number like #{searchParams.jobNumber}
+            </if>
+            <if test="searchParams.personIdList!=null">
+                <foreach collection="searchParams.personIdList" index="index" item="item" open=" and a.person_id not in ("
+                         separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        <foreach item="sort" collection="sortList" open="order by" separator=",">
+            ${sort.name} ${sort.order}
+        </foreach>
+    </select>
+    <select id="absentSearch" parameterType="hashmap" resultMap="MeetingPersonMap">
+        <![CDATA[
+			select a.*
+			FROM base_meeting_person a
+			inner join base_person_info b on a.person_id = b.id_
+		]]>
+        <where>
+            a.del_flag=0 and b.del_flag = 0 and a.sign_time is null
+            <if test="searchParams.meetingId != null">
+                and a.meetingInfo_id = #{searchParams.meetingId}
+            </if>
+            <if test="searchParams.name != null">
+                and b.name_ like #{searchParams.name}
+            </if>
+            <if test="searchParams.jobNumber != null">
+                and b.job_number like #{searchParams.jobNumber}
+            </if>
+        </where>
+        <foreach item="sort" collection="sortList"  open="order by" separator=",">
+            ${sort.name} ${sort.order}
+        </foreach>
+        <!--and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') is not null-->
+    </select>
+    <select id="realToSearch" parameterType="hashmap" resultType="java.util.HashMap">
+        <![CDATA[
+			select a.person_id,a.sign_time
+			FROM base_meeting_person a
+			inner join base_person_info b on a.person_id = b.id_
+		]]>
+        <where>
+            a.del_flag = 0 and b.del_flag = 0 and a.sign_time is not null
+            <if test="searchParams.meetingId != null">
+                and a.meetingInfo_id = #{searchParams.meetingId}
+            </if>
+            <if test="searchParams.name != null">
+                and b.name_ like #{searchParams.name}
+            </if>
+            <if test="searchParams.jobNumber != null">
+                and b.job_number like #{searchParams.jobNumber}
+            </if>
+        </where>
+        <foreach item="sort" collection="sortList"  open="order by" separator=",">
+            ${sort.name} ${sort.order}
+        </foreach>
+        <!--and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') is not null-->
+    </select>
+    <select id="lateSearch" parameterType="hashmap" resultType="java.util.HashMap">
+        <![CDATA[
+			select a.person_id,a.sign_time
+			from base_meeting_person a
+			inner join base_person_info b on a.person_id = b.id_
+		]]>
+        <where>
+            a.del_flag=0 and b.del_flag = 0 and a.sign_type='2'
+            <if test="searchParams.meetingId != null">
+                and a.meetingInfo_id = #{searchParams.meetingId}
+            </if>
+            <if test="searchParams.name != null">
+                and b.name_ like #{searchParams.name}
+            </if>
+            <if test="searchParams.jobNumber != null">
+                and b.job_number like #{searchParams.jobNumber}
+            </if>
+        </where>
+        <foreach item="sort" collection="sortList"  open="order by" separator=",">
+            ${sort.name} ${sort.order}
+        </foreach>
+    </select>
 </mapper>

+ 14 - 1
common/src/main/resources/mapper/base/MeetingTime.xml

@@ -90,8 +90,21 @@ id_,meeting_id,meeting_date,meeting_time,start_sign_in_time,end_sign_in_time,cre
 	<select id="list" resultMap="MeetingTimeMap">
 		select * from base_meeting_time
 	</select>
+	<select id="findByMeetingIdAndStatus" resultMap="MeetingTimeMap">
+		select t1.* from base_meeting_time t1
+		inner join base_meeting_info t2 on t1.meeting_id = t2.id_ and t2.del_flag=0
+		where
+		t1.del_flag=0
+		and t1.meeting_id=#{meetingId}
+		and find_in_set(t2.status_,#{status})>0
+	</select>
 	<select id="findByMeetingId" resultMap="MeetingTimeMap">
-		select * from base_meeting_time where del_flag=false and meeting_id=#{0}
+		select t1.* from base_meeting_time t1
+		inner join base_meeting_info t2 on t1.meeting_id = t2.id_ and t2.del_flag=0
+		where
+		t1.del_flag=0
+		and
+		t1.meeting_id=#{0}
 	</select>
 	<select id="search" parameterType="hashmap" resultMap="MeetingTimeMap">
 		<![CDATA[

+ 6 - 2
common/src/main/resources/mapper/base/PersonInfo.xml

@@ -520,9 +520,13 @@
         order by a.id_ asc
     </select>
     <select id="findListByCompanyCode" resultMap="PersonInfoMap">
-        select a.* from base_person_info a left join base_company_info b on a.company_id = b.id_
+        select a.*,b.name_ as company_name
+        from base_person_info
+        a left join base_company_info b on a.company_id = b.id_
         where
-        b.code_ like #{companyId} and a.del_flag = 0 and b.del_flag = 0
+        b.code_ like #{companyCode}
+        and a.del_flag = 0
+        and b.del_flag = 0
         order by a.id_ asc
     </select>
     <select id="findByCompanyIdAndPopedom" resultMap="PersonInfoMap">

+ 10 - 61
common/src/main/resources/mapper/business/MeetingPersonRecode.xml

@@ -92,7 +92,6 @@
 			and sign_time >= #{startTime} and sign_time <= #{endTime} limit 1
 		]]>
 	</select>
-
 	<select id="search" parameterType="hashmap" resultMap="MeetingPersonRecodeMap">
 		<![CDATA[
 			select * from business_meeting_person_recode
@@ -106,13 +105,11 @@
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
-
-
-	<select id="noAbsentSearch" parameterType="hashmap" resultType="java.util.HashMap">
+<!--	<select id="noAbsentSearch" parameterType="hashmap" resultType="java.util.HashMap">
 		<![CDATA[
 			select a.person_id,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') as startTime,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') as endTime
+			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0' and meetingInfo_id = #{searchParams.meetingId} limit 1) as startTime,
+			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1' and meetingInfo_id = #{searchParams.meetingId} limit 1) as endTime
 			FROM business_meeting_person_recode a
 		]]>
 		<where>
@@ -124,13 +121,12 @@
 		<foreach item="sort" collection="sortList"  open="order by" separator=",">
 			${sort.name} ${sort.order}
 		</foreach>
-	</select>
-
-	<select id="realToSearch" parameterType="hashmap" resultType="java.util.HashMap">
+	</select>-->
+<!--	<select id="leaveEarlySearch" parameterType="hashmap" resultType="java.util.HashMap">
 		<![CDATA[
 			select a.person_id,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') as startTime,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') as endTime
+			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0' and meetingInfo_id = #{searchParams.meetingId} limit 1) as startTime,
+			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1' and meetingInfo_id = #{searchParams.meetingId} limit 1) as endTime
 			FROM business_meeting_person_recode a
 		]]>
 		<where>
@@ -138,62 +134,15 @@
 				and meetingInfo_id = #{searchParams.meetingId}
 			</if>
 			<![CDATA[
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') is not null
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') is not null
+			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0' and meetingInfo_id = #{searchParams.meetingId} limit 1) is not null
+			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1' and meetingInfo_id = #{searchParams.meetingId} limit 1) is null
 			]]>
 		</where>
 		GROUP BY a.person_id
 		<foreach item="sort" collection="sortList"  open="order by" separator=",">
 			${sort.name} ${sort.order}
 		</foreach>
-
-	</select>
-
-
-	<select id="lateSearch" parameterType="hashmap" resultType="java.util.HashMap">
-		<![CDATA[
-			select a.person_id,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') as startTime,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') as endTime
-			FROM business_meeting_person_recode a
-		]]>
-		<where>
-			<if test="searchParams.meetingId != null">
-				and meetingInfo_id = #{searchParams.meetingId}
-			</if>
-			<![CDATA[
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') is null
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') is not null
-			]]>
-		</where>
-		GROUP BY a.person_id
-		<foreach item="sort" collection="sortList"  open="order by" separator=",">
-			${sort.name} ${sort.order}
-		</foreach>
-
-	</select>
-	<select id="leaveEarlySearch" parameterType="hashmap" resultType="java.util.HashMap">
-		<![CDATA[
-			select a.person_id,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') as startTime,
-			(SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') as endTime
-			FROM business_meeting_person_recode a
-		]]>
-		<where>
-			<if test="searchParams.meetingId != null">
-				and meetingInfo_id = #{searchParams.meetingId}
-			</if>
-			<![CDATA[
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='0') is not null
-			and (SELECT b.sign_time FROM business_meeting_person_recode b  WHERE b.person_id = a.person_id and b.sign_type='1') is null
-			]]>
-		</where>
-		GROUP BY a.person_id
-		<foreach item="sort" collection="sortList"  open="order by" separator=",">
-			${sort.name} ${sort.order}
-		</foreach>
-
-	</select>
+	</select>-->
 	<select id="meetingRecordPageList" parameterType="hashmap" resultType="java.util.HashMap">
 		<![CDATA[
 			SELECT a.name_ as name,a.id_ as id,a.status_ as status,

+ 31 - 36
web/src/main/java/com/jpsoft/shinestar/modules/base/controller/MeetingInfoController.java

@@ -136,10 +136,11 @@ public class MeetingInfoController {
         MessageResult<MeetingInfo> msgResult = new MessageResult<>();
 
         try {
+            long beginTime = System.currentTimeMillis();
+
             MeetingInfo meetingInfo = meetingInfoService.get(id);
 
             if (meetingInfo != null) {
-
                 List<MeetingTime> meetingTimeList = meetingTimeService.findByMeetingId(meetingInfo.getId());
 
                 for (MeetingTime meetingTime:meetingTimeList) {
@@ -159,15 +160,21 @@ public class MeetingInfoController {
                     String[] startSignInTimeArray = {start1,end1};
                     meetingTime.setStartSignInTimeArray(startSignInTimeArray);
 
-                    net.sf.json.JSONObject jsonObject2 = net.sf.json.JSONObject.fromObject(meetingTime.getMeetingTime());
-                    String start2 = (String)jsonObject2.get("start");
-                    String end2 = (String)jsonObject2.get("end");
-                    meetingTime.setEndSignInTimeRange(start2 + "," + end2);
+                    net.sf.json.JSONObject jsonObject2 = net.sf.json.JSONObject.fromObject(meetingTime.getEndSignInTime());
+
+                    if(jsonObject2.containsKey("start") && jsonObject2.containsKey("end")){
+                        String start2 = (String)jsonObject2.get("start");
+                        String end2 = (String)jsonObject2.get("end");
+                        meetingTime.setEndSignInTimeRange(start2 + "," + end2);
 
-                    String[] endSignInTimeArray = {start1,end2};
-                    meetingTime.setEndSignInTimeArray(endSignInTimeArray);
+                        String[] endSignInTimeArray = {start2,end2};
+                        meetingTime.setEndSignInTimeArray(endSignInTimeArray);
+                    }
                 }
 
+                logger.error("meetingTimeService.findByMeetingId 耗时:" + (System.currentTimeMillis() - beginTime));
+                beginTime = System.currentTimeMillis();
+
                 List<MeetingTime> removeMeetingTimeList = new ArrayList<>();
 
                 meetingInfo.setMeetingTimeDataList(meetingTimeList);
@@ -175,30 +182,21 @@ public class MeetingInfoController {
 
                 List<MeetingPerson> list = meetingPersonService.findByMeetingId(meetingInfo.getId());
 
+                logger.error("meetingPersonService.findByMeetingId 耗时:" + (System.currentTimeMillis() - beginTime));
+                beginTime = System.currentTimeMillis();
 
                 String selectPersonKey = "";
 
                 List<MeetingPersonDTO> dtoList = new ArrayList<>();
 
                 for (MeetingPerson meetingPerson:list) {
-                    selectPersonKey += String.valueOf(meetingPerson.getPersonId())+",";
+                    selectPersonKey += meetingPerson.getPersonId() + ",";
 
-                    PersonInfo personInfo = personInfoService.get(meetingPerson.getPersonId());
+                    MeetingPersonDTO dto = new MeetingPersonDTO();
+                    dto.setKey(meetingPerson.getPersonId().toString());
+                    dto.setLabel(meetingPerson.getPersonName() + "-" + meetingPerson.getCompanyName());
 
-                    if(personInfo!=null) {
-                        CompanyInfo companyInfo = companyInfoService.get(personInfo.getCompanyId());
-                        String companyName="";
-
-                        if(companyInfo!=null){
-                            companyName = "-"+companyInfo.getName();
-                        }
-
-                        MeetingPersonDTO dto = new MeetingPersonDTO();
-                        dto.setKey(personInfo.getId().toString());
-                        dto.setLabel(personInfo.getName()+ companyName);
-
-                        dtoList.add(dto);
-                    }
+                    dtoList.add(dto);
                 }
 
                 if(StringUtils.isNotEmpty(selectPersonKey)){
@@ -524,10 +522,9 @@ public class MeetingInfoController {
             if(StringUtils.isNotEmpty(companyId)){
                 String[] companyIdArray = companyId.split(",");
 
-                List<PersonInfo> curPersonList = new ArrayList<>();
-
                 for (String companyIdStr:companyIdArray) {
-                    curPersonList = personInfoService.findListByCompanyCode("%"+companyIdStr+"%");
+                    CompanyInfo companyInfo = companyInfoService.get(companyIdStr);
+                    List<PersonInfo> curPersonList = personInfoService.findListByCompanyCode(companyInfo.getCode() + "%");
 
                     if(curPersonList.size()>0){
                         list.addAll(curPersonList);
@@ -539,20 +536,18 @@ public class MeetingInfoController {
             }
 
             List<MeetingPersonDTO> dtoList = new ArrayList<>();
+            Set<Long> personIdSet = new HashSet<>();
 
             for (PersonInfo personInfo:list) {
-                CompanyInfo companyInfo = companyInfoService.get(personInfo.getCompanyId());
-                String companyName="";
-
-                if(companyInfo!=null){
-                    companyName = "-"+companyInfo.getName();
-                }
+                if(!personIdSet.contains(personInfo.getId())){
+                    MeetingPersonDTO dto = new MeetingPersonDTO();
+                    dto.setKey(personInfo.getId().toString());
+                    dto.setLabel(personInfo.getName() + "-" + personInfo.getCompanyName());
 
-                MeetingPersonDTO dto = new MeetingPersonDTO();
-                dto.setKey(personInfo.getId().toString());
-                dto.setLabel(personInfo.getName() + companyName);
+                    dtoList.add(dto);
 
-                dtoList.add(dto);
+                    personIdSet.add(personInfo.getId());
+                }
             }
 
             msgResult.setResult(true);

+ 17 - 0
web/src/main/java/com/jpsoft/shinestar/modules/base/controller/WorkOverController.java

@@ -402,6 +402,23 @@ public class WorkOverController {
                     .map((wop)->wop.getPersonName())
                     .collect(Collectors.joining(","));
             wo.setOverPersonNames(overPersonNames);
+
+//            String overPersonIds = page2.getResult().stream()
+//                    .map((wop)->wop.getPersonId())
+//                    .collect(Collectors.joining(","));
+//            wo.setOverPersonIds(overPersonIds);
+
+            List<Map> overPersonList = new ArrayList<>();
+
+            for (int i=0;i<page2.size();i++){
+                WorkOverPerson workOverPerson=page2.get(i);
+
+                Map<Object,String> overPersonMap = new HashMap<>();
+                overPersonMap.put("id",workOverPerson.getPersonId());
+                overPersonMap.put("name",workOverPerson.getPersonName());
+                overPersonList.add(overPersonMap);
+            }
+            wo.setOverPerson(overPersonList);
         }
 
         List<WorkOver> dataList = page.getResult();

+ 103 - 88
web/src/main/java/com/jpsoft/shinestar/modules/business/controller/MeetingPersonRecodeController.java

@@ -69,7 +69,7 @@ public class MeetingPersonRecodeController {
     @ApiOperation(value="应到列表")
     @RequestMapping(value = "shouldArriveList",method = RequestMethod.POST)
     public MessageResult<Map> shouldArriveList(
-            String meetingId,
+            String meetingId,String name,String jobNumber,
             @RequestParam(value="pageIndex",defaultValue="1") int pageIndex,
             @RequestParam(value="pageSize",defaultValue="20") int pageSize,
             HttpServletRequest request){
@@ -83,12 +83,20 @@ public class MeetingPersonRecodeController {
         Map<String,Object> searchParams = new HashMap<>();
 
         List<Sort> sortList = new ArrayList<>();
-        sortList.add(new Sort("create_time","desc"));
+        sortList.add(new Sort("a.create_time","desc"));
 
         if (StringUtils.isNotEmpty(meetingId)) {
             searchParams.put("meetingId",meetingId);
         }
 
+        if (StringUtils.isNotEmpty(name)) {
+            searchParams.put("name","%"+name+"%");
+        }
+
+        if (StringUtils.isNotEmpty(jobNumber)) {
+            searchParams.put("jobNumber",jobNumber+"%");
+        }
+
         Page<MeetingPerson> page = meetingPersonService.pageSearch(searchParams,pageIndex,pageSize,true,sortList);
 
         Page<MeetingPersonRecodeDTO> pageDto = new Page<>();
@@ -155,7 +163,7 @@ public class MeetingPersonRecodeController {
     @ApiOperation(value="实到列表")
     @RequestMapping(value = "realToList",method = RequestMethod.POST)
     public MessageResult<Map> realToList(
-            String meetingId,String type,
+            String meetingId,String type,String name,String jobNumber,
             @RequestParam(value="pageIndex",defaultValue="1") int pageIndex,
             @RequestParam(value="pageSize",defaultValue="20") int pageSize,
             HttpServletRequest request){
@@ -171,27 +179,34 @@ public class MeetingPersonRecodeController {
             Map<String, Object> searchParams = new HashMap<>();
 
             List<Sort> sortList = new ArrayList<>();
-            sortList.add(new Sort("create_time", "desc"));
+            sortList.add(new Sort("a.sign_time", "desc"));
 
             if (StringUtils.isNotEmpty(meetingId)) {
                 searchParams.put("meetingId", meetingId);
             }
 
+            if (StringUtils.isNotEmpty(name)) {
+                searchParams.put("name","%"+name+"%");
+            }
+
+            if (StringUtils.isNotEmpty(jobNumber)) {
+                searchParams.put("jobNumber",jobNumber+"%");
+            }
+
             Page<Map> page;
 
             if(type.equals("2")){
                 //实到
-                page = meetingPersonRecodeService.realToSearch(searchParams, pageIndex, pageSize, true, sortList);
-            }
-            else if(type.equals("5")){
-                //迟到
-                page = meetingPersonRecodeService.lateSearch(searchParams, pageIndex, pageSize, true, sortList);
+                page = meetingPersonService.realToSearch(searchParams, pageIndex, pageSize, true, sortList);
             }
             else{
-                //早退
-                page = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, pageSize, true, sortList);
+                //if(type.equals("5")) 迟到
+                page = meetingPersonService.lateSearch(searchParams, pageIndex, pageSize, true, sortList);
             }
-
+//            else{
+                //早退
+//                page = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, pageSize, true, sortList);
+//            }
 
             Page<MeetingPersonRecodeDTO> pageDto = new Page<>();
 
@@ -208,8 +223,8 @@ public class MeetingPersonRecodeController {
                     }
                 }
 
-                if (map.get("startTime") != null) {
-                    Date startSignTime = sdf.parse(map.get("startTime").toString());
+                if (map.get("sign_time") != null) {
+                    Date startSignTime = sdf.parse(map.get("sign_time").toString());
                     dto.setStartSignTime(startSignTime);
                 }
                 if (map.get("endTime") != null) {
@@ -255,16 +270,16 @@ public class MeetingPersonRecodeController {
 
         if(type.equals("2")){
             //实到
-            page = meetingPersonRecodeService.realToSearch(searchParams, pageIndex, pageSize, true, sortList);
+            page = meetingPersonService.realToSearch(searchParams, pageIndex, pageSize, true, sortList);
         }
-        else if(type.equals("5")){
-            //迟到
-            page = meetingPersonRecodeService.lateSearch(searchParams, pageIndex, pageSize, true, sortList);
-        }
-        else{
-            //早退
-            page = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, pageSize, true, sortList);
+        else {
+            //if(type.equals("5")) 迟到
+            page = meetingPersonService.lateSearch(searchParams, pageIndex, pageSize, true, sortList);
         }
+//        else{
+//            //早退
+//            page = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, pageSize, true, sortList);
+//        }
 
         for (Map map:page) {
             String name = "";
@@ -293,7 +308,7 @@ public class MeetingPersonRecodeController {
     @ApiOperation(value="缺席列表")
     @RequestMapping(value = "absentList",method = RequestMethod.POST)
     public MessageResult<Map> absentList(
-            String meetingId,
+            String meetingId,String name,String jobNumber,
             @RequestParam(value="pageIndex",defaultValue="1") int pageIndex,
             @RequestParam(value="pageSize",defaultValue="20") int pageSize,
             HttpServletRequest request){
@@ -309,44 +324,49 @@ public class MeetingPersonRecodeController {
             Map<String, Object> searchParams = new HashMap<>();
 
             List<Sort> sortList = new ArrayList<>();
-            sortList.add(new Sort("create_time", "desc"));
+            sortList.add(new Sort("a.sign_time", "desc"));
 
             if (StringUtils.isNotEmpty(meetingId)) {
                 searchParams.put("meetingId", meetingId);
             }
 
-            //缺席
-            Page<Map> pageTemp = meetingPersonRecodeService.noAbsentSearch(searchParams, pageIndex, 10000, true, sortList);
-            List<Long> personIdList = new ArrayList<>();
-            for (Map map:pageTemp) {
-                if(map.get("person_id")!=null){
-                    personIdList.add(Long.parseLong(map.get("person_id").toString()));
-                }
+            if (StringUtils.isNotEmpty(name)) {
+                searchParams.put("name","%"+name+"%");
             }
-            if(personIdList.size()>0){
-                searchParams.put("personIdList", personIdList);
+
+            if (StringUtils.isNotEmpty(jobNumber)) {
+                searchParams.put("jobNumber",jobNumber+"%");
             }
 
-            Page<MeetingPerson> page = meetingPersonService.pageSearch(searchParams, pageIndex, pageSize, true, sortList);
+            MeetingInfo meetingInfo = meetingInfoService.get(meetingId);
 
             Page<MeetingPersonRecodeDTO> pageDto = new Page<>();
 
-            for (MeetingPerson meetingPerson : page) {
-                MeetingPersonRecodeDTO dto = new MeetingPersonRecodeDTO();
+            //如果会议已结束才统计确实
+            if("3".equals(meetingInfo.getStatus())){
+                //缺席
+                Page<MeetingPerson> page = meetingPersonService.absentSearch(searchParams, pageIndex, pageSize, true, sortList);
 
-                Long personId = meetingPerson.getPersonId();
-                PersonInfo personInfo = personInfoService.get(personId);
-                if (personInfo != null) {
-                    dto.setName(personInfo.getName());
-                    dto.setJobNumber(personInfo.getJobNumber());
-                }
+                for (MeetingPerson meetingPerson : page) {
+                    MeetingPersonRecodeDTO dto = new MeetingPersonRecodeDTO();
 
-                pageDto.add(dto);
-            }
+                    Long personId = meetingPerson.getPersonId();
+                    PersonInfo personInfo = personInfoService.get(personId);
+                    if (personInfo != null) {
+                        dto.setName(personInfo.getName());
+                        dto.setJobNumber(personInfo.getJobNumber());
+                    }
 
-            pageDto.setPageSize(page.getPageSize());
-            pageDto.setTotal(page.getTotal());
-            pageDto.setPageNum(page.getPageNum());
+                    pageDto.add(dto);
+                }
+                pageDto.setPageSize(page.getPageSize());
+                pageDto.setTotal(page.getTotal());
+                pageDto.setPageNum(page.getPageNum());
+            }else{
+                pageDto.setPageSize(0);
+                pageDto.setTotal(0);
+                pageDto.setPageNum(0);
+            }
 
             msgResult.setResult(true);
             msgResult.setData(PojoUtils.pageWrapper(pageDto));
@@ -369,27 +389,16 @@ public class MeetingPersonRecodeController {
         Map<String, Object> searchParams = new HashMap<>();
 
         List<Sort> sortList = new ArrayList<>();
-        sortList.add(new Sort("create_time", "desc"));
+        sortList.add(new Sort("sign_time", "desc"));
 
         if (StringUtils.isNotEmpty(meetingId)) {
             searchParams.put("meetingId", meetingId);
         }
 
         //缺席
-        Page<Map> pageTemp = meetingPersonRecodeService.noAbsentSearch(searchParams, pageIndex, 10000, true, sortList);
-        List<Long> personIdList = new ArrayList<>();
-        for (Map map:pageTemp) {
-            if(map.get("person_id")!=null){
-                personIdList.add(Long.parseLong(map.get("person_id").toString()));
-            }
-        }
-        if(personIdList.size()>0){
-            searchParams.put("personIdList", personIdList);
-        }
+        Page<MeetingPerson> page = meetingPersonService.absentSearch(searchParams, pageIndex, pageSize, true, sortList);
 
-        Page<MeetingPerson> page = meetingPersonService.pageSearch(searchParams, pageIndex, pageSize, true, sortList);
-
-        for (MeetingPerson meetingPerson:page) {
+        for (MeetingPerson meetingPerson : page) {
             Map<String,Object> map = new HashMap<>();
 
             Long personId = meetingPerson.getPersonId();
@@ -434,9 +443,6 @@ public class MeetingPersonRecodeController {
             List<Sort> sortList = new ArrayList<>();
             sortList.add(new Sort("a.create_time", "desc"));
 
-            List<Sort> sortList1 = new ArrayList<>();
-            sortList1.add(new Sort("create_time", "desc"));
-
             if (StringUtils.isNotEmpty(meetingId)) {
                 searchParams.put("meetingId", meetingId);
             }
@@ -470,33 +476,43 @@ public class MeetingPersonRecodeController {
                 searchParams.put("meetingId", id);
 
                 //缺席
-                Page<Map> pageTemp = meetingPersonRecodeService.noAbsentSearch(searchParams, pageIndex, 10000, true, sortList1);
-                List<Long> personIdList = new ArrayList<>();
-                for (Map tempMap:pageTemp) {
-                    if(tempMap.get("person_id")!=null){
-                        personIdList.add(Long.parseLong(tempMap.get("person_id").toString()));
-                    }
+//                Page<Map> pageTemp = meetingPersonRecodeService.noAbsentSearch(searchParams, pageIndex, 10000, true, sortList1);
+//                List<Long> personIdList = new ArrayList<>();
+//                for (Map tempMap:pageTemp) {
+//                    if(tempMap.get("person_id")!=null){
+//                        personIdList.add(Long.parseLong(tempMap.get("person_id").toString()));
+//                    }
+//                }
+//                if(personIdList.size()>0){
+//                    searchParams.put("personIdList", personIdList);
+//                }
+
+                MeetingInfo meetingInfo = meetingInfoService.get(id);
+
+                Page<MeetingPerson> page0;
+
+                //会议已结束才统计缺席人数
+                if("3".equals(meetingInfo.getStatus())){
+                    //缺席人数
+                    page0 = meetingPersonService.absentSearch(searchParams, pageIndex, 10000, true, sortList);
                 }
-                if(personIdList.size()>0){
-                    searchParams.put("personIdList", personIdList);
+                else{
+                    page0 = new Page<>();
                 }
 
-                //缺席人数
-                Page<MeetingPerson> page0 = meetingPersonService.pageSearch(searchParams, pageIndex, 10000, true, sortList1);
-
                 //实到
-                Page<Map>  page1 = meetingPersonRecodeService.realToSearch(searchParams, pageIndex, 10000, true, sortList);
+                Page<Map>  page1 = meetingPersonService.realToSearch(searchParams, pageIndex, 10000, true, sortList);
 
                 //迟到
-                Page<Map>  page2 = meetingPersonRecodeService.lateSearch(searchParams, pageIndex, 10000, true, sortList);
+                Page<Map>  page2 = meetingPersonService.lateSearch(searchParams, pageIndex, 10000, true, sortList);
 
                 //早退
-                Page<Map>  page3 = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, 10000, true, sortList);
+//                Page<Map>  page3 = meetingPersonRecodeService.leaveEarlySearch(searchParams, pageIndex, 10000, true, sortList);
 
                 map.put("absentNum",page0.getTotal());
                 map.put("realNum",page1.getTotal());
                 map.put("lateNum",page2.getTotal());
-                map.put("leaveEarlyNum",page3.getTotal());
+//                map.put("leaveEarlyNum",page3.getTotal());
 
                 String statusN="";
 
@@ -561,8 +577,7 @@ public class MeetingPersonRecodeController {
         //表头
         Row rowTitle = sheet.createRow(0);
 
-        String[] titles = new String[]{"序号","会议名称","应到人数","实到人数","缺席人数","迟到人数",
-                "早退人数","会议状态","会议日期"};
+        String[] titles = new String[]{"序号","会议名称","应到人数","实到人数","缺席人数","迟到人数", "会议状态","会议日期"};
 
         for (int i=0;i<titles.length;i++) {
             Cell cell = rowTitle.createCell(i);
@@ -581,7 +596,7 @@ public class MeetingPersonRecodeController {
             row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("realNum"),""));
             row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("absentNum"),""));
             row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("lateNum"),""));
-            row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("leaveEarlyNum"),""));
+//            row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("leaveEarlyNum"),""));
             row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("statusN"),""));
             row.createCell(colIndex++).setCellValue(com.jpsoft.shinestar.modules.common.utils.StringUtils.strValue(map.get("meetingDateStrArr"),""));
         }
@@ -623,13 +638,13 @@ public class MeetingPersonRecodeController {
         List<Map> mapList2 = getRealToMap(meetingId,"2", pageIndex, pageSize);
         List<Map> mapList3 = getAbsentMap(meetingId, pageIndex, pageSize);
         List<Map> mapList4 = getRealToMap(meetingId,"5", pageIndex, pageSize);
-        List<Map> mapList5 = getRealToMap(meetingId,"6", pageIndex, pageSize);
+        //List<Map> mapList5 = getRealToMap(meetingId,"6", pageIndex, pageSize);
 
         totalMapList.add(mapList);
         totalMapList.add(mapList2);
         totalMapList.add(mapList3);
         totalMapList.add(mapList4);
-        totalMapList.add(mapList5);
+        //totalMapList.add(mapList5);
 
         String downloadUrl = "";
 
@@ -647,12 +662,12 @@ public class MeetingPersonRecodeController {
             else if(j==2){
                 sheet = workbook.createSheet("缺席"+ String.valueOf(mapList3.size()));
             }
-            else if(j==3){
-                sheet = workbook.createSheet("迟到"+ String.valueOf(mapList4.size()));
-            }
             else{
-                sheet = workbook.createSheet("早退"+ String.valueOf(mapList5.size()));
+                sheet = workbook.createSheet("迟到"+ String.valueOf(mapList4.size()));
             }
+//            else{
+//                sheet = workbook.createSheet("早退"+ String.valueOf(mapList5.size()));
+//            }
 
             //表头
             Row rowTitle = sheet.createRow(0);

+ 4 - 4
web/src/main/java/com/jpsoft/shinestar/mq/listener/PersonNotificationListener.java

@@ -74,7 +74,7 @@ public class PersonNotificationListener {
             PersonInfo personInfo = personInfoService.get(notification.getPersonId());
 
             if (personInfo==null) {
-                log.error("{}无人员信息!", notification.getPersonId());
+                log.warn("{}无人员信息!", notification.getPersonId());
                 return;
             }
 
@@ -87,17 +87,17 @@ public class PersonNotificationListener {
 
             List<String> sceneNameList = deviceInfoService.findSceneListByDeviceNo(notification.getDeviceNo());
 
-            if(sceneNameList.contains("考勤")) {
+            if(sceneNameList.stream().filter((scene)->scene.contains("考勤")).count()>0){
                 workScheduleAttendanceService.punchIn(notification.getDeviceNo(), personInfo.getId(),
                         notification.getTemperature(),
                         notification.getRecordTime());
             }
 
-            if(sceneNameList.contains("食堂")){
+            if(sceneNameList.stream().filter((scene)->scene.contains("食堂")).count()>0){
                 canteenDiningRecordService.punchIn(notification.getDeviceNo(), personInfo.getId(), notification.getRecordTime());
             }
 
-            if(sceneNameList.contains("会议")){
+            if(sceneNameList.stream().filter((scene)->scene.contains("会议")).count()>0){
                 meetingPersonRecodeService.punchIn(notification.getDeviceNo(), personInfo.getId(), notification.getRecordTime());
             }