首页 > 编程语言 >JAVA+VUE实现动态表单配置

JAVA+VUE实现动态表单配置

时间:2024-09-10 17:15:41浏览次数:1  
标签:VUE return name true id import 表单 data JAVA

功能描述:

资产管理系统中,在资产分类中,给同一种类型的资产配置定制化的表单项,并实现不同类型显示不同的数据,如图所示:

数据库设计部分:

1.表单项表

CREATE TABLE `dct_smp`.`t_asset_product_definitions`  (
  `id` bigint NOT NULL,
  `product_id` bigint NOT NULL COMMENT '分类',
  `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
  `label` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '显示名称',
  `data_type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性类型',
  `length` int NULL DEFAULT NULL COMMENT '长度',
  `ui_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单类型',
  `default_values` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '默认值',
  `required` int NOT NULL COMMENT '是否必填',
  `placeholder` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提示信息',
  `dct_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '数字字典code值',
  `is_lock` int NULL DEFAULT NULL COMMENT '是否锁定',
  `remark` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  `created_by` bigint NOT NULL COMMENT '创建人',
  `created_date` bigint NOT NULL COMMENT '创建时间',
  `modified_by` bigint NULL DEFAULT NULL COMMENT '修改人',
  `modified_date` bigint NULL DEFAULT NULL COMMENT '修改时间',
  `ip` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP',
  `priority` int NOT NULL DEFAULT 1 COMMENT '优先级,越大优先级越高',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '数据状态,1有效0删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产产品元素分类' ROW_FORMAT = Dynamic;

2.数据表:

CREATE TABLE `dct_smp`.`t_asset_product_metas`  (
  `id` bigint NOT NULL,
  `detail_id` bigint NULL DEFAULT NULL COMMENT '要素id',
  `asset_id` bigint NULL DEFAULT NULL COMMENT '资产id',
  `assets_no` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '资产编号',
  `meta_key` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '关联字段名称',
  `meta_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '关联字段内容',
  `meta_priority` int NULL DEFAULT 0 COMMENT '优先级',
  `created_by` bigint NOT NULL COMMENT '创建人',
  `created_date` bigint NOT NULL COMMENT '创建时间',
  `modified_by` bigint NULL DEFAULT NULL COMMENT '修改人',
  `modified_date` bigint NULL DEFAULT NULL COMMENT '修改时间',
  `ip` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP',
  `priority` int NOT NULL DEFAULT 1 COMMENT '优先级,越大优先级越高',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '数据状态,1有效0删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '资产产品元素扩展' ROW_FORMAT = Dynamic;

  

JAVA部分:

表单元素表

package com.cloudoer.dct.ams.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cloudoer.dct.ams.mapstruts.AssetProductDefinitionMapStruct;
import com.cloudoer.dct.ams.service.i.AssetProductDefinitionService;
import com.cloudoer.dct.ams.service.i.AssetProductMetaService;
import com.cloudoer.dct.core.controller.BaseController;
import com.cloudoer.dct.core.model.Page;
import com.cloudoer.dct.core.model.dto.ams.AssetProductDefinitionDTO;
import com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition;
import com.cloudoer.dct.core.model.query.ams.AssetProductDefinitionQuery;
import com.cloudoer.dct.core.model.vo.ams.AssetProductDefinitionVO;
import com.cloudoer.dct.core.support.BeanUtil;
import com.cloudoer.dct.core.support.Condition;
import com.cloudoer.dct.core.support.QueryContext;
import com.cloudoer.framework.core.domain.RO;
import com.google.common.collect.Lists;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@RestController
@RequestMapping("/asset/definitions")
@Slf4j
@Tag(name = "资产产品元素分类", description = "资产产品元素分类管理")
public class AssetProductDefinitionController extends BaseController<AssetProductDefinition> {

    @Autowired
    private AssetProductDefinitionService assetProductDefinitionService;

    @Autowired
    private AssetProductMetaService assetProductMetaService;

    @Autowired
    private AssetProductDefinitionMapStruct assetProductDefinitionMapStruct;

    @Operation(summary = "资产产品元素分类查询", description = "根据筛选条件分页查询,以及按照指定字段进行排序")
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinitionVO.class))})
    })
    @GetMapping(name = "查询")
    public Object list(AssetProductDefinitionQuery assetProductDefinitionQuery, QueryContext queryContext) {
        QueryWrapper<AssetProductDefinition> queryWrapper = Condition.getQueryWrapper(assetProductDefinitionQuery, queryContext, AssetProductDefinition.class);
        Page<AssetProductDefinitionVO> page = assetProductDefinitionService.find(Condition.getPage(queryContext), queryWrapper);
        return RO.ok(page);
    }

    @Operation(summary = "资产产品元素分类详情", description = "根据ID获取资产产品元素分类详细信息")
    @Parameter(name = "id", description = "资产产品元素分类ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinitionVO.class))})
    })
    @GetMapping(value = "/{id}", name = "详情")
    public Object view(@PathVariable("id") Long id) {
        log.info("get AssetProductDefinition Id:{}", id);
        AssetProductDefinitionVO assetProductDefinitionVO = assetProductDefinitionService.find(id);
        return RO.ok(assetProductDefinitionVO);
    }

    @Operation(summary = "创建资产产品元素分类", description = "创建资产产品元素分类信息")
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinition.class))})
    })
    @PostMapping(name = "创建")
    public Object create(@RequestBody AssetProductDefinitionDTO assetProductDefinitionDTO, ServerHttpRequest request) {
        log.info("add AssetProductDefinition DTO:{}", assetProductDefinitionDTO);
        AssetProductDefinition assetProductDefinition = new AssetProductDefinition();
        BeanUtil.copyProperties(assetProductDefinitionDTO, assetProductDefinition);
        this.packAddBaseProps(assetProductDefinition, request);
        boolean flag = assetProductDefinitionService.save(assetProductDefinition);
        return RO.status(flag, assetProductDefinition);
    }

    @Operation(summary = "复制资产产品元素分类", description = "根据ID复制资产产品元素分类")
    @Parameter(name = "id", description = "资产产品元素分类ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinition.class))})
    })
    @PostMapping(value = "/{id}", name = "复制")
    public Object copy(@PathVariable("id") Long id, ServerHttpRequest request) {
        AssetProductDefinition assetProductDefinition = assetProductDefinitionService.getById(id);
        if (assetProductDefinition == null) {
            return RO.fail("不存在的id");
        }
        assetProductDefinition.setId(null);
        //assetProductDefinition.setName(assetProductDefinition.getName() + "_副本");
        this.packAddBaseProps(assetProductDefinition, request);
        boolean flag = assetProductDefinitionService.save(assetProductDefinition);
        return RO.status(flag, assetProductDefinition);
    }

    @Operation(summary = "修改资产产品元素分类", description = "根据ID, 修改资产产品元素分类信息")
    @Parameter(name = "id", description = "资产产品元素分类ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinition.class))})
    })
    @PutMapping(value = "/{id}", name = "修改")
    public Object update(@PathVariable("id") Long id, @RequestBody AssetProductDefinitionDTO assetProductDefinitionDTO, ServerHttpRequest request) {
        log.info("put modify id:{}, AssetProductDefinition DTO:{}", id, assetProductDefinitionDTO);
        AssetProductDefinition assetProductDefinition = assetProductDefinitionService.getById(id);
        if (null == assetProductDefinition) {
            return RO.fail("不存在的id");
        }
        BeanUtil.copyProperties(assetProductDefinitionDTO, assetProductDefinition);
        this.packModifyBaseProps(assetProductDefinition, request);
        boolean flag = assetProductDefinitionService.updateById(assetProductDefinition);
        return RO.status(flag, assetProductDefinition);
    }

    @Operation(summary = "修改资产产品元素分类", description = "根据ID, 修改资产产品元素分类信息")
    @Parameter(name = "id", description = "资产产品元素分类ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductDefinition.class))})
    })
    @PutMapping(value = "/saveOrUpdate/{id}", name = "修改")
    public Object saveOrUpdate(@PathVariable("id") Long id, @RequestBody List<AssetProductDefinitionDTO> assetProductDefinitionDTO, ServerHttpRequest request) {
        log.info("put modify id:{}, AssetProductDefinition DTO:{}", id, assetProductDefinitionDTO);
        List<AssetProductDefinitionDTO> unlockDTOS = assetProductDefinitionDTO.parallelStream().filter(t -> t.getIsLock() == null || t.getIsLock() == 0).collect(Collectors.toList());
        // 通过源数据和dto对比,找到多的数,并删除
        QueryWrapper<AssetProductDefinition> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("product_id", id);
        queryWrapper.eq("is_lock", 0);
        List<AssetProductDefinitionVO> assetProductDefinitionVOS = assetProductDefinitionService.find(queryWrapper);
        if (CollectionUtils.isNotEmpty(assetProductDefinitionVOS)) {
            List<AssetProductDefinitionVO> delList = assetProductDefinitionVOS.stream().filter(item -> unlockDTOS.stream().noneMatch(item2 -> item2.getId().equals(item.getId()) )).collect(Collectors.toList());
            boolean removeByIds = assetProductDefinitionService.removeByIds(delList);
            log.info("put modify id:{}, saveOrUpdate DTO:{}", id, removeByIds);
        }
        List<AssetProductDefinition> dataList = Lists.newArrayList();
        unlockDTOS.forEach(dto -> {
            AssetProductDefinition assetProductDefinition = assetProductDefinitionMapStruct.convertDTO(dto);
            assetProductDefinition.setIsLock(0);
            assetProductDefinition.setProductId(id);
            BeanUtil.packAddBaseProps(assetProductDefinition, request);
            dataList.add(assetProductDefinition);
        });
        boolean batch = assetProductDefinitionService.saveOrUpdateBatch(dataList);
        return RO.status(batch, dataList);
    }

    @Operation(summary = "删除资产产品元素分类", description = "根据ID, 删除资产产品元素分类信息")
    @Parameter(name = "id", description = "资产产品元素分类ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功")
    })
    @DeleteMapping(value = "/{id}", name = "删除")
    public Object remove(@PathVariable("id") Long id, ServerHttpRequest request) {
        log.info("delete AssetProductDefinition, id:{}", id);
        AssetProductDefinition assetProductDefinition = new AssetProductDefinition();
        assetProductDefinition.setId(id);
        this.packModifyBaseProps(assetProductDefinition, request);
        boolean flag = assetProductDefinitionService.delete(assetProductDefinition);
        return RO.status(flag);
    }

    @Operation(summary = "批量删除资产产品元素分类", description = "根据ID集合, 批量删除资产产品元素分类信息")
    @Parameter(name = "ids", description = "资产产品元素分类ID集合", in = ParameterIn.DEFAULT, schema = @Schema(type = "List"), required = true)
    @ApiResponses({
            @ApiResponse(responseCode = "100200", description = "成功")
    })
    @DeleteMapping(name = "批量删除")
    public Object remove(@RequestBody Map<String, Object> params, ServerHttpRequest request) {
        boolean flag = false;
        if (params.get("ids") != null) {
            List<String> ids = (List<String>) params.get("ids");
            if (CollectionUtils.isNotEmpty(ids)) {
                flag = assetProductDefinitionService.delete(ids, getUserId(request));
            }
        }
        return RO.status(flag);
    }

}

  

package com.cloudoer.dct.core.model.entity.ams;

import com.baomidou.mybatisplus.annotation.TableName;
import com.cloudoer.dct.core.model.entity.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素分类")
@Data
@TableName("t_asset_product_definitions")
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductDefinition extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(name = "productId", title = "分类")
    private Long productId;

    @Schema(name = "name", title = "名称")
    private String name;

    @Schema(name = "label", title = "显示名称")
    private String label;

    @Schema(name = "dataType", title = "属性类型")
    private String dataType;

    @Schema(name = "uiType", title = "表单类型")
    private String uiType;

    @Schema(name = "length", title = "长度")
    private Integer length;

    @Schema(name = "defaultValues", title = "默认值")
    private String defaultValues;

    @Schema(name = "required", title = "是否必填")
    private Integer required;

    @Schema(name = "placeholder", title = "提示信息")
    private String placeholder;

    @Schema(name = "isLock", title = "是否可以修改 0:可修改 1:不可修改")
    private Integer isLock;

    @Schema(name = "remark", title = "备注")
    private String remark;

    @Schema(name = "dctCode", title = "数字字典code值")
    private String dctCode;

}

  

package com.cloudoer.dct.core.model.dto.ams;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素分类")
@Data
@ToString(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AssetProductDefinitionDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(name = "id", title = "主键ID")
    private Long id;

    @Schema(name = "productId", title = "分类")
    private Long productId;

    @Schema(name = "name", title = "名称")
    private String name;

    @Schema(name = "label", title = "显示名称")
    private String label;

    @Schema(name = "dataType", title = "属性类型")
    private String dataType;

    @Schema(name = "uiType", title = "表单类型")
    private String uiType;

    @Schema(name = "length", title = "长度")
    private Integer length;

    @Schema(name = "defaultValues", title = "默认值")
    private String defaultValues;

    @Schema(name = "required", title = "是否必填")
    private Integer required;

    @Schema(name = "placeholder", title = "提示信息")
    private String placeholder;

    @Schema(name = "isLock", title = "是否可以修改 0:可修改 1:不可修改")
    private Integer isLock;

    @Schema(name = "priority", title = "优先级")
    private Integer priority;

    @Schema(name = "remark", title = "备注")
    private String remark;

    @Schema(name = "dctCode", title = "数字字典code值")
    private String dctCode;

}

  

package com.cloudoer.dct.core.model.query.ams;

import com.cloudoer.dct.core.model.query.BaseQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素分类")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductDefinitionQuery extends BaseQuery implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(name = "detailId", title = "申购ID")
    private Long detailId;

    @Schema(name = "productId", title = "分类")
    private String productId;

    @Schema(name = "name", title = "名称")
    private String name;

    @Schema(name = "label", title = "显示名称")
    private String label;

    @Schema(name = "dataType", title = "属性类型")
    private String dataType;

    @Schema(name = "uiType", title = "表单类型")
    private String uiType;

    @Schema(name = "length", title = "长度")
    private Integer length;

    @Schema(name = "defaultValues", title = "默认值")
    private String defaultValues;

    @Schema(name = "required", title = "是否必填")
    private String required;

    @Schema(name = "placeholder", title = "提示信息")
    private String placeholder;

    @Schema(name = "isLock", title = "是否可以修改 0:可修改 1:不可修改")
    private Integer isLock;

    @Schema(name = "remark", title = "备注")
    private String remark;

    @Schema(name = "dctCode", title = "数字字典code值")
    private String dctCode;

}

  

package com.cloudoer.dct.core.model.vo.ams;

import com.cloudoer.dct.core.model.vo.BaseVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素分类")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductDefinitionVO extends BaseVO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(name = "productId", title = "分类")
    private Long productId;

    @Schema(name = "name", title = "名称")
    private String name;

    @Schema(name = "label", title = "显示名称")
    private String label;

    @Schema(name = "dataType", title = "属性类型")
    private String dataType;

    @Schema(name = "uiType", title = "表单类型")
    private String uiType;

    @Schema(name = "length", title = "长度")
    private Integer length;

    @Schema(name = "defaultValues", title = "默认值")
    private String defaultValues;

    @Schema(name = "required", title = "是否必填")
    private Integer required;

    @Schema(name = "placeholder", title = "提示信息")
    private String placeholder;

    @Schema(name = "isLock", title = "是否可以修改 0:可修改 1:不可修改")
    private Integer isLock;

    @Schema(name = "remark", title = "备注")
    private String remark;

    @Schema(name = "dctCode", title = "数字字典code值")
    private String dctCode;


}

  

package com.cloudoer.dct.ams.mapstruts;

import com.cloudoer.dct.core.model.dto.ams.AssetProductDefinitionDTO;
import com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition;
import com.cloudoer.dct.core.model.vo.ams.AssetProductDefinitionVO;
import com.cloudoer.dct.core.model.vo.ams.AssetSubscriptionDetailVO;
import org.mapstruct.InjectionStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;

import java.util.List;

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface AssetProductDefinitionMapStruct {

    @Mappings({})
    AssetProductDefinition convertDTO(AssetProductDefinitionDTO dto);


    List<AssetProductDefinition> convertDTO(List<AssetProductDefinitionDTO> dtoList);

    @Mappings({})
    AssetProductDefinition convertVO(AssetProductDefinitionVO vo);


    List<AssetSubscriptionDetailVO> convertVO(List<AssetSubscriptionDetailVO> voList);

}

  

package com.cloudoer.dct.ams.service.i;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloudoer.dct.core.constant.Constant;
import com.cloudoer.dct.core.model.Page;
import com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition;
import com.cloudoer.dct.core.model.vo.BaseVO;
import com.cloudoer.dct.core.model.vo.ams.AssetProductDefinitionVO;
import com.cloudoer.dct.core.support.BeanUtil;
import com.cloudoer.dct.core.support.Condition;
import com.cloudoer.framework.core.domain.SortingContext;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
public interface AssetProductDefinitionService extends IService<AssetProductDefinition> {

    /**
     * 根据id查询一条资产产品元素分类。
     *
     * @param id 数据唯一id。
     * @return 查询到的资产产品元素分类数据。
     */
    default AssetProductDefinitionVO find(Long id){
        if(id == null){
            return null;
        }
        AssetProductDefinition assetProductDefinition = this.getById(id);
        if (null != assetProductDefinition) {
            return BeanUtil.copyProperties(assetProductDefinition, new AssetProductDefinitionVO());
        }
        return null;
    }

    /**
     * 根据id集合查询多条资产产品元素分类。
     *
     * @param ids id集合
     * @return 查询到的资产产品元素分类数据。
     */
    default List<AssetProductDefinitionVO> find(Collection<? extends Serializable> ids){
        if (CollectionUtils.isEmpty(ids)) {
            return null;
        }
        List<AssetProductDefinition> assetProductDefinitionList = listByIds(ids);
        if (CollectionUtils.isNotEmpty(assetProductDefinitionList)) {
            List<AssetProductDefinitionVO> list = new ArrayList<>(assetProductDefinitionList.size());
            for (AssetProductDefinition assetProductDefinition : assetProductDefinitionList) {
            list.add(BeanUtil.copyProperties(assetProductDefinition, new AssetProductDefinitionVO()));
            }
            return list;
        }
        return null;
    }


    /**
    * 根据id集合查询多条题目。
    *
    * @param ids id集合
    * @return 查询到的题目数据。
    */
    default Map<Long, AssetProductDefinitionVO> findMap(Collection<? extends Serializable> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return new HashMap<>();
        }
        List<AssetProductDefinitionVO> list = find(ids);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, AssetProductDefinitionVO> map = new LinkedHashMap<>(list.size());
            for (AssetProductDefinitionVO assetProductDefinitionVO : list) {
                map.put(assetProductDefinitionVO.getId(), assetProductDefinitionVO);
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
    * 根据id集合查询多条题目。
    *
    * @param ids id集合
    * @return 查询到的题目数据。
    */
    default Map<Long, AssetProductDefinitionVO> findMap(String fieldName, Collection<? extends Serializable> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return new HashMap<>(0);
        }
        QueryWrapper<AssetProductDefinition> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);
        return findMap(fieldName, ids);
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param queryWrapper 查询条件。
     * @return 查询结果的数据集合。
     */
    default List<AssetProductDefinitionVO> find(QueryWrapper<AssetProductDefinition> queryWrapper) {
        List<AssetProductDefinitionVO> records = null;
        List<AssetProductDefinition> list = list(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            records = new ArrayList<>(list.size());
            for (AssetProductDefinition assetProductDefinition : list) {
                records.add(BeanUtil.copyProperties(assetProductDefinition, new AssetProductDefinitionVO()));
            }
        }
        return records;
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param queryWrapper 查询条件。
     * @return 查询结果的数据集合。
     */
    default Map<Long, AssetProductDefinitionVO> findMap(QueryWrapper<AssetProductDefinition> queryWrapper) {
        List<AssetProductDefinitionVO> list = find(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, AssetProductDefinitionVO> map = new LinkedHashMap<>(list.size());
            for (AssetProductDefinitionVO assetProductDefinitionVO : list) {
                map.put(assetProductDefinitionVO.getId(), assetProductDefinitionVO);
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
     * 根据查询指定字段
     *
     * @param fieldName    属性名称
     * @param queryWrapper 查询条件
     * @return 查询结果的数据集合
     */
    default Map<Long, String> findMap(String fieldName, QueryWrapper<AssetProductDefinition> queryWrapper) {
        queryWrapper.select("id", fieldName);
        List<Map<String, Object>> list = listMaps(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, String> map = new LinkedHashMap<>(list.size());
            for (Map<String, Object> data : list) {
                Object key = data.get("id");
                if (key != null && StringUtils.isNotBlank(key.toString())) {
                    String val = "";
                    if (data.get(fieldName) != null) {
                        val = data.get(fieldName).toString();
                    }
                    map.put(Long.valueOf(key.toString()), val);
                }
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
     * 根据查询条件得到数据列表,包含分页和排序信息。
     *
     * @param queryWrapper 查询条件。
     * @param page 分页排序信息。
     * @return 查询结果的数据集合。
     */
    default Page<AssetProductDefinitionVO> find(IPage<AssetProductDefinition> page, QueryWrapper<AssetProductDefinition> queryWrapper){
        IPage<AssetProductDefinition> ipage = this.page(page, queryWrapper);
        Page<AssetProductDefinitionVO> dataPage = new Page(ipage.getTotal(), ipage.getCurrent(), ipage.getSize());
        List<AssetProductDefinition> assetProductDefinitionList = ipage.getRecords();
        if (CollectionUtils.isNotEmpty(assetProductDefinitionList)) {
            List<AssetProductDefinitionVO> records = new ArrayList<>(assetProductDefinitionList.size());
            for (AssetProductDefinition assetProductDefinition : assetProductDefinitionList) {
                records.add(BeanUtil.copyProperties(assetProductDefinition, new AssetProductDefinitionVO()));
            }
            dataPage.setRecords(records);
        }
        List<OrderItem> orders = ipage.orders();
        if (CollectionUtils.isNotEmpty(orders)) {
            Map<String, String> scs = new LinkedHashMap<>(orders.size());
            for (OrderItem orderItem : orders) {
                scs.put(orderItem.getColumn(), orderItem.isAsc() ? SortingContext.ASC.toLowerCase() : SortingContext.DESC.toLowerCase());
            }
            dataPage.setScs(scs);
        }
        return dataPage;
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param groupName    属性名称
     * @param queryWrapper 查询条件
     * @return 查询结果的数据集合
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    default Map<String, List<AssetProductDefinitionVO>> findGroupMap(String groupName, QueryWrapper<AssetProductDefinition> queryWrapper) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<AssetProductDefinitionVO> list = find(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            String methodName = "get".concat(groupName.substring(0, 1).toUpperCase()).concat(groupName.substring(1));
            Method method = AssetProductDefinitionVO.class.getMethod(methodName);
            Map<String, List<AssetProductDefinitionVO>> map = new LinkedHashMap<>(list.size());
            for (AssetProductDefinitionVO assetProductDefinitionVO : list) {
                Object key = method.invoke(assetProductDefinitionVO);
                if (key != null && StringUtils.isNotBlank(key.toString())) {
                    if (!map.containsKey(key.toString())) {
                        map.put(key.toString(), new ArrayList<>());
                    }
                    map.get(key.toString()).add(assetProductDefinitionVO);
                }
            }
            return map;
        }
        return new HashMap<>(0);
    }

        /**
         * @param params
         */
        default List<Map<String, Object>> udd(Map<String, Object> params) {
            List<Map<String, Object>> dataList = new ArrayList<>();
            QueryWrapper<AssetProductDefinition> queryWrapper = Condition.getQueryWrapper(params,  AssetProductDefinition.class);
            queryWrapper.select("id", "name");
            queryWrapper.orderByDesc("priority");
            queryWrapper.orderByDesc("id");
            List<AssetProductDefinition> list = list(queryWrapper);
            if (CollectionUtils.isEmpty(list)) {
                return dataList;
            }
            for (AssetProductDefinition obj : list) {
                Map<String, Object> dmap = new HashMap<>();
                dmap.put("key", obj.getId());
                //dmap.put("val", obj.getName());
                dataList.add(dmap);
            }
            return dataList;
        }

    /**
     * 修改某个字段的值
     *
     * @param id
     * @param key
     * @param value
     * @param userId
     * @return
     */
    default boolean update(Long id, String key, Object value, Long userId) {
        if (id != null && StringUtils.isNotBlank(key) && !Constant.DONT_UPDATE_COLUMNS.contains(key.toLowerCase()) && userId != null) {
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set(key, value);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.eq("id", id);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 修改某个字段的值
     *
     * @param ids
     * @param key
     * @param value
     * @param userId
     * @return
     */
    default boolean update(Collection<? extends Serializable> ids, String key, Object value, Long userId) {
        if (CollectionUtils.isNotEmpty(ids) && StringUtils.isNotBlank(key) && !Constant.DONT_UPDATE_COLUMNS.contains(key.toLowerCase()) && userId != null) {
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set(key, value);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.in("id", ids);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 修改多个字段的值
     *
     * @param id
     * @param data
     * @param userId
     * @return
     */
    default boolean update(Long id, Map<String, Object> data, Long userId) {
        if (id != null && MapUtils.isNotEmpty(data) && userId != null) {
            boolean update = false;
            UpdateWrapper updateWrapper = new UpdateWrapper();
                for (Map.Entry<String, Object> entry : data.entrySet()) {
                if (!Constant.DONT_UPDATE_COLUMNS.contains(entry.getKey().toLowerCase())) {
                    update = true;
                    updateWrapper.set(entry.getKey(), entry.getValue());
                }
            }
            if (update) {
                updateWrapper.set("modified_by", userId);
                updateWrapper.set("modified_date", System.currentTimeMillis());
                updateWrapper.eq("id", id);
                return update(updateWrapper);
            }
        }
        return false;
    }

    /**
     * 修改多个字段的值
     *
     * @param ids
     * @param data
     * @param userId
     * @return
     */
    default boolean update(Collection<? extends Serializable> ids, Map<String, Object> data, Long userId) {
        if (CollectionUtils.isNotEmpty(ids) && MapUtils.isNotEmpty(data) && userId != null) {
            boolean update = false;
            UpdateWrapper updateWrapper = new UpdateWrapper();
                for (Map.Entry<String, Object> entry : data.entrySet()) {
                if (!Constant.DONT_UPDATE_COLUMNS.contains(entry.getKey().toLowerCase())) {
                    update = true;
                    updateWrapper.set(entry.getKey(), entry.getValue());
                }
            }
            if (update) {
                updateWrapper.set("modified_by", userId);
                updateWrapper.set("modified_date", System.currentTimeMillis());
                updateWrapper.in("id", ids);
                return update(updateWrapper);
            }
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param assetProductDefinition
     * @return
     */
    default boolean delete(AssetProductDefinition assetProductDefinition) {
        if(assetProductDefinition != null && assetProductDefinition.getId() != null && assetProductDefinition.getModifiedBy() != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", assetProductDefinition.getModifiedBy());
            updateWrapper.set("modified_date", assetProductDefinition.getModifiedDate());
            updateWrapper.eq("id", assetProductDefinition.getId());
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param id
     * @param userId
     * @return
     */
    default boolean delete(Long id, Long userId) {
        if(id != null && userId != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.eq("id", id);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param ids
     * @param userId
     * @return
     */
    default boolean delete(Collection<? extends Serializable> ids, Long userId) {
        boolean flag = false;
        if(CollectionUtils.isNotEmpty(ids) && userId != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.in("id", ids);
            return update(updateWrapper);
        }
        return false;
    }

        /**
         * @param list
         * @param field
         * @param targetField
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         */
        default void inflate(Collection<? extends BaseVO> list, String field, String targetField) throws InvocationTargetException, IllegalAccessException {
            List objectIds = BeanUtil.getObjectIds(list, field);
            if (CollectionUtils.isEmpty(objectIds)) {
                return;
            }
            QueryWrapper<AssetProductDefinition> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("id", "name");
            queryWrapper.in("id", objectIds);
            List<AssetProductDefinition> dataList = list(queryWrapper);
            if (CollectionUtils.isEmpty(dataList)) {
                return;
            }
            Map<String, AssetProductDefinition> dataMap = dataList.stream().collect(Collectors.toMap(item -> item.getId().toString(), obj -> obj));
            String getMethodName = "get".concat(field.substring(0, 1).toUpperCase()).concat(field.substring(1));
            String setMethodName = "set".concat(targetField.substring(0, 1).toUpperCase()).concat(targetField.substring(1));
            for (BaseVO vo : list) {
                Method getMethod = BeanUtil.getObjectMethodByName(vo, getMethodName);
                if (getMethod == null) {
                    continue;
                }
                Object orgId = getMethod.invoke(vo);
                if (orgId == null) {
                    continue;
                }
                AssetProductDefinition obj = dataMap.getOrDefault(orgId.toString(), null);
                if (obj == null) {
                    continue;
                }
                Method setMethod = BeanUtil.getObjectMethodByName(vo, setMethodName, String.class);
                if (setMethod != null) {
                    //setMethod.invoke(vo, obj.getName());
                } else {
                    //vo.addAttribute(targetField, obj.getName());
                }
            }

        }

        /**
         * @param vo
         * @param field
         * @param targetField
         */
        default void inflate(BaseVO vo, String field, String targetField) throws InvocationTargetException, IllegalAccessException {
            Object objectId = BeanUtil.getObjectId(vo, field);
            if (objectId == null) {
                return;
            }
            QueryWrapper<AssetProductDefinition> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("id", "name");
            queryWrapper.eq("id", objectId);
            AssetProductDefinition obj = getOne(queryWrapper);
            if (obj == null) {
                return;
            }
            String setMethodName = "set".concat(targetField.substring(0, 1).toUpperCase()).concat(targetField.substring(1));
            Method setMethod = BeanUtil.getObjectMethodByName(vo, setMethodName, String.class);
            if (setMethod != null) {
                //setMethod.invoke(vo, obj.getName());
            } else {
                //vo.addAttribute(targetField, obj.getName());
            }
        }
}

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.cloudoer.dct.ams.dao.AssetProductDefinitionMapper">
    <resultMap type="com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition" id="AssetProductDefinitionMap">
        <id property="id" column="id" jdbcType="BIGINT"/>
        <result property="productId" column="product_id" jdbcType="BIGINT"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="label" column="label" jdbcType="VARCHAR"/>
        <result property="dataType" column="data_type" jdbcType="INTEGER"/>
        <result property="uiType" column="ui_type" jdbcType="INTEGER"/>
        <result property="defaultValues" column="default_values" jdbcType="VARCHAR"/>
        <result property="remark" column="remark" jdbcType="VARCHAR"/>
        <result property="required" column="required" jdbcType="INTEGER"/>
        <result property="isLock" column="is_lock" jdbcType="INTEGER"/>
        <result property="placeholder" column="placeholder" jdbcType="VARCHAR"/>
        <result property="dctCode" column="dct_code" jdbcType="VARCHAR"/>
        <result property="createdBy" column="created_by" jdbcType="BIGINT"/>
        <result property="createdDate" column="created_date" jdbcType="BIGINT"/>
        <result property="modifiedBy" column="modified_by" jdbcType="BIGINT"/>
        <result property="modifiedDate" column="modified_date" jdbcType="BIGINT"/>
        <result property="priority" column="priority" jdbcType="INTEGER"/>
        <result property="status" column="status" jdbcType="INTEGER"/>
    </resultMap>
</mapper>

  数据表

package com.cloudoer.dct.core.model.dto.ams;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素扩展")
@Data
@ToString(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AssetProductMetaDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "id")
    private Long id;

    @Schema(name = "assetsNo", title = "资产编号")
    private String assetsNo;

    @ApiModelProperty(value = "detailId")
    private Long detailId;

    @ApiModelProperty(value = "关联属性名称")
    private String metaKey;

    @ApiModelProperty(value = "关联属性内容")
    private String metaValue;

    @ApiModelProperty(value = "优先级")
    private Integer metaPriority;

}

  

package com.cloudoer.dct.core.model.entity.ams;

import com.baomidou.mybatisplus.annotation.TableName;
import com.cloudoer.dct.core.model.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素扩展")
@Data
@TableName("t_asset_product_metas")
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductMeta extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "资产Id")
    private Long assetId;

    @Schema(name = "assetsNo", title = "资产编号")
    private String assetsNo;

    @ApiModelProperty(value = "detailId")
    private Long detailId;

    @ApiModelProperty(value = "关联属性名称")
    private String metaKey;

    @ApiModelProperty(value = "关联属性内容")
    private String metaValue;

    @ApiModelProperty(value = "优先级")
    private Integer metaPriority;
}

  

package com.cloudoer.dct.core.model.query.ams;

import com.cloudoer.dct.core.model.query.BaseQuery;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素扩展")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductMetaQuery extends BaseQuery implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "detailId")
    private Long detailId;

    @Schema(name = "assetsNo", title = "资产编号")
    private String assetsNo;

    @ApiModelProperty(value = "关联属性名称")
    private String metaKey;

    @ApiModelProperty(value = "关联属性内容")
    private String metaValue;

    @ApiModelProperty(value = "优先级")
    private Integer metaPriority;
}

  

package com.cloudoer.dct.core.model.vo.ams;

import com.cloudoer.dct.core.model.vo.BaseVO;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@Schema(title = "资产产品元素扩展")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class AssetProductMetaVO extends BaseVO implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "detailId")
    private Long detailId;

    @Schema(name = "assetsNo", title = "资产编号")
    private String assetsNo;

    @ApiModelProperty(value = "关联属性名称")
    private String metaKey;

    @ApiModelProperty(value = "关联属性内容")
    private String metaValue;

    @ApiModelProperty(value = "优先级")
    private Integer metaPriority;

}

  

package com.cloudoer.dct.ams.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cloudoer.dct.ams.service.i.AssetProductMetaService;
import com.cloudoer.dct.core.controller.BaseController;
import com.cloudoer.dct.core.model.Page;
import com.cloudoer.dct.core.model.dto.ams.AssetProductMetaDTO;
import com.cloudoer.dct.core.model.entity.ams.AssetProductMeta;
import com.cloudoer.dct.core.model.query.ams.AssetProductMetaQuery;
import com.cloudoer.dct.core.model.vo.ams.AssetProductMetaVO;
import com.cloudoer.dct.core.support.BeanUtil;
import com.cloudoer.dct.core.support.Condition;
import com.cloudoer.dct.core.support.QueryContext;
import com.cloudoer.framework.core.domain.RO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
@RestController
@RequestMapping("/asset/product/metas")
@Slf4j
@Tag(name = "资产产品元素扩展",description = "资产产品元素扩展管理")
public class AssetProductMetaController extends BaseController<AssetProductMeta> {

    @Autowired
    private AssetProductMetaService assetProductMetaService;

    @Operation(summary = "资产产品元素扩展查询", description = "根据筛选条件分页查询,以及按照指定字段进行排序")
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductMetaVO.class))})
    })
    @GetMapping(name = "查询")
    public Object list(AssetProductMetaQuery assetProductMetaQuery, QueryContext queryContext) {
       QueryWrapper<AssetProductMeta> queryWrapper = Condition.getQueryWrapper(assetProductMetaQuery, queryContext, AssetProductMeta.class);
       Page<AssetProductMetaVO> page = assetProductMetaService.find(Condition.getPage(queryContext), queryWrapper);
       return RO.ok(page);
    }

    @Operation(summary = "资产产品元素扩展详情", description = "根据ID获取资产产品元素扩展详细信息")
    @Parameter(name = "id", description = "资产产品元素扩展ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductMetaVO.class))})
    })
    @GetMapping(value = "/{id}", name = "详情")
    public Object view(@PathVariable("id") Long id) {
        log.info("get AssetProductMeta Id:{}", id);
        AssetProductMetaVO assetProductMetaVO = assetProductMetaService.find(id);
        return RO.ok(assetProductMetaVO);
    }

    @Operation(summary = "创建资产产品元素扩展", description = "创建资产产品元素扩展信息")
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductMeta.class))})
    })
    @PostMapping(name = "创建")
    public Object create(@RequestBody AssetProductMetaDTO assetProductMetaDTO, ServerHttpRequest request) {
        log.info("add AssetProductMeta DTO:{}", assetProductMetaDTO);
        AssetProductMeta assetProductMeta = new AssetProductMeta();
        BeanUtil.copyProperties(assetProductMetaDTO, assetProductMeta);
        this.packAddBaseProps(assetProductMeta, request);
        boolean flag = assetProductMetaService.save(assetProductMeta);
        return RO.status(flag, assetProductMeta);
    }

    @Operation(summary = "复制资产产品元素扩展", description = "根据ID复制资产产品元素扩展")
    @Parameter(name = "id", description = "资产产品元素扩展ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductMeta.class))})
    })
    @PostMapping(value = "/{id}", name = "复制")
    public Object copy(@PathVariable("id") Long id, ServerHttpRequest request) {
        AssetProductMeta assetProductMeta = assetProductMetaService.getById(id);
        if (assetProductMeta == null) {
            return RO.fail("不存在的id");
        }
        assetProductMeta.setId(null);
        //assetProductMeta.setName(assetProductMeta.getName() + "_副本");
        this.packAddBaseProps(assetProductMeta, request);
        boolean flag = assetProductMetaService.save(assetProductMeta);
        return RO.status(flag, assetProductMeta);
    }

    @Operation(summary = "修改资产产品元素扩展", description = "根据ID, 修改资产产品元素扩展信息")
    @Parameter(name = "id", description = "资产产品元素扩展ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功", content = {@Content(schema = @Schema(implementation = AssetProductMeta.class))})
    })
    @PutMapping(value = "/{id}", name = "修改")
    public Object update(@PathVariable("id") Long id, @RequestBody AssetProductMetaDTO assetProductMetaDTO, ServerHttpRequest request) {
        log.info("put modify id:{}, AssetProductMeta DTO:{}", id, assetProductMetaDTO);
        AssetProductMeta assetProductMeta = assetProductMetaService.getById(id);
        if (null == assetProductMeta){
            return RO.fail("不存在的id");
        }
        BeanUtil.copyProperties(assetProductMetaDTO, assetProductMeta);
        this.packModifyBaseProps(assetProductMeta, request);
        boolean flag = assetProductMetaService.updateById(assetProductMeta);
        return RO.status(flag, assetProductMeta);
    }

    @Operation(summary = "删除资产产品元素扩展", description = "根据ID, 删除资产产品元素扩展信息")
    @Parameter(name = "id", description = "资产产品元素扩展ID", in = ParameterIn.PATH, schema = @Schema(type = "Long"), required = true)
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功")
    })
    @DeleteMapping(value = "/{id}", name = "删除")
    public Object remove(@PathVariable("id") Long id, ServerHttpRequest request) {
        log.info("delete AssetProductMeta, id:{}", id);
        AssetProductMeta assetProductMeta = new AssetProductMeta();
        assetProductMeta.setId(id);
        this.packModifyBaseProps(assetProductMeta, request);
        boolean flag = assetProductMetaService.delete(assetProductMeta);
        return RO.status(flag);
    }

    @Operation(summary = "批量删除资产产品元素扩展", description = "根据ID集合, 批量删除资产产品元素扩展信息")
    @Parameter(name = "ids", description = "资产产品元素扩展ID集合", in = ParameterIn.DEFAULT, schema = @Schema(type = "List"), required = true)
    @ApiResponses({
        @ApiResponse(responseCode = "100200", description = "成功")
    })
    @DeleteMapping(name = "批量删除")
    public Object remove(@RequestBody Map<String, Object> params, ServerHttpRequest request) {
        boolean flag = false;
        if(params.get("ids") != null){
            List<String> ids = (List<String>) params.get("ids");
            if (CollectionUtils.isNotEmpty(ids)) {
                flag = assetProductMetaService.delete(ids, getUserId(request));
            }
        }
        return RO.status(flag);
    }

}

  

package com.cloudoer.dct.ams.mapstruts;

import com.cloudoer.dct.core.model.dto.ams.AssetProductMetaDTO;
import com.cloudoer.dct.core.model.entity.ams.AssetProductMeta;
import com.cloudoer.dct.core.model.vo.ams.AssetProductMetaVO;
import org.mapstruct.InjectionStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;

import java.util.List;

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface AssetProductMetaMapStruct {

    @Mappings({})
    AssetProductMeta convert(AssetProductMetaDTO dto);

    List<AssetProductMeta> convert(List<AssetProductMetaDTO> dto);

    @Mappings({})
    AssetProductMetaDTO voConvert(AssetProductMetaVO vo);

    List<AssetProductMetaDTO> voConvert(List<AssetProductMetaVO> dto);

    AssetProductMeta listConvert(AssetProductMeta meta);

}

  

package com.cloudoer.dct.ams.service.i;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cloudoer.dct.core.constant.Constant;
import com.cloudoer.dct.core.model.Page;
import com.cloudoer.dct.core.model.entity.ams.AssetProductMeta;
import com.cloudoer.dct.core.model.vo.BaseVO;
import com.cloudoer.dct.core.model.vo.ams.AssetProductMetaVO;
import com.cloudoer.dct.core.support.BeanUtil;
import com.cloudoer.dct.core.support.Condition;
import com.cloudoer.framework.core.domain.SortingContext;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author cobot
 * @version 1.0.0
 * @since 2024-09-02
 */
public interface AssetProductMetaService extends IService<AssetProductMeta> {

    /**
     * 根据id查询一条资产产品元素扩展。
     *
     * @param id 数据唯一id。
     * @return 查询到的资产产品元素扩展数据。
     */
    default AssetProductMetaVO find(Long id){
        if(id == null){
            return null;
        }
        AssetProductMeta assetProductMeta = this.getById(id);
        if (null != assetProductMeta) {
            return BeanUtil.copyProperties(assetProductMeta, new AssetProductMetaVO());
        }
        return null;
    }

    /**
     * 根据id集合查询多条资产产品元素扩展。
     *
     * @param ids id集合
     * @return 查询到的资产产品元素扩展数据。
     */
    default List<AssetProductMetaVO> find(Collection<? extends Serializable> ids){
        if (CollectionUtils.isEmpty(ids)) {
            return null;
        }
        List<AssetProductMeta> assetProductMetaList = listByIds(ids);
        if (CollectionUtils.isNotEmpty(assetProductMetaList)) {
            List<AssetProductMetaVO> list = new ArrayList<>(assetProductMetaList.size());
            for (AssetProductMeta assetProductMeta : assetProductMetaList) {
            list.add(BeanUtil.copyProperties(assetProductMeta, new AssetProductMetaVO()));
            }
            return list;
        }
        return null;
    }


    /**
    * 根据id集合查询多条题目。
    *
    * @param ids id集合
    * @return 查询到的题目数据。
    */
    default Map<Long, AssetProductMetaVO> findMap(Collection<? extends Serializable> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return new HashMap<>();
        }
        List<AssetProductMetaVO> list = find(ids);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, AssetProductMetaVO> map = new LinkedHashMap<>(list.size());
            for (AssetProductMetaVO assetProductMetaVO : list) {
                map.put(assetProductMetaVO.getId(), assetProductMetaVO);
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
    * 根据id集合查询多条题目。
    *
    * @param ids id集合
    * @return 查询到的题目数据。
    */
    default Map<Long, AssetProductMetaVO> findMap(String fieldName, Collection<? extends Serializable> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return new HashMap<>(0);
        }
        QueryWrapper<AssetProductMeta> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);
        return findMap(fieldName, ids);
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param queryWrapper 查询条件。
     * @return 查询结果的数据集合。
     */
    default List<AssetProductMetaVO> find(QueryWrapper<AssetProductMeta> queryWrapper) {
        List<AssetProductMetaVO> records = null;
        List<AssetProductMeta> list = list(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            records = new ArrayList<>(list.size());
            for (AssetProductMeta assetProductMeta : list) {
                records.add(BeanUtil.copyProperties(assetProductMeta, new AssetProductMetaVO()));
            }
        }
        return records;
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param queryWrapper 查询条件。
     * @return 查询结果的数据集合。
     */
    default Map<Long, AssetProductMetaVO> findMap(QueryWrapper<AssetProductMeta> queryWrapper) {
        List<AssetProductMetaVO> list = find(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, AssetProductMetaVO> map = new LinkedHashMap<>(list.size());
            for (AssetProductMetaVO assetProductMetaVO : list) {
                map.put(assetProductMetaVO.getId(), assetProductMetaVO);
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
     * 根据查询指定字段
     *
     * @param fieldName    属性名称
     * @param queryWrapper 查询条件
     * @return 查询结果的数据集合
     */
    default Map<Long, String> findMap(String fieldName, QueryWrapper<AssetProductMeta> queryWrapper) {
        queryWrapper.select("id", fieldName);
        List<Map<String, Object>> list = listMaps(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            Map<Long, String> map = new LinkedHashMap<>(list.size());
            for (Map<String, Object> data : list) {
                Object key = data.get("id");
                if (key != null && StringUtils.isNotBlank(key.toString())) {
                    String val = "";
                    if (data.get(fieldName) != null) {
                        val = data.get(fieldName).toString();
                    }
                    map.put(Long.valueOf(key.toString()), val);
                }
            }
            return map;
        }
        return new HashMap<>(0);
    }

    /**
     * 根据查询条件得到数据列表,包含分页和排序信息。
     *
     * @param queryWrapper 查询条件。
     * @param page 分页排序信息。
     * @return 查询结果的数据集合。
     */
    default Page<AssetProductMetaVO> find(IPage<AssetProductMeta> page, QueryWrapper<AssetProductMeta> queryWrapper){
        IPage<AssetProductMeta> ipage = this.page(page, queryWrapper);
        Page<AssetProductMetaVO> dataPage = new Page(ipage.getTotal(), ipage.getCurrent(), ipage.getSize());
        List<AssetProductMeta> assetProductMetaList = ipage.getRecords();
        if (CollectionUtils.isNotEmpty(assetProductMetaList)) {
            List<AssetProductMetaVO> records = new ArrayList<>(assetProductMetaList.size());
            for (AssetProductMeta assetProductMeta : assetProductMetaList) {
                records.add(BeanUtil.copyProperties(assetProductMeta, new AssetProductMetaVO()));
            }
            dataPage.setRecords(records);
        }
        List<OrderItem> orders = ipage.orders();
        if (CollectionUtils.isNotEmpty(orders)) {
            Map<String, String> scs = new LinkedHashMap<>(orders.size());
            for (OrderItem orderItem : orders) {
                scs.put(orderItem.getColumn(), orderItem.isAsc() ? SortingContext.ASC.toLowerCase() : SortingContext.DESC.toLowerCase());
            }
            dataPage.setScs(scs);
        }
        return dataPage;
    }

    /**
     * 根据查询条件得到数据列表
     *
     * @param groupName    属性名称
     * @param queryWrapper 查询条件
     * @return 查询结果的数据集合
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    default Map<String, List<AssetProductMetaVO>> findGroupMap(String groupName, QueryWrapper<AssetProductMeta> queryWrapper) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<AssetProductMetaVO> list = find(queryWrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            String methodName = "get".concat(groupName.substring(0, 1).toUpperCase()).concat(groupName.substring(1));
            Method method = AssetProductMetaVO.class.getMethod(methodName);
            Map<String, List<AssetProductMetaVO>> map = new LinkedHashMap<>(list.size());
            for (AssetProductMetaVO assetProductMetaVO : list) {
                Object key = method.invoke(assetProductMetaVO);
                if (key != null && StringUtils.isNotBlank(key.toString())) {
                    if (!map.containsKey(key.toString())) {
                        map.put(key.toString(), new ArrayList<>());
                    }
                    map.get(key.toString()).add(assetProductMetaVO);
                }
            }
            return map;
        }
        return new HashMap<>(0);
    }

        /**
         * @param params
         */
        default List<Map<String, Object>> udd(Map<String, Object> params) {
            List<Map<String, Object>> dataList = new ArrayList<>();
            QueryWrapper<AssetProductMeta> queryWrapper = Condition.getQueryWrapper(params,  AssetProductMeta.class);
            queryWrapper.select("id", "name");
            queryWrapper.orderByDesc("priority");
            queryWrapper.orderByDesc("id");
            List<AssetProductMeta> list = list(queryWrapper);
            if (CollectionUtils.isEmpty(list)) {
                return dataList;
            }
            for (AssetProductMeta obj : list) {
                Map<String, Object> dmap = new HashMap<>();
                dmap.put("key", obj.getId());
                //dmap.put("val", obj.getName());
                dataList.add(dmap);
            }
            return dataList;
        }

    /**
     * 修改某个字段的值
     *
     * @param id
     * @param key
     * @param value
     * @param userId
     * @return
     */
    default boolean update(Long id, String key, Object value, Long userId) {
        if (id != null && StringUtils.isNotBlank(key) && !Constant.DONT_UPDATE_COLUMNS.contains(key.toLowerCase()) && userId != null) {
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set(key, value);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.eq("id", id);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 修改某个字段的值
     *
     * @param ids
     * @param key
     * @param value
     * @param userId
     * @return
     */
    default boolean update(Collection<? extends Serializable> ids, String key, Object value, Long userId) {
        if (CollectionUtils.isNotEmpty(ids) && StringUtils.isNotBlank(key) && !Constant.DONT_UPDATE_COLUMNS.contains(key.toLowerCase()) && userId != null) {
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set(key, value);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.in("id", ids);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 修改多个字段的值
     *
     * @param id
     * @param data
     * @param userId
     * @return
     */
    default boolean update(Long id, Map<String, Object> data, Long userId) {
        if (id != null && MapUtils.isNotEmpty(data) && userId != null) {
            boolean update = false;
            UpdateWrapper updateWrapper = new UpdateWrapper();
                for (Map.Entry<String, Object> entry : data.entrySet()) {
                if (!Constant.DONT_UPDATE_COLUMNS.contains(entry.getKey().toLowerCase())) {
                    update = true;
                    updateWrapper.set(entry.getKey(), entry.getValue());
                }
            }
            if (update) {
                updateWrapper.set("modified_by", userId);
                updateWrapper.set("modified_date", System.currentTimeMillis());
                updateWrapper.eq("id", id);
                return update(updateWrapper);
            }
        }
        return false;
    }

    /**
     * 修改多个字段的值
     *
     * @param ids
     * @param data
     * @param userId
     * @return
     */
    default boolean update(Collection<? extends Serializable> ids, Map<String, Object> data, Long userId) {
        if (CollectionUtils.isNotEmpty(ids) && MapUtils.isNotEmpty(data) && userId != null) {
            boolean update = false;
            UpdateWrapper updateWrapper = new UpdateWrapper();
                for (Map.Entry<String, Object> entry : data.entrySet()) {
                if (!Constant.DONT_UPDATE_COLUMNS.contains(entry.getKey().toLowerCase())) {
                    update = true;
                    updateWrapper.set(entry.getKey(), entry.getValue());
                }
            }
            if (update) {
                updateWrapper.set("modified_by", userId);
                updateWrapper.set("modified_date", System.currentTimeMillis());
                updateWrapper.in("id", ids);
                return update(updateWrapper);
            }
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param assetProductMeta
     * @return
     */
    default boolean delete(AssetProductMeta assetProductMeta) {
        if(assetProductMeta != null && assetProductMeta.getId() != null && assetProductMeta.getModifiedBy() != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", assetProductMeta.getModifiedBy());
            updateWrapper.set("modified_date", assetProductMeta.getModifiedDate());
            updateWrapper.eq("id", assetProductMeta.getId());
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param id
     * @param userId
     * @return
     */
    default boolean delete(Long id, Long userId) {
        if(id != null && userId != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.eq("id", id);
            return update(updateWrapper);
        }
        return false;
    }

    /**
     * 逻辑删除
     *
     * @param ids
     * @param userId
     * @return
     */
    default boolean delete(Collection<? extends Serializable> ids, Long userId) {
        boolean flag = false;
        if(CollectionUtils.isNotEmpty(ids) && userId != null){
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.set("status", 0);
            updateWrapper.set("modified_by", userId);
            updateWrapper.set("modified_date", System.currentTimeMillis());
            updateWrapper.in("id", ids);
            return update(updateWrapper);
        }
        return false;
    }

        /**
         * @param list
         * @param field
         * @param targetField
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         */
        default void inflate(Collection<? extends BaseVO> list, String field, String targetField) throws InvocationTargetException, IllegalAccessException {
            List objectIds = BeanUtil.getObjectIds(list, field);
            if (CollectionUtils.isEmpty(objectIds)) {
                return;
            }
            QueryWrapper<AssetProductMeta> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("id", "name");
            queryWrapper.in("id", objectIds);
            List<AssetProductMeta> dataList = list(queryWrapper);
            if (CollectionUtils.isEmpty(dataList)) {
                return;
            }
            Map<String, AssetProductMeta> dataMap = dataList.stream().collect(Collectors.toMap(item -> item.getId().toString(), obj -> obj));
            String getMethodName = "get".concat(field.substring(0, 1).toUpperCase()).concat(field.substring(1));
            String setMethodName = "set".concat(targetField.substring(0, 1).toUpperCase()).concat(targetField.substring(1));
            for (BaseVO vo : list) {
                Method getMethod = BeanUtil.getObjectMethodByName(vo, getMethodName);
                if (getMethod == null) {
                    continue;
                }
                Object orgId = getMethod.invoke(vo);
                if (orgId == null) {
                    continue;
                }
                AssetProductMeta obj = dataMap.getOrDefault(orgId.toString(), null);
                if (obj == null) {
                    continue;
                }
                Method setMethod = BeanUtil.getObjectMethodByName(vo, setMethodName, String.class);
                if (setMethod != null) {
                    //setMethod.invoke(vo, obj.getName());
                } else {
                    //vo.addAttribute(targetField, obj.getName());
                }
            }

        }

        /**
         * @param vo
         * @param field
         * @param targetField
         */
        default void inflate(BaseVO vo, String field, String targetField) throws InvocationTargetException, IllegalAccessException {
            Object objectId = BeanUtil.getObjectId(vo, field);
            if (objectId == null) {
                return;
            }
            QueryWrapper<AssetProductMeta> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("id", "name");
            queryWrapper.eq("id", objectId);
            AssetProductMeta obj = getOne(queryWrapper);
            if (obj == null) {
                return;
            }
            String setMethodName = "set".concat(targetField.substring(0, 1).toUpperCase()).concat(targetField.substring(1));
            Method setMethod = BeanUtil.getObjectMethodByName(vo, setMethodName, String.class);
            if (setMethod != null) {
                //setMethod.invoke(vo, obj.getName());
            } else {
                //vo.addAttribute(targetField, obj.getName());
            }
        }
}

  

VUE部分:

 配置表单

<template>
  <!--  数据字典-->
  <!--  margin:'0 -12px'-->
  <div :style="{height: height + 'px',overflow:'hidden'}">
    <Split v-model="split" class="icb-split-left-240">
      <template #left>
        <div class="icb-split-left">
          <Card dis-hover :bordered="false" class="udd-tree-card">
            <p slot="title">
              <Icon type="ios-list" size="24" color="black" style="margin-left: -3px"></Icon>
              <span style="vertical-align: text-bottom">资产分类目录</span>
            </p>
            <Tree :data="treeData" @on-select-change="treeChange"
                  :style="{height: treeHeight + 'px',overflow:'auto',}"></Tree>
          </Card>
        </div>
      </template>
      <template #right>
        <Card dis-hover :bordered="false" :padding="0">
          <p slot="title">
            <Dropdown class="icb-dropdown" trigger="click">
              <Icon type="md-more"/>
              <DropdownMenu slot="list">
                <DropdownItem v-if="$checkAuth('-assetScrap-create')" @click.native="edit(null)">
                  <span class="iconx iconx-add-circle-outlined"></span>
                  <span>新建</span>
                </DropdownItem>
                <DropdownItem v-if="$checkAuth('-assetScrap-removeBatch')" @click.native="removeBatch">
                  <span class="iconx iconx-delete-outlined"></span>
                  <span>删除</span>
                </DropdownItem>
              </DropdownMenu>
            </Dropdown>
          </p>
          <Table
              :columns="tableColumns"
              :data="data"
              :loading="loading"
              :size="tableSize"
              :height="tableHeight"
              @on-sort-change="sort"
              :no-data-text="$gdata.tableNoDataText"
              @on-selection-change="tableSelectHandler">
            <template slot-scope="{ row }" slot="name">
              <a @click="showInfo(row)">{{ row.name }}</a>
            </template>
            <template slot-scope="{ row }" slot="action">
              <div class="icb-list-action">
            <span class="iconx iconx-edit-outlined" v-if="$checkAuth('-assetProductDefinition-update')"
                  @click="edit(row)"></span>
                <span class="icb-action-divider"></span>
                <Dropdown class="icb-dropdown" trigger="click" style="margin-left: 0;">
                  <a href="javascript:void(0)" class="icb-list-more">
                    <span class="iconx iconx-more-outlined"></span>
                  </a>
                  <DropdownMenu slot="list">
                    <DropdownItem @click.native="attach(row)">
                      <span class="iconx iconx-link-outlind"></span>
                      <span>附件</span>
                    </DropdownItem>
                    <DropdownItem @click.native="remove(row)" v-if="$checkAuth('-assetProductDefinition-remove')">
                      <span class="iconx iconx-delete-outlined"></span>
                      <span class="table-action">删除</span>
                    </DropdownItem>
                  </DropdownMenu>
                </Dropdown>
              </div>
            </template>
          </Table>
          <div class="ivu-text-right ivu-mt-8">
            <Page :total="pc.total" :current="pc.pageIndex" :page-size="pc.pageSize"
                  :page-size-opts="pageSizeOpts" :disabled="pageDisabled"
                  @on-change="changePage" @on-page-size-change="changePageSize"
                  show-total show-sizer transfer style="margin-left: auto"></Page>
          </div>
        </Card>
      </template>
    </Split>
    <Drawer :title="editorTitle" v-model="editorVisible" :mask-closable="false" :closable="true" width="750"
            class-name="icb-popup">
      <assetProductDefinitionEditor ref="assetProductDefinitionEditor" @on-success="editSuccessHandler"
                                    @on-close="closeHandle"/>
    </Drawer>
    <Drawer :title="infoTitle" v-model="infoVisible" width="750" class-name="icb-popup">
      <assetProductDefinitionInfo ref="assetProductDefinitionInfo"/>
    </Drawer>
    <Attachment ref="attachment"/>
  </div>
</template>
<script>
  import assetProductDefinitionEditor from './editor'
  import assetProductDefinitionInfo from './view'
  import dropdownCommon from '_c/dropdown/dropdown-common';
  import PriorityPoptip from '_c/priority-poptip/priority-poptip';
  import {
    getAssetProductDefinitionList,
    removeAssetProductDefinition,
    removeAssetProductDefinitionBatch,
    updateAssetProductDefinition,
  } from '@api/ams/assetProductDefinition'
  import { getTreeList } from '@api/ams/assetCategory'
  import $ from 'jquery'
  import config from '../config.json'
  import { getUddList } from '@/api/generic/udd';

  export default {
    name: 'udd-list',
    components: {
      assetProductDefinitionEditor,
      assetProductDefinitionInfo,
      dropdownCommon,
      PriorityPoptip
    },
    data () {
      return {
        udds: [],
        dataTypeDatas: [],
        infoTitle: '',
        infoVisible: false,
        ids: null,
        loading: false,
        drawer_styles: {
          height: 'calc(100% - 55px)',
          overflow: 'auto',
          paddingBottom: '53px',
          position: 'static',
          width: '920'
        },
        split: '320px',
        height: 0,
        data: [],
        editorTitle: '',
        editorVisible: false,
        treeData: [
          {
            code: '',
            title: '资产分类',
            expand: true,
            selected: true,
            children: []
          }
        ],
        parent: '/',
        pc: {
          pageIndex: 1,
          pageSize: 20,
          total: 0
        },
        pageDisabled: false,
        scs: [
          {
            priority: 'desc'
          },
          {
            created_date: 'desc'
          }
        ],
        columns: [
          {
            type: 'selection',
            show: true,
            width: 60,
            align: 'center'
          },
          {
            type: 'index',
            show: true,
            width: 60,
            align: 'right'
          },
          {
            title: '名称',
            key: 'name',
            show: true,
            tooltip: true,
            maxWidth: 350,
            slot: 'name',
            className: 'sort-col sort-name-col'
          },
          {
            title: '显示名称',
            key: 'label',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-label-col'
          },
          {
            title: '属性类型',
            key: 'dataType',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-dataType-col',
            render: (h, params) => {
              console.log('params.row.dctCode=====',params.row.dataType,this.dataTypeDatas)
              return h('span', config.dataTypeItems.filter(item => item.value === params.row.dataType)[0].label || '未知');
            }
          },
          {
            title: '表单类型',
            key: 'uiType',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-uiType-col',
            render: (h, params) => {
              return h('span', config.metaTypes.filter(item => item.value === params.row.uiType)[0].label || '未知');
            }
          },
          {
            title: '长度',
            key: 'length',
            align: 'center',
            render: (h, params) => {
              return h('span', params.row.length);
            }
          },
          {
            title: '默认值',
            key: 'defaultValues',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-defaultValues-col'
          },
          {
            title: '是否必填',
            key: 'required',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-required-col'
          },
          {
            title: '数据字典',
            key: 'dctCode',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-dctCode-col',
            render: (h, params) => {

              return h('span', this.udds.filter(item => item.code === params.row.dctCode)[0].name || '未知');
            }
          },
          {
            title: '提示信息',
            key: 'placeholder',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-placeholder-col'
          },
          {
            title: '优先级',
            key: 'priority',
            show: true,
            tooltip: true,
            maxWidth: 350,
            className: 'sort-col sort-priority-col',
            render: (h, params) => {
              return h('div', {}, [
                h(PriorityPoptip, {
                  props: {
                    id: params.row.id,
                    priorityold: params.row.priority,
                    prioritynew: params.row.priority
                  },
                  on: {
                    priorityUpdated: (prioritynew, id) => {
                      this.savePriority(prioritynew, id);
                    }
                  }
                })
              ]);
            }
          },
          {
            title: '操作',
            key: 'action',
            show: true,
            align: 'center',
            slot: 'action',
            width: 100
          }
        ],
        dropitems: [
          {
            icon: '',
            action: 'udd_update',
            title: '修改',
            name: 'editor'
          },
          {
            icon: '',
            action: 'udd_del',
            title: '删除',
            name: 'del'
          }
        ],
        pageRefresh: true,
        pageSizeOpts: [10, 20, 50, 100],
        tableHeight: 0,
        treeHeight: 0,
        tableSize: 'default'
      }
    },
    watch: {
      'pc.pageIndex': function (curVal, oldVal) {
        if (curVal !== oldVal) {
          if (!this.pageRefresh) {
            return
          }
          this.load()
        }
      },
      'pc.pageSize': function (curVal, oldVal) {
        if (curVal !== oldVal) {
          if (!this.pageRefresh) {
            return
          }
          this.load()
        }
      },
      facets: {
        handler (newValue, oldValue) {
          this.load()
        },
        deep: true
      },
      $route: {
        handler () {
          if (this.$route.query.p) {
            if (this.$route.query.p - 0 !== this.pc.pageIndex) {
              this.pc.pageIndex = this.$route.query.p - 0
              this.load()
            }
          } else {
            this.pc.pageIndex = 1
            this.load()
          }
        },
        deep: true
      }
    },
    computed: {
      width () {
        return document.body.clientWidth
      },
      tableColumns () {
        const columns = [...this.columns]
        return columns.filter(item => item.show)
      }
    },
    mounted () {
      const self = this
      self.$nextTick(() => {
        self.autoHeight()
      })
      window.addEventListener('resize', this.autoHeight)
      if (self.$route.query.p) {
        self.pc.pageIndex = this.$route.query.p - 0
      }
      self.load();
      self.treeChange (this.treeData)
    },
    created () {
      this.loadMTIdDatas ();
      this.loadTree();
      this.getUddList ()
      this.load()
    },
    destroyed () {
      window.removeEventListener('resize', this.autoHeight)
    },
    methods: {
      getUddList () {
        const params = {}
        const self = this
        self.udds = []
        getUddList(params).then((res) => {
          console.log(111111,res.data)
          self.udds = res.data.records
        });
      },
      loadMTIdDatas () {
        // todo 此处调用元数据接口 /metatypes
        this.dataTypeDatas  =  [
          {id: '950763959593365504', name: '区域代码'},
          {id: '348648182', name: '文本类型'}
        ];
      },
        refreshSort () {
        this.scs.forEach(function (order, key) {
          let ascEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropup')
          let descEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropdown')
          if (order === 'asc') {
            $(ascEl).addClass('on')
            $(descEl).removeClass('on')
          } else if (order === 'desc') {
            $(ascEl).removeClass('on')
            $(descEl).addClass('on')
          } else {
            $(ascEl).removeClass('on')
            $(descEl).removeClass('on')
          }
        })
      },
      tableSelectHandler (selection) {
        const self = this
        self.ids = []
        if (selection != null && selection.length > 0) {
          selection.forEach(function (item) {
            self.ids.push(item.id)
          })
        }
      },
      buildParams () {
        const self = this
        let params = {
          p: this.pc.pageIndex,
          s: this.pc.pageSize
        }
        params.productId = self.parent;
        let scs = []
        this.scs.forEach(function (order, key) {
          scs.push(key + '(' + order + ')')
        })
        if ((this.scs == null || this.scs.size == 0) && this.defaultScs != null && Object.keys(this.defaultScs).length > 0) {
          Object.keys(this.defaultScs).forEach(function (key) {
            scs.push(key + '(' + self.defaultScs[key] + ')')
          })
        }
        Object.assign(params, this.filters, this.facets, { scs: scs.join(',') })
        return params
      },
      loadTree () {
        getTreeList({ scs: 'name(asc)' }).then((res) => {
          this.treeData[0].children = res.data;
        });
      },
      sort (sc) {
        let key = sc.key
        let order = sc.order
        if (key == null || key == undefined) {
          key = sc.column.slot
        }
        if (this.scs.has(key) && this.scs.get(key) === 'asc') {
          order = 'desc'
        }
        if (key != null && key != undefined && key != '') {
          if (sc.order !== 'normal') {
            this.scs.set(key, order)
          } else {
            this.scs.delete(key)
          }
          this.load()
        }
      },
      load () {
        const self = this
        getAssetProductDefinitionList(self.buildParams()).then((res) => {
          self.loading = false
          self.data = res.data.records
          if (res.data.records.length > 0) {
            self.pc.pageIndex = parseInt(res.data.pageIndex)
            self.pc.total = parseInt(res.data.total)
          } else {
            self.pc = {
              pageIndex: 1,
              pageSize: self.pc.pageSize,
              total: 0
            }
          }
          self.refreshSort()
          setTimeout(function () {
            self.pageRefresh = true
            self.pageDisabled = false
          }, 500)
        })
      },
      treeChange (data) {
        this.parent = data[0].code;

        this.load();
      },
      savePriority (prioritynew,id) {
        updateAssetProductDefinition({
          id: id,
          priority: prioritynew
        }).then((res) => {
          if (res.code === 100200) {
            this.$Message.success('修改成功!')
            this.load()
          }
        })
      },
      dropdown (tdata) {
        switch (tdata.name) {
          case 'editor':
            this.edit(tdata.data.code)
            break
          case 'del':
            this.del(tdata.data)
            break
        }
      },
      edit (data) {
        let id = 0
        if (data != null) {
          id = data.id
        }
        this.editorTitle = (id === 0 ? '新建' : '编辑') + '类型'
        this.editorVisible = true
        this.$refs.assetProductDefinitionEditor.load(id, this.parent)
      },
      editSuccessHandler (data, type) {
        this.editorVisible = false
        this.load()
        this.loadTree()
      },
      closeHandle () {
        this.editorVisible = false
      },
      del (data) {
        const params = {
          id: data.id
        }
        this.$Modal.confirm({
          content: '<p>确定删除吗?</p>',
          onOk: () => {
            removeAssetProductDefinition(params).then((res) => {
              if (res.code === 100200) {
                this.$Message.success('删除成功!')
                this.load()
              }
              this.loadTree()
            })
          },
          onCancel: () => {
          }
        })
      },
      removeBatch () {
        if (this.ids.length > 0) {
          let params = {
            ids: this.ids
          }
          this.$Modal.confirm({
            title: '提示',
            content: '<p>确定要删除选择的数据?</p>',
            cancelText: '取消',
            okText: '确定',
            onOk: () => {
              removeAssetProductDefinitionBatch(params).then((res) => {
                if (res.code === 100200) {
                  this.$Message.success('操作成功!')
                  this.load()
                } else {
                  this.$Message.error(res.message)
                }
              })
            },
            onCancel: () => {

            }
          })
        } else {
          this.$Message.error('请选择要删除的数据!')
        }
      },
      autoHeight () {
        // 42是顶部导航栏高度 32是tab栏高度 headerHeight是列表页顶部高度 12是外层边距,50是底部分页信息栏, 所有被减高度之和为206
        this.height = document.body.clientHeight - 84
        this.treeHeight = this.height - 98
      },
      changePage (page) {
        this.pc.pageIndex = parseInt(page)
      },
      changePageSize (num) {
        this.pc.pageSize = parseInt(num)
      },
      handleChangeTableSize (size) {
        this.tableSize = size
      }
    }
  }
</script>
<style lang="less" scoped>
::v-deep .ivu-table th {
  background: #fff !important;
}

::v-deep .ivu-card-head {
  border-bottom: 0;
}

.icb-split-left {

  ::v-deep .ivu-card-head {
    border-bottom: 1px solid #e8eaec;;
  }

}
</style>

  

<template>
  <div>
    <Form ref="assetProductDefinitionForm" :model="assetProductDefinition" :rules="ruleValidate"
          :label-width="labelWidth" :label-position="labelPosition">
      <Row>
        <Col span="12">
          <Form-item label="名称" prop="name">
            <Input v-model="assetProductDefinition.name" placeholder="名称"></Input>
          </Form-item>
        </Col>
        <Col span="12">
          <Form-item label="显示名称" prop="label">
            <Input v-model="assetProductDefinition.label" placeholder="显示名称"></Input>
          </Form-item>
        </Col>
      </Row>

      <Row>
        <Col span="12">
          <Form-item label="属性类型" prop="dataType">
            <Select v-model="assetProductDefinition.dataType" style="width:100%">
              <Option v-for="item in config.dataTypeItems" :key="item.value" :value="item.value" :label="item.label"></Option>
            </Select>
          </Form-item>
        </Col>
        <Col span="12">
          <Form-item label="表单类型" prop="uiType">
            <Select v-model="assetProductDefinition.uiType" style="width: 200px">
              <Option v-for="item in config.metaTypes" :key="item.value" :value="item.value" :label="item.label"></Option>
            </Select>
          </Form-item>
        </Col>
      </Row>

      <Row>
        <Col span="12">
          <Form-item label="默认值" prop="defaultValues">
            <Input v-model="assetProductDefinition.defaultValues" placeholder="默认值"></Input>
          </Form-item>
        </Col>
        <Col span="12">
          <Form-item label="是否必填" prop="required">
            <Switch v-model="assetProductDefinition.required" :false-value="0" :true-value="1"/>
          </Form-item>
        </Col>
      </Row>

      <Row>
        <Col span="12">
          <Form-item label="提示信息" prop="placeholder">
            <Input v-model="assetProductDefinition.placeholder" placeholder="提示信息"></Input>
          </Form-item>
        </Col>
        <Col span="12">
          <Form-item label="长度" prop="length">
            <InputNumber v-model="assetProductDefinition.length" :max="4096" :min="1" placeholder="长度" ></InputNumber>
          </Form-item>
        </Col>
      </Row>

      <Row>
        <Col span="12">
          <Form-item label="提示信息" prop="dctCode" v-if="assetProductDefinition.dataType === '4'">
            <Select v-model="assetProductDefinition.dctCode" style="width:100%">
              <Option v-for="(item,index) in udds" :key="index" :value="item.code" :label="item.name">
                {{ item.name }}
              </Option>
            </Select>
          </Form-item>
        </Col>
        <Col span="12">
        </Col>
      </Row>

      <Form-item label="备注" prop="remark">
        <tinyEditor class="editor" :value="assetProductDefinition.remark"
                    @input="(res)=> assetProductDefinition.remark = res"></tinyEditor>
      </Form-item>

    </Form>
    <div class="icb-editor-footer">
      <Button @click="cancelHandler">取消</Button>
      <Button type="primary" :loading="loading" @click="save">保存</Button>
    </div>
  </div>
</template>

<script>
  import {
    createAssetProductDefinition,
    getAssetProductDefinition,
    updateAssetProductDefinition
  } from '@api/ams/assetProductDefinition'
  import { mapState } from 'vuex'
  import tinyEditor from '_c/tinymce/index.vue';
  import config from '../config.json'
  import { getUddList } from '@/api/generic/udd';

  export default {
    name: 'asset-product-definition-editor',
    components: { tinyEditor },
    data () {
      return {
        udds: [],
        dataTypeDatas: [],
        config,
        loading: false,
        isNew: false,
        assetProductDefinition: {
          productId: null,
          name: null,
          label: null,
          length: null,
          dataType: null,
          uiType: null,
          defaultValues: null,
          required: null,
          placeholder: null,
          remark: null,
          isLock: 1,
          dctCode: null,
        },
        ruleValidate: {
          name: [
            {
              required: true,
              message: '名称不能为空',
              trigger: 'blur',
            }
          ],
          label: [
            {
              required: true,
              message: '显示名称不能为空',
              trigger: 'blur'
            }
          ],
          dataType: [
            {
              required: true,
              message: '属性类型不能为空',
              trigger: 'blur'
            }
          ],
          uiType: [
            {
              required: true,
              message: '表单类型不能为空',
              trigger: 'blur'
            }
          ],
          defaultValues: [
            {
              required: true,
              message: '默认值不能为空',
              trigger: 'blur'
            }
          ],
          // required: [
          //   {
          //     required: true,
          //     message: '是否必填不能为空',
          //     trigger: 'change',
          //     type: 'number'
          //   }
          // ],
          placeholder: [
            {
              required: true,
              message: '提示信息不能为空',
              trigger: 'blur'
            }
          ],
        }
      }
    },
    created () {

    },
    mounted () {
    },
    beforeDestroy () {
    },
    destroyed () {
    },
    computed: {
      ...mapState('admin/layout', [
        'isMobile'
      ]),
      labelWidth () {
        return this.isMobile ? undefined : 80
      },
      labelPosition () {
        return this.isMobile ? 'top' : 'right'
      }
    },
    watch: {},
    methods: {
      getUddList () {
        const params = {}
        const self = this
        self.udds = []
        getUddList(params).then((res) => {
          console.log(111111,res.data)
          self.udds = res.data.records
        });
      },
      loadMTIdDatas () {
        // todo 此处调用元数据接口 /metatypes
        this.dataTypeDatas = [
          {
            id: '950763959593365504',
            name: '区域代码'
          },
          {
            id: '348648182',
            name: '文本类型'
          },
          {
            id: '444444444444',
            name: '数据字典'
          }
        ];
      },
      load (id, productId) {
        this.loading = false
        this.$refs.assetProductDefinitionForm.resetFields()
        this.isNew = (id === 0)

        if (this.isNew) {
          this.assetProductDefinition = {}
        } else {
          let params = { id }
          getAssetProductDefinition(params).then((res) => {
            let assetProductDefinition = res.data
            this.assetProductDefinition = assetProductDefinition
          })
        }
        this.$set(this.assetProductDefinition, 'productId', productId)
        this.$set(this.assetProductDefinition, 'isLock', 1)
        console.log(this.assetProductDefinition, 9999999999)
        this.getUddList ();
        this.loadMTIdDatas();
      },
      save () {
        console.log(this.$parent, 444444444)
        this.$refs.assetProductDefinitionForm.validate((valid) => {
          // this.loading = true
          if (valid) {
            if (this.isNew) {
              this.create()
            } else {
              this.modify()
            }
          } else {
            this.$Message.error('信息校验失败,请根据页面提示纠正您所填写的信息!')
            this.loading = false
          }
        })
      },
      create () {
        createAssetProductDefinition(this.assetProductDefinition).then((res) => {
          if (res.code === 100200) {
            this.$Message.success('添加成功!')
            this.reset()
            this.$emit('on-success', res.data, 'create')
          } else {
            this.$Message.error('添加失败,请稍后重试!')
          }
          this.loading = false
        })
      },
      modify () {
        this.$Modal.confirm({
          title: '操作提示',
          content: '是否修改该数据?',
          okText: '修改',
          onCancel: () => {
            this.loading = false
          },
          onOk: () => {
            updateAssetProductDefinition(this.assetProductDefinition).then((res) => {
              if (res.code === 100200) {
                this.$Message.success('修改成功!')
                this.$emit('on-success', res.data, 'update')
              } else {
                this.$Message.error('修改失败!')
              }
              this.loading = false
            })
          }
        })
      },
      reset () {
        this.assetProductDefinition = {}
        this.$refs.assetProductDefinitionForm.resetFields()
      },
      cancelHandler () {
        this.$emit('on-close')
      }
    }
  }
</script>

  

<template>
  <div class="icb-list">
    <div class="icb-list-header" ref="cListHeader">
      <div class="icb-search">
        <div class="icb-search-item">
          <Input type="text" class="icb-search-input" v-model="filters.keyword" @on-enter="search" clearable
                 placeholder="根据关键字搜索" style="width: 100%;">
            <Icon type="ios-search" slot="prefix"/>
          </Input>
        </div>
        <div class="icb-search-item">
          <Button type="primary" @click="search" style="margin-right:8px;">查询</Button>
        </div>
      </div>
      <div class="icb-action" style="display: flex">
        <Dropdown class="icb-dropdown" trigger="click">
          <Icon type="md-more"/>
          <DropdownMenu slot="list">
            <DropdownItem v-if="$checkAuth('-assetAcceptance-create')" @click.native="edit(null)">
              <span class="iconx iconx-add-circle-outlined"></span>
              <span>新建</span>
            </DropdownItem>
            <DropdownItem v-if="$checkAuth('-assetAcceptance-removeBatch')" @click.native="removeBatch">
              <span class="iconx iconx-delete-outlined"></span>
              <span>删除</span>
            </DropdownItem>
          </DropdownMenu>
        </Dropdown>
      </div>
    </div>
    <Row style="margin: auto">
      <div>
        <Menu v-if="facets.isSuccess" :active-name="facets.approvalState" :theme="theme" class="hidden-bottom-line"
              mode="horizontal" style="width: 800px">
          <MenuItem v-for="item in assetStates" :key="item.state" :name="item.state === null ? '' : item.state"
                    @click.native="stateChange(item.state)">
            {{ item.name }}({{ item.value }})
          </MenuItem>
        </Menu>
      </div>
    </Row>
    <div class="icb-list-data">
      <Table
          :columns="tableColumns"
          :data="data"
          :loading="loading"
          :size="tableSize"
          :height="tableHeight"
          @on-sort-change="sort"
          :no-data-text="$gdata.tableNoDataText"
          @on-selection-change="tableSelectHandler">
        <template slot-scope="{ row }" slot="attchments">
          <span>{{ row.attchCount }}</span>
          <a style="margin-right: 20px" @click="showAttchments(row)" class="iconx iconx-preview2"></a>
        </template>
        <template slot-scope="{ row }" slot="name">
          <a @click="showInfo(row)">{{ row.name }}</a>
        </template>
        <template slot-scope="{ row }" slot="action">
          <div class="icb-list-action">
            <span class="iconx iconx-edit-outlined" v-if="$checkAuth('-assetAcceptance-update')"
                  @click="edit(row)"></span>
            <span class="icb-action-divider"></span>
            <Dropdown class="icb-dropdown" trigger="click" style="margin-left: 0;">
              <a href="javascript:void(0)" class="icb-list-more">
                <span class="iconx iconx-more-outlined"></span>
              </a>
              <DropdownMenu slot="list">
                <DropdownItem @click.native="attach(row)">
                  <span class="iconx iconx-link-outlind"></span>
                  <span>附件</span>
                </DropdownItem>
                <DropdownItem @click.native="copy(row)" v-if="$checkAuth('-assetAcceptance-copy')">
                  <span class="iconx iconx-copy-outlined"></span>
                  <span>复制</span>
                </DropdownItem>
                <DropdownItem @click.native="remove(row)" v-if="$checkAuth('-assetAcceptance-remove')">
                  <span class="iconx iconx-delete-outlined"></span>
                  <span class="table-action">删除</span>
                </DropdownItem>
              </DropdownMenu>
            </Dropdown>
          </div>
        </template>
      </Table>
      <div class="icb-list-footer" ref="cListFooter">
        <Page :total="pc.total" :current="pc.pageIndex" :page-size="pc.pageSize"
              :page-size-opts="pageSizeOpts" :disabled="pageDisabled"
              @on-change="changePage" @on-page-size-change="changePageSize"
              show-total show-sizer transfer></Page>
      </div>
    </div>
    <Drawer :title="editorTitle" v-model="editorVisible" :mask-closable="false" :closable="true" width="1200"
            class-name="icb-popup">
      <assetAcceptanceEditor ref="assetAcceptanceEditor" @list-event="parentMethod" @on-success="editSuccessHandler" @on-close="closeHandle"/>
    </Drawer>
    <MuseumCoverEditor ref="coverup" @remove="removeHandler" @uploaded="successUploadHandler" @on-close="cancelCoverDialog" :action="url"/>
    <Drawer :title="infoTitle" v-model="infoVisible" width="950" class-name="icb-popup">
      <assetAcceptanceInfo ref="assetAcceptanceInfo"/>
    </Drawer>
    <Drawer title="扩展字段信息" :closable="true"  v-model="metaDataVisible" width="1000" >
      <AccMetaData ref="accMetaData" @getMetas="getMetaDatas"/>
    </Drawer>
    <Cover ref="cover"/>
    <Attachment ref="attachment"/>
    <Modal v-model="checkVisible" :title="appTitle" @on-ok="saveCheck">
      <Form>
        <FormItem label="审核结果">
          <RadioGroup v-model="checkState">
            <Radio :label="1">审核通过</Radio>
            <Radio :label="-1">审核不通过</Radio>
          </RadioGroup>
        </FormItem>
        <FormItem label="审核意见">
          <Input v-model="checkRemark" type="textarea" placeholder="请输入审核意见"></Input>
        </FormItem>
      </Form>
    </Modal>
  </div>

</template>
<script>
  import {
    copyAssetAcceptance,
    getAssetAcceptanceList,
    removeAssetAcceptance,
    removeAssetAcceptanceBatch,
    updateAssetAcceptance,
    getStatesCount,
    approval
  } from '@api/ams/assetAcceptance'
  import assetAcceptanceEditor from './editor'
  import assetAcceptanceInfo from './view'
  import excel from '@/libs/excel'
  import * as moment from 'moment'
  import $ from 'jquery'
  import config from '../config.json'
  import expandRow from './expand'
  import MuseumCoverEditor from '@/components/cover/museumCover.vue'
  import AccMetaData from '../base/accMetaData'
  import { createUpload, removeFile } from '@api/ams/assetAttchments';
  import * as ax from '@/plugins/request'

  export default {
    name: 'asset-acceptance-list',
    components: {
      assetAcceptanceEditor,
      assetAcceptanceInfo,
      MuseumCoverEditor,
      AccMetaData
    },
    data () {
      const self = this
      return {
        url : ax.url + '/ams/asset/attachments',
        theme: 'light',
        assetStates: [],
        config,
        metaDataVisible: false,
        checkVisible: false,
        checkState: 1,
        checkType: 1,
        checkRemark: '',
        appTitle: '审核',
        data: [],
        ids: [],
        infoTitle: '',
        infoVisible: false,
        editorTitle: '',
        editorVisible: false,
        filters: {
          kcs: 'name',
          keyword: ''
        },
        facets: {
          approvalState: '',
          isSuccess: false,
        },
        pc: {
          pageIndex: 1,
          pageSize: 20,
          total: 0
        },
        scs: new Map(),
        defaultScs: {
          'priority': 'desc',
          'id': 'desc'
        },
        columns: [
          {
            type: 'expand',
            width: 50,
            show: true,
            render: (h, params) => {
              return this.$createElement(expandRow, {
                props: {
                  row: params.row
                },
                on: {
                  // 子组件$emit传递方法以及参数
                }
              })
            }
          },
          {
            type: 'selection',
            show: true,
            width: 60,
            align: 'center'
          },
          {
            type: 'index',
            show: true,
            width: 60,
            align: 'right'
          },
          {
            title: '验收编号',
            key: 'accNo',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 200,
            className: 'sort-col sort-accNo-col'
          },
          {
            title: '附件图片',
            key: 'attchCount',
            width: 120,
            show: true,
            render: (h, params) => {
              if (params.row.attchCount > 0) {
                return h('a', {
                  class: ['iconx', 'iconx-cover3'],
                  style: {},
                  on: {
                    click: () => {
                      this.showAttchments(params.row)
                    }
                  }
                }, ' ' + params.row.attchCount);
              } else {
                return h('a', {
                  style: {},
                  on: {
                    click: () => {
                      this.showAttchments(params.row)
                    }
                  }
                }, '暂无');
              }
            }
          },
          {
            title: '制单时间',
            key: 'createdDate',
            maxWidth: 350,
            minWidth: 150,
            render: (h, params) => {
              return h('div', {}, moment(params.row.createdDate - 0).format('YYYY-MM-DD HH:mm'))
            }
          },
          {
            title: '验收人',
            key: 'userName',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            className: 'sort-col sort-userName-col'
          },
          {
            title: '验收部门',
            key: 'dptName',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            className: 'sort-col sort-dptName-col'
          },
          {
            title: '购买时间',
            key: 'purchaseDate',
            render: (h, params) => {
              return h('div', {}, moment(params.row.purchaseDate - 0).format('YYYY-MM-DD HH:mm'))
            }
          },
          {
            title: '收据号',
            key: 'invoiceCode',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            className: 'sort-col sort-invoiceCode-col'
          },
          {
            title: '提交审核',
            key: 'submit',
            show: true,
            minWidth: 150,
            className: 'sort-col sort-approvalState-col',
            render: (h, params) => {
              if (params.row.approvalState === 0 ||
                  params.row.approvalState === -1) {
                return h('Button', {
                      props: {
                        type: 'primary',
                        style: { margin: '0 3px 0 3px' }
                      },
                      on: {
                        click: () => {
                          this.toSubmit(params.row)
                        }
                      }
                    }, [
                      h('span', '提交')
                    ]
                )
              } else if (params.row.approvalState === 2) {
                return h('span', {
                  class: 'row1',
                  style: { color: '#ffed3c' }
                }, '请审核该条记录')
              } else if (params.row.approvalState === 1) {
                return h('span', '')
              }
            }
          },
          {
            title: '审核状态',
            key: 'approvalState',
            show: true,
            tooltip: true,
            width: 150,
            filters: [],
            filterMultiple: false,
            filterRemote (value, row) {
              self.facets.approvalState = value.length > 0 ? value[0] : ''
            },
            className: 'sort-col sort-approvalState-col',
            render: (h, params) => {
              const approvalState = params.row.approvalState;
              let txt = ''
              const color = approvalState === 1 ? '#00ff00' : approvalState === -1 ? '#ff0000' : '#000000';
              if (approvalState != null) {
                const filterArr = config.checkStateData.filter(item => item.value === approvalState);
                console.log('========', approvalState, filterArr)
                if (filterArr && filterArr.length > 0) {
                  txt = filterArr[0].label
                }
              }
              const self = this
              if (approvalState === 2) {
                if (self.$checkAuth('approval-plans-solicitation')) {
                  return h('Button', {
                    props: { type: 'primary' },
                    style: { margin: '0 3px 0 3px' },
                    on: {
                      click: () => {
                        this.toCheck(params)
                      }
                    }
                  }, [
                    h('span', '审核')
                  ])
                }
              } else {
                if (params.row.remark != null && params.row.remark !== '') {
                  return h('Tooltip', {
                    props: {
                      content: params.row.remark,
                      transfer: true,
                      maxWidth: '300'
                    }
                  }, [h('span', {
                    class: 'row1',
                    style: { color: color }
                  }, txt)]);
                }
              }
              return h('span', {
                style: { color: color }
              }, txt)
            }
          },
          {
            title: '操作',
            key: 'action',
            show: true,
            align: 'center',
            slot: 'action',
            width: 100
          }
        ],
        loading: true,
        pageDisabled: false,
        pageRefresh: true,
        pageSizeOpts: [10, 20, 50, 100],
        tableHeight: 0,
        tableSize: 'default'
      }
    },
    watch: {
      'pc.pageIndex': function (curVal, oldVal) {
        if (curVal !== oldVal) {
          if (!this.pageRefresh) {
            return
          }
          this.load()
        }
      },
      'pc.pageSize': function (curVal, oldVal) {
        if (curVal !== oldVal) {
          if (!this.pageRefresh) {
            return
          }
          this.load()
        }
      },
      facets: {
        handler (newValue, oldValue) {
          this.load()
        },
        deep: true
      },
      $route: {
        handler () {
          if (this.$route.query.p) {
            if (this.$route.query.p - 0 !== this.pc.pageIndex) {
              this.pc.pageIndex = this.$route.query.p - 0
              this.load()
            }
          } else {
            this.pc.pageIndex = 1
            this.load()
          }
        },
        deep: true
      }
    },
    computed: {
      width () {
        return document.body.clientWidth
      },
      tableColumns () {
        const columns = [...this.columns]
        return columns.filter(item => item.show)
      }
    },
    mounted () {
      this.$nextTick(() => {
        this.autoHeight()
      })
      window.addEventListener('resize', this.autoHeight)
      if (this.$route.query.p) {
        this.pc.pageIndex = this.$route.query.p - 0
      }
      this.loadClueStatesCount();
      this.load()
    },
    created () {
    },
    methods: {
      getMetaDatas (data) {
        this.metaDataVisible = false;
        this.$refs.assetAcceptanceEditor.buildMetaData(data)
      },
      parentMethod (res) {
        console.log(res.data , res.data.detailId, ' @@@@@@@@@detailId@@@@@@@@@ ')
        this.metaDataVisible = true;
        this.$refs.accMetaData.loadMetaDataByDetailId(res.data.data)
      },
      // ==============上传===========================
      removeHandler (id) {
        const params = {
          id: id
        }
        removeFile(params).then((res) => {
          this.$Notice.success({
            title: '操作提示',
            desc: '封面删除成功'
          });
        })
      },
      successUploadHandler (res, file, oid) {
        console.log('22222222',res)
        const params = {
          objectId: oid,
          objectType: 1,
          url: res.data.url,
          fileId: res.data.id,
          content: res.data.content,
          type: 'pic'
        }
        createUpload(params).then((res) => {
          this.$Notice.success({
            title: '操作提示',
            desc: '添加成功'
          })
        })
      },
      cancelCoverDialog () {
        this.load()
      },
      showAttchments(data) {
        this.$refs.coverup.show({
          objectId: data.id,
          title: '图片上传'
        })
      },
      stateChange (state) {
        this.facets.approvalState = state
        console.log('~~~~~~~~~~~~~', state)
        this.load()
      },
      loadClueStatesCount () {
        this.facets.isSuccess = false;
        getStatesCount(this.buildParams()).then(res => {
          if (res.code === 100200) {
            res.data.forEach(item => {
              if (item.name === '全部') {
                item.state = ''
              }
            })
            this.assetStates = res.data;
            this.facets.approvalState = '';
            this.facets.isSuccess = true;
          }
        })
      },
      toSubmit (data) {
        if (!data) {
          return
        }
        this.$Modal.confirm({
          title: '提示',
          content: '<p>确定提交审核?</p>',
          cancelText: '取消',
          okText: '确定',
          onOk: () => {
            const param = {
              id: data.id,
              approvalStatus: 2,
            }
            approval(param).then((res) => {
              this.$Message.success('提交成功!')
              this.load()
            })
          },
          onCancel: () => {
          }
        })
      },
      saveCheck () {
        if (!this.checkData) {
          return
        }
        const param = {
          id: this.checkData.row.id,
          approvalRemark: this.checkRemark,
          approvalStatus: this.checkState,
          approvalLevel: this.checkType,
        }
        approval(param).then((res) => {
          this.$Message.success('提交成功!')
          this.load()
        })
      },
      toCheck (data, level) {
        console.log('0000000000000', data)
        this.checkData = data
        this.checkState = 1
        this.checkType = level
        this.checkRemark = ''
        this.appTitle = level === 1 ? '初级审批' : '复审';
        this.checkVisible = true
      },
      buildParams () {
        const self = this
        let params = {
          p: this.pc.pageIndex,
          s: this.pc.pageSize
        }
        let scs = []
        this.scs.forEach(function (order, key) {
          scs.push(key + '(' + order + ')')
        })
        if ((this.scs == null || this.scs.size == 0) && this.defaultScs != null && Object.keys(this.defaultScs).length > 0) {
          Object.keys(this.defaultScs).forEach(function (key) {
            scs.push(key + '(' + self.defaultScs[key] + ')')
          })
        }
        Object.assign(params, this.filters, this.facets, { scs: scs.join(',') })
        return params
      },
      resetParams () {
        this.filters = {
          kcs: 'name',
          keyword: ''
        }
        this.scs = new Map()
        this.facets = {
          approvalState: '',
        }
        $('th.sort-col').each(function () {
          $(this).find('.ivu-icon-md-arrow-dropup').removeClass('on')
          $(this).find('.ivu-icon-md-arrow-dropdown').removeClass('on')
        })
        this.load()
      },
      search () {
        this.pc.pageIndex = 1
        this.load()
      },
      load () {
        const self = this
        self.loading = true
        self.pageRefresh = false
        self.pageDisabled = true
        self.ids = []
        self.data = []
        getAssetAcceptanceList(self.buildParams()).then((res) => {
          self.loading = false
          self.data = res.data.records
          if (res.data.records.length > 0) {
            self.pc.pageIndex = parseInt(res.data.pageIndex)
            self.pc.total = parseInt(res.data.total)
          } else {
            self.pc = {
              pageIndex: 1,
              pageSize: this.pc.pageSize,
              total: 0
            }
          }
          self.refreshSort()
          setTimeout(function () {
            self.pageRefresh = true
            self.pageDisabled = false
          }, 500)
        })
      },
      exportExcel () {
        let params = this.buildParams()
        params.p = 1
        params.s = 10000
        getAssetAcceptanceList(params).then((res) => {
          let records = res.data.records
          if (res.data.records.length > 0) {
            records.forEach(function (item) {
            })
            let data = {
              title: ['验收编号', '名称', '验收人ID', '审核状态', '备注'],
              key: ['accNo', 'name', 'userId', 'approvalState', 'remark'],
              data: records,
              autoWidth: true,
              filename: '资产验收_' + moment().format('YYYYMMDDHHmmss')
            }
            excel.export_array_to_excel(data)
          } else {
            this.$Message.warning('无数据!')
          }
        })
      },
      sort (sc) {
        let key = sc.key
        let order = sc.order
        if (key == null || key === undefined) {
          key = sc.column.slot
        }
        if (this.scs.has(key) && this.scs.get(key) === 'asc') {
          order = 'desc'
        }
        if (key != null && key !== undefined && key !== '') {
          if (sc.order !== 'normal') {
            this.scs.set(key, order)
          } else {
            this.scs.delete(key)
          }
          this.load()
        }
      },
      refreshSort () {
        this.scs.forEach(function (order, key) {
          let ascEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropup')
          let descEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropdown')
          if (order === 'asc') {
            $(ascEl).addClass('on')
            $(descEl).removeClass('on')
          } else if (order === 'desc') {
            $(ascEl).removeClass('on')
            $(descEl).addClass('on')
          } else {
            $(ascEl).removeClass('on')
            $(descEl).removeClass('on')
          }
        })
      },
      showInfo (data) {
        this.infoTitle = '资产验收详情'
        this.infoVisible = true
        this.$refs.assetAcceptanceInfo.load(data.id)
      },
      edit (data) {
        let id = 0
        if (data != null) {
          id = data.id
        }
        this.editorTitle = (id === 0 ? '新建' : '修改') + '资产验收'
        this.$refs.assetAcceptanceEditor.load(id)
        this.editorVisible = true
      },
      editSuccessHandler (data, type) {
        this.editorVisible = false
        this.load()
      },
      closeHandle () {
        this.editorVisible = false
      },
      update (id, data, reload) {
        if (id != null && data != null) {
          let params = Object.assign(data, { id })
          updateAssetAcceptance(params).then((res) => {
            this.$Message.success('修改成功!')
            if (reload) {
              this.load()
            }
          })
        }
      },
      copy (data) {
        const params = {
          id: data.id
        }
        this.$Modal.confirm({
          title: '<p class="ivu-modal-confirm-title">确认要复制该数据吗?</p>',
          content: '<p class="ivu-modal-confirm-content">复制当前选中的数据项。</p>',
          iconClass: 'ios-alert',
          cancelText: '取消',
          okText: '确定',
          onOk: () => {
            copyAssetAcceptance(params).then((res) => {
              if (res.code === 100200) {
                this.$Message.success('复制成功!')
                this.load()
              } else {
                this.$Message.error(res.message);
              }
            })
          },
          onCancel: () => {

          }
        })
      },
      remove (data) {
        this.$Modal.confirm({
          title: '提示',
          content: '<p>确定删除?</p>',
          cancelText: '取消',
          okText: '确定',
          onOk: () => {
            removeAssetAcceptance({ id: data.id }).then((res) => {
              if (res.code === 100200) {
                this.$Message.success('删除成功!')
                this.load()
              } else {
                this.$Message.error(res.message)
              }
            })
          },
          onCancel: () => {
          }
        })
      },
      removeBatch () {
        if (this.ids.length > 0) {
          let params = {
            ids: this.ids
          }
          this.$Modal.confirm({
            title: '提示',
            content: '<p>确定要删除选择的数据?</p>',
            cancelText: '取消',
            okText: '确定',
            onOk: () => {
              removeAssetAcceptanceBatch(params).then((res) => {
                if (res.code === 100200) {
                  this.$Message.success('操作成功!')
                  this.load()
                } else {
                  this.$Message.error(res.message)
                }
              })
            },
            onCancel: () => {

            }
          })
        } else {
          this.$Message.error('请选择要删除的数据!')
        }
      },
      tableSelectHandler (selection) {
        const self = this
        self.ids = []
        if (selection != null && selection.length > 0) {
          selection.forEach(function (item) {
            self.ids.push(item.id)
          })
        }
      },
      autoHeight () {
        const headerHeight = this.$refs.cListHeader.offsetHeight ? this.$refs.cListHeader.offsetHeight:0;
        const footerHeight = this.$refs.cListFooter.offsetHeight
        this.tableHeight = document.body.clientHeight - headerHeight - footerHeight - 150
      },
      changePage (page) {
        this.pc.pageIndex = parseInt(page)
      },
      changePageSize (num) {
        this.pc.pageSize = parseInt(num)
      },
      handleChangeTableSize (size) {
        this.tableSize = size
      },
      attach (data) {
        this.$refs.attachment.show({
          objectId: data.id,
          objectType: 'assetAcceptance',
          title: data.name
        })
      },
      cover (data) {
        this.$refs.cover.show({
          objectId: data.id,
          objectType: 'assetAcceptance',
          title: data.name
        })
      },
    }
  }
</script>

  edit.vue

<template>
  <div>
    <Form ref="assetAcceptanceForm" :model="assetAcceptance" :rules="ruleValidate" :label-width="labelWidth"
          :label-position="labelPosition">
      <Row>
        <Col span="8">
          <Form-item label="验收编号" prop="accNo">
            <Input v-model="assetAcceptance.accNo" :disabled="true" placeholder="请输入验收编号" clearable
                   style="width: 100%"/>
          </Form-item>
        </Col>
        <Col :span="8">
          <Form-item label="验收人" prop="userId">
            <Select v-model="assetAcceptance.userId" placeholder="请选择验收人" style="width: 100%"
                    @on-change="(res) => getDeptName(res)">
              <Option v-for="item in employeeList" :key="item.id" :value="item.id">{{ item.name }}</Option>
            </Select>
          </Form-item>
        </Col>
        <Col :span="8">
          <Form-item label="验收部门" prop="dptName">
            <Input v-model="assetAcceptance.dptName" :disabled="true" placeholder="验收部门" clearable
                   style="width: 100%"/>
          </Form-item>
        </Col>
        <Col :span="8">
          <Form-item label="购入单位" prop="purchaseCompany">
            <Input v-model="assetAcceptance.purchaseCompany" placeholder="请输入购入单位" clearable
                   style="width: 100%"/>
          </Form-item>
        </Col>
        <Col :span="8">
          <Form-item label="购入日期" prop="purchaseDate">
            <DatePicker v-model="assetAcceptance.purchaseDate_dt" placeholder="请选择购入日期" type="date"
                        value-format="yyyy-MM-dd" clearable style="width: 100%"/>
          </Form-item>
        </Col>
        <Col :span="8">
          <Form-item label="收据号" prop="invoiceCode">
            <Input v-model="assetAcceptance.invoiceCode" placeholder="请输入收据号" clearable
                   style="width: 100%"/>
          </Form-item>
        </Col>
        <Col :span="24">
          <Form-item label="备注" prop="remark">
            <tinyEditor :showBtn="false" :value="assetAcceptance.remark" class="editor"
                        @input="(res)=> assetAcceptance.remark = res"></tinyEditor>
          </Form-item>
        </Col>
        <Col :span="24">

        </Col>
      </Row>
    </Form>
    <div class="form-detail" style="height: calc(100vh - 102px); overflow-y: auto">
      <AssetsTable ref="assetsTable" :accId="assetAcceptance.id" :tableDataOne="tableData" @editor-event="parentMethod" @value-changed="showMerchantEditor"/>
    </div>
    <div class="icb-editor-footer">
      <Button @click="cancelHandler">取消</Button>
      <Button type="primary" :loading="loading" @click="save">保存</Button>
    </div>
    <Modal v-model="checkVisible" :styles="drawer_styles" :title="appTitle" :mask-closable="false" :closable="true" width="700" footer-hide>
      <AssetMerchantEditor ref="assetMerchantEditor" :key="componentKey" :checkVisible="true" @on-success="editSuccessHandler" @on-close="closeHandle"/>
    </Modal>
  </div>
</template>

<script>
  import {
    acceptCode,
    createAssetAcceptance,
    getAssetAcceptance,
    updateAssetAcceptance
  } from '@api/ams/assetAcceptance'
  import AssetsTable from '../base/assetsTable';
  import { mapState } from 'vuex'
  import { getEmployeeList } from '@api/sems/employee';
  import tinyEditor from '_c/tinymce/index.vue';
  import {
    getAssetAcceptanceDetailList,
    updateAssetAcceptanceDetail,
    updateAssetAcceptanceDetailData
  } from '@api/ams/assetAcceptanceDetail';
  import AssetMerchantEditor from '../assetMerchant/editor'

  export default {
    name: 'asset-acceptance-editor',
    components: {
      AssetsTable,
      tinyEditor,
      AssetMerchantEditor
    },
    data () {
      return {
        componentKey: 0,
        drawer_styles: {
          height: 'calc(100% - 0px)',
          overflowY: 'auto',
          overflowX: 'auto',
          paddingBottom: '0px',
          position: 'static'
        },
        appTitle: '添加商户',
        checkVisible: false,
        employeeList: [],
        id: '',
        loading: false,
        isNew: false,
        tableData: [],
        assetAcceptance: {
          dptName: null,
          accNo: null,
          name: null,
          userId: null,
          approvalState: null,
          remark: null,
          purchaseDate: null,
          purchaseDate_dt: null,
          assetAcceptanceDetails: [],
          items: null,
        },
        ruleValidate: {
          accNo: [
            {
              required: true,
              message: '验收编号不能为空',
              trigger: 'blur'
            }
          ],
          name: [
            {
              required: true,
              message: '名称不能为空',
              trigger: 'blur'
            }
          ],
        }
      }
    },
    created () {

    },
    mounted () {
      this.loadEmployeeInfo()
    },
    beforeDestroy () {
    },
    destroyed () {
    },
    computed: {
      ...mapState('admin/layout', [
        'isMobile'
      ]),
      labelWidth () {
        return this.isMobile ? undefined : 80
      },
      labelPosition () {
        return this.isMobile ? 'top' : 'right'
      }
    },
    watch: {},
    methods: {
      buildMetaData (data) {
        if (data && data.length > 0){
          debugger
          var id = data[0].detailId;
          this.tableData.forEach(item => {
            const detailId = item.detailId;
            if (detailId === id){
              this.$set(item, 'assetLedgers',data)
              this.$set(item, 'metas',data.metas)
            }
          })
          console.log(this.tableData, data, 'Parent method 666666');

          // let params = {dtos : data}
          // let dtos = [];
          // data.forEach(item => {
          //   const obj = {};
          //   obj.id = item.id;
          //   obj.assetLedgers = item.assetLedgers;
          //   dtos.push(obj)
          // })
          updateAssetAcceptanceDetailData(data).then((res) => {
            this.$Message.success('修改成功!')

          })
        }
      },
      editSuccessHandler (data) {
        console.log(data, 'Parent method 2222222222');
        this.checkVisible = false
        this.$refs.assetsTable.loadMerchantList();
      },
      closeHandle () {
        console.log( 'Parent method 3333333333333');
        this.checkVisible = false
      },
      parentMethod (data) {
        console.log(data, 'Parent method called1111111');
        const self = this;
        self.$emit('list-event', { data: data });

      },
      showMerchantEditor () {
        this.checkVisible = true;
        this.componentKey += 1;
      },
      saveCheck () {
        // this.checkVisible = false;
        this.$refs.assetMerchantEditor.save();
        this.$refs.assetsTable.loadMerchantList();
      },
      editMetaData (accId) {
        console.log(accId, ' ----------!!-------- ')
        this.$emit('editMetaData', accId)
      },
      getAssetAcceptanceCode () {
        acceptCode().then((res) => {
          if (res.code === 100200) {
            console.log(res.message, 7777777777777777)
            this.$set(this.assetAcceptance, 'accNo', res.message);
          }
        });
      },
      getDetails () {
        const self = this
        self.loading = true
        const param = {
          p: 1,
          s: 1000,
          accId: this.accId
        }
        self.tableData = [];

        getAssetAcceptanceDetailList(param).then((res) => {
          self.loading = false
          if (res.code === 100200) {
            const data = res.data;
            if (data) {
              const records = data.records;
              records.forEach(item => {
                item.price = Number(item.price)
              })
              self.tableData = records;
            }
          }
        });
      },
      getDeptName (res) {
        console.log('!!!!!!!!!!!', res, this.employeeList)
        if (res) {
          this.assetAcceptance.dptName = this.employeeList.filter(item => item.id === res)[0].department || '未知'
        }
      },
      loadEmployeeInfo () {
        const params = {
          p: 1,
          s: 1000,
          state: 1
        }
        getEmployeeList(params).then((res) => {
          this.employeeList = res.data.records
        })
      },
      async load (id) {
        this.loading = false
        this.$refs.assetAcceptanceForm.resetFields()
        this.isNew = (id === 0)
        this.tableData = [];
        if (this.isNew) {
          this.assetAcceptance = {}
          this.tableData = [{
            num: 1,
            price: 0,
            name: '',
            model: '',
            productId: '',
            specList: []
          }]
          this.getAssetAcceptanceCode();
        } else {
          let params = { id }
          await getAssetAcceptance(params).then((res) => {
            let assetAcceptance = res.data
            this.assetAcceptance = assetAcceptance
            if (assetAcceptance.purchaseDate != null && !isNaN(assetAcceptance.purchaseDate)) {
              assetAcceptance.purchaseDate_dt = new Date(assetAcceptance.purchaseDate - 0)
            }
            // getDeptName(res)
            if (assetAcceptance.userId) {
               this.getDeptName(assetAcceptance.userId)
            }
            const assetAcceptanceDetails = this.assetAcceptance.assetAcceptanceDetails;
            console.log(assetAcceptanceDetails, 88888888888)
            if (assetAcceptanceDetails) {
              this.tableData = assetAcceptanceDetails;

              this.tableData.forEach(item => {
                item.price = Number(item.price)
              })
              console.log('zhixingl')
            }
          })
          this.$refs.assetsTable.loadProductSelect()
        }
      },
      isValidInvoiceNumber (invoiceNumber) {
        return /^\d{10}$/.test(invoiceNumber);
      },
      save () {
        const tableData = this.tableData;
        if (tableData.length < 1) {
          this.$Message.error('请添加验收资产数据');
          return false;
        }
        const find = tableData.find(item => !item.assetsName);
        if (find) {
          this.$Message.error('请填写完整资产名称');
          return false;
        }

        const find2 = tableData.find(item => !item.invoiceCode || (item.invoiceCode && !this.isValidInvoiceNumber(item.invoiceCode)));
        if (find2) {
          this.$Message.error('请填写正确的发票');
          return false;
        }

        const find3 = tableData.find(item => !item.merchantId);
        if (find3) {
          this.$Message.error('请填写完整商户');
          return false;
        }

        this.$refs.assetAcceptanceForm.validate((valid) => {
          // this.loading = true
          if (valid) {
            if (this.assetAcceptance.purchaseDate_dt != null) {
              this.assetAcceptance.purchaseDate = this.assetAcceptance.purchaseDate_dt.getTime()
            }
            this.assetAcceptance.assetAcceptanceDetails = tableData
            if (this.isNew) {
              this.create()
            } else {
              this.modify()
            }
          } else {
            this.$Message.error('信息校验失败,请根据页面提示纠正您所填写的信息!')
            this.loading = false
          }
        })
      },
      create () {
        createAssetAcceptance(this.assetAcceptance).then((res) => {
          if (res.code === 100200) {
            this.$Message.success('添加成功!')
            this.reset()
            this.$emit('on-success', res.data, 'create')
          } else {
            this.$Message.error('添加失败,请稍后重试!')
          }
          this.loading = false
        })
      },
      modify () {
        this.$Modal.confirm({
          title: '操作提示',
          content: '是否修改该数据?',
          okText: '修改',
          onCancel: () => {
            this.loading = false
          },
          onOk: () => {
            updateAssetAcceptance(this.assetAcceptance).then((res) => {
              if (res.code === 100200) {
                this.$Message.success('修改成功!')
                this.$emit('on-success', res.data, 'update')
              } else {
                this.$Message.error('修改失败!')
              }
              this.loading = false
            })
          }
        })
      },
      reset () {
        this.assetAcceptance = {}
        this.$refs.assetAcceptanceForm.resetFields()
      },
      cancelHandler () {
        this.$emit('on-close')
      }
    }
  }
</script>

  

<template>
  <div class="assets-table">
    <Table :columns="tableColumns"
           :data="subscriptionData"
           class="assets-tables"
           :size="tableSize"
           :height="tableHeight"
           :no-data-text="$gdata.tableNoDataText" border
           :header-cell-style="{background:'#F8F8F8',color:'black',padding:'3px'}" :cell-style="{padding:'0px'}">
      <template slot-scope="{ row,index }" slot="name">
        <Input type="text" v-model="row.assetsName" @input="(value) => dataChane(value,index,'assetsName')"/>
      </template>
      <template slot-scope="{ row ,index}" slot="category">
        <Select v-model="row.categoryId" @on-change="(value) => loadProducts(value,index)">
          <OptionGroup label="固定资产">
            <Option v-for="item in categoryList1.slice()" :key="item.id" :label="item.name" :value="item.id"/>
          </OptionGroup>
          <OptionGroup label="无形资产">
            <Option v-for="item in categoryList2.slice()" :key="item.id" :label="item.name" :value="item.id"/>
          </OptionGroup>
        </Select>
      </template>
      <template slot-scope="{ row, index }" slot="product">
        <Select v-model="row.productId" @on-change="value => dataChane(value,index,'productId')"
                :disabled="!row.categoryId">
          <Option v-for="item in row.specList" :key="item.id" :label="item.name" :value="item.id"/>
        </Select>
      </template>
      <template slot-scope="{ row, index }" slot="num">
        <Input-number @on-change="value => dataChane(value,index,'num')" v-model="row.num" :min="0"
                      controls-position="right"/>
      </template>
      <template slot-scope="{ row, index }" slot="price">
        <Input-number @on-change="value => dataChane(value,index,'price')" v-model="row.price" :min="0" :precision="2"
                      controls-position="right"/>
      </template>
      <template slot-scope="{ row,index }" slot="action">
        <Tooltip content="添加申购项">
          <Button @click="add" type="text" icon="md-add"/>
        </Tooltip>
        <Tooltip content="关联参数">
          <Button @click="bindMeta(row, index)" type="text" icon="ios-link"/>
        </Tooltip>
        <Tooltip content="删除申购项">
          <Button @click="remove(index)" type="text" icon="ios-trash" style="color: red"/>
        </Tooltip>
      </template>
    </Table>
    <!--    <Modal v-model="checkVisible" :styles="drawer_styles" :title="appTitle" @on-ok="saveCheck">-->
    <!--      <MetaData ref="metaData" :state="2" @value-changed="handleValueChange"/>-->
    <!--    </Modal>-->
  </div>
</template>

<script>
  import { getAssetCategoryList } from '@api/ams/assetCategory'
  import { getAssetProductList } from '@api/ams/assetProduct';
  import expandRow from './expand'
  import MetaData from './metaData'
  import edgers from '_p/ams/assetReturn/edgers.vue';

  export default {
    name: 'AssetsTable',
    components: {
      edgers,
      expandRow,
      MetaData
    },
    props: {
      subscriptionData: {
        type: Array,
        default: []
      },
    },
    data () {
      return {
        receivedValue: '',
        drawer_styles: {
          height: 'calc(100% - 200px)',
          overflowY: 'auto',
          overflowX: 'auto',
          paddingBottom: '0px',
          position: 'static'
        },
        checkVisible: false,
        appTitle: '',
        tableHeight: 0,
        tableSize: 'default',
        loading: true,
        columns: [
          {
            type: 'expand',
            width: 50,
            show: true,
            render: (h, params) => {
              return this.$createElement(expandRow, {
                props: {
                  row: params.row
                },
                on: {
                  // 子组件$emit传递方法以及参数
                }
              })
            }
          },
          {
            type: 'index',
            show: true,
            width: 60,
            align: 'right'
          },
          {
            title: '资产名称',
            key: 'assetsName',
            slot: 'name',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 150,
            className: 'sort-col sort-assetsName-col'
          },
          {
            title: '资产类型',
            key: 'categoryId',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            slot: 'category',
            className: 'sort-col sort-categoryId-col'
          },
          {
            title: '产品类型',
            key: 'productId',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            slot: 'product',
            className: 'sort-col sort-productId-col'
          },
          {
            title: '购买数量',
            key: 'num',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 100,
            slot: 'num',
            className: 'sort-col sort-assetNum-col'
          },
          {
            title: '询价(元)',
            key: 'price',
            show: true,
            tooltip: true,
            maxWidth: 350,
            minWidth: 120,
            slot: 'price',
            className: 'sort-col sort-price-col'
          },
          {
            title: '操作',
            key: 'action',
            show: true,
            align: 'center',
            slot: 'action',
            width: 150
          }
        ],
        categoryList1: [],
        categoryList2: [],
        detailsList: [],
        specList: [],
      }
    },
    watch: {},
    computed: {
      width () {
        return document.body.clientWidth
      },
      tableColumns () {
        const columns = [...this.columns]
        return columns.filter(item => item.show)
      },
    },
    mounted () {

      this.$nextTick(() => {
        this.autoHeight()
      })

      this.getClassifyGbIsIntangibles();
    },
    created () {
    },
    methods: {
      buildMetas (entityMetas) {

      },
      handleValueChange (newValue) {
        this.receivedValue = newValue;
        console.log('iiiiii======iiiiiiii', this.receivedValue)
        self.$emit('child-event', { data: this.receivedValue });
      },
      saveCheck () {

      },
      loadProductSelect () {
        console.log('iiiiiiiiiiiiii', this.subscriptionData)
        const self = this
        this.subscriptionData.forEach((item, index) => {
          const productId = item.productId;
          const categoryId = item.categoryId;
          self.loadProducts(categoryId, index);
          console.log(productId, index, self.subscriptionData[index], '*************');
          self.$set(self.subscriptionData[index], 'productId', productId)
        })
      },
      dataChane (value, index, name) {
        console.log(value, index, name)
        if (!value) return
        const subscriptionDataElement = this.subscriptionData[index];
        this.$set(this.subscriptionData[index], name, value)
        if (name === 'productId') {// 自动给名称赋值 name+model+productId
          subscriptionDataElement.specList.forEach(item => {
            if (value === item.id) {
              const assetsName = this.subscriptionData[index].assetsName || '';
              this.$set(this.subscriptionData[index], 'assetsName', assetsName.split('_')[0] + '_' + item.model + '-' + item.spec)
            }
          })
        }
      },
      async getClassifyGbIsIntangibles () {
        // 使用async/await等待两个方法完成
        this.categoryList1 = await this.getClassify(0);
        this.categoryList2 = await this.getClassify(1);
      },
      createProducts (value, index) {
        getAssetProductList({
          p: 1,
          s: 100,
          categoryId: value
        }).then((res) => {
          if (res.code === 100200) {
            this.$set(this.subscriptionData[index], 'specList', res.data.records)
          }
        });
      },
      loadProducts (value, index) {
        this.$set(this.subscriptionData[index], 'categoryId', value)
        this.$set(this.subscriptionData[index], 'productId', '')
        getAssetProductList({
          p: 1,
          s: 100,
          categoryId: value
        }).then((res) => {
          if (res.code === 100200) {
            console.log(this.subscriptionData[index], '*******11****');
            this.$set(this.subscriptionData[index], 'specList', res.data.records)
          }
        });
      },
      async getClassify (sign) {
        const param = {
          p: 1,
          s: 1000,
          isIntangibles: sign
        }
        return await getAssetCategoryList(param).then((res) => {
          if (res.code === 100200) {
            return res.data.records;
          }
        });
      },
      add () {
        this.subscriptionData.push({
          num: 1,
          price: 0,
          name: '',
          model: '',
          productId: '',
          metas: [],
          specList: []
        });
      },
      bindMeta (data, index) {
        console.log(data, this.subscriptionData, '*******22222****');
        if (!data || !data.productId) {
          this.$Message.error('请先选择产品类型信息!');
          return;
        }
        const self = this;
        this.$set(data, 'index', index);
        self.$emit('edit-event', {
          data: data
        });
        // this.$refs.metaData.loadMetaDataByProId(data.productId)
        // console.log(self.$emit.$parent('editMetaData', data.id))
      },
      remove (index) {
        if (this.subscriptionData.length < 2) {
          this.$Message.error('至少保留一条数据');
          return false;
        }
        this.subscriptionData.splice(index, 1);
      },
      handleChangeTableSize (size) {
        this.tableSize = size
      },
      autoHeight () {
        const headerHeight = this.$refs.cListHeader.offsetHeight
        const footerHeight = this.$refs.cListFooter.offsetHeight
        this.tableHeight = document.body.clientHeight - headerHeight - footerHeight - 80
      },
    }
  }
</script>

<style>
.assets-table .cell {
  padding-left: 0 !important;
  padding-right: 0 !important;
}

.assets-tables {
  overflow: unset !important;
}

.assets-table .Input__inner {
  border-radius: 0 !important;
  border: none !important;
}

.assets-table .Input-number {
  width: 100% !important;
}
</style>

  

<template>
  <div>
    <Form ref="assetMetaForm" :model="newobj" :rules="rules">
      <Row v-for="(definition,di) in assetProductDefinition" :key="di">
        <Col v-if="definition.uiType==='input'" span="24">
          <Form-item :label="definition.label" :prop="definition.name"
                     v-if="definition.dataType=== 'double'">
            <InputNumber v-model="newobj[definition.name]"
                         :placeholder="definition.placeholder"></InputNumber>
          </Form-item>
          <Form-item :label="definition.label" :prop="definition.name"
                     v-else-if="definition.dataType=== 'integer'">
            <InputNumber v-model="newobj[definition.name]"
                         :placeholder="definition.placeholder"></InputNumber>
          </Form-item>
          <Form-item :label="definition.label" :prop="definition.name" v-else-if="definition.dataType=== 'textarea'">
            <Input v-model="newobj[definition.name]" type="textarea" :rows="5"
                   :placeholder="definition.placeholder"></Input>
          </Form-item>
          <Form-item :label="definition.label" :prop="definition.name" v-else>
            <Input v-model="newobj[definition.name]" :placeholder="definition.placeholder"></Input>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='select'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <select2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]"
                     :url="definition.dctCode"></select2>
            <select2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></select2>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='multiple'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">

            <select2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]"
                     :url="definition.dctCode" multiple></select2>
            <select2 v-else v-model="newobj[definition.name]" :options="definition.dctCode" multiple></select2>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='datepicker'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <DatePicker v-model="newobj[definition.name]" type="date"
                        :placeholder="definition.placeholder" transfer></DatePicker>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='datetimepicker'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <DatePicker v-model="newobj[definition.name]" type="datetime"
                        :placeholder="definition.placeholder" transfer></DatePicker>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='summernote'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <tinyEditor class="editor" :value="newobj[definition.name]" :showBtn="true"
                        @input="(res)=> newobj[definition.name] = res"></tinyEditor>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='radio'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <radio2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]"
                    :url="definition.dctCode"></radio2>
            <radio2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></radio2>
          </Form-item>
        </Col>
        <Col v-if="definition.uiType==='checkbox'" span="24">
          <Form-item :label="definition.label" :prop="definition.name">
            <checkbox2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]"
                       :url="definition.dctCode"></checkbox2>
            <checkbox2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></checkbox2>
          </Form-item>
        </Col>
      </Row>
      <div class="demo-drawer-footer" style="margin-left: 70%">
        <Button style="margin-right: 8px" @click="toCannel">取消</Button>
        <Button type="primary" :loading="loading" @click="toSubmit">完成填写</Button>
      </div>
    </Form>
  </div>
</template>

<script>
  import { clone } from '@/libs/tools';
  import select2 from '_c/select2/select2';
  import select3 from '_c/select2/select3';
  import checkbox2 from '_c/checkbox2/checkbox2';
  import radio2 from '_c/radio2/radio2';
  import tinyEditor from '_c/tinymce';
  import toolsView from '_c/toolsView';
  import { mapState } from 'vuex'
  import config from '../config.json'
  import poptip2 from '_c/poptip2/poptip2';
  import { getAssetProductDefinitionList, } from '@api/ams/assetProductDefinition'

  export default {
    name: 'meta-datum-editor',
    components: {
      select2,
      checkbox2,
      radio2,
      tinyEditor,
      toolsView,
      select3,
      poptip2
    },
    data () {
      return {
        productId: null,
        detailId: null,
        rowNum: null,
        loading: false,
        config,
        assetProductDefinition: [],
        newobj: {},
        rules: {},
      }
    },
    created () {
    },
    mounted () {
    },
    beforeDestroy () {
    },
    destroyed () {
    },
    computed: {
      ...mapState('admin/layout', [
        'isMobile'
      ]),
      labelWidth () {
        return this.isMobile ? undefined : 80;
      },
      labelPosition () {
        return this.isMobile ? 'top' : 'right';
      }
    },
    watch: {},
    methods: {
      toCannel () {
        this.$emit('on-close');
      },
      toSubmit () {
        console.log('66666666', this.newobj)
        this.$refs.assetMetaForm.validate((valid) => {
          // this.loading = true
          if (valid) {
            this.$Modal.confirm({
              title: '操作提示',
              content: '是否填写完成?',
              okText: '修改',
              onCancel: () => {
              },
              onOk: () => {
                this.save();
                this.$Message.success('完成填写!')
                this.$emit('on-close');
              }
            })
          } else {
            this.$Message.error('信息校验失败,请根据页面提示纠正您所填写的信息!')
            this.loading = false
          }
        })
      },
      save () {
        const requestData = clone(this.newobj);
        const entityMetas = [];
        const des = this.assetProductDefinition;
        for (let i = 0; i < des.length; i++) {
          if (this.newobj[des[i].name] instanceof Array) {
            requestData[des[i].name] = this.newobj[des[i].name].join(',');
          }
          const meta = {};
          console.log(des[i], '============des[i]============')
          // meta.id = des[i].id;
          meta.metaKey = des[i].name;
          meta.metaValue = requestData[des[i].name];
          meta.metaPriority = des[i].priority;
          entityMetas.push(meta);
        }

        requestData.entityMetas = entityMetas;
        requestData.productId = this.productId;
        requestData.detailId = this.detailId;
        requestData.rowNum = this.rowNum;
        console.log(entityMetas, requestData, '===========================')
        const self = this;
        console.log(self.$emit('getDefinition'), '==============11===========')
        // self.$emit('meta-event', { data: requestData.entityMetas })
        self.$emit('value-changed', requestData);
      },
      loadMetaDataByProId (data) {
        this.assetProductDefinition = [];
        this.newobj = {};
        this.rules = {};
        this.productId = data.productId;
        this.detailId = data.id;
        this.getDefinition(data)
      },
      getDefinition (data) {
        console.log(data, 9999999999)
        const productId = data.productId;
        const metas = data.metas;

        // const detailId = data.id;

        let params = {
          p: 0,
          s: 1000,
          productId: productId,
        }
        getAssetProductDefinitionList(params).then((res) => {
          let assetProductDefinition = res.data.records
          // this.assetProductDefinition = assetProductDefinition
          console.log(metas, assetProductDefinition, 888888888888888)
          for (let i = 0; i < assetProductDefinition.length; i++) {
            const d = assetProductDefinition[i];
            if (metas) {
              for (let j = 0; j < metas.length; j++) {

                const meta = metas[j];
                if (d.name === meta.metaKey) {
                  if (d.uiType === 'multiple' || d.uiType === 'checkbox') {
                    if (meta.metaValue !== null && meta.metaValue !== '') {
                      this.newobj[meta.metaKey] = meta.metaValue.split(',');
                    } else {
                      this.newobj[meta.metaKey] = meta.metaValue;
                    }
                  } else {
                    if (d.dataType === 'integer' || d.dataType === 'double') {
                      this.newobj[meta.metaKey] = meta.metaValue - 0;
                    } else {
                      this.newobj[meta.metaKey] = meta.metaValue;
                    }
                  }

                }
              }
            }

            console.log(this.newobj, 7777777777777)
            if (d.required === 1) {
              let dd = [];
              if (d.uiType === 'datepicker' || d.uiType === 'datetimepicker') {
                dd = [{
                  required: true,
                  type: 'date',
                  message: '请选择时间',
                  trigger: 'change'
                }];
              } else if (d.uiType === 'integer' || d.uiType === 'double') {
                dd = [{
                  required: true,
                  message: d.label + '不能为空',
                  trigger: 'change',
                  type: 'number'
                }];
              } else {
                dd = [{
                  required: true,
                  message: d.label + '不能为空',
                  trigger: 'blur'
                }];
              }
              this.rules[d.name] = dd;
            }
            this.rowNum = data.index;
            this.assetProductDefinition.push(d);
          }
        })
      },
    }
  }
</script>
<style>

</style>

  

 

标签:VUE,return,name,true,id,import,表单,data,JAVA
From: https://www.cnblogs.com/charkey/p/18406769

相关文章

  • vue 可选链操作符(?.)报错
    一直用的好好的这个运算符,换了个项目,用不了了首先交代一下,vue版本是2.6.11,node版本是v14.17.4,vue-template-compiler也是2.6.11首先哈,我们升级一下vue到2.7.xx版本[email protected]@2.7.0然后安装这个插件npminstall'@babel/plugin-proposal-opti......
  • JavaScript高级——对象
    1、对象的含义:①多个数据的封装体②用来保存多个数据的容器③一个对象代表现实中的一个事物2、为什么要用对象?——统一管理多个数据3、对象的组成①属性:属性名(字符串)和属性值(任意值)组成。代表现实事物的状态数据。②方法:一种特别的属性(属性值是函数)。代表的现......
  • java上传文件接口开发uploadFile
    controller层:@PostMapping("/uploadFile")publicServiceResultuploadFile(MultipartFilefile,@RequestParamStringcompareType){returnprimaryService.uploadFile(file,compareType);}service层:/***样本文件上传*@p......
  • Java Junit单元测试
    文章目录前言一、Junit单元测试---普通Java文件1.Idea依赖导入方式2.Junit的使用二、Junit单元测试---Maven1.普通测试2.单参数测试3.多参数测试三、Junit单元测试---SpringBoot项目1.使用步骤2.@SpringBootTest详解前言所谓单元测试,就是针对最小的功能单......
  • [Vue] 高阶组件和套一层父组件的区别
    前言App.vue的套一层布局组件MainLayout,MainLayout做一些统一的布局之外,再做一些子路由相同的逻辑,比如子路由需要权限访问。但是不灵活,如果一堆路由组件中有一个不需要这个功能,就不能通过父组件嵌套统一逻辑。高阶组件比起套一层父组件复用逻辑更灵活一些。高阶组件高阶组......
  • 【JAVA】第四天
    JAVA第四天一、Object类二、Objects类三、包装类四、字符串修改一、Object类表格:方法名作用publicStringtoString()返回对象的字符串表示形式publicbooleanequals(Objecto)判断两个对象是否相等protectedObjectclone​()对象克隆注意toString()和equals(......
  • 0.1+0.2 != 0.3 (Java为例)
    1.小数的二进制表示以10.625为例。整数部分进行除2取余的操作,10的二进制为1010。小数部分进行乘2取整操作,直到小数部分为0或达到需要的精度:0.625*2=1.25取整数1,小数部分0.25继续计算0.25*2=0.5取整数0,小数部分0.5继续计算0.5*2=1.0取整数1,小数部分为0,停止计算因此0.625......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【回溯】2024E-字符串
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复杂度华为OD算法/大厂面......
  • JAVA多线程-如何保证线程安全
    线程安全:指在多线程对一个共享资源同时进行操作时,所得到的结果都是一样的如何保证线程安全方法:要保证线程安全,就必须保证线程同步,保证线程的可见性,有序性,和原子性线程同步线程同步的含义和字面意思相反,同步其实是线程"排队"的意思,就是让线程按照一定的顺序执......
  • Java面试题大总结(全网最全)
    1、普通类和抽象类有哪些区别?抽象类不能被实例化;抽象类可以有抽象方法,只需申明,无须实现;有抽象方法的类一定是抽象类;抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;抽象方法不能声明为静态、不能被static、final修饰。2、接口和抽象类有什么区别?(1)接口......