Pārlūkot izejas kodu

宿舍申请单webSrc更新

Heyuan 3 nedēļas atpakaļ
vecāks
revīzija
154402de51

+ 16 - 0
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/CheckInApplicationEditHandler.java

@@ -59,6 +59,22 @@ public class CheckInApplicationEditHandler extends DormitoryApplicationEditHandl
             }
             throw new ShrWebBizException(errorMsgBuilder.toString());
         }
+        //校验入住申请单是否重复提交、校验入住信息时间交叉
+        try {
+            IMSFServiceFacade imsfServiceFacade = MSFServiceFacadeFactory.getLocalInstance(ctx);
+            result = (Map) imsfServiceFacade.processService("checkDuplicateCheckInByBillIdService", params);
+        } catch (Exception e) {
+            logger.error(e);
+            throw new ShrWebBizException("调用接口checkDuplicateCheckInByBillIdService报错: " + e.getMessage());
+        }
+        if (500 == (Integer) result.get("code")) {
+            List<String> errorMsgList = (List<String>) result.get("errorMsg");
+            StringBuilder errorMsgBuilder = new StringBuilder();
+            for (String errorMsg : errorMsgList) {
+                errorMsgBuilder.append(errorMsg).append("\n");
+            }
+            throw new ShrWebBizException(errorMsgBuilder.toString());
+        }
         //设置单据状态为未审批
         model.setInt("billState", 1);
         super.beforeSubmit(request, response, model);

+ 18 - 2
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/CheckInApplicationListHandler.java

@@ -40,6 +40,23 @@ public class CheckInApplicationListHandler extends DormitoryApplicationListHandl
         Map result = null;
         Map<String, String> params = new HashMap<String, String>();
         params.put("billIds", billIds);
+        try {
+            //校验房间是否可入住
+            IMSFServiceFacade imsfServiceFacade = MSFServiceFacadeFactory.getLocalInstance(ctx);
+            result = (Map) imsfServiceFacade.processService("validateRoomAvailableByBillIdsService", params);
+        } catch (Exception e) {
+            logger.error(e);
+            throw new ShrWebBizException("调用接口validateRoomAvailableByBillIdsService报错: " + e.getMessage());
+        }
+        Integer code = (Integer) result.get("code");
+        if (500 == code) {
+            List<String> errorMsgList = (List<String>) result.get("errorMsg");
+            StringBuilder errorMsgBuilder = new StringBuilder();
+            for (String errorMsg : errorMsgList) {
+                errorMsgBuilder.append(errorMsg).append("\n");
+            }
+            throw new ShrWebBizException(errorMsgBuilder.toString());
+        }
         //校验入住申请单是否重复提交、校验入住信息时间交叉
         try {
             IMSFServiceFacade imsfServiceFacade = MSFServiceFacadeFactory.getLocalInstance(ctx);
@@ -48,8 +65,7 @@ public class CheckInApplicationListHandler extends DormitoryApplicationListHandl
             logger.error(e);
             throw new ShrWebBizException("调用接口checkDuplicateCheckInByBillIdService报错: " + e.getMessage());
         }
-        Integer code = (Integer) result.get("code");
-        if (500 == code) {
+        if (500 ==  (Integer) result.get("code")) {
             List<String> errorMsgList = (List<String>) result.get("errorMsg");
             StringBuilder errorMsgBuilder = new StringBuilder();
             for (String errorMsg : errorMsgList) {

+ 35 - 0
websrc/com/kingdee/eas/custom/dormitorysystem/application/service/CheckDuplicateCheckInByBillIdService.java

@@ -14,6 +14,7 @@ import com.kingdee.eas.custom.dormitorysystem.application.*;
 import com.kingdee.eas.custom.dormitorysystem.occupants.IOccupants;
 import com.kingdee.eas.custom.dormitorysystem.occupants.OccupantsCollection;
 import com.kingdee.eas.custom.dormitorysystem.occupants.OccupantsFactory;
+import com.kingdee.eas.custom.dormitorysystem.occupants.OccupantsInfo;
 import com.kingdee.eas.framework.CoreBillBaseCollection;
 import com.kingdee.eas.framework.ICoreBillBase;
 import com.kingdee.eas.hr.ats.AtsUtil;
@@ -227,12 +228,46 @@ public class CheckDuplicateCheckInByBillIdService implements IHRMsfService {
         filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5 and #6");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("parent.number");
+        sic.add("occupants.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         CheckInApplicationEntryCollection entryCollection = iCheckInApplicationEntry.getCheckInApplicationEntryCollection(viewInfo);
         StringBuilder errorMsg = new StringBuilder();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
+        ICheckoutApplicationEntry iCheckoutApplicationEntry = CheckoutApplicationEntryFactory.getLocalInstance(ctx);
         for (int i = 0; i < entryCollection.size(); i++) {
             CheckInApplicationEntryInfo checkInApplicationEntryInfo = entryCollection.get(i);
+            //入住信息
+            OccupantsInfo occupants = checkInApplicationEntryInfo.getOccupants();
+            if (occupants != null) {
+                String occupantsId = occupants.getId().toString();
+                try {
+                    //判断该入住申请单对应的入住信息是否存在已申请通过的退宿单,如果存在就跳过这条入住申请单
+                    FilterInfo existsFilter = new FilterInfo();
+                    FilterItemCollection existsFilterItems = existsFilter.getFilterItems();
+                    existsFilterItems.add(new FilterItemInfo("parent.billState", "3"));
+                    existsFilterItems.add(new FilterItemInfo("occupants", occupantsId));
+                    if (iCheckoutApplicationEntry.exists(existsFilter)) {
+                        continue;
+                    }
+                } catch (EASBizException e) {
+                    logger.error("校验退宿单报错:" + e.getMessage(), e);
+                    throw new BOSException(e);
+                }
+                try {
+                    //判断该入住申请单对应的入住信息是否存在已申请通过的退宿单,如果存在就跳过这条入住申请单
+                    FilterInfo existsFilter = new FilterInfo();
+                    FilterItemCollection existsFilterItems = existsFilter.getFilterItems();
+                    existsFilterItems.add(new FilterItemInfo("parent.billState", "3"));
+                    existsFilterItems.add(new FilterItemInfo("oldOccupants", occupantsId));
+                    if (iRoomChangeApplicationEntry.exists(existsFilter)) {
+                        continue;
+                    }
+                } catch (EASBizException e) {
+                    logger.error("校验换宿单报错:" + e.getMessage(), e);
+                    throw new BOSException(e);
+                }
+            }
             CheckInApplicationInfo parent = checkInApplicationEntryInfo.getParent();
             String number = parent.getNumber();
             errorMsg.append("员工[" + personInfoName + "]在[" + sdf.format(checkInDate) + "] ~ [" + sdf.format(checkoutDate) + "]期间与入住申请单[" + number + "]日期存在交叉\n");

+ 94 - 10
websrc/com/kingdee/eas/custom/dormitorysystem/application/service/GetOptionalRoomIdsService.java

@@ -11,10 +11,7 @@ import com.kingdee.eas.basedata.person.IPerson;
 import com.kingdee.eas.basedata.person.PersonFactory;
 import com.kingdee.eas.basedata.person.PersonInfo;
 import com.kingdee.eas.common.EASBizException;
-import com.kingdee.eas.custom.dormitorysystem.application.CheckInApplicationEntryCollection;
-import com.kingdee.eas.custom.dormitorysystem.application.CheckInApplicationEntryFactory;
-import com.kingdee.eas.custom.dormitorysystem.application.CheckInApplicationEntryInfo;
-import com.kingdee.eas.custom.dormitorysystem.application.ICheckInApplicationEntry;
+import com.kingdee.eas.custom.dormitorysystem.application.*;
 import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryCollection;
 import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryFactory;
 import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryInfo;
@@ -75,20 +72,30 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
             sic.add("name");
             PersonInfo personInfo = iPerson.getPersonInfo(new ObjectUuidPK(personId), sic);
             Genders gender = personInfo.getGender();
+            if (gender == null) {
+                throw new BOSException("员工[" + personInfo.getName() + "]的性别为空,请及时维护!");
+            }
             //人员类型
             PersonDormitoryTypeInfo personType = (PersonDormitoryTypeInfo) personInfo.get("personType");
             if (personType == null) {
-                throw new ShrWebBizException("员工[" + personInfo.getName() + "]的人员类别为空,请及时维护!");
+                throw new BOSException("员工[" + personInfo.getName() + "]的人员类别为空,请及时维护!");
             }
             String personTypeId = personType.getId().toString();
             Map<String, Map<String, Object>> dormitoryMap = new HashMap<>();
+            //存放已累加的人员入住信息数据id,避免重复累加
             //1.根据性别查询所有可住房间信息
             List<DormitoryInfo> dormitoryInfoList = getDormitoryInfos(ctx, gender, dormitoryIdSet);
+            if (dormitoryIdSet.isEmpty()) {
+                //没有可住房间信息
+                return "''";
+            }
             //2.根据入住日期和退宿日期算出入住信息每个房间已住人数
             getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, dormitoryMap, dormitoryIdSet);
             //3.根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
             getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, dormitoryMap, dormitoryIdSet);
-            //4.算出房间剩余可住人数: 可住人数 - 已住人数
+            //4.根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
+            getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, dormitoryMap, dormitoryIdSet);
+            //5.算出房间剩余可住人数: 可住人数 - 已住人数
             for (int i = 0; i < dormitoryInfoList.size(); i++) {
                 DormitoryInfo dormitoryInfo = dormitoryInfoList.get(i);
                 String dormitoryId = dormitoryInfo.getId().toString();
@@ -126,6 +133,79 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
         return result;
     }
 
+
+    /**
+     * 根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
+     *
+     * @param ctx
+     * @param checkInDate    入住日期
+     * @param checkoutDate   退宿日期
+     * @param dormitoryMap
+     * @param dormitoryIdSet 房间ids
+     * @throws BOSException
+     */
+    private void getRoomChangeInfoByRoomChangeApplication(
+            Context ctx,
+            Date checkInDate,
+            Date checkoutDate,
+            Map<String, Map<String, Object>> dormitoryMap,
+            Set<String> dormitoryIdSet
+    ) throws BOSException {
+        IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        //调整房间
+        filterItems.add(new FilterItemInfo("adjustRoom", dormitoryIdSet, CompareType.INCLUDE));
+        //申请入住日期在入住日期和退宿日期之间
+        filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.LESS_EQUALS));
+        filterItems.add(new FilterItemInfo("checkoutDate", checkInDate, CompareType.GREATER_EQUALS));
+        //入住日期在申请入住日期和申请退宿日期之间
+        filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
+        filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
+        //单据状态等于审批
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
+        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("checkInRoom.id");
+        sic.add("person.personType.id");
+        sic.add("person.personType.name");
+        sic.add("person.name");
+        sic.add("occupants.id");
+        sic.add("adjustRoom.id");
+        sic.add("parent.number");
+        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        RoomChangeApplicationEntryCollection roomChangeApplicationEntryCol = iRoomChangeApplicationEntry.getRoomChangeApplicationEntryCollection(viewInfo);
+        for (int i = 0; i < roomChangeApplicationEntryCol.size(); i++) {
+            RoomChangeApplicationEntryInfo roomChangeApplicationEntryInfo = roomChangeApplicationEntryCol.get(i);
+            //房间
+            PersonInfo person = roomChangeApplicationEntryInfo.getPerson();
+            String personName = person.getName();
+            //调整房间
+            DormitoryInfo adjustRoom = roomChangeApplicationEntryInfo.getAdjustRoom();
+            if (adjustRoom == null) {
+                String number = roomChangeApplicationEntryInfo.getParent().getNumber();
+                throw new BOSException("换宿单编码[" + number + "]中存在调整房间为空的数据,请检查换宿单数据正确性!");
+            }
+            String dormitoryId = adjustRoom.getId().toString();
+            //人员类型
+            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
+            if (personDormitoryType == null) {
+                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
+            }
+            if (dormitoryMap.containsKey(dormitoryId)) {
+                Map<String, Object> map = dormitoryMap.get(dormitoryId);
+                //累计已住人数
+                int count = (int) map.getOrDefault("count", 0);
+                map.put("count", count + 1);
+            } else {
+                Map<String, Object> map = new HashMap<>();
+                map.put("count", 1);
+                map.put("personDormitoryTypeId", personDormitoryType.getId().toString());
+                dormitoryMap.put(dormitoryId, map);
+            }
+        }
+    }
+
     /**
      * 根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
      *
@@ -140,7 +220,8 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             Map<String, Map<String, Object>> dormitoryMap,
-            Set<String> dormitoryIdSet) throws BOSException, ShrWebBizException {
+            Set<String> dormitoryIdSet
+    ) throws BOSException {
         ICheckInApplicationEntry iCheckInApplicationEntry = CheckInApplicationEntryFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
         FilterItemCollection filterItems = filterInfo.getFilterItems();
@@ -152,9 +233,11 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
         //入住日期在申请入住日期和申请退宿日期之间
         filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
         filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
+        //单据状态为 未审批、审批中
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
         //单据状态等于审批中
         //filterItems.add(new FilterItemInfo("parent.billState", "3"));
-        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) ");
+        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5 ");
         //filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5 ");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("checkInRoom.id");
@@ -171,7 +254,7 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
             //人员类型
             PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
             if (personDormitoryType == null) {
-                throw new ShrWebBizException("员工[" + personName + "]的人员类别为空,请及时维护!");
+                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
             }
             if (dormitoryMap.containsKey(dormitoryId)) {
                 Map<String, Object> map = dormitoryMap.get(dormitoryId);
@@ -219,6 +302,7 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("Dormitory.id");
         sic.add("PersonDormitoryType.id");
+        sic.add("person.personType.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         OccupantsCollection occupantsCollection = iOccupants.getOccupantsCollection(viewInfo);
         for (int i = 0; i < occupantsCollection.size(); i++) {
@@ -227,7 +311,7 @@ public class GetOptionalRoomIdsService implements IHRMsfService {
             DormitoryInfo dormitory = occupantsInfo.getDormitory();
             String dormitoryId = dormitory.getId().toString();
             //人员宿舍分类
-            PersonDormitoryTypeInfo personDormitoryType = occupantsInfo.getPersonDormitoryType();
+            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) occupantsInfo.getPerson().get("personType");
             if (dormitoryMap.containsKey(dormitoryId)) {
                 Map<String, Object> map = dormitoryMap.get(dormitoryId);
                 //累计已住人数

+ 39 - 8
websrc/com/kingdee/eas/custom/dormitorysystem/application/service/ValidateRoomAvailableByBillIdsService.java

@@ -120,16 +120,21 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
                     //String personTypeId = personType.getId().toString();
                     //已住人数
                     int dormCheckInCount = 0;
+                    //存放已累加的人员入住信息数据id,避免重复累加
+                    Set<String> occupantsIds = new HashSet<String>();
                     //1.校验房间信息
                     validateDormitoryInfo(ctx, personInfo, dormitory);
                     //可住人数
                     int occupancyCapacity = dormitory.getOccupancyCapacity();
                     //2.根据入住日期和退宿日期算出入住信息房间已住人数
-                    dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType);
+                    dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
+                    System.out.println("dormCheckInCount1 :" + dormCheckInCount);
                     //3.根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
-                    dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType);
+                    dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
+                    System.out.println("dormCheckInCount2 :" + dormCheckInCount);
                     //4.根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
-                    dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType);
+                    dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
+                    System.out.println("dormCheckInCount3 :" + dormCheckInCount);
                     //5.根据当前参数缓存算出已住人数
                     if (roomListMap.containsKey(roomId)) {
                         List<Map<String, Date>> roomMapList = roomListMap.get(roomId);
@@ -145,6 +150,9 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
                             }
                         }
                     }
+                    System.out.println("dormCheckInCount4 :" + dormCheckInCount);
+                    //累加当前单据人员
+                    dormCheckInCount++;
                     //6.算出房间剩余可住人数: 可住人数 - 已住人数
                     if (occupancyCapacity - dormCheckInCount < 0) {
                         String dormitoryName = dormitory.getName();
@@ -193,7 +201,8 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -207,12 +216,13 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
         filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
         filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
         //单据状态等于审批中
-        filterItems.add(new FilterItemInfo("parent.billState", "1,2,3", CompareType.INCLUDE));
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
         filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("checkInRoom.id");
         sic.add("person.personType.id");
         sic.add("person.personType.name");
+        sic.add("occupants.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         RoomChangeApplicationEntryCollection roomChangeApplicationEntryCol = iRoomChangeApplicationEntry.getRoomChangeApplicationEntryCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -234,6 +244,14 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            //入住人员信息
+//            OccupantsInfo occupants = roomChangeApplicationEntryInfo.getOccupants();
+//            if (occupants != null) {
+//                String occupantsId = occupants.getId().toString();
+//                if (occupantsIds.contains(occupantsId)) {
+//                    continue;
+//                }
+//            }
             //累计已住人数
             dormCheckInCount++;
         }
@@ -256,7 +274,8 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         ICheckInApplicationEntry iCheckInApplicationEntry = CheckInApplicationEntryFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -270,12 +289,13 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
         filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
         filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
         //单据状态等于审批中
-        filterItems.add(new FilterItemInfo("parent.billState", "1,2,3", CompareType.INCLUDE));
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
         filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("checkInRoom.id");
         sic.add("person.personType.id");
         sic.add("person.personType.name");
+        //sic.add("occupants.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         CheckInApplicationEntryCollection checkInApplicationEntryCol = iCheckInApplicationEntry.getCheckInApplicationEntryCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -297,6 +317,14 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            //入住人员信息
+//            OccupantsInfo occupants = checkInApplicationEntryInfo.getOccupants();
+//            if (occupants != null) {
+//                String occupantsId = occupants.getId().toString();
+//                if (occupantsIds.contains(occupantsId)) {
+//                    continue;
+//                }
+//            }
             //累计已住人数
             dormCheckInCount++;
         }
@@ -320,7 +348,8 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         IOccupants iOccupants = OccupantsFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -337,6 +366,7 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("PersonDormitoryType.id");
         sic.add("PersonDormitoryType.name");
+        sic.add("id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         OccupantsCollection occupantsCollection = iOccupants.getOccupantsCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -353,6 +383,7 @@ public class ValidateRoomAvailableByBillIdsService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            occupantsIds.add(occupantsInfo.getId().toString());
             dormCheckInCount++;
         }
         return dormCheckInCount;

+ 36 - 8
websrc/com/kingdee/eas/custom/dormitorysystem/application/service/ValidateRoomAvailableService.java

@@ -100,16 +100,18 @@ public class ValidateRoomAvailableService implements IHRMsfService {
                 //String personTypeId = personType.getId().toString();
                 //已住人数
                 int dormCheckInCount = 0;
+                //存放已累加的人员入住信息数据id,避免重复累加
+                Set<String> occupantsIds = new HashSet<String>();
                 //1.校验房间信息
                 DormitoryInfo dormitoryInfo = validateDormitoryInfo(ctx, personInfo, roomId);
                 //可住人数
                 int occupancyCapacity = dormitoryInfo.getOccupancyCapacity();
                 //2.根据入住日期和退宿日期算出入住信息房间已住人数
-                dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType);
+                dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
                 //3.根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
-                dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId,  personType);
+                dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
                 //4.根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
-                dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId,  personType);
+                dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType, occupantsIds);
                 //5.根据当前参数缓存算出已住人数
                 if (roomListMap.containsKey(roomId)) {
                     List<Map<String, Date>> roomMapList = roomListMap.get(roomId);
@@ -125,6 +127,8 @@ public class ValidateRoomAvailableService implements IHRMsfService {
                         }
                     }
                 }
+                //累加当前单据人员
+                dormCheckInCount++;
                 //6.算出房间剩余可住人数: 可住人数 - 已住人数
                 if (occupancyCapacity - dormCheckInCount < 0) {
                     String dormitoryName = dormitoryInfo.getName();
@@ -172,7 +176,8 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -186,12 +191,14 @@ public class ValidateRoomAvailableService implements IHRMsfService {
         filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
         filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
         //单据状态等于审批中
-        filterItems.add(new FilterItemInfo("parent.billState", "1,2,3", CompareType.INCLUDE));
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
         filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("checkInRoom.id");
         sic.add("person.personType.id");
         sic.add("person.personType.name");
+//        sic.add("occupants.id");
+//        sic.add("oldOccupants.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         RoomChangeApplicationEntryCollection roomChangeApplicationEntryCol = iRoomChangeApplicationEntry.getRoomChangeApplicationEntryCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -213,6 +220,14 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            //原入住信息
+//            OccupantsInfo oldOccupants = roomChangeApplicationEntryInfo.getOldOccupants();
+//            if (oldOccupants != null) {
+//                String oldOccupantsId = oldOccupants.getId().toString();
+//                if (occupantsIds.contains(oldOccupantsId)) {
+//                    continue;
+//                }
+//            }
             //累计已住人数
             dormCheckInCount++;
         }
@@ -235,7 +250,8 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         ICheckInApplicationEntry iCheckInApplicationEntry = CheckInApplicationEntryFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -249,12 +265,13 @@ public class ValidateRoomAvailableService implements IHRMsfService {
         filterItems.add(new FilterItemInfo("checkInDate", checkInDate, CompareType.GREATER_EQUALS));
         filterItems.add(new FilterItemInfo("checkInDate", checkoutDate, CompareType.LESS_EQUALS));
         //单据状态等于审批中
-        filterItems.add(new FilterItemInfo("parent.billState", "1,2,3", CompareType.INCLUDE));
+        filterItems.add(new FilterItemInfo("parent.billState", "1,2", CompareType.INCLUDE));
         filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("checkInRoom.id");
         sic.add("person.personType.id");
         sic.add("person.personType.name");
+//        sic.add("occupants.id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         CheckInApplicationEntryCollection checkInApplicationEntryCol = iCheckInApplicationEntry.getCheckInApplicationEntryCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -276,6 +293,14 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            //入住人员信息
+//            OccupantsInfo occupants = checkInApplicationEntryInfo.getOccupants();
+//            if (occupants != null) {
+//                String occupantsId = occupants.getId().toString();
+//                if (occupantsIds.contains(occupantsId)) {
+//                    continue;
+//                }
+//            }
             //累计已住人数
             dormCheckInCount++;
         }
@@ -299,7 +324,8 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             Date checkInDate,
             Date checkoutDate,
             String roomId,
-            PersonDormitoryTypeInfo personType
+            PersonDormitoryTypeInfo personType,
+            Set<String> occupantsIds
     ) throws BOSException {
         IOccupants iOccupants = OccupantsFactory.getLocalInstance(ctx);
         FilterInfo filterInfo = new FilterInfo();
@@ -316,6 +342,7 @@ public class ValidateRoomAvailableService implements IHRMsfService {
         SelectorItemCollection sic = new SelectorItemCollection();
         sic.add("PersonDormitoryType.id");
         sic.add("PersonDormitoryType.name");
+        sic.add("id");
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         OccupantsCollection occupantsCollection = iOccupants.getOccupantsCollection(viewInfo);
         String personTypeId = personType.getId().toString();
@@ -332,6 +359,7 @@ public class ValidateRoomAvailableService implements IHRMsfService {
             if (!personTypeId.equals(personDormitoryTypeId)) {
                 throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
             }
+            occupantsIds.add(occupantsInfo.getId().toString());
             dormCheckInCount++;
         }
         return dormCheckInCount;