JAVA+VUE实现动态表单配置

news/2024/9/18 19:21:19/文章来源:https://www.cnblogs.com/charkey/p/18406769

功能描述:

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

数据库设计部分:

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> {@Autowiredprivate AssetProductDefinitionService assetProductDefinitionService;@Autowiredprivate AssetProductMetaService assetProductMetaService;@Autowiredprivate 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 mapperPUBLIC "-//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> {@Autowiredprivate 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 - 0this.load()}} else {this.pc.pageIndex = 1this.load()}},deep: true}},computed: {width () {return document.body.clientWidth},tableColumns () {const columns = [...this.columns]return columns.filter(item => item.show)}},mounted () {const self = thisself.$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 = thisself.udds = []getUddList(params).then((res) => {console.log(111111,res.data)self.udds = res.data.records});},loadMTIdDatas () {// todo 此处调用元数据接口 /metatypesthis.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 = thisself.ids = []if (selection != null && selection.length > 0) {selection.forEach(function (item) {self.ids.push(item.id)})}},buildParams () {const self = thislet 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.keylet order = sc.orderif (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 = thisgetAssetProductDefinitionList(self.buildParams()).then((res) => {self.loading = falseself.data = res.data.recordsif (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 = trueself.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)breakcase 'del':this.del(tdata.data)break}},edit (data) {let id = 0if (data != null) {id = data.id}this.editorTitle = (id === 0 ? '新建' : '编辑') + '类型'this.editorVisible = truethis.$refs.assetProductDefinitionEditor.load(id, this.parent)},editSuccessHandler (data, type) {this.editorVisible = falsethis.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是底部分页信息栏, 所有被减高度之和为206this.height = document.body.clientHeight - 84this.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 = thisself.udds = []getUddList(params).then((res) => {console.log(111111,res.data)self.udds = res.data.records});},loadMTIdDatas () {// todo 此处调用元数据接口 /metatypesthis.dataTypeDatas = [{id: '950763959593365504',name: '区域代码'},{id: '348648182',name: '文本类型'},{id: '444444444444',name: '数据字典'}];},load (id, productId) {this.loading = falsethis.$refs.assetProductDefinitionForm.resetFields()this.isNew = (id === 0)if (this.isNew) {this.assetProductDefinition = {}} else {let params = { id }getAssetProductDefinition(params).then((res) => {let assetProductDefinition = res.datathis.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 = trueif (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" clearableplaceholder="根据关键字搜索" 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 = thisreturn {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 = thisif (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 - 0this.load()}} else {this.pc.pageIndex = 1this.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 = stateconsole.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 = datathis.checkState = 1this.checkType = levelthis.checkRemark = ''this.appTitle = level === 1 ? '初级审批' : '复审';this.checkVisible = true},buildParams () {const self = thislet 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 = 1this.load()},load () {const self = thisself.loading = trueself.pageRefresh = falseself.pageDisabled = trueself.ids = []self.data = []getAssetAcceptanceList(self.buildParams()).then((res) => {self.loading = falseself.data = res.data.recordsif (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 = trueself.pageDisabled = false}, 500)})},exportExcel () {let params = this.buildParams()params.p = 1params.s = 10000getAssetAcceptanceList(params).then((res) => {let records = res.data.recordsif (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.keylet order = sc.orderif (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 = truethis.$refs.assetAcceptanceInfo.load(data.id)},edit (data) {let id = 0if (data != null) {id = data.id}this.editorTitle = (id === 0 ? '新建' : '修改') + '资产验收'this.$refs.assetAcceptanceEditor.load(id)this.editorVisible = true},editSuccessHandler (data, type) {this.editorVisible = falsethis.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 = thisself.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.offsetHeightthis.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="请输入验收编号" clearablestyle="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="验收部门" clearablestyle="width: 100%"/></Form-item></Col><Col :span="8"><Form-item label="购入单位" prop="purchaseCompany"><Input v-model="assetAcceptance.purchaseCompany" placeholder="请输入购入单位" clearablestyle="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="请输入收据号" clearablestyle="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){debuggervar 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 = falsethis.$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 = thisself.loading = trueconst param = {p: 1,s: 1000,accId: this.accId}self.tableData = [];getAssetAcceptanceDetailList(param).then((res) => {self.loading = falseif (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 = falsethis.$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.datathis.assetAcceptance = assetAcceptanceif (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 = trueif (valid) {if (this.assetAcceptance.purchaseDate_dt != null) {this.assetAcceptance.purchaseDate = this.assetAcceptance.purchaseDate_dt.getTime()}this.assetAcceptance.assetAcceptanceDetails = tableDataif (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 = thisthis.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) returnconst subscriptionDataElement = this.subscriptionData[index];this.$set(this.subscriptionData[index], name, value)if (name === 'productId') {// 自动给名称赋值 name+model+productIdsubscriptionDataElement.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.offsetHeightconst footerHeight = this.$refs.cListFooter.offsetHeightthis.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 = trueif (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 = assetProductDefinitionconsole.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>

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795030.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 可选链操作符(?.)报错

一直用的好好的这个运算符,换了个项目,用不了了 首先交代一下,vue版本是2.6.11,node版本是v14.17.4 ,vue-template-compiler也是2.6.11 首先哈,我们升级一下vue到2.7.xx版本npm i vue@2.7.0 vue-template-compiler@2.7.0然后安装这个插件npm install @babel/plugin-propo…

互信息

参考 互信息是信息论中用以评价两个随机变量之间的依赖程度的一个度量。 相关概念:信息量:是对某个事件发生或者变量出现的概率的度量,一个事件发生的概率越低,这个事件包含的信息量越大,这跟我们直观上的认知也是吻合的,越稀奇新闻包含的信息量越大,因为这种新闻出现的…

UEFI原理与编程(一)

第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述:缩略词 全名 描述UEFI Unified Extensible Firmware Interface 统一的可扩展固件接口BS Boot Services 启动服务RT Runtime Service 运行时服务BIOS Basic Input Output System …

SparkSQL练习:对学生选课成绩进行分析计算

题目内容: 对学生选课成绩进行分析计算题目要求: (1)该系总共有多少学生; (2)该系共开设来多少门课程; (3)每个学生的总成绩多少; (4)每门课程选修的同学人数; (5)每位同学选修的课程门数; (6)该系DataBase课程共有多少人选修; (7)每位同学平均成绩;数据…

面试-JS基础知识-原型和原型链

JS本身是基于原型来继承的语言。 问题引出:如何判断一个变量是不是数组? 手写一个简易的jQuery,考虑插件和扩展性 class的原型本质,怎么理解?知识点class和继承 类型判断 instanceof 原型和原型链class class相当于一个模版,可以用来构建(constructor)东西。 class Stu…

作业9.2:论文查重

这个作业属于哪个课程 班级链接这个作业要求在哪里 作业要求链接这个作业的目标 设计论文查重算法;学会 Git 版本控制。Github 链接:博客正文首行 github 链接 目录一、整体设计开发环境整体设计项目结构二、模块接口的设计与实现核心的类与方法类与函数的调用关系核心算法三…

搭建企业内部的大语言模型系统

大纲开源大语言模型 大语言模型管理 私有大语言模型服务部署方案开源大语言模型 担心安全与隐私?可私有部署的开源大模型商业大模型,不支持私有部署ChatGPT Claude Google Gemini 百度问心一言开源大模型,支持私有部署Mistral Meta Llama ChatGLM 阿里通义千问常用开源大模型…

115. 不同的子序列(leetcode)

https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/ 这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述 class Solution {public int numDistinct(String s, String t) {// f[i][j]表示s中前i个字符中选择,有…

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,停止…

信创领域认证,来自工信部人才交流中心的PostgreSQL培训班

在国家大力发展信创软件和数据库行业的背景下,PostgreSQL 具有多方面的优势和机遇,具体体现在以下几个方面: 1. 技术优势契合信创需求: PostgreSQL 数据库是一个功能强大、性能稳定、可扩展性强的开源对象关系数据库系统,支持多种数据类型(如数组、JSON、XML 等),方便存储…

Salesforce职业规划:原厂,甲方,乙方,从业者应该如何选择?

Salesforce生态系统蓬勃发展,对不同角色的需求量不断增加。需求方包括使用Salesforce的最终用户(甲方)、实施Salesforce的咨询公司、为Salesforce创建应用程序的AppExchange公司(或ISV),当然还有Salesforce原厂。 Salesforce最终用户(甲方) 2020年,Salesforce的客户数…

3SRB5016-ASEMI三相整流桥3SRB5016

3SRB5016-ASEMI三相整流桥3SRB5016编辑:ll 3SRB5016-ASEMI三相整流桥3SRB5016 型号:3SRB5016 品牌:ASEMI 封装:3SRB-5 批号:2024+ 现货:50000+ 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):50A 功率(Pd):大功率 芯片个数:5 引脚数量:5 安装方式:直插 类…