JAVA+VUE实现动态表单配置
功能描述:
资产管理系统中,在资产分类中,给同一种类型的资产配置定制化的表单项,并实现不同类型显示不同的数据,如图所示:
数据库设计部分:
1.表单项表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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.数据表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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部分:
表单元素表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | package com.cloudoer.dct.ams.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cloudoer.dct.ams.mapstruts.AssetProductDefinitionMapStruct; import com.cloudoer.dct.ams.service.i.AssetProductDefinitionService; import com.cloudoer.dct.ams.service.i.AssetProductMetaService; import com.cloudoer.dct.core.controller.BaseController; import com.cloudoer.dct.core.model.Page; import com.cloudoer.dct.core.model.dto.ams.AssetProductDefinitionDTO; import com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition; import com.cloudoer.dct.core.model.query.ams.AssetProductDefinitionQuery; import com.cloudoer.dct.core.model.vo.ams.AssetProductDefinitionVO; import com.cloudoer.dct.core.support.BeanUtil; import com.cloudoer.dct.core.support.Condition; import com.cloudoer.dct.core.support.QueryContext; import com.cloudoer.framework.core.domain.RO; import com.google.common.collect.Lists; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author cobot * @version 1.0.0 * @since 2024-09-02 */ @RestController @RequestMapping ( "/asset/definitions" ) @Slf4j @Tag (name = "资产产品元素分类" , description = "资产产品元素分类管理" ) public class AssetProductDefinitionController extends BaseController<AssetProductDefinition> { @Autowired private AssetProductDefinitionService assetProductDefinitionService; @Autowired private AssetProductMetaService assetProductMetaService; @Autowired private AssetProductDefinitionMapStruct assetProductDefinitionMapStruct; @Operation (summary = "资产产品元素分类查询" , description = "根据筛选条件分页查询,以及按照指定字段进行排序" ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinitionVO. class ))}) }) @GetMapping (name = "查询" ) public Object list(AssetProductDefinitionQuery assetProductDefinitionQuery, QueryContext queryContext) { QueryWrapper<AssetProductDefinition> queryWrapper = Condition.getQueryWrapper(assetProductDefinitionQuery, queryContext, AssetProductDefinition. class ); Page<AssetProductDefinitionVO> page = assetProductDefinitionService.find(Condition.getPage(queryContext), queryWrapper); return RO.ok(page); } @Operation (summary = "资产产品元素分类详情" , description = "根据ID获取资产产品元素分类详细信息" ) @Parameter (name = "id" , description = "资产产品元素分类ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinitionVO. class ))}) }) @GetMapping (value = "/{id}" , name = "详情" ) public Object view( @PathVariable ( "id" ) Long id) { log.info( "get AssetProductDefinition Id:{}" , id); AssetProductDefinitionVO assetProductDefinitionVO = assetProductDefinitionService.find(id); return RO.ok(assetProductDefinitionVO); } @Operation (summary = "创建资产产品元素分类" , description = "创建资产产品元素分类信息" ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinition. class ))}) }) @PostMapping (name = "创建" ) public Object create( @RequestBody AssetProductDefinitionDTO assetProductDefinitionDTO, ServerHttpRequest request) { log.info( "add AssetProductDefinition DTO:{}" , assetProductDefinitionDTO); AssetProductDefinition assetProductDefinition = new AssetProductDefinition(); BeanUtil.copyProperties(assetProductDefinitionDTO, assetProductDefinition); this .packAddBaseProps(assetProductDefinition, request); boolean flag = assetProductDefinitionService.save(assetProductDefinition); return RO.status(flag, assetProductDefinition); } @Operation (summary = "复制资产产品元素分类" , description = "根据ID复制资产产品元素分类" ) @Parameter (name = "id" , description = "资产产品元素分类ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinition. class ))}) }) @PostMapping (value = "/{id}" , name = "复制" ) public Object copy( @PathVariable ( "id" ) Long id, ServerHttpRequest request) { AssetProductDefinition assetProductDefinition = assetProductDefinitionService.getById(id); if (assetProductDefinition == null ) { return RO.fail( "不存在的id" ); } assetProductDefinition.setId( null ); //assetProductDefinition.setName(assetProductDefinition.getName() + "_副本"); this .packAddBaseProps(assetProductDefinition, request); boolean flag = assetProductDefinitionService.save(assetProductDefinition); return RO.status(flag, assetProductDefinition); } @Operation (summary = "修改资产产品元素分类" , description = "根据ID, 修改资产产品元素分类信息" ) @Parameter (name = "id" , description = "资产产品元素分类ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinition. class ))}) }) @PutMapping (value = "/{id}" , name = "修改" ) public Object update( @PathVariable ( "id" ) Long id, @RequestBody AssetProductDefinitionDTO assetProductDefinitionDTO, ServerHttpRequest request) { log.info( "put modify id:{}, AssetProductDefinition DTO:{}" , id, assetProductDefinitionDTO); AssetProductDefinition assetProductDefinition = assetProductDefinitionService.getById(id); if ( null == assetProductDefinition) { return RO.fail( "不存在的id" ); } BeanUtil.copyProperties(assetProductDefinitionDTO, assetProductDefinition); this .packModifyBaseProps(assetProductDefinition, request); boolean flag = assetProductDefinitionService.updateById(assetProductDefinition); return RO.status(flag, assetProductDefinition); } @Operation (summary = "修改资产产品元素分类" , description = "根据ID, 修改资产产品元素分类信息" ) @Parameter (name = "id" , description = "资产产品元素分类ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductDefinition. class ))}) }) @PutMapping (value = "/saveOrUpdate/{id}" , name = "修改" ) public Object saveOrUpdate( @PathVariable ( "id" ) Long id, @RequestBody List<AssetProductDefinitionDTO> assetProductDefinitionDTO, ServerHttpRequest request) { log.info( "put modify id:{}, AssetProductDefinition DTO:{}" , id, assetProductDefinitionDTO); List<AssetProductDefinitionDTO> unlockDTOS = assetProductDefinitionDTO.parallelStream().filter(t -> t.getIsLock() == null || t.getIsLock() == 0 ).collect(Collectors.toList()); // 通过源数据和dto对比,找到多的数,并删除 QueryWrapper<AssetProductDefinition> queryWrapper = new QueryWrapper<>(); queryWrapper.eq( "product_id" , id); queryWrapper.eq( "is_lock" , 0 ); List<AssetProductDefinitionVO> assetProductDefinitionVOS = assetProductDefinitionService.find(queryWrapper); if (CollectionUtils.isNotEmpty(assetProductDefinitionVOS)) { List<AssetProductDefinitionVO> delList = assetProductDefinitionVOS.stream().filter(item -> unlockDTOS.stream().noneMatch(item2 -> item2.getId().equals(item.getId()) )).collect(Collectors.toList()); boolean removeByIds = assetProductDefinitionService.removeByIds(delList); log.info( "put modify id:{}, saveOrUpdate DTO:{}" , id, removeByIds); } List<AssetProductDefinition> dataList = Lists.newArrayList(); unlockDTOS.forEach(dto -> { AssetProductDefinition assetProductDefinition = assetProductDefinitionMapStruct.convertDTO(dto); assetProductDefinition.setIsLock( 0 ); assetProductDefinition.setProductId(id); BeanUtil.packAddBaseProps(assetProductDefinition, request); dataList.add(assetProductDefinition); }); boolean batch = assetProductDefinitionService.saveOrUpdateBatch(dataList); return RO.status(batch, dataList); } @Operation (summary = "删除资产产品元素分类" , description = "根据ID, 删除资产产品元素分类信息" ) @Parameter (name = "id" , description = "资产产品元素分类ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" ) }) @DeleteMapping (value = "/{id}" , name = "删除" ) public Object remove( @PathVariable ( "id" ) Long id, ServerHttpRequest request) { log.info( "delete AssetProductDefinition, id:{}" , id); AssetProductDefinition assetProductDefinition = new AssetProductDefinition(); assetProductDefinition.setId(id); this .packModifyBaseProps(assetProductDefinition, request); boolean flag = assetProductDefinitionService.delete(assetProductDefinition); return RO.status(flag); } @Operation (summary = "批量删除资产产品元素分类" , description = "根据ID集合, 批量删除资产产品元素分类信息" ) @Parameter (name = "ids" , description = "资产产品元素分类ID集合" , in = ParameterIn.DEFAULT, schema = @Schema (type = "List" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" ) }) @DeleteMapping (name = "批量删除" ) public Object remove( @RequestBody Map<String, Object> params, ServerHttpRequest request) { boolean flag = false ; if (params.get( "ids" ) != null ) { List<String> ids = (List<String>) params.get( "ids" ); if (CollectionUtils.isNotEmpty(ids)) { flag = assetProductDefinitionService.delete(ids, getUserId(request)); } } return RO.status(flag); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 | 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()); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "com.cloudoer.dct.ams.dao.AssetProductDefinitionMapper" > <resultMap type= "com.cloudoer.dct.core.model.entity.ams.AssetProductDefinition" id= "AssetProductDefinitionMap" > <id property= "id" column= "id" jdbcType= "BIGINT" /> <result property= "productId" column= "product_id" jdbcType= "BIGINT" /> <result property= "name" column= "name" jdbcType= "VARCHAR" /> <result property= "label" column= "label" jdbcType= "VARCHAR" /> <result property= "dataType" column= "data_type" jdbcType= "INTEGER" /> <result property= "uiType" column= "ui_type" jdbcType= "INTEGER" /> <result property= "defaultValues" column= "default_values" jdbcType= "VARCHAR" /> <result property= "remark" column= "remark" jdbcType= "VARCHAR" /> <result property= "required" column= "required" jdbcType= "INTEGER" /> <result property= "isLock" column= "is_lock" jdbcType= "INTEGER" /> <result property= "placeholder" column= "placeholder" jdbcType= "VARCHAR" /> <result property= "dctCode" column= "dct_code" jdbcType= "VARCHAR" /> <result property= "createdBy" column= "created_by" jdbcType= "BIGINT" /> <result property= "createdDate" column= "created_date" jdbcType= "BIGINT" /> <result property= "modifiedBy" column= "modified_by" jdbcType= "BIGINT" /> <result property= "modifiedDate" column= "modified_date" jdbcType= "BIGINT" /> <result property= "priority" column= "priority" jdbcType= "INTEGER" /> <result property= "status" column= "status" jdbcType= "INTEGER" /> </resultMap> </mapper> |
数据表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | package com.cloudoer.dct.ams.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cloudoer.dct.ams.service.i.AssetProductMetaService; import com.cloudoer.dct.core.controller.BaseController; import com.cloudoer.dct.core.model.Page; import com.cloudoer.dct.core.model.dto.ams.AssetProductMetaDTO; import com.cloudoer.dct.core.model.entity.ams.AssetProductMeta; import com.cloudoer.dct.core.model.query.ams.AssetProductMetaQuery; import com.cloudoer.dct.core.model.vo.ams.AssetProductMetaVO; import com.cloudoer.dct.core.support.BeanUtil; import com.cloudoer.dct.core.support.Condition; import com.cloudoer.dct.core.support.QueryContext; import com.cloudoer.framework.core.domain.RO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * @author cobot * @version 1.0.0 * @since 2024-09-02 */ @RestController @RequestMapping ( "/asset/product/metas" ) @Slf4j @Tag (name = "资产产品元素扩展" ,description = "资产产品元素扩展管理" ) public class AssetProductMetaController extends BaseController<AssetProductMeta> { @Autowired private AssetProductMetaService assetProductMetaService; @Operation (summary = "资产产品元素扩展查询" , description = "根据筛选条件分页查询,以及按照指定字段进行排序" ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductMetaVO. class ))}) }) @GetMapping (name = "查询" ) public Object list(AssetProductMetaQuery assetProductMetaQuery, QueryContext queryContext) { QueryWrapper<AssetProductMeta> queryWrapper = Condition.getQueryWrapper(assetProductMetaQuery, queryContext, AssetProductMeta. class ); Page<AssetProductMetaVO> page = assetProductMetaService.find(Condition.getPage(queryContext), queryWrapper); return RO.ok(page); } @Operation (summary = "资产产品元素扩展详情" , description = "根据ID获取资产产品元素扩展详细信息" ) @Parameter (name = "id" , description = "资产产品元素扩展ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductMetaVO. class ))}) }) @GetMapping (value = "/{id}" , name = "详情" ) public Object view( @PathVariable ( "id" ) Long id) { log.info( "get AssetProductMeta Id:{}" , id); AssetProductMetaVO assetProductMetaVO = assetProductMetaService.find(id); return RO.ok(assetProductMetaVO); } @Operation (summary = "创建资产产品元素扩展" , description = "创建资产产品元素扩展信息" ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductMeta. class ))}) }) @PostMapping (name = "创建" ) public Object create( @RequestBody AssetProductMetaDTO assetProductMetaDTO, ServerHttpRequest request) { log.info( "add AssetProductMeta DTO:{}" , assetProductMetaDTO); AssetProductMeta assetProductMeta = new AssetProductMeta(); BeanUtil.copyProperties(assetProductMetaDTO, assetProductMeta); this .packAddBaseProps(assetProductMeta, request); boolean flag = assetProductMetaService.save(assetProductMeta); return RO.status(flag, assetProductMeta); } @Operation (summary = "复制资产产品元素扩展" , description = "根据ID复制资产产品元素扩展" ) @Parameter (name = "id" , description = "资产产品元素扩展ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductMeta. class ))}) }) @PostMapping (value = "/{id}" , name = "复制" ) public Object copy( @PathVariable ( "id" ) Long id, ServerHttpRequest request) { AssetProductMeta assetProductMeta = assetProductMetaService.getById(id); if (assetProductMeta == null ) { return RO.fail( "不存在的id" ); } assetProductMeta.setId( null ); //assetProductMeta.setName(assetProductMeta.getName() + "_副本"); this .packAddBaseProps(assetProductMeta, request); boolean flag = assetProductMetaService.save(assetProductMeta); return RO.status(flag, assetProductMeta); } @Operation (summary = "修改资产产品元素扩展" , description = "根据ID, 修改资产产品元素扩展信息" ) @Parameter (name = "id" , description = "资产产品元素扩展ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" , content = { @Content (schema = @Schema (implementation = AssetProductMeta. class ))}) }) @PutMapping (value = "/{id}" , name = "修改" ) public Object update( @PathVariable ( "id" ) Long id, @RequestBody AssetProductMetaDTO assetProductMetaDTO, ServerHttpRequest request) { log.info( "put modify id:{}, AssetProductMeta DTO:{}" , id, assetProductMetaDTO); AssetProductMeta assetProductMeta = assetProductMetaService.getById(id); if ( null == assetProductMeta){ return RO.fail( "不存在的id" ); } BeanUtil.copyProperties(assetProductMetaDTO, assetProductMeta); this .packModifyBaseProps(assetProductMeta, request); boolean flag = assetProductMetaService.updateById(assetProductMeta); return RO.status(flag, assetProductMeta); } @Operation (summary = "删除资产产品元素扩展" , description = "根据ID, 删除资产产品元素扩展信息" ) @Parameter (name = "id" , description = "资产产品元素扩展ID" , in = ParameterIn.PATH, schema = @Schema (type = "Long" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" ) }) @DeleteMapping (value = "/{id}" , name = "删除" ) public Object remove( @PathVariable ( "id" ) Long id, ServerHttpRequest request) { log.info( "delete AssetProductMeta, id:{}" , id); AssetProductMeta assetProductMeta = new AssetProductMeta(); assetProductMeta.setId(id); this .packModifyBaseProps(assetProductMeta, request); boolean flag = assetProductMetaService.delete(assetProductMeta); return RO.status(flag); } @Operation (summary = "批量删除资产产品元素扩展" , description = "根据ID集合, 批量删除资产产品元素扩展信息" ) @Parameter (name = "ids" , description = "资产产品元素扩展ID集合" , in = ParameterIn.DEFAULT, schema = @Schema (type = "List" ), required = true ) @ApiResponses ({ @ApiResponse (responseCode = "100200" , description = "成功" ) }) @DeleteMapping (name = "批量删除" ) public Object remove( @RequestBody Map<String, Object> params, ServerHttpRequest request) { boolean flag = false ; if (params.get( "ids" ) != null ){ List<String> ids = (List<String>) params.get( "ids" ); if (CollectionUtils.isNotEmpty(ids)) { flag = assetProductMetaService.delete(ids, getUserId(request)); } } return RO.status(flag); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 | 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部分:
配置表单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | <template> <!-- 数据字典--> <!-- margin: '0 -12px' --> <div :style= "{height: height + 'px',overflow:'hidden'}" > <Split v-model= "split" class = "icb-split-left-240" > <template #left> <div class = "icb-split-left" > <Card dis-hover :bordered= "false" class = "udd-tree-card" > <p slot= "title" > <Icon type= "ios-list" size= "24" color= "black" style= "margin-left: -3px" ></Icon> <span style= "vertical-align: text-bottom" >资产分类目录</span> </p> <Tree :data= "treeData" @on -select-change= "treeChange" :style= "{height: treeHeight + 'px',overflow:'auto',}" ></Tree> </Card> </div> </template> <template #right> <Card dis-hover :bordered= "false" :padding= "0" > <p slot= "title" > <Dropdown class = "icb-dropdown" trigger= "click" > <Icon type= "md-more" /> <DropdownMenu slot= "list" > <DropdownItem v- if = "$checkAuth('-assetScrap-create')" @click . native = "edit(null)" > <span class = "iconx iconx-add-circle-outlined" ></span> <span>新建</span> </DropdownItem> <DropdownItem v- if = "$checkAuth('-assetScrap-removeBatch')" @click . native = "removeBatch" > <span class = "iconx iconx-delete-outlined" ></span> <span>删除</span> </DropdownItem> </DropdownMenu> </Dropdown> </p> <Table :columns= "tableColumns" :data= "data" :loading= "loading" :size= "tableSize" :height= "tableHeight" @on -sort-change= "sort" :no-data-text= "$gdata.tableNoDataText" @on -selection-change= "tableSelectHandler" > <template slot-scope= "{ row }" slot= "name" > <a @click = "showInfo(row)" >{{ row.name }}</a> </template> <template slot-scope= "{ row }" slot= "action" > <div class = "icb-list-action" > <span class = "iconx iconx-edit-outlined" v- if = "$checkAuth('-assetProductDefinition-update')" @click = "edit(row)" ></span> <span class = "icb-action-divider" ></span> <Dropdown class = "icb-dropdown" trigger= "click" style= "margin-left: 0;" > <a href= "javascript:void(0)" class = "icb-list-more" > <span class = "iconx iconx-more-outlined" ></span> </a> <DropdownMenu slot= "list" > <DropdownItem @click . native = "attach(row)" > <span class = "iconx iconx-link-outlind" ></span> <span>附件</span> </DropdownItem> <DropdownItem @click . native = "remove(row)" v- if = "$checkAuth('-assetProductDefinition-remove')" > <span class = "iconx iconx-delete-outlined" ></span> <span class = "table-action" >删除</span> </DropdownItem> </DropdownMenu> </Dropdown> </div> </template> </Table> <div class = "ivu-text-right ivu-mt-8" > <Page :total= "pc.total" :current= "pc.pageIndex" :page-size= "pc.pageSize" :page-size-opts= "pageSizeOpts" :disabled= "pageDisabled" @on -change= "changePage" @on -page-size-change= "changePageSize" show-total show-sizer transfer style= "margin-left: auto" ></Page> </div> </Card> </template> </Split> <Drawer :title= "editorTitle" v-model= "editorVisible" :mask-closable= "false" :closable= "true" width= "750" class -name= "icb-popup" > <assetProductDefinitionEditor ref= "assetProductDefinitionEditor" @on -success= "editSuccessHandler" @on -close= "closeHandle" /> </Drawer> <Drawer :title= "infoTitle" v-model= "infoVisible" width= "750" class -name= "icb-popup" > <assetProductDefinitionInfo ref= "assetProductDefinitionInfo" /> </Drawer> <Attachment ref= "attachment" /> </div> </template> <script> import assetProductDefinitionEditor from './editor' import assetProductDefinitionInfo from './view' import dropdownCommon from '_c/dropdown/dropdown-common' ; import PriorityPoptip from '_c/priority-poptip/priority-poptip' ; import { getAssetProductDefinitionList, removeAssetProductDefinition, removeAssetProductDefinitionBatch, updateAssetProductDefinition, } from '@api/ams/assetProductDefinition' import { getTreeList } from '@api/ams/assetCategory' import $ from 'jquery' import config from '../config.json' import { getUddList } from '@/api/generic/udd' ; export default { name: 'udd-list' , components: { assetProductDefinitionEditor, assetProductDefinitionInfo, dropdownCommon, PriorityPoptip }, data () { return { udds: [], dataTypeDatas: [], infoTitle: '' , infoVisible: false , ids: null , loading: false , drawer_styles: { height: 'calc(100% - 55px)' , overflow: 'auto' , paddingBottom: '53px' , position: 'static' , width: '920' }, split: '320px' , height: 0 , data: [], editorTitle: '' , editorVisible: false , treeData: [ { code: '' , title: '资产分类' , expand: true , selected: true , children: [] } ], parent: '/' , pc: { pageIndex: 1 , pageSize: 20 , total: 0 }, pageDisabled: false , scs: [ { priority: 'desc' }, { created_date: 'desc' } ], columns: [ { type: 'selection' , show: true , width: 60 , align: 'center' }, { type: 'index' , show: true , width: 60 , align: 'right' }, { title: '名称' , key: 'name' , show: true , tooltip: true , maxWidth: 350 , slot: 'name' , className: 'sort-col sort-name-col' }, { title: '显示名称' , key: 'label' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-label-col' }, { title: '属性类型' , key: 'dataType' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-dataType-col' , render: (h, params) => { console.log( 'params.row.dctCode=====' ,params.row.dataType, this .dataTypeDatas) return h( 'span' , config.dataTypeItems.filter(item => item.value === params.row.dataType)[ 0 ].label || '未知' ); } }, { title: '表单类型' , key: 'uiType' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-uiType-col' , render: (h, params) => { return h( 'span' , config.metaTypes.filter(item => item.value === params.row.uiType)[ 0 ].label || '未知' ); } }, { title: '长度' , key: 'length' , align: 'center' , render: (h, params) => { return h( 'span' , params.row.length); } }, { title: '默认值' , key: 'defaultValues' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-defaultValues-col' }, { title: '是否必填' , key: 'required' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-required-col' }, { title: '数据字典' , key: 'dctCode' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-dctCode-col' , render: (h, params) => { return h( 'span' , this .udds.filter(item => item.code === params.row.dctCode)[ 0 ].name || '未知' ); } }, { title: '提示信息' , key: 'placeholder' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-placeholder-col' }, { title: '优先级' , key: 'priority' , show: true , tooltip: true , maxWidth: 350 , className: 'sort-col sort-priority-col' , render: (h, params) => { return h( 'div' , {}, [ h(PriorityPoptip, { props: { id: params.row.id, priorityold: params.row.priority, prioritynew: params.row.priority }, on: { priorityUpdated: (prioritynew, id) => { this .savePriority(prioritynew, id); } } }) ]); } }, { title: '操作' , key: 'action' , show: true , align: 'center' , slot: 'action' , width: 100 } ], dropitems: [ { icon: '' , action: 'udd_update' , title: '修改' , name: 'editor' }, { icon: '' , action: 'udd_del' , title: '删除' , name: 'del' } ], pageRefresh: true , pageSizeOpts: [ 10 , 20 , 50 , 100 ], tableHeight: 0 , treeHeight: 0 , tableSize: 'default' } }, watch: { 'pc.pageIndex' : function (curVal, oldVal) { if (curVal !== oldVal) { if (! this .pageRefresh) { return } this .load() } }, 'pc.pageSize' : function (curVal, oldVal) { if (curVal !== oldVal) { if (! this .pageRefresh) { return } this .load() } }, facets: { handler (newValue, oldValue) { this .load() }, deep: true }, $route: { handler () { if ( this .$route.query.p) { if ( this .$route.query.p - 0 !== this .pc.pageIndex) { this .pc.pageIndex = this .$route.query.p - 0 this .load() } } else { this .pc.pageIndex = 1 this .load() } }, deep: true } }, computed: { width () { return document.body.clientWidth }, tableColumns () { const columns = [... this .columns] return columns.filter(item => item.show) } }, mounted () { const self = this self.$nextTick(() => { self.autoHeight() }) window.addEventListener( 'resize' , this .autoHeight) if (self.$route.query.p) { self.pc.pageIndex = this .$route.query.p - 0 } self.load(); self.treeChange ( this .treeData) }, created () { this .loadMTIdDatas (); this .loadTree(); this .getUddList () this .load() }, destroyed () { window.removeEventListener( 'resize' , this .autoHeight) }, methods: { getUddList () { const params = {} const self = this self.udds = [] getUddList(params).then((res) => { console.log( 111111 ,res.data) self.udds = res.data.records }); }, loadMTIdDatas () { // todo 此处调用元数据接口 /metatypes this .dataTypeDatas = [ {id: '950763959593365504' , name: '区域代码' }, {id: '348648182' , name: '文本类型' } ]; }, refreshSort () { this .scs.forEach(function (order, key) { let ascEl = $( 'th.sort-' + key + '-col' ).find( '.ivu-icon-md-arrow-dropup' ) let descEl = $( 'th.sort-' + key + '-col' ).find( '.ivu-icon-md-arrow-dropdown' ) if (order === 'asc' ) { $(ascEl).addClass( 'on' ) $(descEl).removeClass( 'on' ) } else if (order === 'desc' ) { $(ascEl).removeClass( 'on' ) $(descEl).addClass( 'on' ) } else { $(ascEl).removeClass( 'on' ) $(descEl).removeClass( 'on' ) } }) }, tableSelectHandler (selection) { const self = this self.ids = [] if (selection != null && selection.length > 0 ) { selection.forEach(function (item) { self.ids.push(item.id) }) } }, buildParams () { const self = this let params = { p: this .pc.pageIndex, s: this .pc.pageSize } params.productId = self.parent; let scs = [] this .scs.forEach(function (order, key) { scs.push(key + '(' + order + ')' ) }) if (( this .scs == null || this .scs.size == 0 ) && this .defaultScs != null && Object.keys( this .defaultScs).length > 0 ) { Object.keys( this .defaultScs).forEach(function (key) { scs.push(key + '(' + self.defaultScs[key] + ')' ) }) } Object.assign(params, this .filters, this .facets, { scs: scs.join( ',' ) }) return params }, loadTree () { getTreeList({ scs: 'name(asc)' }).then((res) => { this .treeData[ 0 ].children = res.data; }); }, sort (sc) { let key = sc.key let order = sc.order if (key == null || key == undefined) { key = sc.column.slot } if ( this .scs.has(key) && this .scs.get(key) === 'asc' ) { order = 'desc' } if (key != null && key != undefined && key != '' ) { if (sc.order !== 'normal' ) { this .scs.set(key, order) } else { this .scs.delete(key) } this .load() } }, load () { const self = this getAssetProductDefinitionList(self.buildParams()).then((res) => { self.loading = false self.data = res.data.records if (res.data.records.length > 0 ) { self.pc.pageIndex = parseInt(res.data.pageIndex) self.pc.total = parseInt(res.data.total) } else { self.pc = { pageIndex: 1 , pageSize: self.pc.pageSize, total: 0 } } self.refreshSort() setTimeout(function () { self.pageRefresh = true self.pageDisabled = false }, 500 ) }) }, treeChange (data) { this .parent = data[ 0 ].code; this .load(); }, savePriority (prioritynew,id) { updateAssetProductDefinition({ id: id, priority: prioritynew }).then((res) => { if (res.code === 100200 ) { this .$Message.success( '修改成功!' ) this .load() } }) }, dropdown (tdata) { switch (tdata.name) { case 'editor' : this .edit(tdata.data.code) break case 'del' : this .del(tdata.data) break } }, edit (data) { let id = 0 if (data != null ) { id = data.id } this .editorTitle = (id === 0 ? '新建' : '编辑' ) + '类型' this .editorVisible = true this .$refs.assetProductDefinitionEditor.load(id, this .parent) }, editSuccessHandler (data, type) { this .editorVisible = false this .load() this .loadTree() }, closeHandle () { this .editorVisible = false }, del (data) { const params = { id: data.id } this .$Modal.confirm({ content: '<p>确定删除吗?</p>' , onOk: () => { removeAssetProductDefinition(params).then((res) => { if (res.code === 100200 ) { this .$Message.success( '删除成功!' ) this .load() } this .loadTree() }) }, onCancel: () => { } }) }, removeBatch () { if ( this .ids.length > 0 ) { let params = { ids: this .ids } this .$Modal.confirm({ title: '提示' , content: '<p>确定要删除选择的数据?</p>' , cancelText: '取消' , okText: '确定' , onOk: () => { removeAssetProductDefinitionBatch(params).then((res) => { if (res.code === 100200 ) { this .$Message.success( '操作成功!' ) this .load() } else { this .$Message.error(res.message) } }) }, onCancel: () => { } }) } else { this .$Message.error( '请选择要删除的数据!' ) } }, autoHeight () { // 42是顶部导航栏高度 32是tab栏高度 headerHeight是列表页顶部高度 12是外层边距,50是底部分页信息栏, 所有被减高度之和为206 this .height = document.body.clientHeight - 84 this .treeHeight = this .height - 98 }, changePage (page) { this .pc.pageIndex = parseInt(page) }, changePageSize (num) { this .pc.pageSize = parseInt(num) }, handleChangeTableSize (size) { this .tableSize = size } } } </script> <style lang= "less" scoped> ::v-deep .ivu-table th { background: #fff !important; } ::v-deep .ivu-card-head { border-bottom: 0 ; } .icb-split-left { ::v-deep .ivu-card-head { border-bottom: 1px solid #e8eaec;; } } </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | <template> <div> <Form ref= "assetProductDefinitionForm" :model= "assetProductDefinition" :rules= "ruleValidate" :label-width= "labelWidth" :label-position= "labelPosition" > <Row> <Col span= "12" > <Form-item label= "名称" prop= "name" > <Input v-model= "assetProductDefinition.name" placeholder= "名称" ></Input> </Form-item> </Col> <Col span= "12" > <Form-item label= "显示名称" prop= "label" > <Input v-model= "assetProductDefinition.label" placeholder= "显示名称" ></Input> </Form-item> </Col> </Row> <Row> <Col span= "12" > <Form-item label= "属性类型" prop= "dataType" > <Select v-model= "assetProductDefinition.dataType" style= "width:100%" > <Option v- for = "item in config.dataTypeItems" :key= "item.value" :value= "item.value" :label= "item.label" ></Option> </Select> </Form-item> </Col> <Col span= "12" > <Form-item label= "表单类型" prop= "uiType" > <Select v-model= "assetProductDefinition.uiType" style= "width: 200px" > <Option v- for = "item in config.metaTypes" :key= "item.value" :value= "item.value" :label= "item.label" ></Option> </Select> </Form-item> </Col> </Row> <Row> <Col span= "12" > <Form-item label= "默认值" prop= "defaultValues" > <Input v-model= "assetProductDefinition.defaultValues" placeholder= "默认值" ></Input> </Form-item> </Col> <Col span= "12" > <Form-item label= "是否必填" prop= "required" > <Switch v-model= "assetProductDefinition.required" : false -value= "0" : true -value= "1" /> </Form-item> </Col> </Row> <Row> <Col span= "12" > <Form-item label= "提示信息" prop= "placeholder" > <Input v-model= "assetProductDefinition.placeholder" placeholder= "提示信息" ></Input> </Form-item> </Col> <Col span= "12" > <Form-item label= "长度" prop= "length" > <InputNumber v-model= "assetProductDefinition.length" :max= "4096" :min= "1" placeholder= "长度" ></InputNumber> </Form-item> </Col> </Row> <Row> <Col span= "12" > <Form-item label= "提示信息" prop= "dctCode" v- if = "assetProductDefinition.dataType === '4'" > <Select v-model= "assetProductDefinition.dctCode" style= "width:100%" > <Option v- for = "(item,index) in udds" :key= "index" :value= "item.code" :label= "item.name" > {{ item.name }} </Option> </Select> </Form-item> </Col> <Col span= "12" > </Col> </Row> <Form-item label= "备注" prop= "remark" > <tinyEditor class = "editor" :value= "assetProductDefinition.remark" @input = "(res)=> assetProductDefinition.remark = res" ></tinyEditor> </Form-item> </Form> <div class = "icb-editor-footer" > <Button @click = "cancelHandler" >取消</Button> <Button type= "primary" :loading= "loading" @click = "save" >保存</Button> </div> </div> </template> <script> import { createAssetProductDefinition, getAssetProductDefinition, updateAssetProductDefinition } from '@api/ams/assetProductDefinition' import { mapState } from 'vuex' import tinyEditor from '_c/tinymce/index.vue' ; import config from '../config.json' import { getUddList } from '@/api/generic/udd' ; export default { name: 'asset-product-definition-editor' , components: { tinyEditor }, data () { return { udds: [], dataTypeDatas: [], config, loading: false , isNew: false , assetProductDefinition: { productId: null , name: null , label: null , length: null , dataType: null , uiType: null , defaultValues: null , required: null , placeholder: null , remark: null , isLock: 1 , dctCode: null , }, ruleValidate: { name: [ { required: true , message: '名称不能为空' , trigger: 'blur' , } ], label: [ { required: true , message: '显示名称不能为空' , trigger: 'blur' } ], dataType: [ { required: true , message: '属性类型不能为空' , trigger: 'blur' } ], uiType: [ { required: true , message: '表单类型不能为空' , trigger: 'blur' } ], defaultValues: [ { required: true , message: '默认值不能为空' , trigger: 'blur' } ], // required: [ // { // required: true, // message: '是否必填不能为空', // trigger: 'change', // type: 'number' // } // ], placeholder: [ { required: true , message: '提示信息不能为空' , trigger: 'blur' } ], } } }, created () { }, mounted () { }, beforeDestroy () { }, destroyed () { }, computed: { ...mapState( 'admin/layout' , [ 'isMobile' ]), labelWidth () { return this .isMobile ? undefined : 80 }, labelPosition () { return this .isMobile ? 'top' : 'right' } }, watch: {}, methods: { getUddList () { const params = {} const self = this self.udds = [] getUddList(params).then((res) => { console.log( 111111 ,res.data) self.udds = res.data.records }); }, loadMTIdDatas () { // todo 此处调用元数据接口 /metatypes this .dataTypeDatas = [ { id: '950763959593365504' , name: '区域代码' }, { id: '348648182' , name: '文本类型' }, { id: '444444444444' , name: '数据字典' } ]; }, load (id, productId) { this .loading = false this .$refs.assetProductDefinitionForm.resetFields() this .isNew = (id === 0 ) if ( this .isNew) { this .assetProductDefinition = {} } else { let params = { id } getAssetProductDefinition(params).then((res) => { let assetProductDefinition = res.data this .assetProductDefinition = assetProductDefinition }) } this .$set( this .assetProductDefinition, 'productId' , productId) this .$set( this .assetProductDefinition, 'isLock' , 1 ) console.log( this .assetProductDefinition, 9999999999 ) this .getUddList (); this .loadMTIdDatas(); }, save () { console.log( this .$parent, 444444444 ) this .$refs.assetProductDefinitionForm.validate((valid) => { // this.loading = true if (valid) { if ( this .isNew) { this .create() } else { this .modify() } } else { this .$Message.error( '信息校验失败,请根据页面提示纠正您所填写的信息!' ) this .loading = false } }) }, create () { createAssetProductDefinition( this .assetProductDefinition).then((res) => { if (res.code === 100200 ) { this .$Message.success( '添加成功!' ) this .reset() this .$emit( 'on-success' , res.data, 'create' ) } else { this .$Message.error( '添加失败,请稍后重试!' ) } this .loading = false }) }, modify () { this .$Modal.confirm({ title: '操作提示' , content: '是否修改该数据?' , okText: '修改' , onCancel: () => { this .loading = false }, onOk: () => { updateAssetProductDefinition( this .assetProductDefinition).then((res) => { if (res.code === 100200 ) { this .$Message.success( '修改成功!' ) this .$emit( 'on-success' , res.data, 'update' ) } else { this .$Message.error( '修改失败!' ) } this .loading = false }) } }) }, reset () { this .assetProductDefinition = {} this .$refs.assetProductDefinitionForm.resetFields() }, cancelHandler () { this .$emit( 'on-close' ) } } } </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 | < template > < div class="icb-list"> < div class="icb-list-header" ref="cListHeader"> < div class="icb-search"> < div class="icb-search-item"> < Input type="text" class="icb-search-input" v-model="filters.keyword" @on-enter="search" clearable placeholder="根据关键字搜索" style="width: 100%;"> < Icon type="ios-search" slot="prefix"/> </ Input > </ div > < div class="icb-search-item"> < Button type="primary" @click="search" style="margin-right:8px;">查询</ Button > </ div > </ div > < div class="icb-action" style="display: flex"> < Dropdown class="icb-dropdown" trigger="click"> < Icon type="md-more"/> < DropdownMenu slot="list"> < DropdownItem v-if="$checkAuth('-assetAcceptance-create')" @click.native="edit(null)"> < span class="iconx iconx-add-circle-outlined"></ span > < span >新建</ span > </ DropdownItem > < DropdownItem v-if="$checkAuth('-assetAcceptance-removeBatch')" @click.native="removeBatch"> < span class="iconx iconx-delete-outlined"></ span > < span >删除</ span > </ DropdownItem > </ DropdownMenu > </ Dropdown > </ div > </ div > < Row style="margin: auto"> < div > < Menu v-if="facets.isSuccess" :active-name="facets.approvalState" :theme="theme" class="hidden-bottom-line" mode="horizontal" style="width: 800px"> < MenuItem v-for="item in assetStates" :key="item.state" :name="item.state === null ? '' : item.state" @click.native="stateChange(item.state)"> {{ item.name }}({{ item.value }}) </ MenuItem > </ Menu > </ div > </ Row > < div class="icb-list-data"> < Table :columns="tableColumns" :data="data" :loading="loading" :size="tableSize" :height="tableHeight" @on-sort-change="sort" :no-data-text="$gdata.tableNoDataText" @on-selection-change="tableSelectHandler"> < template slot-scope="{ row }" slot="attchments"> < span >{{ row.attchCount }}</ span > < a style="margin-right: 20px" @click="showAttchments(row)" class="iconx iconx-preview2"></ a > </ template > < template slot-scope="{ row }" slot="name"> < a @click="showInfo(row)">{{ row.name }}</ a > </ template > < template slot-scope="{ row }" slot="action"> < div class="icb-list-action"> < span class="iconx iconx-edit-outlined" v-if="$checkAuth('-assetAcceptance-update')" @click="edit(row)"></ span > < span class="icb-action-divider"></ span > < Dropdown class="icb-dropdown" trigger="click" style="margin-left: 0;"> < a href="javascript:void(0)" class="icb-list-more"> < span class="iconx iconx-more-outlined"></ span > </ a > < DropdownMenu slot="list"> < DropdownItem @click.native="attach(row)"> < span class="iconx iconx-link-outlind"></ span > < span >附件</ span > </ DropdownItem > < DropdownItem @click.native="copy(row)" v-if="$checkAuth('-assetAcceptance-copy')"> < span class="iconx iconx-copy-outlined"></ span > < span >复制</ span > </ DropdownItem > < DropdownItem @click.native="remove(row)" v-if="$checkAuth('-assetAcceptance-remove')"> < span class="iconx iconx-delete-outlined"></ span > < span class="table-action">删除</ span > </ DropdownItem > </ DropdownMenu > </ Dropdown > </ div > </ template > </ Table > < div class="icb-list-footer" ref="cListFooter"> < Page :total="pc.total" :current="pc.pageIndex" :page-size="pc.pageSize" :page-size-opts="pageSizeOpts" :disabled="pageDisabled" @on-change="changePage" @on-page-size-change="changePageSize" show-total show-sizer transfer></ Page > </ div > </ div > < Drawer :title="editorTitle" v-model="editorVisible" :mask-closable="false" :closable="true" width="1200" class-name="icb-popup"> < assetAcceptanceEditor ref="assetAcceptanceEditor" @list-event="parentMethod" @on-success="editSuccessHandler" @on-close="closeHandle"/> </ Drawer > < MuseumCoverEditor ref="coverup" @remove="removeHandler" @uploaded="successUploadHandler" @on-close="cancelCoverDialog" :action="url"/> < Drawer :title="infoTitle" v-model="infoVisible" width="950" class-name="icb-popup"> < assetAcceptanceInfo ref="assetAcceptanceInfo"/> </ Drawer > < Drawer title="扩展字段信息" :closable="true" v-model="metaDataVisible" width="1000" > < AccMetaData ref="accMetaData" @getMetas="getMetaDatas"/> </ Drawer > < Cover ref="cover"/> < Attachment ref="attachment"/> < Modal v-model="checkVisible" :title="appTitle" @on-ok="saveCheck"> < Form > < FormItem label="审核结果"> < RadioGroup v-model="checkState"> < Radio :label="1">审核通过</ Radio > < Radio :label="-1">审核不通过</ Radio > </ RadioGroup > </ FormItem > < FormItem label="审核意见"> < Input v-model="checkRemark" type="textarea" placeholder="请输入审核意见"></ Input > </ FormItem > </ Form > </ Modal > </ div > </ template > < script > import { copyAssetAcceptance, getAssetAcceptanceList, removeAssetAcceptance, removeAssetAcceptanceBatch, updateAssetAcceptance, getStatesCount, approval } from '@api/ams/assetAcceptance' import assetAcceptanceEditor from './editor' import assetAcceptanceInfo from './view' import excel from '@/libs/excel' import * as moment from 'moment' import $ from 'jquery' import config from '../config.json' import expandRow from './expand' import MuseumCoverEditor from '@/components/cover/museumCover.vue' import AccMetaData from '../base/accMetaData' import { createUpload, removeFile } from '@api/ams/assetAttchments'; import * as ax from '@/plugins/request' export default { name: 'asset-acceptance-list', components: { assetAcceptanceEditor, assetAcceptanceInfo, MuseumCoverEditor, AccMetaData }, data () { const self = this return { url : ax.url + '/ams/asset/attachments', theme: 'light', assetStates: [], config, metaDataVisible: false, checkVisible: false, checkState: 1, checkType: 1, checkRemark: '', appTitle: '审核', data: [], ids: [], infoTitle: '', infoVisible: false, editorTitle: '', editorVisible: false, filters: { kcs: 'name', keyword: '' }, facets: { approvalState: '', isSuccess: false, }, pc: { pageIndex: 1, pageSize: 20, total: 0 }, scs: new Map(), defaultScs: { 'priority': 'desc', 'id': 'desc' }, columns: [ { type: 'expand', width: 50, show: true, render: (h, params) => { return this.$createElement(expandRow, { props: { row: params.row }, on: { // 子组件$emit传递方法以及参数 } }) } }, { type: 'selection', show: true, width: 60, align: 'center' }, { type: 'index', show: true, width: 60, align: 'right' }, { title: '验收编号', key: 'accNo', show: true, tooltip: true, maxWidth: 350, minWidth: 200, className: 'sort-col sort-accNo-col' }, { title: '附件图片', key: 'attchCount', width: 120, show: true, render: (h, params) => { if (params.row.attchCount > 0) { return h('a', { class: ['iconx', 'iconx-cover3'], style: {}, on: { click: () => { this.showAttchments(params.row) } } }, ' ' + params.row.attchCount); } else { return h('a', { style: {}, on: { click: () => { this.showAttchments(params.row) } } }, '暂无'); } } }, { title: '制单时间', key: 'createdDate', maxWidth: 350, minWidth: 150, render: (h, params) => { return h('div', {}, moment(params.row.createdDate - 0).format('YYYY-MM-DD HH:mm')) } }, { title: '验收人', key: 'userName', show: true, tooltip: true, maxWidth: 350, minWidth: 100, className: 'sort-col sort-userName-col' }, { title: '验收部门', key: 'dptName', show: true, tooltip: true, maxWidth: 350, minWidth: 100, className: 'sort-col sort-dptName-col' }, { title: '购买时间', key: 'purchaseDate', render: (h, params) => { return h('div', {}, moment(params.row.purchaseDate - 0).format('YYYY-MM-DD HH:mm')) } }, { title: '收据号', key: 'invoiceCode', show: true, tooltip: true, maxWidth: 350, minWidth: 100, className: 'sort-col sort-invoiceCode-col' }, { title: '提交审核', key: 'submit', show: true, minWidth: 150, className: 'sort-col sort-approvalState-col', render: (h, params) => { if (params.row.approvalState === 0 || params.row.approvalState === -1) { return h('Button', { props: { type: 'primary', style: { margin: '0 3px 0 3px' } }, on: { click: () => { this.toSubmit(params.row) } } }, [ h('span', '提交') ] ) } else if (params.row.approvalState === 2) { return h('span', { class: 'row1', style: { color: '#ffed3c' } }, '请审核该条记录') } else if (params.row.approvalState === 1) { return h('span', '') } } }, { title: '审核状态', key: 'approvalState', show: true, tooltip: true, width: 150, filters: [], filterMultiple: false, filterRemote (value, row) { self.facets.approvalState = value.length > 0 ? value[0] : '' }, className: 'sort-col sort-approvalState-col', render: (h, params) => { const approvalState = params.row.approvalState; let txt = '' const color = approvalState === 1 ? '#00ff00' : approvalState === -1 ? '#ff0000' : '#000000'; if (approvalState != null) { const filterArr = config.checkStateData.filter(item => item.value === approvalState); console.log('========', approvalState, filterArr) if (filterArr && filterArr.length > 0) { txt = filterArr[0].label } } const self = this if (approvalState === 2) { if (self.$checkAuth('approval-plans-solicitation')) { return h('Button', { props: { type: 'primary' }, style: { margin: '0 3px 0 3px' }, on: { click: () => { this.toCheck(params) } } }, [ h('span', '审核') ]) } } else { if (params.row.remark != null && params.row.remark !== '') { return h('Tooltip', { props: { content: params.row.remark, transfer: true, maxWidth: '300' } }, [h('span', { class: 'row1', style: { color: color } }, txt)]); } } return h('span', { style: { color: color } }, txt) } }, { title: '操作', key: 'action', show: true, align: 'center', slot: 'action', width: 100 } ], loading: true, pageDisabled: false, pageRefresh: true, pageSizeOpts: [10, 20, 50, 100], tableHeight: 0, tableSize: 'default' } }, watch: { 'pc.pageIndex': function (curVal, oldVal) { if (curVal !== oldVal) { if (!this.pageRefresh) { return } this.load() } }, 'pc.pageSize': function (curVal, oldVal) { if (curVal !== oldVal) { if (!this.pageRefresh) { return } this.load() } }, facets: { handler (newValue, oldValue) { this.load() }, deep: true }, $route: { handler () { if (this.$route.query.p) { if (this.$route.query.p - 0 !== this.pc.pageIndex) { this.pc.pageIndex = this.$route.query.p - 0 this.load() } } else { this.pc.pageIndex = 1 this.load() } }, deep: true } }, computed: { width () { return document.body.clientWidth }, tableColumns () { const columns = [...this.columns] return columns.filter(item => item.show) } }, mounted () { this.$nextTick(() => { this.autoHeight() }) window.addEventListener('resize', this.autoHeight) if (this.$route.query.p) { this.pc.pageIndex = this.$route.query.p - 0 } this.loadClueStatesCount(); this.load() }, created () { }, methods: { getMetaDatas (data) { this.metaDataVisible = false; this.$refs.assetAcceptanceEditor.buildMetaData(data) }, parentMethod (res) { console.log(res.data , res.data.detailId, ' @@@@@@@@@detailId@@@@@@@@@ ') this.metaDataVisible = true; this.$refs.accMetaData.loadMetaDataByDetailId(res.data.data) }, // ==============上传=========================== removeHandler (id) { const params = { id: id } removeFile(params).then((res) => { this.$Notice.success({ title: '操作提示', desc: '封面删除成功' }); }) }, successUploadHandler (res, file, oid) { console.log('22222222',res) const params = { objectId: oid, objectType: 1, url: res.data.url, fileId: res.data.id, content: res.data.content, type: 'pic' } createUpload(params).then((res) => { this.$Notice.success({ title: '操作提示', desc: '添加成功' }) }) }, cancelCoverDialog () { this.load() }, showAttchments(data) { this.$refs.coverup.show({ objectId: data.id, title: '图片上传' }) }, stateChange (state) { this.facets.approvalState = state console.log('~~~~~~~~~~~~~', state) this.load() }, loadClueStatesCount () { this.facets.isSuccess = false; getStatesCount(this.buildParams()).then(res => { if (res.code === 100200) { res.data.forEach(item => { if (item.name === '全部') { item.state = '' } }) this.assetStates = res.data; this.facets.approvalState = ''; this.facets.isSuccess = true; } }) }, toSubmit (data) { if (!data) { return } this.$Modal.confirm({ title: '提示', content: '< p >确定提交审核?</ p >', cancelText: '取消', okText: '确定', onOk: () => { const param = { id: data.id, approvalStatus: 2, } approval(param).then((res) => { this.$Message.success('提交成功!') this.load() }) }, onCancel: () => { } }) }, saveCheck () { if (!this.checkData) { return } const param = { id: this.checkData.row.id, approvalRemark: this.checkRemark, approvalStatus: this.checkState, approvalLevel: this.checkType, } approval(param).then((res) => { this.$Message.success('提交成功!') this.load() }) }, toCheck (data, level) { console.log('0000000000000', data) this.checkData = data this.checkState = 1 this.checkType = level this.checkRemark = '' this.appTitle = level === 1 ? '初级审批' : '复审'; this.checkVisible = true }, buildParams () { const self = this let params = { p: this.pc.pageIndex, s: this.pc.pageSize } let scs = [] this.scs.forEach(function (order, key) { scs.push(key + '(' + order + ')') }) if ((this.scs == null || this.scs.size == 0) && this.defaultScs != null && Object.keys(this.defaultScs).length > 0) { Object.keys(this.defaultScs).forEach(function (key) { scs.push(key + '(' + self.defaultScs[key] + ')') }) } Object.assign(params, this.filters, this.facets, { scs: scs.join(',') }) return params }, resetParams () { this.filters = { kcs: 'name', keyword: '' } this.scs = new Map() this.facets = { approvalState: '', } $('th.sort-col').each(function () { $(this).find('.ivu-icon-md-arrow-dropup').removeClass('on') $(this).find('.ivu-icon-md-arrow-dropdown').removeClass('on') }) this.load() }, search () { this.pc.pageIndex = 1 this.load() }, load () { const self = this self.loading = true self.pageRefresh = false self.pageDisabled = true self.ids = [] self.data = [] getAssetAcceptanceList(self.buildParams()).then((res) => { self.loading = false self.data = res.data.records if (res.data.records.length > 0) { self.pc.pageIndex = parseInt(res.data.pageIndex) self.pc.total = parseInt(res.data.total) } else { self.pc = { pageIndex: 1, pageSize: this.pc.pageSize, total: 0 } } self.refreshSort() setTimeout(function () { self.pageRefresh = true self.pageDisabled = false }, 500) }) }, exportExcel () { let params = this.buildParams() params.p = 1 params.s = 10000 getAssetAcceptanceList(params).then((res) => { let records = res.data.records if (res.data.records.length > 0) { records.forEach(function (item) { }) let data = { title: ['验收编号', '名称', '验收人ID', '审核状态', '备注'], key: ['accNo', 'name', 'userId', 'approvalState', 'remark'], data: records, autoWidth: true, filename: '资产验收_' + moment().format('YYYYMMDDHHmmss') } excel.export_array_to_excel(data) } else { this.$Message.warning('无数据!') } }) }, sort (sc) { let key = sc.key let order = sc.order if (key == null || key === undefined) { key = sc.column.slot } if (this.scs.has(key) && this.scs.get(key) === 'asc') { order = 'desc' } if (key != null && key !== undefined && key !== '') { if (sc.order !== 'normal') { this.scs.set(key, order) } else { this.scs.delete(key) } this.load() } }, refreshSort () { this.scs.forEach(function (order, key) { let ascEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropup') let descEl = $('th.sort-' + key + '-col').find('.ivu-icon-md-arrow-dropdown') if (order === 'asc') { $(ascEl).addClass('on') $(descEl).removeClass('on') } else if (order === 'desc') { $(ascEl).removeClass('on') $(descEl).addClass('on') } else { $(ascEl).removeClass('on') $(descEl).removeClass('on') } }) }, showInfo (data) { this.infoTitle = '资产验收详情' this.infoVisible = true this.$refs.assetAcceptanceInfo.load(data.id) }, edit (data) { let id = 0 if (data != null) { id = data.id } this.editorTitle = (id === 0 ? '新建' : '修改') + '资产验收' this.$refs.assetAcceptanceEditor.load(id) this.editorVisible = true }, editSuccessHandler (data, type) { this.editorVisible = false this.load() }, closeHandle () { this.editorVisible = false }, update (id, data, reload) { if (id != null && data != null) { let params = Object.assign(data, { id }) updateAssetAcceptance(params).then((res) => { this.$Message.success('修改成功!') if (reload) { this.load() } }) } }, copy (data) { const params = { id: data.id } this.$Modal.confirm({ title: '< p class="ivu-modal-confirm-title">确认要复制该数据吗?</ p >', content: '< p class="ivu-modal-confirm-content">复制当前选中的数据项。</ p >', iconClass: 'ios-alert', cancelText: '取消', okText: '确定', onOk: () => { copyAssetAcceptance(params).then((res) => { if (res.code === 100200) { this.$Message.success('复制成功!') this.load() } else { this.$Message.error(res.message); } }) }, onCancel: () => { } }) }, remove (data) { this.$Modal.confirm({ title: '提示', content: '< p >确定删除?</ p >', cancelText: '取消', okText: '确定', onOk: () => { removeAssetAcceptance({ id: data.id }).then((res) => { if (res.code === 100200) { this.$Message.success('删除成功!') this.load() } else { this.$Message.error(res.message) } }) }, onCancel: () => { } }) }, removeBatch () { if (this.ids.length > 0) { let params = { ids: this.ids } this.$Modal.confirm({ title: '提示', content: '< p >确定要删除选择的数据?</ p >', cancelText: '取消', okText: '确定', onOk: () => { removeAssetAcceptanceBatch(params).then((res) => { if (res.code === 100200) { this.$Message.success('操作成功!') this.load() } else { this.$Message.error(res.message) } }) }, onCancel: () => { } }) } else { this.$Message.error('请选择要删除的数据!') } }, tableSelectHandler (selection) { const self = this self.ids = [] if (selection != null && selection.length > 0) { selection.forEach(function (item) { self.ids.push(item.id) }) } }, autoHeight () { const headerHeight = this.$refs.cListHeader.offsetHeight ? this.$refs.cListHeader.offsetHeight:0; const footerHeight = this.$refs.cListFooter.offsetHeight this.tableHeight = document.body.clientHeight - headerHeight - footerHeight - 150 }, changePage (page) { this.pc.pageIndex = parseInt(page) }, changePageSize (num) { this.pc.pageSize = parseInt(num) }, handleChangeTableSize (size) { this.tableSize = size }, attach (data) { this.$refs.attachment.show({ objectId: data.id, objectType: 'assetAcceptance', title: data.name }) }, cover (data) { this.$refs.cover.show({ objectId: data.id, objectType: 'assetAcceptance', title: data.name }) }, } } </ script > |
edit.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 | < template > < div > < Form ref="assetAcceptanceForm" :model="assetAcceptance" :rules="ruleValidate" :label-width="labelWidth" :label-position="labelPosition"> < Row > < Col span="8"> < Form-item label="验收编号" prop="accNo"> < Input v-model="assetAcceptance.accNo" :disabled="true" placeholder="请输入验收编号" clearable style="width: 100%"/> </ Form-item > </ Col > < Col :span="8"> < Form-item label="验收人" prop="userId"> < Select v-model="assetAcceptance.userId" placeholder="请选择验收人" style="width: 100%" @on-change="(res) => getDeptName(res)"> < Option v-for="item in employeeList" :key="item.id" :value="item.id">{{ item.name }}</ Option > </ Select > </ Form-item > </ Col > < Col :span="8"> < Form-item label="验收部门" prop="dptName"> < Input v-model="assetAcceptance.dptName" :disabled="true" placeholder="验收部门" clearable style="width: 100%"/> </ Form-item > </ Col > < Col :span="8"> < Form-item label="购入单位" prop="purchaseCompany"> < Input v-model="assetAcceptance.purchaseCompany" placeholder="请输入购入单位" clearable style="width: 100%"/> </ Form-item > </ Col > < Col :span="8"> < Form-item label="购入日期" prop="purchaseDate"> < DatePicker v-model="assetAcceptance.purchaseDate_dt" placeholder="请选择购入日期" type="date" value-format="yyyy-MM-dd" clearable style="width: 100%"/> </ Form-item > </ Col > < Col :span="8"> < Form-item label="收据号" prop="invoiceCode"> < Input v-model="assetAcceptance.invoiceCode" placeholder="请输入收据号" clearable style="width: 100%"/> </ Form-item > </ Col > < Col :span="24"> < Form-item label="备注" prop="remark"> < tinyEditor :showBtn="false" :value="assetAcceptance.remark" class="editor" @input="(res)=> assetAcceptance.remark = res"></ tinyEditor > </ Form-item > </ Col > < Col :span="24"> </ Col > </ Row > </ Form > < div class="form-detail" style="height: calc(100vh - 102px); overflow-y: auto"> < AssetsTable ref="assetsTable" :accId="assetAcceptance.id" :tableDataOne="tableData" @editor-event="parentMethod" @value-changed="showMerchantEditor"/> </ div > < div class="icb-editor-footer"> < Button @click="cancelHandler">取消</ Button > < Button type="primary" :loading="loading" @click="save">保存</ Button > </ div > < Modal v-model="checkVisible" :styles="drawer_styles" :title="appTitle" :mask-closable="false" :closable="true" width="700" footer-hide> < AssetMerchantEditor ref="assetMerchantEditor" :key="componentKey" :checkVisible="true" @on-success="editSuccessHandler" @on-close="closeHandle"/> </ Modal > </ div > </ template > < script > import { acceptCode, createAssetAcceptance, getAssetAcceptance, updateAssetAcceptance } from '@api/ams/assetAcceptance' import AssetsTable from '../base/assetsTable'; import { mapState } from 'vuex' import { getEmployeeList } from '@api/sems/employee'; import tinyEditor from '_c/tinymce/index.vue'; import { getAssetAcceptanceDetailList, updateAssetAcceptanceDetail, updateAssetAcceptanceDetailData } from '@api/ams/assetAcceptanceDetail'; import AssetMerchantEditor from '../assetMerchant/editor' export default { name: 'asset-acceptance-editor', components: { AssetsTable, tinyEditor, AssetMerchantEditor }, data () { return { componentKey: 0, drawer_styles: { height: 'calc(100% - 0px)', overflowY: 'auto', overflowX: 'auto', paddingBottom: '0px', position: 'static' }, appTitle: '添加商户', checkVisible: false, employeeList: [], id: '', loading: false, isNew: false, tableData: [], assetAcceptance: { dptName: null, accNo: null, name: null, userId: null, approvalState: null, remark: null, purchaseDate: null, purchaseDate_dt: null, assetAcceptanceDetails: [], items: null, }, ruleValidate: { accNo: [ { required: true, message: '验收编号不能为空', trigger: 'blur' } ], name: [ { required: true, message: '名称不能为空', trigger: 'blur' } ], } } }, created () { }, mounted () { this.loadEmployeeInfo() }, beforeDestroy () { }, destroyed () { }, computed: { ...mapState('admin/layout', [ 'isMobile' ]), labelWidth () { return this.isMobile ? undefined : 80 }, labelPosition () { return this.isMobile ? 'top' : 'right' } }, watch: {}, methods: { buildMetaData (data) { if (data && data.length > 0){ debugger var id = data[0].detailId; this.tableData.forEach(item => { const detailId = item.detailId; if (detailId === id){ this.$set(item, 'assetLedgers',data) this.$set(item, 'metas',data.metas) } }) console.log(this.tableData, data, 'Parent method 666666'); // let params = {dtos : data} // let dtos = []; // data.forEach(item => { // const obj = {}; // obj.id = item.id; // obj.assetLedgers = item.assetLedgers; // dtos.push(obj) // }) updateAssetAcceptanceDetailData(data).then((res) => { this.$Message.success('修改成功!') }) } }, editSuccessHandler (data) { console.log(data, 'Parent method 2222222222'); this.checkVisible = false this.$refs.assetsTable.loadMerchantList(); }, closeHandle () { console.log( 'Parent method 3333333333333'); this.checkVisible = false }, parentMethod (data) { console.log(data, 'Parent method called1111111'); const self = this; self.$emit('list-event', { data: data }); }, showMerchantEditor () { this.checkVisible = true; this.componentKey += 1; }, saveCheck () { // this.checkVisible = false; this.$refs.assetMerchantEditor.save(); this.$refs.assetsTable.loadMerchantList(); }, editMetaData (accId) { console.log(accId, ' ----------!!-------- ') this.$emit('editMetaData', accId) }, getAssetAcceptanceCode () { acceptCode().then((res) => { if (res.code === 100200) { console.log(res.message, 7777777777777777) this.$set(this.assetAcceptance, 'accNo', res.message); } }); }, getDetails () { const self = this self.loading = true const param = { p: 1, s: 1000, accId: this.accId } self.tableData = []; getAssetAcceptanceDetailList(param).then((res) => { self.loading = false if (res.code === 100200) { const data = res.data; if (data) { const records = data.records; records.forEach(item => { item.price = Number(item.price) }) self.tableData = records; } } }); }, getDeptName (res) { console.log('!!!!!!!!!!!', res, this.employeeList) if (res) { this.assetAcceptance.dptName = this.employeeList.filter(item => item.id === res)[0].department || '未知' } }, loadEmployeeInfo () { const params = { p: 1, s: 1000, state: 1 } getEmployeeList(params).then((res) => { this.employeeList = res.data.records }) }, async load (id) { this.loading = false this.$refs.assetAcceptanceForm.resetFields() this.isNew = (id === 0) this.tableData = []; if (this.isNew) { this.assetAcceptance = {} this.tableData = [{ num: 1, price: 0, name: '', model: '', productId: '', specList: [] }] this.getAssetAcceptanceCode(); } else { let params = { id } await getAssetAcceptance(params).then((res) => { let assetAcceptance = res.data this.assetAcceptance = assetAcceptance if (assetAcceptance.purchaseDate != null && !isNaN(assetAcceptance.purchaseDate)) { assetAcceptance.purchaseDate_dt = new Date(assetAcceptance.purchaseDate - 0) } // getDeptName(res) if (assetAcceptance.userId) { this.getDeptName(assetAcceptance.userId) } const assetAcceptanceDetails = this.assetAcceptance.assetAcceptanceDetails; console.log(assetAcceptanceDetails, 88888888888) if (assetAcceptanceDetails) { this.tableData = assetAcceptanceDetails; this.tableData.forEach(item => { item.price = Number(item.price) }) console.log('zhixingl') } }) this.$refs.assetsTable.loadProductSelect() } }, isValidInvoiceNumber (invoiceNumber) { return /^\d{10}$/.test(invoiceNumber); }, save () { const tableData = this.tableData; if (tableData.length < 1 ) { this.$Message.error('请添加验收资产数据'); return false; } const find = tableData.find(item => !item.assetsName); if (find) { this.$Message.error('请填写完整资产名称'); return false; } const find2 = tableData.find(item => !item.invoiceCode || (item.invoiceCode && !this.isValidInvoiceNumber(item.invoiceCode))); if (find2) { this.$Message.error('请填写正确的发票'); return false; } const find3 = tableData.find(item => !item.merchantId); if (find3) { this.$Message.error('请填写完整商户'); return false; } this.$refs.assetAcceptanceForm.validate((valid) => { // this.loading = true if (valid) { if (this.assetAcceptance.purchaseDate_dt != null) { this.assetAcceptance.purchaseDate = this.assetAcceptance.purchaseDate_dt.getTime() } this.assetAcceptance.assetAcceptanceDetails = tableData if (this.isNew) { this.create() } else { this.modify() } } else { this.$Message.error('信息校验失败,请根据页面提示纠正您所填写的信息!') this.loading = false } }) }, create () { createAssetAcceptance(this.assetAcceptance).then((res) => { if (res.code === 100200) { this.$Message.success('添加成功!') this.reset() this.$emit('on-success', res.data, 'create') } else { this.$Message.error('添加失败,请稍后重试!') } this.loading = false }) }, modify () { this.$Modal.confirm({ title: '操作提示', content: '是否修改该数据?', okText: '修改', onCancel: () => { this.loading = false }, onOk: () => { updateAssetAcceptance(this.assetAcceptance).then((res) => { if (res.code === 100200) { this.$Message.success('修改成功!') this.$emit('on-success', res.data, 'update') } else { this.$Message.error('修改失败!') } this.loading = false }) } }) }, reset () { this.assetAcceptance = {} this.$refs.assetAcceptanceForm.resetFields() }, cancelHandler () { this.$emit('on-close') } } } </ script > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | < template > < div class="assets-table"> < Table :columns="tableColumns" :data="subscriptionData" class="assets-tables" :size="tableSize" :height="tableHeight" :no-data-text="$gdata.tableNoDataText" border :header-cell-style="{background:'#F8F8F8',color:'black',padding:'3px'}" :cell-style="{padding:'0px'}"> < template slot-scope="{ row,index }" slot="name"> < Input type="text" v-model="row.assetsName" @input="(value) => dataChane(value,index,'assetsName')"/> </ template > < template slot-scope="{ row ,index}" slot="category"> < Select v-model="row.categoryId" @on-change="(value) => loadProducts(value,index)"> < OptionGroup label="固定资产"> < Option v-for="item in categoryList1.slice()" :key="item.id" :label="item.name" :value="item.id"/> </ OptionGroup > < OptionGroup label="无形资产"> < Option v-for="item in categoryList2.slice()" :key="item.id" :label="item.name" :value="item.id"/> </ OptionGroup > </ Select > </ template > < template slot-scope="{ row, index }" slot="product"> < Select v-model="row.productId" @on-change="value => dataChane(value,index,'productId')" :disabled="!row.categoryId"> < Option v-for="item in row.specList" :key="item.id" :label="item.name" :value="item.id"/> </ Select > </ template > < template slot-scope="{ row, index }" slot="num"> < Input-number @on-change="value => dataChane(value,index,'num')" v-model="row.num" :min="0" controls-position="right"/> </ template > < template slot-scope="{ row, index }" slot="price"> < Input-number @on-change="value => dataChane(value,index,'price')" v-model="row.price" :min="0" :precision="2" controls-position="right"/> </ template > < template slot-scope="{ row,index }" slot="action"> < Tooltip content="添加申购项"> < Button @click="add" type="text" icon="md-add"/> </ Tooltip > < Tooltip content="关联参数"> < Button @click="bindMeta(row, index)" type="text" icon="ios-link"/> </ Tooltip > < Tooltip content="删除申购项"> < Button @click="remove(index)" type="text" icon="ios-trash" style="color: red"/> </ Tooltip > </ template > </ Table > <!-- <Modal v-model="checkVisible" :styles="drawer_styles" :title="appTitle" @on-ok="saveCheck">--> <!-- <MetaData ref="metaData" :state="2" @value-changed="handleValueChange"/>--> <!-- </Modal>--> </ div > </ template > < script > import { getAssetCategoryList } from '@api/ams/assetCategory' import { getAssetProductList } from '@api/ams/assetProduct'; import expandRow from './expand' import MetaData from './metaData' import edgers from '_p/ams/assetReturn/edgers.vue'; export default { name: 'AssetsTable', components: { edgers, expandRow, MetaData }, props: { subscriptionData: { type: Array, default: [] }, }, data () { return { receivedValue: '', drawer_styles: { height: 'calc(100% - 200px)', overflowY: 'auto', overflowX: 'auto', paddingBottom: '0px', position: 'static' }, checkVisible: false, appTitle: '', tableHeight: 0, tableSize: 'default', loading: true, columns: [ { type: 'expand', width: 50, show: true, render: (h, params) => { return this.$createElement(expandRow, { props: { row: params.row }, on: { // 子组件$emit传递方法以及参数 } }) } }, { type: 'index', show: true, width: 60, align: 'right' }, { title: '资产名称', key: 'assetsName', slot: 'name', show: true, tooltip: true, maxWidth: 350, minWidth: 150, className: 'sort-col sort-assetsName-col' }, { title: '资产类型', key: 'categoryId', show: true, tooltip: true, maxWidth: 350, minWidth: 100, slot: 'category', className: 'sort-col sort-categoryId-col' }, { title: '产品类型', key: 'productId', show: true, tooltip: true, maxWidth: 350, minWidth: 100, slot: 'product', className: 'sort-col sort-productId-col' }, { title: '购买数量', key: 'num', show: true, tooltip: true, maxWidth: 350, minWidth: 100, slot: 'num', className: 'sort-col sort-assetNum-col' }, { title: '询价(元)', key: 'price', show: true, tooltip: true, maxWidth: 350, minWidth: 120, slot: 'price', className: 'sort-col sort-price-col' }, { title: '操作', key: 'action', show: true, align: 'center', slot: 'action', width: 150 } ], categoryList1: [], categoryList2: [], detailsList: [], specList: [], } }, watch: {}, computed: { width () { return document.body.clientWidth }, tableColumns () { const columns = [...this.columns] return columns.filter(item => item.show) }, }, mounted () { this.$nextTick(() => { this.autoHeight() }) this.getClassifyGbIsIntangibles(); }, created () { }, methods: { buildMetas (entityMetas) { }, handleValueChange (newValue) { this.receivedValue = newValue; console.log('iiiiii======iiiiiiii', this.receivedValue) self.$emit('child-event', { data: this.receivedValue }); }, saveCheck () { }, loadProductSelect () { console.log('iiiiiiiiiiiiii', this.subscriptionData) const self = this this.subscriptionData.forEach((item, index) => { const productId = item.productId; const categoryId = item.categoryId; self.loadProducts(categoryId, index); console.log(productId, index, self.subscriptionData[index], '*************'); self.$set(self.subscriptionData[index], 'productId', productId) }) }, dataChane (value, index, name) { console.log(value, index, name) if (!value) return const subscriptionDataElement = this.subscriptionData[index]; this.$set(this.subscriptionData[index], name, value) if (name === 'productId') {// 自动给名称赋值 name+model+productId subscriptionDataElement.specList.forEach(item => { if (value === item.id) { const assetsName = this.subscriptionData[index].assetsName || ''; this.$set(this.subscriptionData[index], 'assetsName', assetsName.split('_')[0] + '_' + item.model + '-' + item.spec) } }) } }, async getClassifyGbIsIntangibles () { // 使用async/await等待两个方法完成 this.categoryList1 = await this.getClassify(0); this.categoryList2 = await this.getClassify(1); }, createProducts (value, index) { getAssetProductList({ p: 1, s: 100, categoryId: value }).then((res) => { if (res.code === 100200) { this.$set(this.subscriptionData[index], 'specList', res.data.records) } }); }, loadProducts (value, index) { this.$set(this.subscriptionData[index], 'categoryId', value) this.$set(this.subscriptionData[index], 'productId', '') getAssetProductList({ p: 1, s: 100, categoryId: value }).then((res) => { if (res.code === 100200) { console.log(this.subscriptionData[index], '*******11****'); this.$set(this.subscriptionData[index], 'specList', res.data.records) } }); }, async getClassify (sign) { const param = { p: 1, s: 1000, isIntangibles: sign } return await getAssetCategoryList(param).then((res) => { if (res.code === 100200) { return res.data.records; } }); }, add () { this.subscriptionData.push({ num: 1, price: 0, name: '', model: '', productId: '', metas: [], specList: [] }); }, bindMeta (data, index) { console.log(data, this.subscriptionData, '*******22222****'); if (!data || !data.productId) { this.$Message.error('请先选择产品类型信息!'); return; } const self = this; this.$set(data, 'index', index); self.$emit('edit-event', { data: data }); // this.$refs.metaData.loadMetaDataByProId(data.productId) // console.log(self.$emit.$parent('editMetaData', data.id)) }, remove (index) { if (this.subscriptionData.length < 2 ) { this.$Message.error('至少保留一条数据'); return false; } this.subscriptionData.splice(index, 1); }, handleChangeTableSize (size) { this.tableSize = size }, autoHeight () { const headerHeight = this.$refs.cListHeader.offsetHeight const footerHeight = this.$refs.cListFooter.offsetHeight this.tableHeight = document.body.clientHeight - headerHeight - footerHeight - 80 }, } } </script> < style > .assets-table .cell { padding-left: 0 !important; padding-right: 0 !important; } .assets-tables { overflow: unset !important; } .assets-table .Input__inner { border-radius: 0 !important; border: none !important; } .assets-table .Input-number { width: 100% !important; } </ style > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | < template > < div > < Form ref="assetMetaForm" :model="newobj" :rules="rules"> < Row v-for="(definition,di) in assetProductDefinition" :key="di"> < Col v-if="definition.uiType==='input'" span="24"> < Form-item :label="definition.label" :prop="definition.name" v-if="definition.dataType=== 'double'"> < InputNumber v-model="newobj[definition.name]" :placeholder="definition.placeholder"></ InputNumber > </ Form-item > < Form-item :label="definition.label" :prop="definition.name" v-else-if="definition.dataType=== 'integer'"> < InputNumber v-model="newobj[definition.name]" :placeholder="definition.placeholder"></ InputNumber > </ Form-item > < Form-item :label="definition.label" :prop="definition.name" v-else-if="definition.dataType=== 'textarea'"> < Input v-model="newobj[definition.name]" type="textarea" :rows="5" :placeholder="definition.placeholder"></ Input > </ Form-item > < Form-item :label="definition.label" :prop="definition.name" v-else> < Input v-model="newobj[definition.name]" :placeholder="definition.placeholder"></ Input > </ Form-item > </ Col > < Col v-if="definition.uiType==='select'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < select2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]" :url="definition.dctCode"></ select2 > < select2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></ select2 > </ Form-item > </ Col > < Col v-if="definition.uiType==='multiple'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < select2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]" :url="definition.dctCode" multiple></ select2 > < select2 v-else v-model="newobj[definition.name]" :options="definition.dctCode" multiple></ select2 > </ Form-item > </ Col > < Col v-if="definition.uiType==='datepicker'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < DatePicker v-model="newobj[definition.name]" type="date" :placeholder="definition.placeholder" transfer></ DatePicker > </ Form-item > </ Col > < Col v-if="definition.uiType==='datetimepicker'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < DatePicker v-model="newobj[definition.name]" type="datetime" :placeholder="definition.placeholder" transfer></ DatePicker > </ Form-item > </ Col > < Col v-if="definition.uiType==='summernote'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < tinyEditor class="editor" :value="newobj[definition.name]" :showBtn="true" @input="(res)=> newobj[definition.name] = res"></ tinyEditor > </ Form-item > </ Col > < Col v-if="definition.uiType==='radio'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < radio2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]" :url="definition.dctCode"></ radio2 > < radio2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></ radio2 > </ Form-item > </ Col > < Col v-if="definition.uiType==='checkbox'" span="24"> < Form-item :label="definition.label" :prop="definition.name"> < checkbox2 v-if="definition.dataType=== 'udd'" v-model="newobj[definition.name]" :url="definition.dctCode"></ checkbox2 > < checkbox2 v-else v-model="newobj[definition.name]" :options="definition.dctCode"></ checkbox2 > </ Form-item > </ Col > </ Row > < div class="demo-drawer-footer" style="margin-left: 70%"> < Button style="margin-right: 8px" @click="toCannel">取消</ Button > < Button type="primary" :loading="loading" @click="toSubmit">完成填写</ Button > </ div > </ Form > </ div > </ template > < script > import { clone } from '@/libs/tools'; import select2 from '_c/select2/select2'; import select3 from '_c/select2/select3'; import checkbox2 from '_c/checkbox2/checkbox2'; import radio2 from '_c/radio2/radio2'; import tinyEditor from '_c/tinymce'; import toolsView from '_c/toolsView'; import { mapState } from 'vuex' import config from '../config.json' import poptip2 from '_c/poptip2/poptip2'; import { getAssetProductDefinitionList, } from '@api/ams/assetProductDefinition' export default { name: 'meta-datum-editor', components: { select2, checkbox2, radio2, tinyEditor, toolsView, select3, poptip2 }, data () { return { productId: null, detailId: null, rowNum: null, loading: false, config, assetProductDefinition: [], newobj: {}, rules: {}, } }, created () { }, mounted () { }, beforeDestroy () { }, destroyed () { }, computed: { ...mapState('admin/layout', [ 'isMobile' ]), labelWidth () { return this.isMobile ? undefined : 80; }, labelPosition () { return this.isMobile ? 'top' : 'right'; } }, watch: {}, methods: { toCannel () { this.$emit('on-close'); }, toSubmit () { console.log('66666666', this.newobj) this.$refs.assetMetaForm.validate((valid) => { // this.loading = true if (valid) { this.$Modal.confirm({ title: '操作提示', content: '是否填写完成?', okText: '修改', onCancel: () => { }, onOk: () => { this.save(); this.$Message.success('完成填写!') this.$emit('on-close'); } }) } else { this.$Message.error('信息校验失败,请根据页面提示纠正您所填写的信息!') this.loading = false } }) }, save () { const requestData = clone(this.newobj); const entityMetas = []; const des = this.assetProductDefinition; for (let i = 0; i < des.length ; i++) { if (this.newobj[des[i].name] instanceof Array) { requestData[des[i].name] = this.newobj[des[i].name].join(','); } const meta = {}; console.log(des[i], '============des[i]============') // meta.id = des[i].id; meta.metaKey = des[i].name; meta.metaValue = requestData[des[i].name]; meta.metaPriority = des[i].priority; entityMetas.push(meta); } requestData.entityMetas = entityMetas; requestData.productId = this.productId; requestData.detailId = this.detailId; requestData.rowNum = this.rowNum; console.log(entityMetas, requestData, '===========================') const self = this; console.log(self.$emit('getDefinition'), '==============11===========') // self.$emit('meta-event', { data: requestData.entityMetas }) self.$emit('value-changed', requestData); }, loadMetaDataByProId (data) { this.assetProductDefinition = []; this.newobj = {}; this.rules = {}; this.productId = data.productId; this.detailId = data.id; this.getDefinition(data) }, getDefinition (data) { console.log(data, 9999999999) const productId = data.productId; const metas = data.metas; // const detailId = data.id; let params = { p: 0, s: 1000, productId: productId, } getAssetProductDefinitionList(params).then((res) => { let assetProductDefinition = res.data.records // this.assetProductDefinition = assetProductDefinition console.log(metas, assetProductDefinition, 888888888888888) for (let i = 0; i < assetProductDefinition.length ; i++) { const d = assetProductDefinition[i]; if (metas) { for (let j = 0; j < metas.length; j++) { const meta = metas[j]; if (d.name === meta.metaKey) { if (d.uiType === 'multiple' || d.uiType === 'checkbox') { if (meta.metaValue !== null && meta.metaValue !== '') { this.newobj[meta.metaKey] = meta.metaValue.split(','); } else { this.newobj[meta.metaKey] = meta.metaValue; } } else { if (d.dataType === 'integer' || d.dataType === 'double') { this.newobj[meta.metaKey] = meta.metaValue - 0; } else { this.newobj[meta.metaKey] = meta.metaValue; } } } } } console.log(this.newobj, 7777777777777) if (d.required === 1) { let dd = []; if (d.uiType === 'datepicker' || d.uiType === 'datetimepicker') { dd = [{ required: true, type: 'date', message: '请选择时间', trigger: 'change' }]; } else if (d.uiType === 'integer' || d.uiType === 'double') { dd = [{ required: true, message: d.label + '不能为空', trigger: 'change', type: 'number' }]; } else { dd = [{ required: true, message: d.label + '不能为空', trigger: 'blur' }]; } this.rules[d.name] = dd; } this.rowNum = data.index; this.assetProductDefinition.push(d); } }) }, } } </script> < style > </ style > |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?