物联网之产品类型业务逻辑

物联网之产品类型业务逻辑 、引用模板

@Service
@Slf4j
public class IotProductService {

    @Autowired
    private LoginService loginService;    
 
    @Autowired
    private ObjectModelDao objectModelDao;
 
    @Autowired
    private ProductsDao productsDao;
 
    @Autowired
    private SystemConfigDao systemConfigDao;
 
    @Autowired
    private CategoryDao categoryDao;
 
    @Autowired
    private ObjectPropertiesDao objectPropertiesDao;
    @Autowired
    private ObjectServicesDao objectServicesDao;
    @Autowired
    private ObjectEventsDao objectEventsDao;
    @Autowired
    private ObjectEventsParamsDao objectEventsParamsDao;
    @Autowired
    private ObjectServicesParamsDao objectServicesParamsDao;
    @Autowired
    private ProductPropertiesDao productPropertiesDao;
    @Autowired
    private ProductServicesDao productServicesDao;
    @Autowired
    private ProductEventsDao productEventsDao;
    @Autowired
    private ProductEventsParamsDao productEventsParamsDao;
    @Autowired
    private ProductServicesParamsDao productServicesParamsDao;
    @Autowired
    private EmployeeDao employeeDao;
 
    @Autowired
    private ProductInnerIdentifierDao innerIdentifierDao;
 
    @Autowired
    private ProductsService productsService;
 
    private final String SERVICE_METHOD_PREFIX = "thing.service.property.";
    private final String AUTH_TYPE = "product_auth_mode";
    private final String LINK_TYPE = "product_link_mode";
    private final String EVENT_METHOD_PROPERTY = "thing.event.property.post";
 
    /**
     * 默认功能事件的标识符
     */
    private final String POST = "property";
 
    @Autowired
    private SystemConfig systemConfig;
 
 
    /**
     * 根据id查询
     */
    public ProductsEntity getById(Long id) {
        return productsDao.selectById(id);
    }
 
    /*    public boolean checkExistByProductNameAndCategoryId(String productName, Long categoryId) {
        QueryWrapper<ProductsEntity> qw = new QueryWrapper<>();
        qw.eq("category_id", categoryId);
        qw.eq("name", productName);
        qw.eq("product_status", 1);
        Integer integer = productsDao.selectCount(qw);
        return integer > 0;
    }*/
 
    /**
     * 分页查询 默认按添加时间降序排列
     * <p>
     * TODO 选择发布状态,可以看到所有人发布的;选择草稿状态,只能看到自己创建的
     * 优化缓存产品类型信息
     *
     */
 
 
    public ResponseDTO<PageResultDTO<ProductsVO>> queryByPage(ProductsQueryDTO queryDTO) {
        Page<?> page = IotPageUtil.convert2QueryPage(queryDTO);
        if (page.getOrders() == null || page.getOrders().isEmpty()) {
            List<OrderItem> list = new ArrayList<OrderItem>();
            OrderItem item = new OrderItem();
            item.setAsc(false);
            item.setColumn("update_time");
            list.add(item);
            page.setOrders(list);
        }
        IPage<ProductsVO> pageVOs = productsDao.queryByPage(page, queryDTO);
        List<ProductsVO> records = pageVOs.getRecords();
        records.forEach(r -> {
            Long categoryId = r.getCategoryId();
            r.setCategoryName(systemConfig.id2CategoryMap.get(categoryId));
        });
        pageVOs.setRecords(records);
        PageResultDTO<ProductsVO> pageResultDTO =         IotPageUtil.convert2PageResult(pageVOs);
        return ResponseDTO.succData(pageResultDTO);
    }

 
 
    @Transactional(rollbackFor = Exception.class)
    public ResponseDTO<Long> add(ProductsAddDTO addDTO, String userNo) {
        ProductsEntity productsEntity = IotBeanUtil.copy(addDTO, ProductsEntity.class);
        productsEntity.setAuthType(convertListToString(addDTO.getAuthType()));
        productsEntity.setLinkType(convertListToString(addDTO.getLinkType()));
 
        // 新增产品类型 草稿状态
        productsEntity
                .setProductStatus(ProductRefEnum.ProductStatusType.DRAFT.getCode())
                .setProductRefNum(1);
        // 当前前端请求参数未传noteType
        productsEntity.setNodeType(addDTO.getNodeType() == null ? NodeTypeEnum.NodeType.DIRECT_CONNECTED_DEVICE.code : addDTO.getNodeType());
        // TODO 调试阶段注释此逻辑。获取当前用户并赋值给entity的creator_id
//        RequestTokenBO requestUser = IotRequestTokenUtil.getRequestUser();
//
//        LoginDetailVO session = loginService.getSession(requestUser);
//        Long id = session.getId();
//        String number = session.getPhone();
//        entity.setCreatorId(id);
        QueryWrapper<EmployeeEntity> qw = new QueryWrapper<>(new EmployeeEntity());
        qw.eq("login_name", userNo);
        EmployeeEntity employeeEntity = employeeDao.selectOne(qw);
        //String loginName = employeeEntity.getLoginName();
        if (employeeEntity != null) {
            productsEntity.setCreatorId(employeeEntity.getId());
        }
        Long categoryId = productsEntity.getCategoryId();
        productsEntity.setCategoryName(systemConfig.id2CategoryMap.get(categoryId));
        productsEntity.setCreatorName(userNo);
 
        productsDao.insert(productsEntity);
        long productId = productsEntity.getId();
        createDefaultFunction4Product(productId);
        return ResponseDTO.succData(productId);
    }

private void createDefaultFunction4Product(long productId) {
        // 创建默认的set、get服务,post事件
        String get = "get";
        String set = "set";
        ProductServicesEntity identifierGetEntity = createProductServicesEntity4Identifier(productId, get, 1);
        ProductServicesEntity identifierSetEntity = createProductServicesEntity4Identifier(productId, set, 2);
        productServicesDao.insertBatch(new ArrayList<>(Arrays.asList(identifierGetEntity, identifierSetEntity)));

        // 自动生成get的set参数
        ProductServicesParamsEntity setServiceParam = createProductServicesParamsEntity4Set(identifierSetEntity.getId());
        ProductServicesParamsEntity getServiceParam = createProductServicesParamsEntity4Get(identifierGetEntity.getId());
 
        
        productServicesParamsDao.insertBatch(new ArrayList<>(Arrays.asList(setServiceParam, getServiceParam)));
 
 
        ProductEventsEntity eventsEntity = new ProductEventsEntity();
        eventsEntity.setCustom(ProductRefEnum.FunctionType.DEFAULT.getCode())
                .setIdentifier(POST)
                .setDescription("属性上报")
                .setOriginalRequired(0)
                .setProductId(productId)
                .setLevel(0) // 设计文档 默认等级为0
                .setMethod(EVENT_METHOD_PROPERTY)
                .setName(POST)
                .setType(0)
                .setUpdateRequired(0);
        productEventsDao.insert(eventsEntity);
 
        // 插入get、post、set 信息到 t_product_inner_identifier 开始
        ProductInnerIdentifierEntity getEntity = new ProductInnerIdentifierEntity()
                .setProductId(productId).setIdentifier("get").setRef(1).setCustom(2);
        ProductInnerIdentifierEntity setEntity = new ProductInnerIdentifierEntity()
                .setProductId(productId).setIdentifier("set").setRef(2).setCustom(2);
        ProductInnerIdentifierEntity postEntity = new ProductInnerIdentifierEntity()
            .setProductId(productId).setIdentifier("property").setRef(3).setCustom(2);
 
        List<ProductInnerIdentifierEntity> list = new ArrayList<>(3);
        list.add(getEntity);
        list.add(postEntity);
        list.add(setEntity);
        innerIdentifierDao.insertBatch4WithRefIdentifier(list);
        // 插入get、post、set 信息到 t_product_inner_identifier 完毕
    }

    private ProductServicesParamsEntity createProductServicesParamsEntity4Set(long setServiceId) {
        ProductServicesParamsEntity getServiceParam = new ProductServicesParamsEntity();
 
        getServiceParam.setRef(1);
        getServiceParam.setCustom(2);
        getServiceParam.setType(ServiceParamTypeEnum.ParamType.OUT_PARAM.getCode());
        getServiceParam.setIdentifier("set_results");
        getServiceParam.setName("请求参数");
        getServiceParam.setRefId(setServiceId);
        getServiceParam.setDescription("设置失败的属性ref列表");
        getServiceParam.setDataType(7); // 数组嵌套
        /**
         * "dataType": {
         * 				"type": "array",
         * 				"specs": {
         * 					"size": "5",
         * 					"item": {
         * 						"dataType": {
         * 							"type": "text",
         * 							"specs": {
         * 								"rule": "",
         * 								"length": 0
         *                           }* 						}
         *                    }
         *                }* 			}
         */
        JSONObject specs = new JSONObject();
        specs.put("size", 0); // 创建产品时,get 的输出参数列表默认大小为0
        JSONObject item = new JSONObject();
        JSONObject dataType = new JSONObject();
        dataType.put("type", 3);
        JSONObject innerSpecs = new JSONObject();
        innerSpecs.put("rule", "");
        innerSpecs.put("length", 64);
        dataType.put("specs", innerSpecs);
        item.put("dataType", dataType);
        specs.put("item", item);
        getServiceParam.setSpecs(specs.toJSONString());
 
        return getServiceParam;
    }

private ProductServicesParamsEntity createProductServicesParamsEntity4Get(long getServiceId) {
        ProductServicesParamsEntity setServiceParam = new ProductServicesParamsEntity();
        setServiceParam.setRef(2);
        setServiceParam.setCustom(2);
        setServiceParam.setType(ServiceParamTypeEnum.ParamType.IN_PARAM.getCode());
        setServiceParam.setIdentifier("get_params");
        setServiceParam.setName("返回值");
        setServiceParam.setRefId(getServiceId);
        setServiceParam.setDescription("获取属性(默认生成)");
        setServiceParam.setDataType(7); // 数组嵌套
 /**
         * "dataType": {
         * 				"type": "array",
         * 				"specs": {
         * 					"size": "5",
         * 					"item": {
         * 						"dataType": {
         * 							"type": "text",
         * 							"specs": {
         * 								"rule": "",
         * 								"length": 0
         *                           }* 						}
         *                    }
         *                }* 			}
         */
        JSONObject specs = new JSONObject();
        specs.put("size", 0); // 创建产品时,get 的输出参数列表默认大小为0
        JSONObject item = new JSONObject();
        JSONObject dataType = new JSONObject();
        dataType.put("type", 3);
        JSONObject innerSpecs = new JSONObject();
        innerSpecs.put("rule", "");
        innerSpecs.put("length", 64);
        dataType.put("specs", innerSpecs);
        item.put("dataType", dataType);
        specs.put("item", item);
        setServiceParam.setSpecs(specs.toJSONString());
        return setServiceParam;
 
    }
    private ProductServicesEntity createProductServicesEntity4Identifier(long productId, String identifier, Integer ref) {
        String method;
        ProductServicesEntity servicesEntity = new ProductServicesEntity();
        method = SERVICE_METHOD_PREFIX + identifier;
        servicesEntity.setMethod(method)
                .setCustom(ProductRefEnum.FunctionType.DEFAULT.getCode()) // custom 1:自定义
                .setDescription("set".equals(identifier) ? "设置属性(默认生成)" : "获取属性(默认生成)")
                .setName(identifier)
                .setProductId(productId)
                .setOriginalRequired(0)
                .setUpdateRequired(0)
                .setIdentifier(identifier)
                .setSystemCall(0); //  确认方法默认情况暂按异步处理 0:async(异步),1:sync(同步)
 
 
        return servicesEntity;
    }

/**
     * 将数组转为字符串,update时,控制器层已校验数组是否空
     *
     * @param stringList
     * @return
     */
    private String convertListToString(List<String> stringList) {
        if (CollectionUtils.isEmpty(stringList)) {
            return "";
        }
        String str = stringList.toString();
        return str.substring(1, str.length() - 1);
    }
 
    /**
     * 编辑
     */
    @Transactional(rollbackFor = Exception.class)
    public ResponseDTO<String> update(ProductsUpdateDTO updateDTO) {
        ProductsEntity entity = IotBeanUtil.copy(updateDTO, ProductsEntity.class);
        entity.setAuthType(convertListToString(updateDTO.getAuthType()));
        entity.setLinkType(convertListToString(updateDTO.getLinkType()));
        entity.setUpdateTime(new Date());
        int ret = productsDao.updateByIdAndStatus(entity);
        return ret > 0 ? ResponseDTO.succ() : ResponseDTO.failInvalidParamWithMsg("产品类型已发布");
    }
@Transactional(rollbackFor = Exception.class)
    public ResponseDTO<String> deleteByIds(List<Long> idList) {
 
/*
        List<ProductsEntity> productsEntities = productsDao.listByIds(idList);
        if (CollectionUtils.isEmpty(productsEntities)) {
            return ResponseDTO.failInvalidParamWithMsg("参数异常!");
        }
        ProductsEntity productsEntity = productsEntities.get(0);
        String name = productsEntity.getName();
        ProductsEntity existed = productsDao.selectOneByNameAndDeletedIsTrue(name);
 String innerType = productsEntity.getInnerType();
        ProductsEntity existedInner = productsDao.selectOneByInnerTypeAndDeletedIsTrue(innerType);
        if (existedInner != null) {
            // 第一次删除保留数据,若开多个界面,一个删除之后,其他页面再删除,则删除数据!
            productsDao.deleteById4NotLogic(idList.get(0));
            return ResponseDTO.failInvalidParam();
        }
        if (existed != null && ((existed.getObjectId() == null && productsEntity.getObjectId() == null) ||
                        (existed.getObjectId() == productsEntity.getObjectId()))) {
            // 第一次删除保留数据,若开多个界面,一个删除之后,其他页面再删除,则删除数据!
            productsDao.deleteById4NotLogic(idList.get(0));
            return ResponseDTO.failInvalidParam();
        }*/
 
        int affected = productsDao.deleteBatch(idList);
        if (affected < 1) {
            log.error("产品类型已发布或者不存在, productId = {}", idList.get(0));
            return ResponseDTO.failInvalidParamWithMsg("产品类型已发布或者不存在");
        }
 
        return ResponseDTO.succ();
    }

@Transactional(rollbackFor = Exception.class)
    public ResponseDTO<Integer> releaseByIds(List<Long> idList) {
        int ret = productsDao.releaseByIds(idList);
 
        if (ret < 1) {
            return ResponseDTO.failInvalidParam();
        }
        long productId = idList.get(0);
        // 统一更新默认服务get(输入参数)、set(输出参数) 数据规格的size
        int count = productPropertiesDao.countByProductId(productId);
        QueryWrapper<ProductServicesEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("product_id", productId);
        queryWrapper.in("identifier", new ArrayList<>(Arrays.asList("get", "set")));
        List<ProductServicesEntity> services = productServicesDao.selectList(queryWrapper);
        Map<String, Long> collect = services.stream().collect(Collectors.toMap(ProductServicesEntity::getIdentifier, ProductServicesEntity::getId));
        QueryWrapper<ProductServicesParamsEntity> paramsEntityQueryWrapper4Get = new QueryWrapper<>();

paramsEntityQueryWrapper4Get.eq("ref_id", collect.get("get"));
        paramsEntityQueryWrapper4Get.eq("identifier", "get_params");
        ProductServicesParamsEntity productServicesParamsEntity4Get = productServicesParamsDao.selectOne(paramsEntityQueryWrapper4Get);
        QueryWrapper<ProductServicesParamsEntity> paramsEntityQueryWrapper4Set = new QueryWrapper<>();
        paramsEntityQueryWrapper4Set.eq("ref_id", collect.get("set"));
        paramsEntityQueryWrapper4Set.eq("identifier", "set_results");
        ProductServicesParamsEntity productServicesParamsEntity4Set = productServicesParamsDao.selectOne(paramsEntityQueryWrapper4Set);
        if (null == productServicesParamsEntity4Get || productServicesParamsEntity4Set == null) {
            log.error("脏数据,默认服务参数列表不能为空!productId = {}", productId);
            throw new IotBusinessException("默认服务参数列表不能为空!");
        }
        String specsGet = productServicesParamsEntity4Get.getSpecs();
        JSONObject getJson = (JSONObject) JSONObject.parse(specsGet);
        getJson.put("size", count);
        productServicesParamsEntity4Get.setSpecs(getJson.toJSONString());
 
        String specs4Set = productServicesParamsEntity4Set.getSpecs();
        JSONObject setJson = (JSONObject) JSONObject.parse(specs4Set);
        setJson.put("size", count);
        productServicesParamsEntity4Set.setSpecs(setJson.toJSONString());
        ArrayList<ProductServicesParamsEntity> productServicesParamsEntities = new ArrayList<>(Arrays.asList(productServicesParamsEntity4Get, productServicesParamsEntity4Set));
        log.info("默认服务更新size: {}", productServicesParamsEntities);
 
        productServicesParamsDao.updateBatch(productServicesParamsEntities);
 
        return ResponseDTO.succData(ret);
    }


    public ProductsDetailVO getProductDetailsById(Long id) {
        ProductsEntity entity = productsDao.selectById(id);
        if (null == entity) {
            return null;
        }
        SystemConfigEntity authTypeConfig;
        SystemConfigEntity linkTypeConfig;
        ConcurrentHashMap<String, SystemConfigEntity> authAndLinkModeEntityMap = systemConfig.authAndLinkModeEntityMap;
        if (authAndLinkModeEntityMap.containsKey(AUTH_TYPE)) {
            authTypeConfig = authAndLinkModeEntityMap.get(AUTH_TYPE);
        } else {
            authTypeConfig = systemConfigDao.getByConfigKey(AUTH_TYPE);
        }
        if (authAndLinkModeEntityMap.containsKey(LINK_TYPE)) {
            linkTypeConfig = authAndLinkModeEntityMap.get(LINK_TYPE);
        } else {
            linkTypeConfig = systemConfigDao.getByConfigKey(LINK_TYPE);
        }
        String authType = authTypeConfig.getConfigValue();
        String linkType = linkTypeConfig.getConfigValue();
        List<ConfigName2ValueVO> authRet = JSONObject.parseArray(authType, ConfigName2ValueVO.class);
        List<ConfigName2ValueVO> linkRet = JSONObject.parseArray(linkType, ConfigName2ValueVO.class);
 
        String entityAuth = entity.getAuthType();
        String entityLink = entity.getLinkType();
        System.err.println("entityAuth: " + entityAuth + "\n entityLink: " + entityLink);
        List<String> auths = new ArrayList<>(Arrays.asList(StringUtils.split(entityAuth, ";")));
        List<String> links = new ArrayList<>(Arrays.asList(StringUtils.split(entityLink, ";")));
        List<SystemConfigKey2ValueDTO> authKey2ValueDTOs = new ArrayList<>(auths.size());
        List<SystemConfigKey2ValueDTO> linkKey2ValueDTOs = new ArrayList<>(links.size());
        JSONArray authArray = new JSONArray();
        JSONArray linkArray = new JSONArray();
        for (ConfigName2ValueVO configName2ValueVO : authRet) {
 
            if (auths.contains(configName2ValueVO.getValue())) {
                SystemConfigKey2ValueDTO object = new SystemConfigKey2ValueDTO();
                object.setKey(configName2ValueVO.getValue()).setValue(configName2ValueVO.getName());
                authKey2ValueDTOs.add(object);
                authArray.add(object);
            }
        }
 
        for (ConfigName2ValueVO configName2ValueVO : linkRet) {
            if (links.contains(configName2ValueVO.getValue())) {
                SystemConfigKey2ValueDTO object = new SystemConfigKey2ValueDTO();
                object.setKey(configName2ValueVO.getValue()).setValue(configName2ValueVO.getName());
                linkKey2ValueDTOs.add(object);
                linkArray.add(object);
            }
        }
        CategoryEntity categoryEntity = categoryDao.selectById(entity.getCategoryId());
        ProductsDetailVO vo = new ProductsDetailVO();
        System.err.println("AuthArray: " + authArray.toJSONString());
        vo.setAuthType(authArray.toJSONString())
                .setLinkType(linkArray.toJSONString())
                .setId(entity.getId())
                .setCategoryId(entity.getCategoryId())
                .setCreatorName(entity.getCreatorName())
                .setName(entity.getName())
                .setDescription(entity.getDescription())
                .setInnerType(entity.getInnerType())
                .setProductRefNum(entity.getProductRefNum())
                .setNodeType(Objects.requireNonNull(NodeTypeEnum.NodeType.parse(entity.getNodeType())).msg)
                .setCategoryName(categoryEntity.getName());
 
        System.out.println("ret: " + authRet);
        return vo;
    }
    public ProductObjectRefInfoVO getObjectRefInfoByProductId(Long productId) {
 
        ProductObjectRefInfoVO ret = new ProductObjectRefInfoVO();
        ProductsEntity productsEntity = productsDao.selectById(productId);
        Long categoryId = productsEntity.getCategoryId();
        CategoryEntity categoryEntity = categoryDao.selectById(categoryId);
        String categoryName = categoryEntity.getName();
        ret.setCategoryName(categoryName);
        // TODO 查询产品类型相关数据填充result
 
        Long objectId = productsEntity.getObjectId();
        if (objectId == null) {
            ret.setRefObjectEvents(new ArrayList<>(0)).setRefObjectServices(new ArrayList<>(0))
                    .setRefObjectProperties(new ArrayList<>(0));
            return ret;
        }
        ret.setObjectId(objectId);
 
        ObjectModelEntity objectModelEntity = objectModelDao.selectById(objectId);
        // 获取产品类型引用的功能定义列表
        List<ProductPropertiesVO> propertiesVOS = productPropertiesDao.listByProductIdAndCustom(productId, 0);
 
        List<ProductEventsVO> eventsVOS = productEventsDao.listByProductIdAndCustom(productId, 0);
 
        List<ProductServicesVO> servicesVOS = productServicesDao.listByProductIdAndCustom(productId, 0);
 
 
        // 获取产品类型引用的功能定义列表标识符集合
        List<String> propertyIdentifiers = propertiesVOS.stream().map(ProductPropertiesVO::getIdentifier).collect(Collectors.toList());
        List<String> serviceIdentifiers = servicesVOS.stream().map(ProductServicesVO::getIdentifier).collect(Collectors.toList());
        List<String> eventIdentifiers = eventsVOS.stream().map(ProductEventsVO::getIdentifier).collect(Collectors.toList());
 
        // 到这儿其实已经够判断了 下面的逻辑完全多余  前端可根据当前产品类型的objectId 和 identifier的集合就可以筛选出已经引用的功能定义
        // 物模板属性
        List<ObjectPropertiesVO> objectPropertiesVOS = new ArrayList<>(propertyIdentifiers.size());
        if (CollectionUtils.isNotEmpty(propertyIdentifiers)) {
            System.err.println("属性====产品类型引用物模板identifier集合: " + propertyIdentifiers);
            objectPropertiesVOS = objectPropertiesDao.listByObjectIdAndIdentifiersIn(objectId, propertyIdentifiers);
            List<ProductObjectFunctionRefVO> properties = objectPropertiesVOS
                    .stream()
                    .map(a -> new ProductObjectFunctionRefVO(a.getId(), a.getIdentifier()))
                    .collect(Collectors.toList());
            ret.setRefObjectProperties(properties);
        }
 
        // 物模板事件
        List<ObjectEventsVO> objectEventsVOS = new ArrayList<>(eventIdentifiers.size());
        if (CollectionUtils.isNotEmpty(eventIdentifiers)) {
            System.err.println("事件====产品类型引用物模板identifier集合: " + eventIdentifiers);
            objectEventsVOS = objectEventsDao.listByObjectIdAndIdentifiersIn(objectId, eventIdentifiers);
            List<ProductObjectFunctionRefVO> events= objectEventsVOS.stream().map(a -> new ProductObjectFunctionRefVO(a.getId(), a.getIdentifier())).collect(Collectors.toList());
            ret.setRefObjectEvents(events);
        }
 
        // 物模板服务
        List<ObjectServicesVO> objectServiceVOS = new ArrayList<>(serviceIdentifiers.size());
        if (CollectionUtils.isNotEmpty(serviceIdentifiers)) {
            System.err.println("服务====产品类型引用物模板identifier集合: " + serviceIdentifiers);
            objectServiceVOS = objectServicesDao.listByObjectIdAndIdentifiersIn(objectId, serviceIdentifiers);
            List<ProductObjectFunctionRefVO> services = objectServiceVOS
                    .stream()
                    .map(a -> new ProductObjectFunctionRefVO(a.getId(), a.getIdentifier()))
                    .collect(Collectors.toList());
            ret.setRefObjectServices(services);
        }
 
        ret.setObjectModelName(objectModelEntity.getName());
        return ret;
 
    }

@Transactional(rollbackFor = Exception.class)
    public ResponseDTO<String> addObjectFunctions(ProductsSaveFunctionsDTO saveFunctionsDTO) {
        Long productId = saveFunctionsDTO.getId();
        Long objectId = saveFunctionsDTO.getObjectId();
        ObjectModelEntity objectModel = null;
        if (objectId != null) {
            objectModel = objectModelDao.selectById(objectId);
        }
        // 操作编辑或者添加物模板时,没有选择物模板,将产品之前的引用信息置空
        if (objectModel == null) {
            return deleteAllRefObjectFunctions(productId);
        }
        // 编辑时查询产品类型是否存在
        ProductsEntity products = productsDao.selectById(productId);
        List<Long> objectPropertiesIdsRequest = saveFunctionsDTO.getPropertiesIdList();
        List<Long> objectServicesIdsRequest = saveFunctionsDTO.getServicesIdList();
        List<Long> objectEventsIdsRequest = saveFunctionsDTO.getEventsIdsList();
if (products == null) {
            return ResponseDTO.failInvalidParamWithMsg("请你不要乱搞接口,操作可以操作的产品类型去!");
        }
        // 不论如何,直接删除所有引用的功能定义
        deleteAllRefObjectFunctions(productId);
        // 请求的去掉交集 批量insert 去掉模板中的 set、get、post
        List<ObjectServicesVO> objectServicesVOS = objectServicesDao.listByObjectIdAndIdentifiersIn(objectId, new ArrayList<>(Arrays.asList("get", "set")));
        List<ObjectEventsVO> postEventVO = objectEventsDao.listByObjectIdAndIdentifiersIn(objectId, new ArrayList<>(Arrays.asList("property")));
        objectEventsIdsRequest.removeAll(postEventVO.stream().map(ObjectEventsVO::getId).collect(Collectors.toSet()));
        objectServicesIdsRequest.removeAll(objectServicesVOS.stream().map(ObjectServicesVO::getId).collect(Collectors.toSet()));
        // 添加模板功能定义 perf 声明和数据准备合并
        List<ObjectPropertiesEntity> objectPropertiesEntities = new ArrayList<>();
        List<ObjectServicesEntity> objectServicesEntities = new ArrayList<>();
        List<ObjectEventsEntity> objectEventsEntities = new ArrayList<>();
        List<ObjectServicesParamsEntity> servicesParamsEntities = new ArrayList<>();
        List<ObjectEventsParamsEntity> eventsParamsEntities = new ArrayList<>();
        log.error("\n===>Debug#物模型模板一致 跳出数据处理 objectEventsIdsRequest = {} \n objectServicesIdsRequest = {} \n objectPropertiesIdsRequest = {}", objectEventsIdsRequest, objectServicesIdsRequest, objectPropertiesIdsRequest);
 
        objectPropertiesEntities = prepareObjectPropertiesEntities(objectPropertiesIdsRequest, objectPropertiesEntities);
 
        ObjectServicesOrEventsAndParamsDTO temp =
                prepareObjectServicesOrEventAndParams(objectServicesIdsRequest, objectEventsIdsRequest);
        objectEventsEntities = temp.getObjectEventsEntities();
        eventsParamsEntities = temp.getEventsParamsEntities();
        objectServicesEntities = temp.getObjectServicesEntities();
        servicesParamsEntities = temp.getServicesParamsEntities();
/**
         * 批量插入标识符到中间记录表 开始
         */
        int maxRef = innerIdentifierDao.selectMaxRefByProductIdOrderByRef(productId);
        List<ProductInnerIdentifierEntity> identifiers4Properties =         prepareProductIdentifiersWithProperties(objectPropertiesEntities, productId, maxRef);
        maxRef = maxRef + identifiers4Properties.size();
        List<ProductInnerIdentifierEntity> identifier4Services = prepareProductIdentifiersWithServices(objectServicesEntities, productId, maxRef);
        maxRef = maxRef + identifier4Services.size();
        List<ProductInnerIdentifierEntity> identifier4Events = prepareProductIdentifiersWithEvents(objectEventsEntities, productId, maxRef);
        identifiers4Properties.addAll(identifier4Services);
        identifiers4Properties.addAll(identifier4Events);
 
 
        List<ProductPropertiesEntity> productPropertiesEntities = createProductPropertiesEntities(objectPropertiesEntities, productId);
 
        // 产品类型——》新增服务
        List<ProductServicesEntity> productServicesEntities = createProductServicesEntities(objectServicesEntities, productId);
 
        List<ProductEventsEntity> productEventsEntities = createProductEventsEntities(objectEventsEntities, productId);
        // TODO mapper.xml
        innerIdentifierDao.deleteAllByProductIdAndCustom(productId, 0);
        if (CollectionUtils.isNotEmpty(identifiers4Properties)) {
 
            innerIdentifierDao.insertBatch4WithRefIdentifier(identifiers4Properties);
        }
 
 
        if (CollectionUtils.isNotEmpty(productPropertiesEntities)) {
            log.info("===>debug,模板引入属性数据 properties = {}", productPropertiesEntities);
            int count = productPropertiesDao.insertBatch(productPropertiesEntities);
            log.info("===>debug,模板引入属性数据成功,共{}个", count);
            // 生成对应的服务、事件
            createProductFunctionParamRecord(productPropertiesEntities, productId);
 
        }
List<String> serviceIdentifiers = new ArrayList<>(productServicesEntities.size());
        Map<String, Long> serviceIdentifier2IdMap = new HashMap<>(productServicesEntities.size());
        if (CollectionUtils.isNotEmpty(productServicesEntities)) {
            productServicesDao.insertBatch(productServicesEntities);
            serviceIdentifier2IdMap = prepareServiceIdentifier2IdMap(productId, productServicesEntities);
        }
 
        List<String> eventIdentifiers = new ArrayList<>(productEventsEntities.size());
        Map<String, Long> eventIdentifier2IdMap = new HashMap<>(productEventsEntities.size());
        if (CollectionUtils.isNotEmpty(productEventsEntities)) {
            productEventsDao.insertBatch(productEventsEntities);
            eventIdentifier2IdMap = getEventIdentifier2IdMap(productId, productEventsEntities);
 
 
        }
List<ProductEventsParamsEntity> productEventsParamsEntities = new ArrayList<>();
        List<Long> serviceParamRefIds = servicesParamsEntities
                .stream()
                .map(ObjectServicesParamsEntity::getRefId)
                .collect(Collectors.toList());
        Map<Long, String> id2IdentifiersMap = new HashMap<>();
        if (CollectionUtils.isNotEmpty(serviceParamRefIds)) {
            id2IdentifiersMap = objectServicesDao
                    .selectBatchIds(serviceParamRefIds)
                    .stream()
                    .collect(Collectors.toMap(ObjectServicesEntity::getId, ObjectServicesEntity::getIdentifier));
        }
        List<ProductServicesParamsEntity> productsServicesParamsEntities = prepareProductServiceParam(servicesParamsEntities, serviceIdentifier2IdMap, id2IdentifiersMap);
        log.info("模板引入,服务参数列表:{}", productsServicesParamsEntities);
List<Long> eventParamRefIds = eventsParamsEntities.stream().map(ObjectEventsParamsEntity::getRefId).collect(Collectors.toList());
        Map<Long, String> id2EventIdentifiersMap = new HashMap<>();
        if (CollectionUtils.isNotEmpty(eventParamRefIds)) {
            id2EventIdentifiersMap = objectEventsDao.selectBatchIds(eventParamRefIds).stream().collect(Collectors.toMap(ObjectEventsEntity::getId, ObjectEventsEntity::getIdentifier));
        }
        productEventsParamsEntities = prepareProductEventParamEntities(eventsParamsEntities, eventIdentifier2IdMap, id2EventIdentifiersMap);
        log.info("模板引入,事件参数列表:{}", productEventsParamsEntities);
        // b、将模板的参数插入参数表
        if (CollectionUtils.isNotEmpty(productsServicesParamsEntities)) {
            productServicesParamsDao.insertBatch(productsServicesParamsEntities);
        }
        if (CollectionUtils.isNotEmpty(productEventsParamsEntities)) {
            productEventsParamsDao.insertBatch(productEventsParamsEntities);
        }
 
        // 更新产品类型信息
        ProductsEntity productsEntity = new ProductsEntity();
        productsEntity.setId(productId);
        productsEntity.setObjectId(objectId);
        productsEntity.setObjectCategoryId(objectModel.getCategoryId());
        productsDao.updateById(productsEntity);
 
        /**
         * 批量插入标识符到中间记录表 结束
         */
 
        return ResponseDTO.succ();
    }

private List<ProductEventsParamsEntity> prepareProductEventParamEntities(List<ObjectEventsParamsEntity> eventsParamsEntities, Map<String, Long> eventIdentifier2IdMap, Map<Long, String> id2EventIdentifiersMap) {
        List<ProductEventsParamsEntity> productEventsParamsEntities = new ArrayList<>();
        for (ObjectEventsParamsEntity event : eventsParamsEntities) {
            ProductEventsParamsEntity entity = new ProductEventsParamsEntity();
            String identifier = id2EventIdentifiersMap.get(event.getRefId());
            Long refId = eventIdentifier2IdMap.get(identifier);
            entity.setRefId(refId)
                    .setDataType(event.getDataType())
                    .setDescription(event.getDescription())
                    .setIdentifier(event.getIdentifier())
                    .setSpecs(event.getSpecs())
                    .setRef(event.getRef())
                    .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode()) // 模板引入,非自定义
                    .setName(event.getName());
            productEventsParamsEntities.add(entity);
        }
        return productEventsParamsEntities;
    }

private ObjectServicesOrEventsAndParamsDTO prepareObjectServicesOrEventAndParams(List<Long> objectServicesIdsRequest, List<Long> objectEventsIdsRequest) {
        ObjectServicesOrEventsAndParamsDTO ret = new ObjectServicesOrEventsAndParamsDTO();
        List<ObjectServicesEntity> objectServicesEntities = new ArrayList<>();
        List<ObjectEventsEntity> objectEventsEntities = new ArrayList<>();
        List<ObjectServicesParamsEntity> servicesParamsEntities = new ArrayList<>();
        List<ObjectEventsParamsEntity> eventsParamsEntities = new ArrayList<>();
        if (!CollectionUtils.isEmpty(objectServicesIdsRequest)) {
            // 此次请求添加的物模板功能:服务及服务对应的参数
            objectServicesEntities = objectServicesDao.selectBatchIds(objectServicesIdsRequest);
            List<ObjectServicesParamsVO> servicesParamsVOS = objectServicesParamsDao.listByRefIds(objectServicesIdsRequest);
            servicesParamsVOS.forEach(spv -> {
                ObjectServicesParamsEntity entity = new ObjectServicesParamsEntity();
                log.info("debug#addFunctions,模板服务参数: {}", spv);
                BeanUtils.copyProperties(spv, entity);
                servicesParamsEntities.add(entity);
            });
        }
if (!CollectionUtils.isEmpty(objectEventsIdsRequest)) {
            objectEventsEntities = objectEventsDao.selectBatchIds(objectEventsIdsRequest);
 
            List<ObjectEventsParamsVO> eventsParamsVOS = objectEventsParamsDao.listByRefIds(objectEventsIdsRequest);
            eventsParamsVOS.forEach(epv -> {
                ObjectEventsParamsEntity entity = new ObjectEventsParamsEntity();
                BeanUtils.copyProperties(epv, entity);
 
                log.info("debug#addFunctions,模板事件参数:  " + epv);
                eventsParamsEntities.add(entity);
            });
        }
 
        ret.setServicesParamsEntities(servicesParamsEntities);
        ret.setObjectServicesEntities(objectServicesEntities);
        ret.setObjectEventsEntities(objectEventsEntities);
        ret.setEventsParamsEntities(eventsParamsEntities);
 
        return ret;
    }

        private List<ObjectPropertiesEntity> prepareObjectPropertiesEntities(List<Long> objectPropertiesIdsRequest, List<ObjectPropertiesEntity> objectPropertiesEntities) {
        if (!CollectionUtils.isEmpty(objectPropertiesIdsRequest)) {
            // 此次请求添加的物模板功能:属性
            objectPropertiesEntities = objectPropertiesDao.selectBatchIds(objectPropertiesIdsRequest);
            log.error("\n===>Debug#查询数据库返回objectPropertiesEntities {}", objectPropertiesEntities);
 
        }
        return objectPropertiesEntities;
    }

private List<ProductServicesParamsEntity> prepareProductServiceParam(List<ObjectServicesParamsEntity> servicesParamsEntities, Map<String, Long> serviceIdentifier2IdMap, Map<Long, String> id2IdentifiersMap) {
        List<ProductServicesParamsEntity> productsServicesParamsEntities = new ArrayList<>();
        for (ObjectServicesParamsEntity service : servicesParamsEntities) {
            ProductServicesParamsEntity entity = new ProductServicesParamsEntity();
            entity.setRefId(serviceIdentifier2IdMap.get(id2IdentifiersMap.get(service.getRefId())))
                    .setType(service.getType())
                    .setDataType(service.getDataType())
                    .setDescription(service.getDescription())
                    .setIdentifier(service.getIdentifier())
                    .setSpecs(service.getSpecs())
                    .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode())// 模板引入,非自定义
                    .setRef(service.getRef()) // 直接使用模板的ref
                    .setName(service.getName());
 
            productsServicesParamsEntities.add(entity);
        }
        return productsServicesParamsEntities;
    }

private Map<String, Long> getEventIdentifier2IdMap(Long productId, List<ProductEventsEntity> productEventsEntities) {
        List<String> eventIdentifiers;
        Map<String, Long> eventIdentifier2IdMap;
        eventIdentifiers = productEventsEntities
                .stream()
                .map(ProductEventsEntity::getIdentifier)
                .collect(Collectors.toList());
        List<ProductEventsVO> eventsVOS = productEventsDao.listByProductIdAndIdentifiersIn(productId, eventIdentifiers);
        eventIdentifier2IdMap = eventsVOS
                .stream()
                .collect(Collectors.toMap(ProductEventsVO::getIdentifier, ProductEventsVO::getId));
        return eventIdentifier2IdMap;
    }

private Map<String, Long> prepareServiceIdentifier2IdMap(Long productId, List<ProductServicesEntity> productServicesEntities) {
        List<String> serviceIdentifiers;
        Map<String, Long> serviceIdentifier2IdMap;
        serviceIdentifiers = productServicesEntities
                .stream()
                .map(ProductServicesEntity::getIdentifier)
                .collect(Collectors.toList());
        List<ProductServicesVO> servicesVOS = productServicesDao.listByProductIdAndIdentifiersIn(productId, serviceIdentifiers);
        serviceIdentifier2IdMap = servicesVOS
                .stream()
                .collect(Collectors.toMap(ProductServicesVO::getIdentifier, ProductServicesVO::getId));
        return serviceIdentifier2IdMap;
    }

void deleteProductServiceParamByRefIdAndIdentifier(String identifier, long refId) {
        QueryWrapper<ProductServicesParamsEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(ProductRefEnum.DefaultIdentifierType.IDENTIFIER.getValue(), identifier)
                .eq(ProductRefEnum.DefaultIdentifierType.TYPE.getValue(),
                        ProductRefEnum.DefaultIdentifierType.GET.getValue().equals(identifier) ? 0 : 1)
                .eq(ProductRefEnum.DefaultIdentifierType.REF_ID.getValue(), refId);
 
        productServicesParamsDao.delete(queryWrapper);
    }
 
    void deleteProductEventParamByRefId(long refId) {
        QueryWrapper<ProductEventsParamsEntity> queryWrapperPost = new QueryWrapper<>();
        queryWrapperPost.eq(ProductRefEnum.DefaultIdentifierType.IDENTIFIER.getValue(),
                ProductRefEnum.DefaultIdentifierType.POST.getValue())
                .eq(ProductRefEnum.DefaultIdentifierType.REF_ID.getValue(), refId);
productEventsParamsDao.delete(queryWrapperPost); 
    }

@Transactional(rollbackFor = Exception.class)
    public ResponseDTO<String> deleteAllRefObjectFunctions(Long productId) {
        // 获取产品类型的所有模板引入的属性功能定义
        List<ProductPropertiesEntity> productPropertiesEntities = productPropertiesDao.selectAllRefPropertiesByProductIdAndCustomIsFalse(productId);
        List<String> identifiers = productPropertiesEntities.stream()
                .map(ProductPropertiesEntity::getIdentifier)
                .collect(Collectors.toList());
        // 获取对应set、get、post 功能定义id
 
        QueryWrapper<ProductServicesEntity> queryMapperSet = new QueryWrapper<>();
        queryMapperSet.eq("product_id", productId);
        queryMapperSet.eq("identifier", "set");
 
        ProductServicesEntity setService = productServicesDao.selectOne(queryMapperSet);
 
        QueryWrapper<ProductServicesEntity> queryMapperGet = new QueryWrapper<>();
        queryMapperGet.eq("product_id", productId);
        queryMapperGet.eq("identifier", "get");
        ProductServicesEntity getService = productServicesDao.selectOne(queryMapperGet);
 
 
        QueryWrapper<ProductEventsEntity> queryMapperPost = new QueryWrapper<>();
        queryMapperPost.eq("product_id", productId);
        queryMapperPost.eq("identifier", "property");
        ProductEventsEntity postEvent = productEventsDao.selectOne(queryMapperPost);
 
        if (setService == null || getService == null || postEvent == null) {
            throw new IotBusinessException("数据异常,默认功能定义不存在!");
        }
 
        long getId = getService.getId();
        long setId = setService.getId();
        long postId = postEvent.getId();
 
        // 统一删除模板引入的参数 get set post
        if (CollectionUtils.isNotEmpty(identifiers)) {
            productServicesParamsDao.deleteByRefIdAndIdentifiersIn(getId, identifiers);
            productServicesParamsDao.deleteByRefIdAndIdentifiersIn(setId, identifiers);
            productEventsParamsDao.deleteByRefIdAndIdentifiersIn(postId, identidentifiers);
        }
 
 
        log.info("\n===>Debug#deleteAllRefObjectFunctions postId = {}, getId = {}, setId = {}, identifiers = {}", postId, getId, setId, identifiers);
 
 
        productPropertiesDao.deleteAllRefObjectByProductId(productId);
        List<ProductEventsEntity> productEventsEntities = productEventsDao.selectAllByProductIdAndCustomIsFalse(productId);
        List<ProductServicesEntity> productServicesEntities = productServicesDao.selectAllByProductIdAndCustomIsFalse(productId);
        // 清空服务、事件参数表
        if (CollectionUtils.isNotEmpty(productServicesEntities)) {
            List<Long> serviceParamsDel = productServicesEntities
                    .stream()
                    .map(ProductServicesEntity::getId)
                    .collect(Collectors.toList());
            productServicesParamsDao.deleteByRefIds4ObjectRef(serviceParamsDel);
 
        }
        if (CollectionUtils.isNotEmpty(productEventsEntities)) {
            List<Long> eventParamsDel = productEventsEntities
                    .stream()
                    .map(ProductEventsEntity::getId)
                    .collect(Collectors.toList());
            productEventsParamsDao.deleteByRefIds(eventParamsDel);
        }
        // 清空产品类型的所有服务、事件功能定义
        productPropertiesDao.deleteAllRefObjectByProductId(productId);
        productEventsDao.deleteAllRefObjectByProductId(productId);
        productServicesDao.deleteAllRefObjectByProductId(productId);
        // 清空产品类型的中间表中的identifier记录
        innerIdentifierDao.deleteAllByProductIdAndCustom(productId, 0);
        // 将产品类型的模板信息清除
        ProductsEntity productsEntity = new ProductsEntity();
        productsEntity.setId(productId);
        int ret = productsDao.updateProductObjectRefNullById(productsEntity);
        if (ret < 1) {
            log.error("并发过高,产品类型更新错误: {}", productId);
            throw new IotBusinessException("产品类型更新错误!");
        }
        return ResponseDTO.succ();
    }

private List<ProductEventsEntity> createProductEventsEntities(List<ObjectEventsEntity> objectEventsEntities, long productId) {
 
        List<ProductEventsEntity> productEventsEntities = new ArrayList<>();
        for (ObjectEventsEntity e : objectEventsEntities) {
            ProductEventsEntity productEventsEntity = new ProductEventsEntity();
            System.err.println("level: " + e.getLevel());
            productEventsEntity
                    .setCustom(0)
                    .setDescription(e.getDescription())
                    .setIdentifier(e.getIdentifier())
                    .setName(e.getName())
                    .setRefId(e.getId())
                    .setType(e.getType())
                    .setLevel(e.getLevel() == null ? 0 : e.getLevel())
                    .setMethod(e.getMethod())
                    .setProductId(productId);
 
            if (e.getRequired() == 1) {
                productEventsEntity.setOriginalRequired(1).setUpdateRequired(1);
            } else {
                productEventsEntity.setOriginalRequired(0).setUpdateRequired(0);
            }
            log.info("=====>Debug#saveFunctions, productEventsEntity: " + productEventsEntity.getLevel());
 
            productEventsEntities.add(productEventsEntity);
        }
        return productEventsEntities;
    }

private List<ProductServicesEntity> createProductServicesEntities(List<ObjectServicesEntity> objectServicesEntities, long productId) {
 
        List<ProductServicesEntity> productServicesEntities = new ArrayList<>();
        for (ObjectServicesEntity s : objectServicesEntities) {
            ProductServicesEntity productServicesEntity = new ProductServicesEntity();
            productServicesEntity
                    .setCustom(0)                   
                    .setProductId(productId);
			BeanUtils.copyProperties(s, productServicesEntity);
 
            if (s.getRequired() == 1) {
                productServicesEntity.setOriginalRequired(1).setUpdateRequired(1);
            } else {
                productServicesEntity.setOriginalRequired(0).setUpdateRequired(0);
            }
 
            productServicesEntities.add(productServicesEntity);
        }
        return productServicesEntities;
    }

private List<ProductPropertiesEntity> createProductPropertiesEntities(List<ObjectPropertiesEntity> objectPropertiesEntities, Long productId) {List<ProductPropertiesEntity> productPropertiesEntities = new ArrayList<>();
        for (ObjectPropertiesEntity p : objectPropertiesEntities) {
            log.error("\n===>Debug#createProductPropertiesEntities {}", p);
            ProductPropertiesEntity propertiesEntity = new ProductPropertiesEntity();
			propertiesEntity.
                        .setProductId(productId)
						.setUpdateRequired(0)
                        .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode());
            if (p.getRequired() == 1) {           
                        BeanUtils.copyProperties(s, propertiesEntity);
 
            } else {
                propertiesEntity.setUpdateRequired(p.getRequired());
            }
            productPropertiesEntities.add(propertiesEntity);
        }
           return productPropertiesEntities;
}

        @Transactional
        public void createProductFunctionParamRecord(List<ProductPropertiesEntity> list, Long productId) {
            List<ProductInnerIdentifierEntity> identifiers = innerIdentifierDao.selectByProductIdAndCustom(productId, 0);
            Map<String, Integer> productIdAndIdentifier2RefMap = identifiers.stream().collect(Collectors.toMap(a -> a.getProductId() + a.getIdentifier(), ProductInnerIdentifierEntity::getRef));
		    long getServiceId = getProductServiceId(ProductRefEnum.DefaultIdentifierType.GET.getValue(), productId);
            long postEventId = getProductEventId(productId);
            long setServiceId = getProductServiceId(ProductRefEnum.DefaultIdentifierType.SET.getValue(), productId);
            log.info("getServiceId = {}, setServiceId = {}", getServiceId, setServiceId);
            List<ProductServicesParamsEntity> servicesParamsEntities = new ArrayList<>();
            List<ProductEventsParamsEntity> eventsParamsEntities = new ArrayList<>();
            for (ProductPropertiesEntity p : list) {
            String access = p.getAccess();
            ProductServicesParamsEntity getServiceParam = new ProductServicesParamsEntity().setCustom(0);
            ProductServicesParamsEntity setServiceParam = new ProductServicesParamsEntity().setCustom(0);
            ProductEventsParamsEntity postEventParam = new ProductEventsParamsEntity().setCustom(0);
            String key = productId + p.getIdentifier();
            switch (access) {            
				case "rwp":  // 读、写服务参数加上报事件参数
                    getServiceParam.setDataType
                            .setRefId(getServiceId)                            
                            .setRef(productIdAndIdentifier2RefMap.get(key))
                            .setType(ServiceParamTypeEnum.ParamType.OUT_PARAM.getCode());
                    // 输入参数记录
                    setServiceParam.
                            .setRefId(setServiceId).setRef(productIdAndIdentifier2RefMap.get(key))
                            .setType(ServiceParamTypeEnum.ParamType.IN_PARAM.getCode());
                    servicesParamsEntities.add(getServiceParam);
                    servicesParamsEntities.add(setServiceParam);
                    postEventParam.
                            .setRefId(postEventId)                            
                            .setRef(productIdAndIdentifier2RefMap.get(key));                            
                    eventsParamsEntities.add(postEventParam);
                    break;
            }
        }

            if(!CollectionUtils.isEmpty(servicesParamsEntities)){
                log.info("引用模板,批量插入服务参数 type=1,services ={}",servicesParamsEntities.stream().filter(a->a.getType()==1).collect(Collectors.toList()));log.info("引用模板,批量插入服务参数 type=0,services = {}",servicesParamsEntities.stream().filter(a->a.getType()==0).collect(Collectors.toList()));productServicesParamsDao.insertBatch(servicesParamsEntities);
            }
            if(CollectionUtils.isNotEmpty(eventsParamsEntities)){
                log.info("引用模板,批量插入事件参数 = {}",eventsParamsEntities);
                productEventsParamsDao.insertBatch(eventsParamsEntities);
            }
        }


private List<ProductInnerIdentifierEntity> prepareProductIdentifiersWithEvents(List<ObjectEventsEntity> events, Long productId, int maxRef) {
        List<ProductInnerIdentifierEntity> identifierEntities = new ArrayList<>(events.size());
        for (ObjectEventsEntity p : events) {
            maxRef++;
            ProductInnerIdentifierEntity tmp = new ProductInnerIdentifierEntity();
            tmp.setProductId(productId)
                    .setIdentifier(p.getIdentifier())
                    .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode()); // 模板引入
            tmp.setRef(maxRef);
 
            identifierEntities.add(tmp);
        }
        return identifierEntities;
    }

private Long getProductEventId(long productId) {
        String identifierPost = "property"; // 默认生成的post对应的identifier为property
        QueryWrapper<ProductEventsEntity> queryEventsWrapper = new QueryWrapper<>();
        queryEventsWrapper.eq("identifier", identifierPost);
        queryEventsWrapper.eq("product_id", productId);
        ProductEventsEntity eventsEntity = productEventsDao.selectOne(queryEventsWrapper);
        if (null == eventsEntity) { // 创建产品类型时,自动创建空的set、get服务,post事件,对应的identifier为property
            throw new RuntimeException("引用物模板,产品类型id = " + productId + ", post(property) 事件查询异常,请联系管理员!");
        }
        return eventsEntity.getId();
    }


private List<ProductInnerIdentifierEntity> prepareProductIdentifiersWithEvents(List<ObjectEventsEntity> events, Long productId, int maxRef) {
        List<ProductInnerIdentifierEntity> identifierEntities = new ArrayList<>(events.size());
        for (ObjectEventsEntity p : events) {
            maxRef++;
            ProductInnerIdentifierEntity tmp = new ProductInnerIdentifierEntity();
            tmp.setProductId(productId)
                    .setIdentifier(p.getIdentifier())
                    .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode()); // 模板引入
            tmp.setRef(maxRef);
 
            identifierEntities.add(tmp);
        }
        return identifierEntities;
    }

private List<Long> getRetain(List<Long> source1, List<Long> source2) {
        CollectionUtils.removeAll(source1, source2);
        return source1;
    }

private List<Long> getIntersection(List<Long> source1, List<Long> source2) {
        List<Long> ids = new ArrayList<>();
        if (CollectionUtils.isEmpty(source1) || CollectionUtils.isEmpty(source2)) {
            return ids;
        }
        for (int i = 0; i < source1.size(); i++) {
            Long eventId = source1.get(i);
            for (int j = 0; j < source2.size(); j++) {
                if (eventId.longValue() == source2.get(j).longValue()) {
                    ids.add(eventId);
                }
            }
        }
        return ids;
    }

private List<ProductInnerIdentifierEntity> prepareProductIdentifiersWithProperties(List<ObjectPropertiesEntity> propertiesEntities, Long productId, int maxRef) {
        List<ProductInnerIdentifierEntity> identifierEntities = new ArrayList<>(propertiesEntities.size());
        for (ObjectPropertiesEntity p : propertiesEntities) {
            maxRef++;
            ProductInnerIdentifierEntity tmp = new ProductInnerIdentifierEntity();
            tmp.setProductId(productId)
                    .setIdentifier(p.getIdentifier())
                    .setCustom(ProductRefEnum.FunctionType.MODEL_REF.getCode()); // 模板引入
            tmp.setRef(maxRef);
            identifierEntities.add(tmp);
        }
        log.info("模板引入:createProductIdentifiersWithProperties#identifierEntities = {}", identifierEntities);
        return identifierEntities;
 
 
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值