package com.java110.community.cmd.visit; import com.alibaba.fastjson.JSONObject; import com.java110.core.annotation.Java110Cmd; import com.java110.core.annotation.Java110Transactional; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.core.factory.CommunitySettingFactory; import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.smo.IPhotoSMO; import com.java110.dto.oaWorkflow.OaWorkflowDto; import com.java110.dto.oaWorkflowXml.OaWorkflowXmlDto; import com.java110.dto.parking.ParkingSpaceDto; import com.java110.dto.visit.VisitDto; import com.java110.dto.visitSetting.VisitSettingDto; import com.java110.intf.common.*; import com.java110.intf.community.*; import com.java110.intf.oa.IOaWorkflowInnerServiceSMO; import com.java110.intf.oa.IOaWorkflowXmlInnerServiceSMO; import com.java110.po.owner.VisitPo; import com.java110.po.parking.ParkingSpacePo; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import java.text.ParseException; import java.util.*; /** * 访客登记 * * @author fqz * @date 2023-02-27 10:23 */ @Java110Cmd(serviceCode = "visit.saveVisit") public class SaveVisitCmd extends Cmd { @Autowired private IVisitInnerServiceSMO visitInnerServiceSMOImpl; @Autowired private IVisitV1InnerServiceSMO visitV1InnerServiceSMOImpl; @Autowired private IPhotoSMO photoSMOImpl; @Autowired private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl; @Autowired private IVisitSettingV1InnerServiceSMO visitSettingV1InnerServiceSMOImpl; @Autowired private IOaWorkflowInnerServiceSMO oaWorkflowInnerServiceSMOImpl; @Autowired private IOaWorkflowActivitiInnerServiceSMO oaWorkflowActivitiInnerServiceSMOImpl; @Autowired private IOaWorkflowXmlInnerServiceSMO oaWorkflowXmlInnerServiceSMOImpl; public static final String CODE_PREFIX_ID = "10"; //键 public static final String IS_NEED_REVIEW = "IS_NEED_REVIEW"; //键 public static final String VISIT_NUMBER = "VISIT_NUMBER"; //键 public static final String CAR_FREE_TIME = "CAR_FREE_TIME"; //键 public static final String ASCRIPTION_CAR_AREA_ID = "ASCRIPTION_CAR_AREA_ID"; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { Assert.hasKeyAndValue(reqJson, "vName", "必填,请填写访客姓名"); Assert.hasKeyAndValue(reqJson, "visitGender", "必填,请填写访客姓名"); Assert.hasKeyAndValue(reqJson, "phoneNumber", "必填,请填写访客联系方式"); Assert.hasKeyAndValue(reqJson, "visitTime", "必填,请填写访客拜访时间"); } @Override @Java110Transactional public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { String userId = context.getReqHeaders().get("user-id"); String storeId = context.getReqHeaders().get("store-id"); reqJson.put("vId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_vId)); //随行人数 if (StringUtil.isEmpty(reqJson.getString("entourage"))) { reqJson.put("entourage", "0"); } reqJson.put("recordState", "0"); VisitPo visitPo = BeanConvertUtil.covertBean(reqJson, VisitPo.class); visitPo.setState(VisitDto.STATE_W); visitPo.setUserId(userId); int flag = visitV1InnerServiceSMOImpl.saveVisit(visitPo); if (flag < 1) { throw new CmdException("保存访客失败"); } photoSMOImpl.savePhoto(reqJson, reqJson.getString("vId"), reqJson.getString("communityId")); // 访客记录是否需要审核 if (hasAuditVisit(visitPo, reqJson, storeId, userId)) { return; // 需要审核结束,审核时处理 相应 送图片 和车牌数据 } //查询访客配置信息 VisitSettingDto visitSettingDto = new VisitSettingDto(); visitSettingDto.setCommunityId(reqJson.getString("communityId")); List visitSettingDtos = visitSettingV1InnerServiceSMOImpl.queryVisitSettings(visitSettingDto); //有车辆信息的情况下判断车辆是否需要审核 if (reqJson.containsKey("carNum") && !StringUtil.isEmpty(reqJson.getString("carNum"))) { //有车辆 if (visitSettingDtos != null && visitSettingDtos.size() == 1 && visitSettingDtos.get(0).getCarNumWay().equals("Y")) { //车辆同步 Y 是 N 否 //获取预约车辆停车场ID、预约车辆免费时长、预约车限制次数、预约车是否审核 JSONObject visitJson = getVisitCarOperate(reqJson); //车辆是否需要审核 // String isNeedReview = CommunitySettingFactory.getValue(reqJson.getString("communityId"), IS_NEED_REVIEW); //获取小区配置里车辆是否需要审核的值 String isNeedReview = visitJson.getString("isNeedReview"); //获取车辆是否需要审核的值 if (!StringUtil.isEmpty(isNeedReview) && isNeedReview.equals("0")) { //0表示需要审核 1表示不需要审核 visitPo = new VisitPo(); visitPo.setCarState(VisitDto.CAR_STATE_W); //车辆状态为待审核状态 visitPo.setState(VisitDto.STATE_C); //访客记录为审核通过状态 visitPo.setvId(reqJson.getString("vId")); visitPo.setCommunityId(reqJson.getString("communityId")); flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("修改访客状态失败"); } } else { //其他情况默认为车辆审核通过 visitPo = new VisitPo(); visitPo.setState(VisitDto.STATE_C); //访客记录状态变为审核通过 visitPo.setvId(reqJson.getString("vId")); visitPo.setCommunityId(reqJson.getString("communityId")); JSONObject param = dealVisitorRegistrationTimes(visitJson); //判断是否超过访客登记次数 if (param.containsKey("specifiedTimes") && !StringUtil.isEmpty(param.getString("specifiedTimes")) && param.getString("specifiedTimes").equals("true")) { //超过车辆登记次数 visitPo.setStateRemark("访客信息登记成功,您已经超过预约车辆登记次数限制,车辆将无法审核!"); visitPo.setCarStateRemark("访客信息登记成功,您已经超过预约车辆登记次数限制,车辆将无法审核!"); visitPo.setCarState(VisitDto.CAR_STATE_F); //车辆状态变为审核拒绝 ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_OK, "访客信息登记成功,您已经超过预约车辆登记次数限制,车辆将无法自动审核!"); context.setResponseEntity(responseEntity); flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("保存访客失败"); } } else { //未超过车辆登记次数 //获取车位 JSONObject paramJson = dealParkingSpace(visitJson); if (paramJson.containsKey("freeSpace") && !StringUtil.isEmpty(paramJson.getString("freeSpace")) && paramJson.getString("freeSpace").equals("true")) { //无空闲车位 visitPo.setStateRemark("访客信息登记成功,当前停车场已无空闲车位,登记车辆将暂时不能进入停车场,请您合理安排出行。"); visitPo.setCarStateRemark("访客信息登记成功,当前停车场已无空闲车位,登记车辆将暂时不能进入停车场,请您合理安排出行。"); visitPo.setCarState(VisitDto.CAR_STATE_F); //车辆状态为审核拒绝状态 ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_OK, "访客信息登记成功,当前停车场已无空闲车位,登记车辆将暂时不能进入停车场,请您合理安排出行。"); context.setResponseEntity(responseEntity); flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("保存访客失败"); } } else { //有空闲车位 visitPo.setPsId(paramJson.getString("psId")); //处理预约车免费时长 String freeTime = dealVisitCarFreeTime(visitJson); reqJson.put("freeTime", freeTime); visitPo.setFreeTime(freeTime); //预约车免费时长 visitPo.setCarState(VisitDto.CAR_STATE_C); //车辆状态为审核通过状态 flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("修改访客状态失败"); } //修改车位状态 modifyParkingSpaceSate(paramJson); } } } } else if (visitSettingDtos != null && visitSettingDtos.size() == 1 && visitSettingDtos.get(0).getCarNumWay().equals("N")) { //车辆不同步 visitPo = new VisitPo(); visitPo.setState(VisitDto.STATE_C); visitPo.setCarState(VisitDto.CAR_STATE_C); //车辆审核通过 visitPo.setCarStateRemark("车辆不同步!"); visitPo.setvId(reqJson.getString("vId")); visitPo.setCommunityId(reqJson.getString("communityId")); flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("修改访客状态失败"); } } } else { //无车辆 visitPo = new VisitPo(); visitPo.setState(VisitDto.STATE_C); visitPo.setvId(reqJson.getString("vId")); visitPo.setCommunityId(reqJson.getString("communityId")); flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("修改访客状态失败"); } } } /** * 是否需要审核 * * @param visitPo * @param reqJson */ private boolean hasAuditVisit(VisitPo visitPo, JSONObject reqJson, String storeId, String userId) { VisitSettingDto visitSettingDto = new VisitSettingDto(); visitSettingDto.setCommunityId(reqJson.getString("communityId")); List visitSettingDtos = visitSettingV1InnerServiceSMOImpl.queryVisitSettings(visitSettingDto); if (visitSettingDtos == null || visitSettingDtos.size() < 1) { return false; } // 需要审核 if (!VisitSettingDto.AUDIT_WAY_YES.equals(visitSettingDtos.get(0).getAuditWay())) { return false; } //触发 审批流程 OaWorkflowDto oaWorkflowDto = new OaWorkflowDto(); oaWorkflowDto.setStoreId(storeId); oaWorkflowDto.setFlowId(visitSettingDtos.get(0).getFlowId()); List oaWorkflowDtos = oaWorkflowInnerServiceSMOImpl.queryOaWorkflows(oaWorkflowDto); Assert.listOnlyOne(oaWorkflowDtos, "流程不存在"); if (!OaWorkflowDto.STATE_COMPLAINT.equals(oaWorkflowDtos.get(0).getState())) { throw new IllegalArgumentException(oaWorkflowDtos.get(0).getFlowName() + "流程未部署"); } if (StringUtil.isEmpty(oaWorkflowDtos.get(0).getProcessDefinitionKey())) { throw new IllegalArgumentException(oaWorkflowDtos.get(0).getFlowName() + "流程未部署"); } //启动任务 JSONObject flowJson = new JSONObject(); flowJson.put("processDefinitionKey", oaWorkflowDtos.get(0).getProcessDefinitionKey()); flowJson.put("createUserId", userId); flowJson.put("flowId", oaWorkflowDtos.get(0).getFlowId()); flowJson.put("id", visitPo.getvId()); flowJson.put("auditMessage", "提交审核"); flowJson.put("storeId", storeId); reqJson.put("processDefinitionKey", oaWorkflowDtos.get(0).getProcessDefinitionKey()); JSONObject result = oaWorkflowActivitiInnerServiceSMOImpl.startProcess(flowJson); //提交者提交 flowJson = new JSONObject(); flowJson.put("processInstanceId", result.getString("processInstanceId")); flowJson.put("createUserId", userId); flowJson.put("nextUserId", nextAuditStaff(storeId, visitSettingDtos.get(0).getFlowId())); // 这里要求流程 下一处理人必须要指定 flowJson.put("storeId", storeId); flowJson.put("id", visitPo.getvId()); flowJson.put("flowId", oaWorkflowDtos.get(0).getFlowId()); oaWorkflowActivitiInnerServiceSMOImpl.autoFinishFirstTask(flowJson); visitPo = new VisitPo(); visitPo.setState(VisitDto.STATE_D); visitPo.setvId(reqJson.getString("vId")); visitPo.setCommunityId(reqJson.getString("communityId")); if (reqJson.containsKey("carNum") && !StringUtil.isEmpty(reqJson.getString("carNum"))) { visitPo.setCarState(VisitDto.CAR_STATE_D); } int flag = visitV1InnerServiceSMOImpl.updateVisit(visitPo); if (flag < 1) { throw new CmdException("修改访客状态失败"); } return true; } private String nextAuditStaff(String storeId, String flowId) { OaWorkflowDto oaWorkflowDto = new OaWorkflowDto(); oaWorkflowDto.setFlowId(flowId); oaWorkflowDto.setStoreId(storeId); List oaWorkflowDtos = oaWorkflowInnerServiceSMOImpl.queryOaWorkflows(oaWorkflowDto); Assert.listOnlyOne(oaWorkflowDtos, "流程不存在"); OaWorkflowXmlDto oaWorkflowXmlDto = new OaWorkflowXmlDto(); oaWorkflowXmlDto.setFlowId(oaWorkflowDtos.get(0).getFlowId()); List oaWorkflowXmlDtos = oaWorkflowXmlInnerServiceSMOImpl.queryOaWorkflowXmls(oaWorkflowXmlDto); Assert.listOnlyOne(oaWorkflowXmlDtos, "流程不存在"); List tasks = oaWorkflowActivitiInnerServiceSMOImpl.queryFirstAuditStaff(oaWorkflowXmlDtos.get(0)); if (tasks == null || tasks.size() < 1) { throw new CmdException("流程未设置下一步审核人"); } String assignee = tasks.get(0).getString("assignee"); if (assignee.startsWith("-")) { throw new CmdException("流程未设置下一步审核人"); } return assignee; } //处理车位id public JSONObject dealParkingSpace(JSONObject reqJson) { //是否有空闲车位 false 有空闲 true无空闲 boolean freeSpace = false; //获取访客配置里配置的停车场id // String parkingAreaId = CommunitySettingFactory.getValue(reqJson.getString("communityId"), ASCRIPTION_CAR_AREA_ID); String ascriptionCarAreaId = reqJson.getString("ascriptionCarAreaId"); if (StringUtil.isEmpty(ascriptionCarAreaId)) { //如果没有配置停车场id,就随便分配该小区下一个空闲车位 ParkingSpaceDto parkingSpace = new ParkingSpaceDto(); parkingSpace.setCommunityId(reqJson.getString("communityId")); parkingSpace.setState("F"); //车位状态 出售 S,出租 H ,空闲 F parkingSpace.setParkingType("1"); //1:普通车位 2:子母车位 3:豪华车位 //查询小区空闲车位 List parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpace); if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { freeSpace = true; } else { //随机生成一个不大于集合长度的整数 Random random = new Random(); int i = random.nextInt(parkingSpaceDtos.size()); //获取车位id String psId = parkingSpaceDtos.get(i).getPsId(); reqJson.put("psId", psId); } } else { ParkingSpaceDto parkingSpace = new ParkingSpaceDto(); parkingSpace.setCommunityId(reqJson.getString("communityId")); parkingSpace.setPaId(ascriptionCarAreaId); //停车场id parkingSpace.setState("F"); //车位状态 出售 S,出租 H ,空闲 F parkingSpace.setParkingType("1"); //1:普通车位 2:子母车位 3:豪华车位 List parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpace); if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { freeSpace = true; } else { //随机生成一个不大于集合长度的整数 Random random = new Random(); int i = random.nextInt(parkingSpaceDtos.size()); //获取车位id String psId = parkingSpaceDtos.get(i).getPsId(); reqJson.put("psId", psId); } } reqJson.put("freeSpace", freeSpace); return reqJson; } //更改车位状态 public void modifyParkingSpaceSate(JSONObject reqJson) { ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto(); parkingSpaceDto.setPsId(reqJson.getString("psId")); List parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto); Assert.listOnlyOne(parkingSpaceDtos, "查询车位错误!"); ParkingSpacePo parkingSpacePo = new ParkingSpacePo(); parkingSpacePo.setPsId(parkingSpaceDtos.get(0).getPsId()); parkingSpacePo.setState("H"); //车位状态 出售 S,出租 H ,空闲 F parkingSpaceInnerServiceSMOImpl.updateParkingSpace(parkingSpacePo); } //判断是否超过访客登记次数 public JSONObject dealVisitorRegistrationTimes(JSONObject reqJson) { //是否超过规定次数 boolean specifiedTimes = false; //查询预约车辆登记次数 // String visitNumber = CommunitySettingFactory.getValue(reqJson.getString("communityId"), VISIT_NUMBER); String visitNumber = reqJson.getString("visitNumber"); //预约车限制次数 if (StringUtil.isEmpty(visitNumber)) { reqJson.put("specifiedTimes", specifiedTimes); return reqJson; } int number = Integer.parseInt(visitNumber); VisitDto visitDto = new VisitDto(); //查询当天车辆登记次数 visitDto.setOwnerId(reqJson.getString("ownerId")); visitDto.setCommunityId(reqJson.getString("communityId")); visitDto.setCarNumNoEmpty("1"); visitDto.setSameDay("1"); visitDto.setCarState("1"); //车辆审核通过 visitDto.setSign(reqJson.getString("vId")); List visitDtos = visitInnerServiceSMOImpl.queryVisits(visitDto); int count = visitDtos.size(); //预约车辆登记次数0不做限制 if (count >= number && number > 0) { reqJson.put("psId", null); reqJson.put("freeTime", null); specifiedTimes = true; } reqJson.put("specifiedTimes", specifiedTimes); return reqJson; } //处理预约车免费时长 public String dealVisitCarFreeTime(JSONObject reqJson) { //获取预约车免费时长的值 // String freeTime = CommunitySettingFactory.getValue(reqJson.getString("communityId"), CAR_FREE_TIME); String carFreeTime = reqJson.getString("carFreeTime"); if (StringUtil.isEmpty(carFreeTime)) { carFreeTime = "120"; } Date time = DateUtil.getDateFromStringA(reqJson.getString("visitTime")); Calendar newTime = Calendar.getInstance(); newTime.setTime(time); newTime.add(Calendar.MINUTE, Integer.parseInt(carFreeTime));//日期加上分钟 Date newDate = newTime.getTime(); String finishFreeTime = DateUtil.getFormatTimeString(newDate, DateUtil.DATE_FORMATE_STRING_A); return finishFreeTime; } //获取预约车辆停车场ID、预约车辆免费时长、预约车限制次数、预约车是否审核 public JSONObject getVisitCarOperate(JSONObject reqJson) { VisitSettingDto visitSettingDto = new VisitSettingDto(); visitSettingDto.setCommunityId(reqJson.getString("communityId")); List visitSettingDtos = visitSettingV1InnerServiceSMOImpl.queryVisitSettings(visitSettingDto); if (visitSettingDtos != null && visitSettingDtos.size() > 0) { reqJson.put("ascriptionCarAreaId", visitSettingDtos.get(0).getPaId()); //预约车辆归属停车场ID reqJson.put("carFreeTime", visitSettingDtos.get(0).getCarFreeTime()); //预约车辆免费时长(单位为分钟) reqJson.put("visitNumber", visitSettingDtos.get(0).getVisitNumber()); //预约车限制次数 reqJson.put("isNeedReview", visitSettingDtos.get(0).getIsNeedReview()); //预约车是否审核 0表示需要审核 1表示不需要审核 } return reqJson; } }