package com.java110.common.thread; import com.alibaba.fastjson.JSONObject; import com.java110.common.dao.IMachineTranslateServiceDao; import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.smo.common.IMachineInnerServiceSMO; import com.java110.core.smo.order.IOrderInnerServiceSMO; import com.java110.core.smo.user.IOwnerInnerServiceSMO; import com.java110.core.smo.user.IOwnerRoomRelInnerServiceSMO; import com.java110.core.smo.community.IRoomInnerServiceSMO; import com.java110.dto.RoomDto; import com.java110.dto.machine.MachineDto; import com.java110.dto.order.OrderDto; import com.java110.dto.owner.OwnerDto; import com.java110.dto.owner.OwnerRoomRelDto; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.BusinessTypeConstant; import com.java110.utils.constant.StatusConstant; import com.java110.utils.factory.ApplicationContextFactory; import com.java110.utils.util.Assert; import com.java110.utils.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 从订单中同步业主信息至设备中间表 * add by wuxw 2019-11-14 */ public class TranslateOwnerToMachine implements Runnable { Logger logger = LoggerFactory.getLogger(TranslateOwnerToMachine.class); public static final long DEFAULT_WAIT_SECOND = 5000 * 6; // 默认30秒执行一次 public static boolean TRANSLATE_STATE = false; private IOrderInnerServiceSMO orderInnerServiceSMOImpl; private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl; private IOwnerRoomRelInnerServiceSMO ownerRoomRelInnerServiceSMOImpl; private IMachineInnerServiceSMO machineInnerServiceSMOImpl; private IRoomInnerServiceSMO roomInnerServiceSMOImpl; private IMachineTranslateServiceDao machineTranslateServiceDaoImpl; public TranslateOwnerToMachine(boolean state) { TRANSLATE_STATE = state; orderInnerServiceSMOImpl = ApplicationContextFactory.getBean(IOrderInnerServiceSMO.class.getName(), IOrderInnerServiceSMO.class); ownerInnerServiceSMOImpl = ApplicationContextFactory.getBean(IOwnerInnerServiceSMO.class.getName(), IOwnerInnerServiceSMO.class); ownerRoomRelInnerServiceSMOImpl = ApplicationContextFactory.getBean(IOwnerRoomRelInnerServiceSMO.class.getName(), IOwnerRoomRelInnerServiceSMO.class); roomInnerServiceSMOImpl = ApplicationContextFactory.getBean(IRoomInnerServiceSMO.class.getName(), IRoomInnerServiceSMO.class); machineInnerServiceSMOImpl = ApplicationContextFactory.getBean("machineInnerServiceSMOImpl", IMachineInnerServiceSMO.class); machineTranslateServiceDaoImpl = ApplicationContextFactory.getBean("machineTranslateServiceDaoImpl", IMachineTranslateServiceDao.class); } @Override public void run() { long waitTime = DEFAULT_WAIT_SECOND; while (TRANSLATE_STATE) { try { executeTask(); waitTime = StringUtil.isNumber(MappingCache.getValue("DEFAULT_WAIT_SECOND")) ? Long.parseLong(MappingCache.getValue("DEFAULT_WAIT_SECOND")) : DEFAULT_WAIT_SECOND; Thread.sleep(waitTime); } catch (Throwable e) { logger.error("执行订单中同步业主信息至设备中失败", e); } } } /** * 执行任务 */ private void executeTask() { OwnerDto ownerDto = null; //查询订单信息 OrderDto orderDto = new OrderDto(); List orderDtos = orderInnerServiceSMOImpl.queryOwenrOrders(orderDto); for (OrderDto tmpOrderDto : orderDtos) { try { logger.debug("开始处理订单" + JSONObject.toJSONString(tmpOrderDto)); ownerDto = new OwnerDto(); if (BusinessTypeConstant.BUSINESS_TYPE_SAVE_OWNER_ROOM_REL.equals(tmpOrderDto.getBusinessTypeCd())) { //判断是否为添加房屋 OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto(); ownerRoomRelDto.setbId(tmpOrderDto.getbId()); List ownerRoomRelDtos = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto); Assert.listOnlyOne(ownerRoomRelDtos, "数据错误 业主房屋关系未找到,或找到多条" + JSONObject.toJSONString(tmpOrderDto)); ownerDto.setOwnerId(ownerRoomRelDtos.get(0).getOwnerId()); } else { ownerDto.setbId(tmpOrderDto.getbId()); } List ownerDtos = null; //根据bId 查询业主信息 //这种情况说明 业主已经删掉了 需要查询状态为 1 的数据 if (BusinessTypeConstant.BUSINESS_TYPE_DELETE_OWNER_INFO.equals(tmpOrderDto.getBusinessTypeCd())) { ownerDto.setStatusCd(StatusConstant.STATUS_CD_INVALID); ownerDtos = ownerInnerServiceSMOImpl.queryOwnerMembers(ownerDto); MachineDto machineDto = new MachineDto(); machineDto.setMachineId(""); deleteMachineTranslate(machineDto, ownerDtos.get(0)); orderInnerServiceSMOImpl.updateBusinessStatusCd(tmpOrderDto); logger.debug("没有数据数据直接刷为C1,当前为删除业主操作" + JSONObject.toJSONString(tmpOrderDto)); continue; } ownerDtos = ownerInnerServiceSMOImpl.queryOwnerMembers(ownerDto); // 房屋信息 if (ownerDtos == null || ownerDtos.size() == 0) { //刷新 状态为C1 orderInnerServiceSMOImpl.updateBusinessStatusCd(tmpOrderDto); logger.debug("没有数据数据直接刷为C1" + JSONObject.toJSONString(tmpOrderDto)); continue; } RoomDto roomDto = new RoomDto(); roomDto.setOwnerId(ownerDtos.get(0).getOwnerId()); List rooms = roomInnerServiceSMOImpl.queryRoomsByOwner(roomDto); dealData(tmpOrderDto, ownerDtos, rooms); //刷新 状态为C1 orderInnerServiceSMOImpl.updateBusinessStatusCd(tmpOrderDto); logger.debug("处理订单结束" + JSONObject.toJSONString(tmpOrderDto)); } catch (Exception e) { logger.error("执行订单任务失败", e); } } } /** * 将业主数据同步给所有该小区设备 * * @param tmpOrderDto * @param ownerDtos */ private void dealData(OrderDto tmpOrderDto, List ownerDtos, List roomDtos) { //拿到小区ID String communityId = ownerDtos.get(0).getCommunityId(); //根据小区ID查询现有设备 MachineDto machineDto = new MachineDto(); machineDto.setCommunityId(communityId); //String[] locationObjIds = new String[]{communityId}; List locationObjIds = new ArrayList<>(); locationObjIds.add(communityId); for (RoomDto roomDto : roomDtos) { locationObjIds.add(roomDto.getUnitId()); locationObjIds.add(roomDto.getRoomId()); } machineDto.setLocationObjIds(locationObjIds.toArray(new String[locationObjIds.size()])); List machineDtos = machineInnerServiceSMOImpl.queryMachines(machineDto); for (OwnerDto ownerDto : ownerDtos) { for (MachineDto tmpMachineDto : machineDtos) { if ("9996".equals(tmpMachineDto.getMachineTypeCd())) { continue; } if (BusinessTypeConstant.BUSINESS_TYPE_SAVE_OWNER_INFO.equals(tmpOrderDto.getBusinessTypeCd()) || BusinessTypeConstant.BUSINESS_TYPE_SAVE_OWNER_ROOM_REL.equals(tmpOrderDto.getBusinessTypeCd()) || BusinessTypeConstant.BUSINESS_TYPE_UPDATE_OWNER_INFO.equals(tmpOrderDto.getBusinessTypeCd())) { saveMachineTranslate(tmpMachineDto, ownerDto); // } else if (BusinessTypeConstant.BUSINESS_TYPE_UPDATE_OWNER_INFO.equals(tmpOrderDto.getBusinessTypeCd())) { // updateMachineTranslate(tmpMachineDto, ownerDto); } else if (BusinessTypeConstant.BUSINESS_TYPE_DELETE_OWNER_INFO.equals(tmpOrderDto.getBusinessTypeCd()) || BusinessTypeConstant.BUSINESS_TYPE_DELETE_OWNER_ROOM_REL.equals(tmpOrderDto.getBusinessTypeCd()) ) { deleteMachineTranslate(tmpMachineDto, ownerDto); } else { } } } } private void saveMachineTranslate(MachineDto tmpMachineDto, OwnerDto ownerDto) { Map paramInfo = new HashMap(); paramInfo.put("machineId", tmpMachineDto.getMachineId()); paramInfo.put("objId", ownerDto.getMemberId()); paramInfo.put("statusCd", "0"); int count = machineTranslateServiceDaoImpl.queryMachineTranslatesCount(paramInfo); if (count > 0) { updateMachineTranslate(tmpMachineDto, ownerDto); return; } Map info = new HashMap(); //machine_id,machine_code,status_cd,type_cd,machine_translate_id,obj_id,obj_name,state,community_id,b_id info.put("machineTranslateId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_machineTranslateId)); info.put("machineId", tmpMachineDto.getMachineId()); info.put("machineCode", tmpMachineDto.getMachineCode()); info.put("typeCd", "8899"); info.put("objId", ownerDto.getMemberId()); info.put("objName", ownerDto.getName()); info.put("state", "10000"); info.put("communityId", ownerDto.getCommunityId()); info.put("bId", "-1"); machineTranslateServiceDaoImpl.saveMachineTranslate(info); } private void updateMachineTranslate(MachineDto tmpMachineDto, OwnerDto ownerDto) { Map info = new HashMap(); //machine_id,machine_code,status_cd,type_cd,machine_translate_id,obj_id,obj_name,state,community_id,b_id info.put("machineId", tmpMachineDto.getMachineId()); info.put("objId", ownerDto.getMemberId()); info.put("state", "10000"); info.put("communityId", ownerDto.getCommunityId()); info.put("updateTime", new Date()); machineTranslateServiceDaoImpl.updateMachineTranslate(info); } private void deleteMachineTranslate(MachineDto tmpMachineDto, OwnerDto ownerDto) { Map info = new HashMap(); //machine_id,machine_code,status_cd,type_cd,machine_translate_id,obj_id,obj_name,state,community_id,b_id info.put("machineId", tmpMachineDto.getMachineId()); info.put("objId", ownerDto.getMemberId()); info.put("statusCd", StatusConstant.STATUS_CD_INVALID); info.put("communityId", ownerDto.getCommunityId()); machineTranslateServiceDaoImpl.updateMachineTranslate(info); } }