qingwu hai 2 días
pai
achega
b29026bfd0

+ 377 - 15
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/HRBillBaseEditHandler.java

@@ -1,29 +1,42 @@
 package com.kingdee.eas.custom.dormitorysystem.application.handler;
 
 import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
 import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.AbstractObjectCollection;
 import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
-import com.kingdee.bos.metadata.entity.EntityViewInfo;
-import com.kingdee.bos.metadata.entity.FilterInfo;
-import com.kingdee.bos.metadata.entity.FilterItemCollection;
-import com.kingdee.bos.metadata.entity.FilterItemInfo;
+import com.kingdee.bos.metadata.entity.*;
 import com.kingdee.bos.metadata.query.util.CompareType;
 import com.kingdee.bos.util.BOSUuid;
 import com.kingdee.eas.basedata.org.HROrgUnitInfo;
+import com.kingdee.eas.basedata.person.Genders;
 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.*;
 import com.kingdee.eas.custom.dormitorysystem.application.utils.RoomChangeOrderUtil;
+import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryFactory;
+import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryInfo;
+import com.kingdee.eas.custom.dormitorysystem.dormitory.IDormitory;
+import com.kingdee.eas.custom.dormitorysystem.enumerationset.DormitoryClassification;
 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.custom.dormitorysystem.otherbasicdata.DormitoryTypeInfo;
+import com.kingdee.eas.custom.dormitorysystem.otherbasicdata.PersonDormitoryTypeInfo;
 import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.framework.CoreBillBaseCollection;
+import com.kingdee.eas.framework.ICoreBillBase;
+import com.kingdee.eas.hr.ats.AtsUtil;
+import com.kingdee.eas.hr.base.HRBillBaseEntryInfo;
 import com.kingdee.eas.hr.base.HRBillBaseInfo;
+import com.kingdee.shr.base.syssetting.BasicItemStateEnum;
 import com.kingdee.shr.base.syssetting.context.SHRContext;
 import com.kingdee.shr.base.syssetting.exception.SHRWebException;
 import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.util.StringUtils;
 import org.apache.log4j.Logger;
 import org.springframework.ui.ModelMap;
 
@@ -59,24 +72,373 @@ public class HRBillBaseEditHandler extends DormitoryApplicationEditHandler {
     public void saveverifyAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws ShrWebBizException {
         logger.error("saveverifyAction---");
         RoomChangeApplicationInfo model = (RoomChangeApplicationInfo) request.getAttribute("dynamic_model");
-        //RoomChangeApplicationInfo model = (RoomChangeApplicationInfo) request.getAttribute("dynamic_model");
+        // RoomChangeApplicationInfo model = (RoomChangeApplicationInfo) request.getAttribute("dynamic_model");
         try {
-            //校验原入住人员信息 和 新入住人员信息
+            // 校验原入住人员信息 和 新入住人员信息
             verifyOccupants(model);
-            //校验原入住人员信息退宿日期是否小于当前时间
+            // 校验原入住人员信息退宿日期是否小于当前时间
             verifyCheckOutDateBeforeCurrent(model);
-            //换宿单不能存在同员工日期交叉的数据
+            // 换宿单不能存在同员工日期交叉的数据
             verifyCheckNoDateOverlap(model);
-            //换宿单不能对有退宿单的入住信息进行换宿
+            // 换宿单不能对有退宿单的入住信息进行换宿
             ValidateSwapWithCheckout(model);
 
-
         } catch (Exception e) {
             e.printStackTrace();
             throw new ShrWebBizException(e);
         }
     }
 
+    public Map validateRoomAvailableByBillIds(String billIds) throws BOSException {
+        logger.error("validateRoomAvailableByBillIds--");
+        if (StringUtils.isEmpty(billIds)) {
+            logger.error("单据id不能为空!");
+            throw new BOSException("单据id不能为空!");
+        }
+        Map<String, List<Map<String, Date>>> roomListMap = new HashMap<String, List<Map<String, Date>>>();
+        // StringBuilder errorMsg = new StringBuilder();
+        List<String> errorMsgList = new ArrayList<String>();
+        // HRBillBaseFactory.getLocalInstance()
+        ICoreBillBase iCoreBillBase = (ICoreBillBase) BOSObjectFactory.createBOSObject(ctx,
+                BOSUuid.read(billIds.split(",")[0]).getType());
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("*");
+        sic.add("entrys.*");
+        sic.add("entrys.person.*");
+        sic.add("entrys.person.personType.*");
+        sic.add("entrys.adjustRoom.*");
+        sic.add("entrys.adjustRoom.DormitoryType.*");
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        // 房间
+        filterItems.add(new FilterItemInfo("id", AtsUtil.toSet(billIds), CompareType.INCLUDE));
+        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        CoreBillBaseCollection hrBillBaseCollection = iCoreBillBase.getCoreBillBaseCollection(viewInfo);
+        logger.error("hrBillBaseCollection--" + hrBillBaseCollection.size());
+        for (int i = 0; i < hrBillBaseCollection.size(); i++) {
+            HRBillBaseInfo hrBillBaseInfo = (HRBillBaseInfo) hrBillBaseCollection.get(i);
+            // String billId = hrBillBaseInfo.getId().toString();
+            String baseInfoNumber = hrBillBaseInfo.getNumber();
+            String bosType = hrBillBaseInfo.getId().getType().toString();
+            AbstractObjectCollection entrys = (AbstractObjectCollection) hrBillBaseInfo.get("entrys");
+            logger.error("entrys--" + entrys.size());
+            for (int j = 0; j < entrys.size(); j++) {
+                try {
+                    HRBillBaseEntryInfo entryInfo = (HRBillBaseEntryInfo) entrys.getObject(j);
+                    Date checkInDate = null;
+                    // B371AC0A 换宿单分录  0CDEF948
+                    if ("0CDEF948".equals(bosType)) {
+                        // 换宿单
+                        checkInDate = entryInfo.getDate("checkInDate");
+                    }
+                    if (checkInDate == null) {
+                        throw new BOSException("换宿日期不能为空!");
+                    }
+                    // 退宿日期
+                    Date checkoutDate = entryInfo.getDate("checkoutDate");
+                    if (checkoutDate == null) {
+                        throw new BOSException("退宿日期不能为空!");
+                    }
+                    // 人员
+                    PersonInfo personInfo = (PersonInfo) entryInfo.getObjectValue("person");
+                    if (personInfo == null) {
+                        throw new BOSException("人员不能为空!");
+                    }
+                    // 房间
+                    DormitoryInfo dormitory = (DormitoryInfo) entryInfo.getObjectValue("adjustRoom");
+                    if (dormitory == null) {
+                        throw new BOSException("房间不能为空!");
+                    }
+                    String roomId = dormitory.getId().toString();
+                    // 根据入住日期,性别,员工类别查询可选房间
+                    // 人员类型
+                    PersonDormitoryTypeInfo personType = (PersonDormitoryTypeInfo) personInfo.get("personType");
+                    if (personType == null) {
+                        throw new BOSException("员工[" + personInfo.getName() + "]的人员类别为空,请及时维护!");
+                    }
+                    // String personTypeId = personType.getId().toString();
+                    // 已住人数
+                    int dormCheckInCount = 0;
+                    // 1.校验房间信息
+                    validateDormitoryInfo(ctx, personInfo, dormitory);
+                    // 可住人数
+                    int occupancyCapacity = dormitory.getOccupancyCapacity();
+                    // 2.根据换宿日期和退宿日期算出入住信息房间已住人数
+                    dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType);
+                    // 3.根据换宿日期和退宿日期算出入住申请单状态为申请中的已住人数
+                    dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType);
+                    // 4.根据换宿日期和退宿日期算出换宿申请单状态为申请中的已住人数
+                    dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType);
+                    // 5.根据当前参数缓存算出已住人数
+                    if (roomListMap.containsKey(roomId)) {
+                        List<Map<String, Date>> roomMapList = roomListMap.get(roomId);
+                        for (int k = 0; k < roomMapList.size(); k++) {
+                            Map<String, Date> roomMap = roomMapList.get(k);
+                            Date checkInDateOld = roomMap.get("checkInDate");
+                            Date checkoutDateOld = roomMap.get("checkoutDate");
+                            // 申请入住日期在入住日期和退宿日期之间
+                            // 入住日期在申请入住日期和申请退宿日期之间
+                            if ((checkInDateOld.compareTo(checkInDate) <= 0 && checkoutDateOld.compareTo(checkInDate) >= 0)
+                                    || (checkInDateOld.compareTo(checkInDate) >= 0 && checkInDateOld.compareTo(checkoutDate) <= 0)) {
+                                dormCheckInCount++;
+                            }
+                        }
+                    }
+                    logger.error("occupancyCapacity--" + occupancyCapacity);
+                    logger.error("dormCheckInCount--" + dormCheckInCount);
+                    // 6.算出房间剩余可住人数: 可住人数 - 已住人数
+                    if (occupancyCapacity - dormCheckInCount < 0) {
+                        String dormitoryName = dormitory.getName();
+                        throw new BOSException("当前入住人数" + dormCheckInCount + ",已超过房间[" + dormitoryName + "]可住人数" + occupancyCapacity + ",不能入住!");
+                    }
+                    Map roomMap = new HashMap();
+                    roomMap.put("checkInDate", checkInDate);
+                    roomMap.put("checkoutDate", checkoutDate);
+                    if (roomListMap.containsKey(roomId)) {
+                        roomListMap.get(roomId).add(roomMap);
+                    } else {
+                        List list = new ArrayList();
+                        roomListMap.put(roomId, list);
+                        list.add(roomMap);
+                    }
+                } catch (Exception e) {
+                    logger.error("单据编号为" + baseInfoNumber + "校验未通过: " + e.getMessage(), e);
+                    errorMsgList.add("单据编号为" + baseInfoNumber + "校验未通过: " + e.getMessage());
+                    // errorMsg.append("单据编号为").append(baseInfoNumber).append("校验未通过: ").append(e.getMessage()).append(System.lineSeparator());
+                }
+            }
+        }
+        Map result = new HashMap();
+        if (errorMsgList.size() > 0) {
+            result.put("code", 500);
+            result.put("errorMsg", errorMsgList);
+        } else {
+            result.put("code", 200);
+        }
+        return result;
+    }
+
+    /**
+     * 根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
+     *
+     * @param ctx
+     * @param checkInDate  入住日期
+     * @param checkoutDate 退宿日期
+     * @param roomId       房间id
+     * @param personType   人员类型
+     * @return
+     * @throws BOSException
+     */
+    private int getRoomChangeInfoByRoomChangeApplication(
+            Context ctx,
+            Date checkInDate,
+            Date checkoutDate,
+            String roomId,
+            PersonDormitoryTypeInfo personType
+    ) throws BOSException {
+        IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        // 房间
+        filterItems.add(new FilterItemInfo("adjustRoom", roomId));
+        // 申请入住日期在入住日期和退宿日期之间
+        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,3", CompareType.INCLUDE));
+        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("adjustRoom.id");
+        sic.add("person.personType.id");
+        sic.add("person.personType.name");
+        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        RoomChangeApplicationEntryCollection roomChangeApplicationEntryCol = iRoomChangeApplicationEntry.getRoomChangeApplicationEntryCollection(viewInfo);
+        String personTypeId = personType.getId().toString();
+        String personTypeName = personType.getName();
+        // 已住人数
+        int dormCheckInCount = 0;
+        for (int i = 0; i < roomChangeApplicationEntryCol.size(); i++) {
+            RoomChangeApplicationEntryInfo roomChangeApplicationEntryInfo = roomChangeApplicationEntryCol.get(i);
+            // 房间
+            PersonInfo person = roomChangeApplicationEntryInfo.getPerson();
+            String personName = person.getName();
+            // 人员类型
+            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
+            if (personDormitoryType == null) {
+                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
+            }
+            String personDormitoryTypeId = personDormitoryType.getId().toString();
+            String personDormitoryTypeName = personDormitoryType.getName();
+            if (!personTypeId.equals(personDormitoryTypeId)) {
+                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
+            }
+            // 累计已住人数
+            dormCheckInCount++;
+        }
+        return dormCheckInCount;
+    }
+
+    /**
+     * 根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
+     *
+     * @param ctx
+     * @param checkInDate  入住日期
+     * @param checkoutDate 退宿日期
+     * @param roomId       房间id
+     * @param personType   人员类型
+     * @return
+     * @throws BOSException
+     */
+    private int getCheckInInfoByCheckInApplication(
+            Context ctx,
+            Date checkInDate,
+            Date checkoutDate,
+            String roomId,
+            PersonDormitoryTypeInfo personType
+    ) throws BOSException {
+        ICheckInApplicationEntry iCheckInApplicationEntry = CheckInApplicationEntryFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        // 房间
+        filterItems.add(new FilterItemInfo("checkInRoom", roomId));
+        // 申请入住日期在入住日期和退宿日期之间
+        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,3", 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");
+        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        CheckInApplicationEntryCollection checkInApplicationEntryCol = iCheckInApplicationEntry.getCheckInApplicationEntryCollection(viewInfo);
+        String personTypeId = personType.getId().toString();
+        String personTypeName = personType.getName();
+        // 已住人数
+        int dormCheckInCount = 0;
+        for (int i = 0; i < checkInApplicationEntryCol.size(); i++) {
+            CheckInApplicationEntryInfo checkInApplicationEntryInfo = checkInApplicationEntryCol.get(i);
+            // 房间
+            PersonInfo person = checkInApplicationEntryInfo.getPerson();
+            String personName = person.getName();
+            // 人员类型
+            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
+            if (personDormitoryType == null) {
+                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
+            }
+            String personDormitoryTypeId = personDormitoryType.getId().toString();
+            String personDormitoryTypeName = personDormitoryType.getName();
+            if (!personTypeId.equals(personDormitoryTypeId)) {
+                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
+            }
+            // 累计已住人数
+            dormCheckInCount++;
+        }
+        return dormCheckInCount;
+    }
+
+    /**
+     * 校验房间信息
+     *
+     * @param ctx
+     * @param personInfo
+     * @param dormitory  房间
+     * @return
+     * @throws BOSException
+     * @throws EASBizException
+     */
+    protected void validateDormitoryInfo(
+            Context ctx,
+            PersonInfo personInfo,
+            DormitoryInfo dormitory
+    ) throws BOSException, EASBizException {
+        Genders gender = personInfo.getGender();
+        if (gender == null) {
+            throw new BOSException("员工性别为空!");
+        }
+        String personInfoName = personInfo.getName();
+        IDormitory iDormitory = DormitoryFactory.getLocalInstance(ctx);
+        // 查询房间信息
+        String dormitoryName = dormitory.getName();
+        DormitoryClassification roomClassification = dormitory.getRoomClassification();
+        if (!DormitoryClassification.ROOM.equals(roomClassification)) {
+            String classificationAlias = roomClassification.getAlias();
+            throw new BOSException("房间[" + dormitoryName + "]房间归类为" + classificationAlias + ",不能入住!");
+        }
+        BasicItemStateEnum dormitoryInfoState = dormitory.getState();
+        if (BasicItemStateEnum.DISABLE.equals(dormitoryInfoState)) {
+            throw new BOSException("房间[" + dormitoryName + "]未启用,不能入住!");
+        }
+        // 宿舍类型
+        DormitoryTypeInfo dormitoryType = dormitory.getDormitoryType();
+        Genders roomGender = dormitoryType.getGender();
+        if (roomGender != null && gender.getValue() != roomGender.getValue()) {
+            String dormitoryTypeName = dormitoryType.getName();
+            throw new BOSException("房间[" + dormitoryName + "]宿舍类型为" + dormitoryTypeName + ",与人员[" + personInfoName + "]的性别不符!");
+        }
+    }
+
+    /**
+     * 根据入住日期和退宿日期算出入住信息中每个房间已住人数
+     *
+     * @param ctx
+     * @param checkInDate  入住日期
+     * @param checkoutDate 退宿日期
+     * @param roomId       房间id
+     * @param personType   人员类型
+     * @return
+     * @throws BOSException
+     */
+    protected int getCheckInInfoByOccupants(
+            Context ctx,
+            Date checkInDate,
+            Date checkoutDate,
+            String roomId,
+            PersonDormitoryTypeInfo personType
+    ) throws BOSException {
+        IOccupants iOccupants = OccupantsFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        // 房间
+        filterItems.add(new FilterItemInfo("Dormitory", roomId));
+        // 申请入住日期在入住日期和退宿日期之间
+        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));
+        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) ");
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("PersonDormitoryType.id");
+        sic.add("PersonDormitoryType.name");
+        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        OccupantsCollection occupantsCollection = iOccupants.getOccupantsCollection(viewInfo);
+        String personTypeId = personType.getId().toString();
+        String personTypeName = personType.getName();
+        // 已住人数
+        int dormCheckInCount = 0;
+        String personDormitoryTypeId = null;
+        for (int i = 0; i < occupantsCollection.size(); i++) {
+            OccupantsInfo occupantsInfo = occupantsCollection.get(i);
+            // 人员宿舍分类
+            PersonDormitoryTypeInfo personDormitoryType = occupantsInfo.getPersonDormitoryType();
+            personDormitoryTypeId = personDormitoryType.getId().toString();
+            String personDormitoryTypeName = personDormitoryType.getName();
+            if (!personTypeId.equals(personDormitoryTypeId)) {
+                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
+            }
+            dormCheckInCount++;
+        }
+        return dormCheckInCount;
+    }
+
     /**
      * 换宿单不能对有退宿单的入住信息进行换宿
      *
@@ -138,12 +500,12 @@ public class HRBillBaseEditHandler extends DormitoryApplicationEditHandler {
         IPerson iPerson = PersonFactory.getLocalInstance(ctx);
         IOccupants iOccupants = OccupantsFactory.getLocalInstance(ctx);
         for (int i = 0; i < entrys.size(); i++) {
-            //保存单据的数据
+            // 保存单据的数据
             RoomChangeApplicationEntryInfo entryInfo = entrys.get(i);
-            //OccupantsInfo oldOccupants = entryInfo.getOldOccupants();
+            // OccupantsInfo oldOccupants = entryInfo.getOldOccupants();
             OccupantsInfo oldOccupants = iOccupants.getOccupantsInfo(new ObjectUuidPK(entryInfo.getOldOccupants().getId()));
             PersonInfo person = oldOccupants.getPerson();
-            //查询历史的数据
+            // 查询历史的数据
             RoomChangeApplicationEntryCollection roomChangeApplicationEntryCollection =
                     ientry.getRoomChangeApplicationEntryCollection("select * ,person.name where person.id='" + person.getId() + "'");
             roomChangeOrders.add(new RoomChangeOrderUtil(entryInfo.getPerson().getId().toString(), entryInfo.getCheckInDate(), entryInfo.getCheckoutDate()));
@@ -151,7 +513,7 @@ public class HRBillBaseEditHandler extends DormitoryApplicationEditHandler {
             for (int j = 0; j < roomChangeApplicationEntryCollection.size(); j++) {
                 RoomChangeApplicationEntryInfo entry = roomChangeApplicationEntryCollection.get(j);
                 roomChangeOrders.add(new RoomChangeOrderUtil(entry.getPerson().getId().toString(), entry.getCheckInDate(), entry.getCheckoutDate()));
-                logger.error("verifyCheckNoDateOverlap-" + entry.getPerson().getId().toString() + "---" + entry.getCheckInDate().getTime() + "----" + entry.getCheckoutDate().getTime());
+                // logger.error("verifyCheckNoDateOverlap-" + entry.getPerson().getId().toString() + "---" + entry.getCheckInDate().getTime() + "----" + entry.getCheckoutDate().getTime());
             }
         }
         logger.error("verifyCheckNoDateOverlap--roomChangeOrders.size()--" + roomChangeOrders.size());
@@ -207,7 +569,7 @@ public class HRBillBaseEditHandler extends DormitoryApplicationEditHandler {
             logger.error("checkOutDate---" + checkOutDate);
             long checkOutTime = checkOutDate.getTime();
             long dateTime = new Date().getTime();
-            //校验原入住人员信息退宿日期是否小于当前时间
+            // 校验原入住人员信息退宿日期是否小于当前时间
             if (checkOutTime < dateTime) {
                 throw new ShrWebBizException("不可对历史入住人员信息进行换宿!!");
             }

+ 18 - 367
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/RoomChangeApplicationEditHandler.java

@@ -54,377 +54,28 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
     protected void beforeSubmit(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model) throws SHRWebException {
         logger.error("beforeSubmit--");
         HRBillBaseInfo hrBillBaseInfo = (HRBillBaseInfo) model;
-        //String billIds = hrBillBaseInfo.getId().toString();
-        //Map result = null;
-        //try {
-        //    //result = validateRoomAvailableByBillIds(billIds);
-        //} catch (Exception e) {
-        //    logger.error(e);
-        //    throw new ShrWebBizException("调用方法validateRoomAvailableByBillIds报错: " + 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());
-        //}
-        ////设置单据状态为未审批
-        //model.setInt("billState", 1);
-        super.beforeSubmit(request, response, model);
-    }
-
-    public Map validateRoomAvailableByBillIds(String billIds) throws BOSException {
-        logger.error("validateRoomAvailableByBillIds--");
-        if (StringUtils.isEmpty(billIds)) {
-            logger.error("单据id不能为空!");
-            throw new BOSException("单据id不能为空!");
-        }
-        Map<String, List<Map<String, Date>>> roomListMap = new HashMap<String, List<Map<String, Date>>>();
-        //StringBuilder errorMsg = new StringBuilder();
-        List<String> errorMsgList = new ArrayList<String>();
-        // HRBillBaseFactory.getLocalInstance()
-        ICoreBillBase iCoreBillBase = (ICoreBillBase) BOSObjectFactory.createBOSObject(ctx,
-                BOSUuid.read(billIds.split(",")[0]).getType());
-        SelectorItemCollection sic = new SelectorItemCollection();
-        sic.add("*");
-        sic.add("entrys.*");
-        sic.add("entrys.person.*");
-        sic.add("entrys.person.personType.*");
-        sic.add("entrys.adjustRoom.*");
-        sic.add("entrys.adjustRoom.DormitoryType.*");
-        FilterInfo filterInfo = new FilterInfo();
-        FilterItemCollection filterItems = filterInfo.getFilterItems();
-        //房间
-        filterItems.add(new FilterItemInfo("id", AtsUtil.toSet(billIds), CompareType.INCLUDE));
-        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-        CoreBillBaseCollection hrBillBaseCollection = iCoreBillBase.getCoreBillBaseCollection(viewInfo);
-        logger.error("hrBillBaseCollection--" + hrBillBaseCollection.size());
-        for (int i = 0; i < hrBillBaseCollection.size(); i++) {
-            HRBillBaseInfo hrBillBaseInfo = (HRBillBaseInfo) hrBillBaseCollection.get(i);
-            //String billId = hrBillBaseInfo.getId().toString();
-            String baseInfoNumber = hrBillBaseInfo.getNumber();
-            String bosType = hrBillBaseInfo.getId().getType().toString();
-            AbstractObjectCollection entrys = (AbstractObjectCollection) hrBillBaseInfo.get("entrys");
-            logger.error("entrys--" + entrys.size());
-            for (int j = 0; j < entrys.size(); j++) {
-                try {
-                    HRBillBaseEntryInfo entryInfo = (HRBillBaseEntryInfo) entrys.getObject(j);
-                    Date checkInDate = null;
-                    //B371AC0A 换宿单分录
-                    if ("B371AC0A".equals(bosType)) {
-                        //换宿单
-                        checkInDate = entryInfo.getDate("checkInDate");
-                    }
-                    if (checkInDate == null) {
-                        throw new BOSException("换宿日期不能为空!");
-                    }
-                    //退宿日期
-                    Date checkoutDate = entryInfo.getDate("checkoutDate");
-                    if (checkoutDate == null) {
-                        throw new BOSException("退宿日期不能为空!");
-                    }
-                    //人员
-                    PersonInfo personInfo = (PersonInfo) entryInfo.getObjectValue("person");
-                    if (personInfo == null) {
-                        throw new BOSException("人员不能为空!");
-                    }
-                    //房间
-                    DormitoryInfo dormitory = (DormitoryInfo) entryInfo.getObjectValue("adjustRoom");
-                    if (dormitory == null) {
-                        throw new BOSException("房间不能为空!");
-                    }
-                    String roomId = dormitory.getId().toString();
-                    //根据入住日期,性别,员工类别查询可选房间
-                    //人员类型
-                    PersonDormitoryTypeInfo personType = (PersonDormitoryTypeInfo) personInfo.get("personType");
-                    if (personType == null) {
-                        throw new BOSException("员工[" + personInfo.getName() + "]的人员类别为空,请及时维护!");
-                    }
-                    //String personTypeId = personType.getId().toString();
-                    //已住人数
-                    int dormCheckInCount = 0;
-                    //1.校验房间信息
-                    validateDormitoryInfo(ctx, personInfo, dormitory);
-                    //可住人数
-                    int occupancyCapacity = dormitory.getOccupancyCapacity();
-                    //2.根据换宿日期和退宿日期算出入住信息房间已住人数
-                    dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType);
-                    //3.根据换宿日期和退宿日期算出入住申请单状态为申请中的已住人数
-                    dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType);
-                    //4.根据换宿日期和退宿日期算出换宿申请单状态为申请中的已住人数
-                    dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType);
-                    //5.根据当前参数缓存算出已住人数
-                    if (roomListMap.containsKey(roomId)) {
-                        List<Map<String, Date>> roomMapList = roomListMap.get(roomId);
-                        for (int k = 0; k < roomMapList.size(); k++) {
-                            Map<String, Date> roomMap = roomMapList.get(k);
-                            Date checkInDateOld = roomMap.get("checkInDate");
-                            Date checkoutDateOld = roomMap.get("checkoutDate");
-                            //申请入住日期在入住日期和退宿日期之间
-                            //入住日期在申请入住日期和申请退宿日期之间
-                            if ((checkInDateOld.compareTo(checkInDate) <= 0 && checkoutDateOld.compareTo(checkInDate) >= 0)
-                                    || (checkInDateOld.compareTo(checkInDate) >= 0 && checkInDateOld.compareTo(checkoutDate) <= 0)) {
-                                dormCheckInCount++;
-                            }
-                        }
-                    }
-                    logger.error("occupancyCapacity--" + occupancyCapacity);
-                    logger.error("dormCheckInCount--" + dormCheckInCount);
-                    //6.算出房间剩余可住人数: 可住人数 - 已住人数
-                    if (occupancyCapacity - dormCheckInCount < 0) {
-                        String dormitoryName = dormitory.getName();
-                        throw new BOSException("当前入住人数" + dormCheckInCount + ",已超过房间[" + dormitoryName + "]可住人数" + occupancyCapacity + ",不能入住!");
-                    }
-                    Map roomMap = new HashMap();
-                    roomMap.put("checkInDate", checkInDate);
-                    roomMap.put("checkoutDate", checkoutDate);
-                    if (roomListMap.containsKey(roomId)) {
-                        roomListMap.get(roomId).add(roomMap);
-                    } else {
-                        List list = new ArrayList();
-                        roomListMap.put(roomId, list);
-                        list.add(roomMap);
-                    }
-                } catch (Exception e) {
-                    logger.error("单据编号为" + baseInfoNumber + "校验未通过: " + e.getMessage(), e);
-                    errorMsgList.add("单据编号为" + baseInfoNumber + "校验未通过: " + e.getMessage());
-                    //errorMsg.append("单据编号为").append(baseInfoNumber).append("校验未通过: ").append(e.getMessage()).append(System.lineSeparator());
-                }
-            }
-        }
-        Map result = new HashMap();
-        if (errorMsgList.size() > 0) {
-            result.put("code", 500);
-            result.put("errorMsg", errorMsgList);
-        } else {
-            result.put("code", 200);
-        }
-        return result;
-    }
-
-    /**
-     * 根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
-     *
-     * @param ctx
-     * @param checkInDate  入住日期
-     * @param checkoutDate 退宿日期
-     * @param roomId       房间id
-     * @param personType   人员类型
-     * @return
-     * @throws BOSException
-     */
-    private int getRoomChangeInfoByRoomChangeApplication(
-            Context ctx,
-            Date checkInDate,
-            Date checkoutDate,
-            String roomId,
-            PersonDormitoryTypeInfo personType
-    ) throws BOSException {
-        IRoomChangeApplicationEntry iRoomChangeApplicationEntry = RoomChangeApplicationEntryFactory.getLocalInstance(ctx);
-        FilterInfo filterInfo = new FilterInfo();
-        FilterItemCollection filterItems = filterInfo.getFilterItems();
-        //房间
-        filterItems.add(new FilterItemInfo("adjustRoom", roomId));
-        //申请入住日期在入住日期和退宿日期之间
-        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,3", CompareType.INCLUDE));
-        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
-        SelectorItemCollection sic = new SelectorItemCollection();
-        sic.add("adjustRoom.id");
-        sic.add("person.personType.id");
-        sic.add("person.personType.name");
-        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-        RoomChangeApplicationEntryCollection roomChangeApplicationEntryCol = iRoomChangeApplicationEntry.getRoomChangeApplicationEntryCollection(viewInfo);
-        String personTypeId = personType.getId().toString();
-        String personTypeName = personType.getName();
-        //已住人数
-        int dormCheckInCount = 0;
-        for (int i = 0; i < roomChangeApplicationEntryCol.size(); i++) {
-            RoomChangeApplicationEntryInfo roomChangeApplicationEntryInfo = roomChangeApplicationEntryCol.get(i);
-            //房间
-            PersonInfo person = roomChangeApplicationEntryInfo.getPerson();
-            String personName = person.getName();
-            //人员类型
-            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
-            if (personDormitoryType == null) {
-                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
-            }
-            String personDormitoryTypeId = personDormitoryType.getId().toString();
-            String personDormitoryTypeName = personDormitoryType.getName();
-            if (!personTypeId.equals(personDormitoryTypeId)) {
-                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
-            }
-            //累计已住人数
-            dormCheckInCount++;
+        String billIds = hrBillBaseInfo.getId().toString();
+        Map result = null;
+        try {
+            result = validateRoomAvailableByBillIds(billIds);
+        } catch (Exception e) {
+            logger.error(e);
+            throw new ShrWebBizException("调用方法validateRoomAvailableByBillIds报错: " + e.getMessage());
         }
-        return dormCheckInCount;
-    }
-
-    /**
-     * 根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
-     *
-     * @param ctx
-     * @param checkInDate  入住日期
-     * @param checkoutDate 退宿日期
-     * @param roomId       房间id
-     * @param personType   人员类型
-     * @return
-     * @throws BOSException
-     */
-    private int getCheckInInfoByCheckInApplication(
-            Context ctx,
-            Date checkInDate,
-            Date checkoutDate,
-            String roomId,
-            PersonDormitoryTypeInfo personType
-    ) throws BOSException {
-        ICheckInApplicationEntry iCheckInApplicationEntry = CheckInApplicationEntryFactory.getLocalInstance(ctx);
-        FilterInfo filterInfo = new FilterInfo();
-        FilterItemCollection filterItems = filterInfo.getFilterItems();
-        //房间
-        filterItems.add(new FilterItemInfo("adjustRoom", roomId));
-        //申请入住日期在入住日期和退宿日期之间
-        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,3", CompareType.INCLUDE));
-        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) and #5");
-        SelectorItemCollection sic = new SelectorItemCollection();
-        sic.add("adjustRoom.id");
-        sic.add("person.personType.id");
-        sic.add("person.personType.name");
-        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-        CheckInApplicationEntryCollection checkInApplicationEntryCol = iCheckInApplicationEntry.getCheckInApplicationEntryCollection(viewInfo);
-        String personTypeId = personType.getId().toString();
-        String personTypeName = personType.getName();
-        //已住人数
-        int dormCheckInCount = 0;
-        for (int i = 0; i < checkInApplicationEntryCol.size(); i++) {
-            CheckInApplicationEntryInfo checkInApplicationEntryInfo = checkInApplicationEntryCol.get(i);
-            //房间
-            PersonInfo person = checkInApplicationEntryInfo.getPerson();
-            String personName = person.getName();
-            //人员类型
-            PersonDormitoryTypeInfo personDormitoryType = (PersonDormitoryTypeInfo) person.get("personType");
-            if (personDormitoryType == null) {
-                throw new BOSException("员工[" + personName + "]的人员类别为空,请及时维护!");
+        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");
             }
-            String personDormitoryTypeId = personDormitoryType.getId().toString();
-            String personDormitoryTypeName = personDormitoryType.getName();
-            if (!personTypeId.equals(personDormitoryTypeId)) {
-                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
-            }
-            //累计已住人数
-            dormCheckInCount++;
-        }
-        return dormCheckInCount;
-    }
-
-    /**
-     * 校验房间信息
-     *
-     * @param ctx
-     * @param personInfo
-     * @param dormitory  房间
-     * @return
-     * @throws BOSException
-     * @throws EASBizException
-     */
-    protected void validateDormitoryInfo(
-            Context ctx,
-            PersonInfo personInfo,
-            DormitoryInfo dormitory
-    ) throws BOSException, EASBizException {
-        Genders gender = personInfo.getGender();
-        if (gender == null) {
-            throw new BOSException("员工性别为空!");
-        }
-        String personInfoName = personInfo.getName();
-        IDormitory iDormitory = DormitoryFactory.getLocalInstance(ctx);
-        //查询房间信息
-        String dormitoryName = dormitory.getName();
-        DormitoryClassification roomClassification = dormitory.getRoomClassification();
-        if (!DormitoryClassification.ROOM.equals(roomClassification)) {
-            String classificationAlias = roomClassification.getAlias();
-            throw new BOSException("房间[" + dormitoryName + "]房间归类为" + classificationAlias + ",不能入住!");
-        }
-        BasicItemStateEnum dormitoryInfoState = dormitory.getState();
-        if (BasicItemStateEnum.DISABLE.equals(dormitoryInfoState)) {
-            throw new BOSException("房间[" + dormitoryName + "]未启用,不能入住!");
-        }
-        //宿舍类型
-        DormitoryTypeInfo dormitoryType = dormitory.getDormitoryType();
-        Genders roomGender = dormitoryType.getGender();
-        if (roomGender != null && gender.getValue() != roomGender.getValue()) {
-            String dormitoryTypeName = dormitoryType.getName();
-            throw new BOSException("房间[" + dormitoryName + "]宿舍类型为" + dormitoryTypeName + ",与人员[" + personInfoName + "]的性别不符!");
+            throw new ShrWebBizException(errorMsgBuilder.toString());
         }
+        // 设置单据状态为未审批
+        // model.setInt("billState", 1);
+        super.beforeSubmit(request, response, model);
     }
 
-    /**
-     * 根据入住日期和退宿日期算出入住信息中每个房间已住人数
-     *
-     * @param ctx
-     * @param checkInDate  入住日期
-     * @param checkoutDate 退宿日期
-     * @param roomId       房间id
-     * @param personType   人员类型
-     * @return
-     * @throws BOSException
-     */
-    protected int getCheckInInfoByOccupants(
-            Context ctx,
-            Date checkInDate,
-            Date checkoutDate,
-            String roomId,
-            PersonDormitoryTypeInfo personType
-    ) throws BOSException {
-        IOccupants iOccupants = OccupantsFactory.getLocalInstance(ctx);
-        FilterInfo filterInfo = new FilterInfo();
-        FilterItemCollection filterItems = filterInfo.getFilterItems();
-        //房间
-        filterItems.add(new FilterItemInfo("Dormitory", roomId));
-        //申请入住日期在入住日期和退宿日期之间
-        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));
-        filterInfo.setMaskString("#0 and ((#1 and #2) or (#3 and #4)) ");
-        SelectorItemCollection sic = new SelectorItemCollection();
-        sic.add("PersonDormitoryType.id");
-        sic.add("PersonDormitoryType.name");
-        EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-        OccupantsCollection occupantsCollection = iOccupants.getOccupantsCollection(viewInfo);
-        String personTypeId = personType.getId().toString();
-        String personTypeName = personType.getName();
-        //已住人数
-        int dormCheckInCount = 0;
-        String personDormitoryTypeId = null;
-        for (int i = 0; i < occupantsCollection.size(); i++) {
-            OccupantsInfo occupantsInfo = occupantsCollection.get(i);
-            //人员宿舍分类
-            PersonDormitoryTypeInfo personDormitoryType = occupantsInfo.getPersonDormitoryType();
-            personDormitoryTypeId = personDormitoryType.getId().toString();
-            String personDormitoryTypeName = personDormitoryType.getName();
-            if (!personTypeId.equals(personDormitoryTypeId)) {
-                throw new BOSException("人员类别[" + personTypeName + "]与宿舍类型[" + personDormitoryTypeName + "]不符,不能入住!");
-            }
-            dormCheckInCount++;
-        }
-        return dormCheckInCount;
-    }
 
     @Override
     protected void afterCreateNewModel(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo coreBaseInfo) throws SHRWebException {
@@ -434,7 +85,7 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
             RoomChangeApplicationEntryCollection entrys = roomChangeApplicationInfo.getEntrys();
             RoomChangeApplicationEntryInfo roomChangeApplicationEntryInfo = new RoomChangeApplicationEntryInfo();
             roomChangeApplicationEntryInfo.setCheckoutDate(DateTimeUtils.parseDate("2199-12-31", "yyyy-MM-dd"));
-            //managementNotes  宿舍管理说明
+            // managementNotes  宿舍管理说明
             StringBuilder managementNotes = new StringBuilder();
             managementNotes.append("本人愿意遵守以下条款:").append("\n");
             managementNotes.append("1、自觉遵守公司《宿舍管理制度》和员工宿舍区有关管理办法,不私自调换宿舍和床位。").append("\n");