创建商城模块,完成商品管理模块下的 商品规格键值管理,完成单元测试

This commit is contained in:
chen quan 2022-01-03 17:09:33 +08:00
parent 9a5f085369
commit 022a1046f1
42 changed files with 2618 additions and 5 deletions

40
sql/mall/mall-menu.sql Normal file
View File

@ -0,0 +1,40 @@
-- mall 菜单SQL
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1185, '商品管理', '', 1, 12, 0, '/mall', 'shopping', NULL, 0, '1', '2022-01-02 17:12:50', '1',
'2022-01-02 17:12:50', b'0', 0);
-- mall 商品模块SQL
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1186, '商品规格键管理', '', 2, 0, 1185, 'product-attr-key', '', 'mall/product/attr/index', 0, '',
'2022-01-02 17:13:21', '1', '2022-01-02 17:14:56', b'0', 0);
-- mall 商品模块 attr 权限SQL
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1187, '商品规格键查询', 'mall:product-attr-key:query', 3, 1, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
'2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1188, '商品规格键创建', 'mall:product-attr-key:create', 3, 2, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
'2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1189, '商品规格键更新', 'mall:product-attr-key:update', 3, 3, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
'2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1190, '商品规格键删除', 'mall:product-attr-key:delete', 3, 4, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
'2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
`deleted`, `tenant_id`)
VALUES (1191, '商品规格键导出', 'mall:product-attr-key:export', 3, 5, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
'2022-01-02 17:13:21', b'0', 0);

View File

@ -0,0 +1,92 @@
/*
Navicat Premium Data Transfer
Source Server : 阿里云数据库
Source Server Type : MySQL
Source Server Version : 80018
Source Host : rm-j6cxl87683w973f78ho.mysql.rds.aliyuncs.com:3306
Source Schema : ruoyi-vue-pro
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 03/01/2022 16:07:09
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for mall_product_attr_key
-- ----------------------------
DROP TABLE IF EXISTS `mall_product_attr_key`;
CREATE TABLE `mall_product_attr_key` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规格键编号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格键名称',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态\n *\n * 1-开启\n * 2-禁用',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格键';
-- ----------------------------
-- Records of mall_product_attr_key
-- ----------------------------
BEGIN;
INSERT INTO `mall_product_attr_key` VALUES (1, '手机型号2', 0, '1', '2022-01-02 17:27:54', '1', '2022-01-02 17:28:01', b'1');
INSERT INTO `mall_product_attr_key` VALUES (2, '手机型号', 0, '1', '2022-01-02 17:28:08', '1', '2022-01-02 19:01:34', b'0');
INSERT INTO `mall_product_attr_key` VALUES (3, '衬衫', 0, '1', '2022-01-02 19:03:00', '1', '2022-01-02 19:03:00', b'0');
INSERT INTO `mall_product_attr_key` VALUES (4, '无用的', 0, '1', '2022-01-03 15:50:08', '1', '2022-01-03 15:50:11', b'1');
COMMIT;
-- ----------------------------
-- Table structure for mall_product_attr_value
-- ----------------------------
DROP TABLE IF EXISTS `mall_product_attr_value`;
CREATE TABLE `mall_product_attr_value` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规格值编号',
`attr_key_id` bigint(20) NOT NULL COMMENT '规格键编号',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格值名字',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格值';
-- ----------------------------
-- Records of mall_product_attr_value
-- ----------------------------
BEGIN;
INSERT INTO `mall_product_attr_value` VALUES (1, 2, 'iPhone 13 Pro', 0, '1', '2022-01-03 11:13:11', '1', '2022-01-03 11:13:37', b'0');
INSERT INTO `mall_product_attr_value` VALUES (2, 2, 'iPhone 13', 0, '1', '2022-01-03 11:13:46', '1', '2022-01-03 11:56:36', b'0');
INSERT INTO `mall_product_attr_value` VALUES (3, 2, 'iPhone 13 Pro Max', 0, '1', '2022-01-03 11:13:58', '1', '2022-01-03 14:55:56', b'0');
INSERT INTO `mall_product_attr_value` VALUES (4, 3, '连衣裙', 0, '1', '2022-01-03 11:51:42', '1', '2022-01-03 11:51:42', b'0');
INSERT INTO `mall_product_attr_value` VALUES (5, 2, '皮衣', 0, '1', '2022-01-03 11:56:53', '1', '2022-01-03 11:57:05', b'1');
INSERT INTO `mall_product_attr_value` VALUES (6, 3, '大一', 0, '1', '2022-01-03 11:57:14', '1', '2022-01-03 11:57:14', b'0');
INSERT INTO `mall_product_attr_value` VALUES (7, 3, '紫色', 1, '1', '2022-01-03 11:57:24', '1', '2022-01-03 15:38:36', b'0');
INSERT INTO `mall_product_attr_value` VALUES (8, 2, 'XiaoMi 12 Pro', 0, '1', '2022-01-03 11:57:34', '1', '2022-01-03 14:50:36', b'0');
INSERT INTO `mall_product_attr_value` VALUES (9, 3, 'BUG了', 0, '1', '2022-01-03 11:57:53', '1', '2022-01-03 14:55:32', b'0');
INSERT INTO `mall_product_attr_value` VALUES (10, 3, '123', 0, '1', '2022-01-03 14:00:34', '1', '2022-01-03 14:04:33', b'1');
INSERT INTO `mall_product_attr_value` VALUES (11, 2, '123', 1, '1', '2022-01-03 14:00:57', '1', '2022-01-03 14:50:41', b'1');
INSERT INTO `mall_product_attr_value` VALUES (12, 3, '毛衣', 0, '1', '2022-01-03 14:55:21', '1', '2022-01-03 15:38:33', b'0');
INSERT INTO `mall_product_attr_value` VALUES (13, 2, '乌鱼子', 1, '1', '2022-01-03 14:55:43', '1', '2022-01-03 14:55:43', b'0');
INSERT INTO `mall_product_attr_value` VALUES (14, 2, 'vivo 12', 0, '1', '2022-01-03 14:57:49', '1', '2022-01-03 14:57:49', b'0');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1185, '商品管理', '', 1, 12, 0, '/mall', 'shopping', NULL, 0, '1', '2022-01-02 17:12:50', '1', '2022-01-02 17:12:50', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1186, '商品规格键管理', '', 2, 0, 1185, 'product-attr-key', '', 'mall/product/attr/index', 0, '', '2022-01-02 17:13:21', '1', '2022-01-02 17:14:56', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1187, '商品规格键查询', 'mall:product-attr-key:query', 3, 1, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1188, '商品规格键创建', 'mall:product-attr-key:create', 3, 2, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1189, '商品规格键更新', 'mall:product-attr-key:update', 3, 3, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1190, '商品规格键删除', 'mall:product-attr-key:delete', 3, 4, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1191, '商品规格键导出', 'mall:product-attr-key:export', 3, 5, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);

View File

@ -0,0 +1,120 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrKeyConvert;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
/**
* @author aquan
*/
@Api(tags = "商品规格键")
@RestController
@RequestMapping("/mall/product-attr-key")
@Validated
public class MallProductAttrKeyController {
@Resource
private MallProductAttrKeyService productAttrKeyService;
@PostMapping("/create")
@ApiOperation("创建商品规格键")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:create')")
public CommonResult<Long> createProductAttrKey(@Valid @RequestBody MallProductAttrKeyCreateReqVO createReqVO) {
return success(productAttrKeyService.createProductAttrKey(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新商品规格键")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
public CommonResult<Boolean> updateProductAttrKey(@Valid @RequestBody MallProductAttrKeyUpdateReqVO updateReqVO) {
productAttrKeyService.updateProductAttrKey(updateReqVO);
return success(true);
}
@PutMapping("/update-status")
@ApiOperation("修改商品规格键状态")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
public CommonResult<Boolean> updateProductAttrStatus(@Valid @RequestBody MallProductAttrKeyUpdateStatusReqVO reqVO) {
productAttrKeyService.updateProductAttrKeyStatus(reqVO);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除商品规格键")
@ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:delete')")
public CommonResult<Boolean> deleteProductAttrKey(@RequestParam("id") Long id) {
productAttrKeyService.deleteProductAttrKey(id);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得商品规格键")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<MallProductAttrKeyRespVO> getProductAttrKey(@RequestParam("id") Long id) {
MallProductAttrKeyDO productAttrKey = productAttrKeyService.getProductAttrKey(id);
return success(MallProductAttrKeyConvert.INSTANCE.convert(productAttrKey));
}
@GetMapping("/list")
@ApiOperation("获得商品规格键列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<List<MallProductAttrKeyRespVO>> getProductAttrKeyList(
@RequestParam("ids") Collection<Long> ids) {
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(ids);
return success(MallProductAttrKeyConvert.INSTANCE.convertList(list));
}
@GetMapping("/list-all-simple")
@ApiOperation(value = "获取全部的商品规格键")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<List<MallProductAttrKeySimpleRespVO>> getAttrKeySimpleList() {
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList();
return success(MallProductAttrKeyConvert.INSTANCE.convertSimpleList(list));
}
@GetMapping("/page")
@ApiOperation("获得商品规格键分页")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<PageResult<MallProductAttrKeyRespVO>> getProductAttrKeyPage(
@Valid MallProductAttrKeyPageReqVO pageVO) {
PageResult<MallProductAttrKeyDO> pageResult = productAttrKeyService.getProductAttrKeyPage(pageVO);
return success(MallProductAttrKeyConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出商品规格键 Excel")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:export')")
@OperateLog(type = EXPORT)
public void exportProductAttrKeyExcel(@Valid MallProductAttrKeyExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(exportReqVO);
// 导出 Excel
List<MallProductAttrKeyExcelVO> datas = MallProductAttrKeyConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "商品规格键.xls", "数据", MallProductAttrKeyExcelVO.class, datas);
}
}

View File

@ -0,0 +1,127 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrValueConvert;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrValueService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
/**
* @author aquan
*/
@Api(tags = "商品规格值")
@RestController
@RequestMapping("/mall/product-attr-value")
@Validated
public class MallProductAttrValueController {
@Resource
private MallProductAttrValueService productAttrValueService;
@Resource
private MallProductAttrKeyService productAttrKeyService;
@PostMapping("/create")
@ApiOperation("创建商品规格值")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:create')")
public CommonResult<Long> createProductAttrValue(@Valid @RequestBody MallProductAttrValueCreateReqVO createReqVO) {
return success(productAttrValueService.createProductAttrValue(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新商品规格值")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
public CommonResult<Boolean> updateProductAttrValue(
@Valid @RequestBody MallProductAttrValueUpdateReqVO updateReqVO) {
productAttrValueService.updateProductAttrValue(updateReqVO);
return success(true);
}
@PutMapping("/update-status")
@ApiOperation("修改商品规格值状态")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
public CommonResult<Boolean> updateProductAttrStatus(
@Valid @RequestBody MallProductAttrValueUpdateStatusReqVO reqVO) {
productAttrValueService.updateProductAttrKeyStatus(reqVO);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除商品规格值")
@ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:delete')")
public CommonResult<Boolean> deleteProductAttrValue(@RequestParam("id") Long id) {
productAttrValueService.deleteProductAttrValue(id);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得商品规格值")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<MallProductAttrValueRespVO> getProductAttrValue(@RequestParam("id") Long id) {
MallProductAttrValueDO productAttrValue = productAttrValueService.getProductAttrValue(id);
return success(MallProductAttrValueConvert.INSTANCE.convert(productAttrValue));
}
@GetMapping("/list")
@ApiOperation("获得商品规格值列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<List<MallProductAttrValueRespVO>> getProductAttrValueList(
@RequestParam("ids") Collection<Long> ids) {
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(ids);
return success(MallProductAttrValueConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@ApiOperation("获得商品规格值分页")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
public CommonResult<PageResult<MallProductAttrValueRespVO>> getProductAttrValuePage(
@Valid MallProductAttrValuePageReqVO pageVO) {
PageResult<MallProductAttrValueDO> pageResult = productAttrValueService.getProductAttrValuePage(pageVO);
return success(MallProductAttrValueConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出商品规格值 Excel")
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:export')")
@OperateLog(type = EXPORT)
public void exportProductAttrValueExcel(@Valid MallProductAttrValueExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
// 数据处理
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(exportReqVO);
List<MallProductAttrValueExcelVO> datas = MallProductAttrValueConvert.INSTANCE.convertList02(list);
Map<Long, MallProductAttrKeyDO> productAttrKeyMap = productAttrKeyService
.getProductAttrKeyMap(CollectionUtils.convertList(list, MallProductAttrValueDO::getAttrKeyId));
datas.forEach(c -> {
c.setAttrKeyName(productAttrKeyMap.get(c.getAttrKeyId()).getName());
});
ExcelUtils.write(response, "商品规格值.xls", "数据", MallProductAttrValueExcelVO.class, datas);
}
}

View File

@ -0,0 +1,25 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 商品规格键 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*
* @author aquan
*/
@Data
public class MallProductAttrKeyBaseVO {
@ApiModelProperty(value = "规格键名称", required = true)
@NotNull(message = "规格键名称不能为空")
private String name;
@ApiModelProperty(value = "状态", required = true)
@NotNull(message = "状态")
private Integer status;
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import lombok.*;
import io.swagger.annotations.*;
/**
* @author aquan
*/
@ApiModel("商品规格键创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrKeyCreateReqVO extends MallProductAttrKeyBaseVO {
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author aquan
*/
@Data
public class MallProductAttrKeyExcelVO {
@ExcelProperty("规格键编号")
private Long id;
@ExcelProperty("规格键名称")
private String name;
@DictFormat("sys_common_status")
@ExcelProperty(value = "状态", converter = DictConvert.class)
private Integer status;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @author aquan
*/
@ApiModel(value = "商品规格键 Excel 导出 Request VO", description = "参数和 MallProductAttrKeyPageReqVO 是一致的")
@Data
public class MallProductAttrKeyExportReqVO {
@ApiModelProperty(value = "规格键名称")
private String name;
@ApiModelProperty(value = "状态")
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @author aquan
*/
@ApiModel("商品规格键分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrKeyPageReqVO extends PageParam {
@ApiModelProperty(value = "规格键名称")
private String name;
@ApiModelProperty(value = "状态")
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
/**
* @author aquan
*/
@ApiModel("商品规格键 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrKeyRespVO extends MallProductAttrKeyBaseVO {
@ApiModelProperty(value = "规格键编号", required = true)
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author aquan
*/
@Data
@ApiModel("商品规格键精简 Response VO")
public class MallProductAttrKeySimpleRespVO {
@ApiModelProperty(value = "商品规格键ID")
private Long id;
@ApiModelProperty(value = "规格键名称", required = true)
private String name;
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
/**
* @author aquan
*/
@ApiModel("商品规格键更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrKeyUpdateReqVO extends MallProductAttrKeyBaseVO {
@ApiModelProperty(value = "规格键编号", required = true)
@NotNull(message = "规格键编号不能为空")
private Long id;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author aquan
*/
@ApiModel("修改商品规格键状态 Request VO")
@Data
public class MallProductAttrKeyUpdateStatusReqVO {
@ApiModelProperty(value = "规格键编号", required = true, example = "1024")
@NotNull(message = "规格键编号不能为空")
private Long id;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
@NotNull(message = "状态不能为空")
private Integer status;
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 商品规格值 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*
* @author aquan
*/
@Data
public class MallProductAttrValueBaseVO {
@ApiModelProperty(value = "规格键编号", required = true)
@NotNull(message = "规格键编号不能为空")
private Long attrKeyId;
@ApiModelProperty(value = "规格值名字", required = true)
@NotNull(message = "规格值名字不能为空")
private String name;
@ApiModelProperty(value = "状态", required = true)
@NotNull(message = "状态不能为空")
private Integer status;
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* @author aquan
*/
@ApiModel("商品规格值创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrValueCreateReqVO extends MallProductAttrValueBaseVO {
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 商品规格值 Excel VO
*
* @author aquan
*/
@Data
public class MallProductAttrValueExcelVO {
@ExcelProperty("规格值编号")
private Long id;
/**
* 规格键编号
*/
@ExcelIgnore
private Long attrKeyId;
@ExcelProperty("规格键名称")
private String attrKeyName;
@ExcelProperty("规格值名字")
private String name;
@DictFormat("sys_common_status")
@ExcelProperty(value = "状态", converter = DictConvert.class)
private Integer status;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @author aquan
*/
@ApiModel(value = "商品规格值 Excel 导出 Request VO", description = "参数和 MallProductAttrValuePageReqVO 是一致的")
@Data
public class MallProductAttrValueExportReqVO {
@ApiModelProperty(value = "规格键编号")
private Long attrKeyId;
@ApiModelProperty(value = "规格值名字")
private String name;
@ApiModelProperty(value = "状态")
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @author aquan
*/
@ApiModel("商品规格值分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrValuePageReqVO extends PageParam {
@ApiModelProperty(value = "规格键编号")
private Long attrKeyId;
@ApiModelProperty(value = "规格值名字")
private String name;
@ApiModelProperty(value = "状态")
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
/**
* @author aquan
*/
@ApiModel("商品规格值 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrValueRespVO extends MallProductAttrValueBaseVO {
@ApiModelProperty(value = "规格值编号", required = true)
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
/**
* @author aquan
*/
@ApiModel("商品规格值更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MallProductAttrValueUpdateReqVO extends MallProductAttrValueBaseVO {
@ApiModelProperty(value = "规格值编号", required = true)
@NotNull(message = "规格值编号不能为空")
private Long id;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author aquan
*/
@ApiModel("修改商品规格值状态 Request VO")
@Data
public class MallProductAttrValueUpdateStatusReqVO {
@ApiModelProperty(value = "规格值编号", required = true, example = "1024")
@NotNull(message = "规格值编号不能为空")
private Long id;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
@NotNull(message = "状态不能为空")
private Integer status;
}

View File

@ -0,0 +1,37 @@
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 商品规格键 Convert
*
* @author aquan
*/
@Mapper
public interface MallProductAttrKeyConvert {
MallProductAttrKeyConvert INSTANCE = Mappers.getMapper(MallProductAttrKeyConvert.class);
MallProductAttrKeyDO convert(MallProductAttrKeyCreateReqVO bean);
MallProductAttrKeyDO convert(MallProductAttrKeyUpdateStatusReqVO bean);
MallProductAttrKeyDO convert(MallProductAttrKeyUpdateReqVO bean);
MallProductAttrKeyRespVO convert(MallProductAttrKeyDO bean);
List<MallProductAttrKeyRespVO> convertList(List<MallProductAttrKeyDO> list);
List<MallProductAttrKeySimpleRespVO> convertSimpleList(List<MallProductAttrKeyDO> list);
PageResult<MallProductAttrKeyRespVO> convertPage(PageResult<MallProductAttrKeyDO> page);
List<MallProductAttrKeyExcelVO> convertList02(List<MallProductAttrKeyDO> list);
}

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 商品规格值 Convert
*
* @author aquan
*/
@Mapper
public interface MallProductAttrValueConvert {
MallProductAttrValueConvert INSTANCE = Mappers.getMapper(MallProductAttrValueConvert.class);
MallProductAttrValueDO convert(MallProductAttrValueCreateReqVO bean);
MallProductAttrValueDO convert(MallProductAttrValueUpdateReqVO bean);
MallProductAttrValueRespVO convert(MallProductAttrValueDO bean);
MallProductAttrValueDO convert(MallProductAttrValueUpdateStatusReqVO bean);
List<MallProductAttrValueRespVO> convertList(List<MallProductAttrValueDO> list);
PageResult<MallProductAttrValueRespVO> convertPage(PageResult<MallProductAttrValueDO> page);
List<MallProductAttrValueExcelVO> convertList02(List<MallProductAttrValueDO> list);
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 商品规格键 DO
*
* @author aquan
*/
@TableName("mall_product_attr_key")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MallProductAttrKeyDO extends BaseDO {
/**
* 规格键编号
*/
@TableId
private Long id;
/**
* 规格键名称
*/
private String name;
/**
* 状态
*/
private Integer status;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 商品规格值 DO
*
* @author aquan
*/
@TableName("mall_product_attr_value")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MallProductAttrValueDO extends BaseDO {
/**
* 规格值编号
*/
@TableId
private Long id;
/**
* 规格键编号
*/
private Long attrKeyId;
/**
* 规格值名字
*/
private String name;
/**
* 状态
*/
private Integer status;
}

View File

@ -0,0 +1,37 @@
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyExportReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 商品规格键 Mapper
*
* @author aquan
*/
@Mapper
public interface MallProductAttrKeyMapper extends BaseMapperX<MallProductAttrKeyDO> {
default PageResult<MallProductAttrKeyDO> selectPage(MallProductAttrKeyPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<MallProductAttrKeyDO>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id"));
}
default List<MallProductAttrKeyDO> selectList(MallProductAttrKeyExportReqVO reqVO) {
return selectList(new QueryWrapperX<MallProductAttrKeyDO>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id"));
}
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueExportReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValuePageReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 商品规格值 Mapper
*
* @author aquan
*/
@Mapper
public interface MallProductAttrValueMapper extends BaseMapperX<MallProductAttrValueDO> {
default PageResult<MallProductAttrValueDO> selectPage(MallProductAttrValuePageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<MallProductAttrValueDO>()
.eqIfPresent("attr_key_id", reqVO.getAttrKeyId())
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id"));
}
default List<MallProductAttrValueDO> selectList(MallProductAttrValueExportReqVO reqVO) {
return selectList(new QueryWrapperX<MallProductAttrValueDO>()
.eqIfPresent("attr_key_id", reqVO.getAttrKeyId())
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id"));
}
default Long selectCount(Long attrKeyId) {
return selectCount(new LambdaQueryWrapper<MallProductAttrValueDO>()
.eq(MallProductAttrValueDO::getAttrKeyId, attrKeyId));
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.adminserver.modules.mall.enums;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* mall 商城模块错误码
*
* @author aquan
*/
public interface MallErrorCodeConstants {
/**
* ========== 商品规格模块 1-008-000-000 ==========
*/
ErrorCode PRODUCT_ATTR_KEY_NOT_EXISTS = new ErrorCode(1008000001, "商品规格键不存在");
ErrorCode PRODUCT_ATTR_VALUE_NOT_EXISTS = new ErrorCode(1008000002, "商品规格值不存在");
ErrorCode PRODUCT_ATTR_KEY_EXIST_VALUES_CANT_DELETE = new ErrorCode(1008000002, "商品规格键存在商品规格值无法删除");
}

View File

@ -0,0 +1,99 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import javax.validation.Valid;
import java.util.*;
/**
* 商品规格键 Service 接口
*
* @author aquan
*/
public interface MallProductAttrKeyService {
/**
* 创建商品规格键
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createProductAttrKey(@Valid MallProductAttrKeyCreateReqVO createReqVO);
/**
* 更新商品规格键
*
* @param updateReqVO 更新信息
*/
void updateProductAttrKey(@Valid MallProductAttrKeyUpdateReqVO updateReqVO);
/**
* 更新商品规格键状态
*
* @param updateStatusReqVO 更新状态
*/
void updateProductAttrKeyStatus(@Valid MallProductAttrKeyUpdateStatusReqVO updateStatusReqVO);
/**
* 删除商品规格键
*
* @param id 编号
*/
void deleteProductAttrKey(Long id);
/**
* 获得商品规格键
*
* @param id 编号
* @return 商品规格键
*/
MallProductAttrKeyDO getProductAttrKey(Long id);
/**
* 获得商品规格键列表
*
* @param ids 编号
* @return 商品规格键列表
*/
List<MallProductAttrKeyDO> getProductAttrKeyList(Collection<Long> ids);
/**
* 获得商品规格键分页
*
* @param pageReqVO 分页查询
* @return 商品规格键分页
*/
PageResult<MallProductAttrKeyDO> getProductAttrKeyPage(MallProductAttrKeyPageReqVO pageReqVO);
/**
* 获得商品规格键列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 商品规格键列表
*/
List<MallProductAttrKeyDO> getProductAttrKeyList(MallProductAttrKeyExportReqVO exportReqVO);
/**
* 获得商品规格键列表
*
* @return 商品规格键列表
*/
List<MallProductAttrKeyDO> getProductAttrKeyList();
/**
* 根据 商品规格件 ID 集合 获取 Map 数据列表
*
* @param keyIdList 商品规格件 ID 集合
* @return Map 数据列表
*/
default Map<Long, MallProductAttrKeyDO> getProductAttrKeyMap(Collection<Long> keyIdList) {
List<MallProductAttrKeyDO> list = this.getProductAttrKeyList(keyIdList);
if (list.size() < 1) {
return Collections.emptyMap();
}
return CollectionUtils.convertMap(list, MallProductAttrKeyDO::getId);
}
}

View File

@ -0,0 +1,80 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
* 商品规格值 Service 接口
*
* @author aquan
*/
public interface MallProductAttrValueService {
/**
* 创建商品规格值
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createProductAttrValue(@Valid MallProductAttrValueCreateReqVO createReqVO);
/**
* 更新商品规格值
*
* @param updateReqVO 更新信息
*/
void updateProductAttrValue(@Valid MallProductAttrValueUpdateReqVO updateReqVO);
/**
* 更新商品规格值状态
*
* @param updateStatusReqVO 更新状态
*/
void updateProductAttrKeyStatus(@Valid MallProductAttrValueUpdateStatusReqVO updateStatusReqVO);
/**
* 删除商品规格值
*
* @param id 编号
*/
void deleteProductAttrValue(Long id);
/**
* 获得商品规格值
*
* @param id 编号
* @return 商品规格值
*/
MallProductAttrValueDO getProductAttrValue(Long id);
/**
* 获得商品规格值列表
*
* @param ids 编号
* @return 商品规格值列表
*/
List<MallProductAttrValueDO> getProductAttrValueList(Collection<Long> ids);
/**
* 获得商品规格值分页
*
* @param pageReqVO 分页查询
* @return 商品规格值分页
*/
PageResult<MallProductAttrValueDO> getProductAttrValuePage(MallProductAttrValuePageReqVO pageReqVO);
/**
* 获得商品规格值列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 商品规格值列表
*/
List<MallProductAttrValueDO> getProductAttrValueList(MallProductAttrValueExportReqVO exportReqVO);
}

View File

@ -0,0 +1,110 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrKeyConvert;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrKeyMapper;
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 商品规格键 Service 实现类
*
* @author aquan
*/
@Service
@Validated
public class MallProductAttrKeyServiceImpl implements MallProductAttrKeyService {
@Resource
private MallProductAttrKeyMapper productAttrKeyMapper;
@Resource
private MallProductAttrValueMapper productAttrValueMapper;
@Override
public Long createProductAttrKey(MallProductAttrKeyCreateReqVO createReqVO) {
// 插入
MallProductAttrKeyDO productAttrKey = MallProductAttrKeyConvert.INSTANCE.convert(createReqVO);
productAttrKeyMapper.insert(productAttrKey);
// 返回
return productAttrKey.getId();
}
@Override
public void updateProductAttrKey(MallProductAttrKeyUpdateReqVO updateReqVO) {
// 校验存在
this.validateProductAttrKeyExists(updateReqVO.getId());
// 更新
MallProductAttrKeyDO updateObj = MallProductAttrKeyConvert.INSTANCE.convert(updateReqVO);
productAttrKeyMapper.updateById(updateObj);
}
/**
* 更新商品规格键状态
*
* @param updateStatusReqVO 更新状态
*/
@Override
public void updateProductAttrKeyStatus(MallProductAttrKeyUpdateStatusReqVO updateStatusReqVO) {
// 校验存在
this.validateProductAttrKeyExists(updateStatusReqVO.getId());
productAttrKeyMapper.updateById(MallProductAttrKeyConvert.INSTANCE.convert(updateStatusReqVO));
}
@Override
public void deleteProductAttrKey(Long id) {
// 校验存在
this.validateProductAttrKeyExists(id);
// 校验如果商品规格键下有值则无法删除
if (productAttrValueMapper.selectCount(id) > 0) {
throw exception(PRODUCT_ATTR_KEY_EXIST_VALUES_CANT_DELETE);
}
// 删除
productAttrKeyMapper.deleteById(id);
}
private void validateProductAttrKeyExists(Long id) {
if (productAttrKeyMapper.selectById(id) == null) {
throw exception(PRODUCT_ATTR_KEY_NOT_EXISTS);
}
}
@Override
public MallProductAttrKeyDO getProductAttrKey(Long id) {
return productAttrKeyMapper.selectById(id);
}
@Override
public List<MallProductAttrKeyDO> getProductAttrKeyList(Collection<Long> ids) {
return productAttrKeyMapper.selectBatchIds(ids);
}
@Override
public PageResult<MallProductAttrKeyDO> getProductAttrKeyPage(MallProductAttrKeyPageReqVO pageReqVO) {
return productAttrKeyMapper.selectPage(pageReqVO);
}
@Override
public List<MallProductAttrKeyDO> getProductAttrKeyList(MallProductAttrKeyExportReqVO exportReqVO) {
return productAttrKeyMapper.selectList(exportReqVO);
}
@Override
public List<MallProductAttrKeyDO> getProductAttrKeyList() {
return productAttrKeyMapper.selectList();
}
}

View File

@ -0,0 +1,95 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrValueConvert;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrValueService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_VALUE_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 商品规格值 Service 实现类
*
* @author aquan
*/
@Service
@Validated
public class MallProductAttrValueServiceImpl implements MallProductAttrValueService {
@Resource
private MallProductAttrValueMapper productAttrValueMapper;
@Override
public Long createProductAttrValue(MallProductAttrValueCreateReqVO createReqVO) {
// 插入
MallProductAttrValueDO productAttrValue = MallProductAttrValueConvert.INSTANCE.convert(createReqVO);
productAttrValueMapper.insert(productAttrValue);
// 返回
return productAttrValue.getId();
}
@Override
public void updateProductAttrValue(MallProductAttrValueUpdateReqVO updateReqVO) {
// 校验存在
this.validateProductAttrValueExists(updateReqVO.getId());
// 更新
MallProductAttrValueDO updateObj = MallProductAttrValueConvert.INSTANCE.convert(updateReqVO);
productAttrValueMapper.updateById(updateObj);
}
/**
* 更新商品规格值状态
*
* @param updateStatusReqVO 更新状态
*/
@Override
public void updateProductAttrKeyStatus(MallProductAttrValueUpdateStatusReqVO updateStatusReqVO) {
this.validateProductAttrValueExists(updateStatusReqVO.getId());
productAttrValueMapper.updateById(MallProductAttrValueConvert.INSTANCE.convert(updateStatusReqVO));
}
@Override
public void deleteProductAttrValue(Long id) {
// 校验存在
this.validateProductAttrValueExists(id);
// todo @aquan 后续优化有商品使用当前值的时候无法删除
// 删除
productAttrValueMapper.deleteById(id);
}
private void validateProductAttrValueExists(Long id) {
if (productAttrValueMapper.selectById(id) == null) {
throw exception(PRODUCT_ATTR_VALUE_NOT_EXISTS);
}
}
@Override
public MallProductAttrValueDO getProductAttrValue(Long id) {
return productAttrValueMapper.selectById(id);
}
@Override
public List<MallProductAttrValueDO> getProductAttrValueList(Collection<Long> ids) {
return productAttrValueMapper.selectBatchIds(ids);
}
@Override
public PageResult<MallProductAttrValueDO> getProductAttrValuePage(MallProductAttrValuePageReqVO pageReqVO) {
return productAttrValueMapper.selectPage(pageReqVO);
}
@Override
public List<MallProductAttrValueDO> getProductAttrValueList(MallProductAttrValueExportReqVO exportReqVO) {
return productAttrValueMapper.selectList(exportReqVO);
}
}

View File

@ -1,10 +1,9 @@
package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 支付应用信息 Excel VO

View File

@ -0,0 +1,173 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
import cn.hutool.core.util.RandomUtil;
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyExportReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrKeyMapper;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductAttrKeyServiceImpl;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_KEY_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.*;
/**
* {@link MallProductAttrKeyServiceImpl} 的单元测试类
*
* @author aquan
*/
@Import(MallProductAttrKeyServiceImpl.class)
public class MallProductAttrKeyServiceTest extends BaseDbUnitTest {
@Resource
private MallProductAttrKeyServiceImpl productAttrKeyService;
@Resource
private MallProductAttrKeyMapper productAttrKeyMapper;
@Test
public void testCreateProductAttrKey_success() {
// 准备参数
MallProductAttrKeyCreateReqVO reqVO = randomPojo(MallProductAttrKeyCreateReqVO.class,o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
// 调用
Long productAttrKeyId = productAttrKeyService.createProductAttrKey(reqVO);
// 断言
assertNotNull(productAttrKeyId);
// 校验记录的属性是否正确
MallProductAttrKeyDO productAttrKey = productAttrKeyMapper.selectById(productAttrKeyId);
assertPojoEquals(reqVO, productAttrKey);
}
@Test
public void testUpdateProductAttrKey_success() {
// mock 数据
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class,o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
productAttrKeyMapper.insert(dbProductAttrKey);// @Sql: 先插入出一条存在的数据
// 准备参数
MallProductAttrKeyUpdateReqVO reqVO = randomPojo(MallProductAttrKeyUpdateReqVO.class, o -> {
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setId(dbProductAttrKey.getId()); // 设置更新的 ID
});
// 调用
productAttrKeyService.updateProductAttrKey(reqVO);
// 校验是否更新正确
MallProductAttrKeyDO productAttrKey = productAttrKeyMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, productAttrKey);
}
@Test
public void testUpdateProductAttrKey_notExists() {
// 准备参数
MallProductAttrKeyUpdateReqVO reqVO = randomPojo(MallProductAttrKeyUpdateReqVO.class,o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
// 调用, 并断言异常
assertServiceException(() -> productAttrKeyService.updateProductAttrKey(reqVO), PRODUCT_ATTR_KEY_NOT_EXISTS);
}
@Test
public void testDeleteProductAttrKey_success() {
// mock 数据
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class,o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
productAttrKeyMapper.insert(dbProductAttrKey);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbProductAttrKey.getId();
// 调用
productAttrKeyService.deleteProductAttrKey(id);
// 校验数据不存在了
assertNull(productAttrKeyMapper.selectById(id));
}
@Test
public void testDeleteProductAttrKey_notExists() {
// 准备参数
// mock 数据
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> productAttrKeyService.deleteProductAttrKey(id), PRODUCT_ATTR_KEY_NOT_EXISTS);
}
@Test // TODO 请修改 null 为需要的值
public void testGetProductAttrKeyPage() {
// mock 数据
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class, o -> { // 等会查询到
o.setName("电子产品");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2022, 1, 3));
});
productAttrKeyMapper.insert(dbProductAttrKey);
// 测试 name 不匹配
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setName("服装")));
// 测试 status 不匹配
productAttrKeyMapper.insert(
cloneIgnoreId(dbProductAttrKey, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setCreateTime(buildTime(2021, 11, 3))));
// 准备参数
MallProductAttrKeyPageReqVO reqVO = new MallProductAttrKeyPageReqVO();
reqVO.setName("电子产品");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
// 调用
PageResult<MallProductAttrKeyDO> pageResult = productAttrKeyService.getProductAttrKeyPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbProductAttrKey, pageResult.getList().get(0));
}
@Test // TODO 请修改 null 为需要的值
public void testGetProductAttrKeyList() {
// mock 数据
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class, o -> { // 等会查询到
o.setName("电子产品");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2022, 1, 3));
});
productAttrKeyMapper.insert(dbProductAttrKey);
// 测试 name 不匹配
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setName("服装")));
// 测试 status 不匹配
productAttrKeyMapper.insert(
cloneIgnoreId(dbProductAttrKey, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setCreateTime(buildTime(2021, 11, 3))));
// 准备参数
MallProductAttrKeyExportReqVO reqVO = new MallProductAttrKeyExportReqVO();
reqVO.setName("电子产品");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
// 调用
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbProductAttrKey, list.get(0));
}
}

View File

@ -0,0 +1,183 @@
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
import cn.hutool.core.util.RandomUtil;
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueExportReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValuePageReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductAttrValueServiceImpl;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_VALUE_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.*;
/**
* {@link MallProductAttrValueServiceImpl} 的单元测试类
*
* @author aquan
*/
@Import(MallProductAttrValueServiceImpl.class)
public class MallProductAttrValueServiceTest extends BaseDbUnitTest {
@Resource
private MallProductAttrValueServiceImpl productAttrValueService;
@Resource
private MallProductAttrValueMapper productAttrValueMapper;
@Test
public void testCreateProductAttrValue_success() {
// 准备参数
MallProductAttrValueCreateReqVO reqVO = randomPojo(MallProductAttrValueCreateReqVO.class, o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
// 调用
Long productAttrValueId = productAttrValueService.createProductAttrValue(reqVO);
// 断言
assertNotNull(productAttrValueId);
// 校验记录的属性是否正确
MallProductAttrValueDO productAttrValue = productAttrValueMapper.selectById(productAttrValueId);
assertPojoEquals(reqVO, productAttrValue);
}
@Test
public void testUpdateProductAttrValue_success() {
// mock 数据
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
productAttrValueMapper.insert(dbProductAttrValue);// @Sql: 先插入出一条存在的数据
// 准备参数
MallProductAttrValueUpdateReqVO reqVO = randomPojo(MallProductAttrValueUpdateReqVO.class, o -> {
o.setStatus(CommonStatusEnum.DISABLE.getStatus());
o.setId(dbProductAttrValue.getId()); // 设置更新的 ID
});
// 调用
productAttrValueService.updateProductAttrValue(reqVO);
// 校验是否更新正确
MallProductAttrValueDO productAttrValue = productAttrValueMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, productAttrValue);
}
@Test
public void testUpdateProductAttrValue_notExists() {
// 准备参数
MallProductAttrValueUpdateReqVO reqVO = randomPojo(MallProductAttrValueUpdateReqVO.class, o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
// 调用, 并断言异常
assertServiceException(() -> productAttrValueService.updateProductAttrValue(reqVO),
PRODUCT_ATTR_VALUE_NOT_EXISTS);
}
@Test
public void testDeleteProductAttrValue_success() {
// mock 数据
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o ->
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
productAttrValueMapper.insert(dbProductAttrValue);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbProductAttrValue.getId();
// 调用
productAttrValueService.deleteProductAttrValue(id);
// 校验数据不存在了
assertNull(productAttrValueMapper.selectById(id));
}
@Test
public void testDeleteProductAttrValue_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> productAttrValueService.deleteProductAttrValue(id), PRODUCT_ATTR_VALUE_NOT_EXISTS);
}
@Test // TODO 请修改 null 为需要的值
public void testGetProductAttrValuePage() {
// mock 数据
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o -> { // 等会查询到
o.setAttrKeyId(1L);
o.setName("海尔笔记本电脑");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2022, 1, 3));
});
productAttrValueMapper.insert(dbProductAttrValue);
// 测试 attrKeyId 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setAttrKeyId(2L)));
// 测试 name 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setName("红双喜乒乓球")));
// 测试 status 不匹配
productAttrValueMapper.insert(
cloneIgnoreId(dbProductAttrValue, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o ->
o.setCreateTime(buildTime(2021, 12, 12))));
// 准备参数
MallProductAttrValuePageReqVO reqVO = new MallProductAttrValuePageReqVO();
reqVO.setAttrKeyId(1L);
reqVO.setName("海尔笔记本电脑");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
// 调用
PageResult<MallProductAttrValueDO> pageResult = productAttrValueService.getProductAttrValuePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbProductAttrValue, pageResult.getList().get(0));
}
@Test // TODO 请修改 null 为需要的值
public void testGetProductAttrValueList() {
// mock 数据
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o -> { // 等会查询到
o.setAttrKeyId(1L);
o.setName("海尔笔记本电脑");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2022, 1, 3));
});
productAttrValueMapper.insert(dbProductAttrValue);
// 测试 attrKeyId 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setAttrKeyId(2L)));
// 测试 name 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setName("红双喜乒乓球")));
// 测试 status 不匹配
productAttrValueMapper.insert(
cloneIgnoreId(dbProductAttrValue, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o ->
o.setCreateTime(buildTime(2021, 12, 12))));
// 准备参数
MallProductAttrValueExportReqVO reqVO = new MallProductAttrValueExportReqVO();
reqVO.setAttrKeyId(1L);
reqVO.setName("海尔笔记本电脑");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
// 调用
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbProductAttrValue, list.get(0));
}
}

View File

@ -31,4 +31,8 @@ DELETE FROM pay_merchant;
DELETE FROM pay_app;
DELETE FROM pay_channel;
DELETE FROM pay_order;
DELETE FROM pay_refund;
DELETE FROM pay_refund;
-- mall 模块
delete from mall_product_attr_key;
delete from mall_product_attr_value;

View File

@ -597,3 +597,30 @@ CREATE TABLE `pay_refund`
PRIMARY KEY ("id")
) COMMENT = '退款订单';
CREATE TABLE `mall_product_attr_key`
(
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
`name` varchar(50) NOT NULL DEFAULT '',
`status` tinyint(4) NOT NULL DEFAULT '1',
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT false,
PRIMARY KEY (`id`)
) COMMENT = '商品规格键';
CREATE TABLE `mall_product_attr_value`
(
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
`attr_key_id` bigint(20) NOT NULL ,
`name` varchar(50) NOT NULL DEFAULT '',
`status` tinyint(4) NOT NULL DEFAULT '1',
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT false,
PRIMARY KEY (`id`)
) COMMENT = '商品规格值';

View File

@ -0,0 +1,75 @@
import request from '@/utils/request'
// 创建商品规格键
export function createProductAttrKey(data) {
return request({
url: '/mall/product-attr-key/create',
method: 'post',
data: data
})
}
// 更新商品规格键
export function updateProductAttrKey(data) {
return request({
url: '/mall/product-attr-key/update',
method: 'put',
data: data
})
}
// 更新商品规格键状态
export function updateProductAttrKeyStatus(id, status) {
const data = {
id,
status
}
return request({
url: '/mall/product-attr-key/update-status',
method: 'put',
data: data
})
}
// 删除商品规格键
export function deleteProductAttrKey(id) {
return request({
url: '/mall/product-attr-key/delete?id=' + id,
method: 'delete'
})
}
// 获得商品规格键
export function getProductAttrKey(id) {
return request({
url: '/mall/product-attr-key/get?id=' + id,
method: 'get'
})
}
// 获得商品规格键分页
export function getProductAttrKeyPage(query) {
return request({
url: '/mall/product-attr-key/page',
method: 'get',
params: query
})
}
// 导出商品规格键 Excel
export function exportProductAttrKeyExcel(query) {
return request({
url: '/mall/product-attr-key/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得所有的商品规格键
export function getAttrKeySimpleList() {
return request({
url: '/mall/product-attr-key/list-all-simple',
method: 'get'
})
}

View File

@ -0,0 +1,67 @@
import request from '@/utils/request'
// 创建商品规格值
export function createProductAttrValue(data) {
return request({
url: '/mall/product-attr-value/create',
method: 'post',
data: data
})
}
// 更新商品规格值
export function updateProductAttrValue(data) {
return request({
url: '/mall/product-attr-value/update',
method: 'put',
data: data
})
}
// 更新商品规格值状态
export function updateProductAttrValueStatus(id, status) {
const data = {
id,
status
}
return request({
url: '/mall/product-attr-value/update-status',
method: 'put',
data: data
})
}
// 删除商品规格值
export function deleteProductAttrValue(id) {
return request({
url: '/mall/product-attr-value/delete?id=' + id,
method: 'delete'
})
}
// 获得商品规格值
export function getProductAttrValue(id) {
return request({
url: '/mall/product-attr-value/get?id=' + id,
method: 'get'
})
}
// 获得商品规格值分页
export function getProductAttrValuePage(query) {
return request({
url: '/mall/product-attr-value/page',
method: 'get',
params: query
})
}
// 导出商品规格值 Excel
export function exportProductAttrValueExcel(query) {
return request({
url: '/mall/product-attr-value/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

View File

@ -98,6 +98,19 @@ export const constantRoutes = [
}
]
},
{
path: '/mall',
component: Layout,
hidden: true,
children: [
{
path: 'product-attr-key/:attrId(\\d+)',
component: (resolve) => require(['@/views/mall/product/attr/attrValue'], resolve),
name: 'AttrValue',
meta: { title: '商品规格值', icon: '' }
}
]
},
{
path: '/job',
component: Layout,

View File

@ -0,0 +1,312 @@
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="规格键" prop="attrKeyId">
<el-select v-model="queryParams.attrKeyId" size="small" filterable placeholder="请选择"
@change="findByAttrKeyIdGetObject(queryParams.attrKeyId);">
<el-option v-for="item in attrKeyList" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="规格值名字" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入规格值名字" clearable size="small"
@keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
:value="parseInt(dict.value)"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['mall:product-attr-key:create']">新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['mall:product-attr-key:export']">导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table-column label="规格值编号" align="center" prop="id"/>
<el-table-column label="规格值名字" align="center" prop="name"/>
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1"
@change="handleStatusChange(scope.row)"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['mall:product-attr-key:update']">修改
</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['mall:product-attr-key:delete']">删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/>
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="规格键名称">
<el-input v-model="this.selectedAttrKeyObject.name" :disabled="true"/>
</el-form-item>
<el-form-item label="规格值名字" prop="name">
<el-input v-model="form.name" placeholder="请输入规格值名字"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
createProductAttrValue,
updateProductAttrValue,
deleteProductAttrValue,
getProductAttrValue,
getProductAttrValuePage,
exportProductAttrValueExcel, updateProductAttrValueStatus
} from "@/api/mall/product/attrValue";
import {getAttrKeySimpleList, getProductAttrKey} from "@/api/mall/product/attrKey";
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
import {SysCommonStatusEnum} from "@/utils/constants";
export default {
name: "AttrValue",
components: {},
data() {
return {
//
loading: true,
//
showSearch: true,
//
total: 0,
//
list: [],
//
title: "",
//
open: false,
dateRangeCreateTime: [],
//
queryParams: {
pageNo: 1,
pageSize: 10,
attrKeyId: null,
name: null,
status: null,
},
//
form: {},
//
rules: {
attrKeyId: [{required: true, message: "规格键编号不能为空", trigger: "blur"}],
name: [{required: true, message: "规格值名字不能为空", trigger: "blur"}],
status: [{required: true, message: "状态不能为空", trigger: "blur"}],
},
// ID
transferAttrKeyId: null,
//
selectedAttrKeyObject: {
id: null,
name: ''
},
//
attrKeyList: null,
//
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
};
},
created() {
this.transferAttrKeyId = this.$route.params && parseInt(this.$route.params.attrId);
this.getAttrKeyAllList();
this.findByAttrKeyIdGetObject(this.transferAttrKeyId);
},
methods: {
/**
* 根据选中的商品规格键 ID 获取对象
*/
findByAttrKeyIdGetObject(attrKeyId) {
getProductAttrKey(attrKeyId).then(response => {
this.selectedAttrKeyObject = response.data;
this.queryParams.attrKeyId = this.selectedAttrKeyObject.id;
this.getList();
})
},
/**
* 查询所有的商品规格键
*/
getAttrKeyAllList() {
getAttrKeySimpleList().then(response => {
this.attrKeyList = response.data;
})
},
/** 查询列表 */
getList() {
this.loading = true;
//
let params = {...this.queryParams};
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
//
getProductAttrValuePage(params).then(response => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
/** 取消按钮 */
cancel() {
this.open = false;
this.reset();
},
/** 表单重置 */
reset() {
this.form = {
id: undefined,
attrKeyId: this.selectedAttrKeyObject.id,
name: undefined,
status: undefined,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeCreateTime = [];
this.resetForm("queryForm");
this.queryParams.attrKeyId = this.transferAttrKeyId;
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加商品规格值";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id;
// this.findByAttrKeyIdGetObject(row.attrKeyId);
getProductAttrValue(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改商品规格值";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (!valid) {
return;
}
//
if (this.form.id != null) {
updateProductAttrValue(this.form).then(response => {
this.msgSuccess("修改成功");
this.open = false;
this.getList();
});
return;
}
//
createProductAttrValue(this.form).then(response => {
this.msgSuccess("新增成功");
this.open = false;
this.getList();
});
});
},
/** 删除按钮操作 */
handleDelete(row) {
const id = row.id;
this.$confirm('是否确认删除商品规格值编号为"' + row.name + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return deleteProductAttrValue(id);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
})
},
/** 导出按钮操作 */
handleExport() {
//
let params = {...this.queryParams};
params.pageNo = undefined;
params.pageSize = undefined;
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
//
this.$confirm('是否确认导出所有商品规格值数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return exportProductAttrValueExcel(params);
}).then(response => {
this.downloadExcel(response, '商品规格值.xls');
})
},
//
handleStatusChange(row) {
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
this.$confirm('确认要"' + text + '""' + row.name + '"当前商品规格吗?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return updateProductAttrValueStatus(row.id, row.status);
}).then(() => {
this.msgSuccess(text + "成功");
}).catch(function () {
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
: SysCommonStatusEnum.ENABLE;
});
},
}
};
</script>

View File

@ -0,0 +1,278 @@
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="规格键名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入规格键名称" clearable size="small"
@keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
:value="parseInt(dict.value)"/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['mall:product-attr-key:create']">新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['mall:product-attr-key:export']">导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" prop="id"/>
<el-table-column label="规格键名称" align="center" prop="name">
<template v-slot="scope">
<router-link :to="'/mall/product-attr-key/' + scope.row.id" class="link-type">
<span>{{ scope.row.name }}</span>
</router-link>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['mall:product-attr-key:update']">修改
</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['mall:product-attr-key:delete']">删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/>
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="规格键名称" prop="name">
<el-input v-model="form.name" placeholder="请输入规格键名称"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
createProductAttrKey,
updateProductAttrKey,
updateProductAttrKeyStatus,
deleteProductAttrKey,
getProductAttrKey,
getProductAttrKeyPage,
exportProductAttrKeyExcel
} from "@/api/mall/product/attrKey";
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
import {SysCommonStatusEnum} from "@/utils/constants";
export default {
name: "ProductAttrKey",
components: {},
data() {
return {
//
loading: true,
//
showSearch: true,
//
total: 0,
//
list: [],
//
title: "",
//
open: false,
dateRangeCreateTime: [],
//
queryParams: {
pageNo: 1,
pageSize: 10,
name: null,
status: null,
},
//
form: {},
//
rules: {
name: [{required: true, message: "规格键名称不能为空", trigger: "blur"}],
status: [{required: true, message: "状态", trigger: "blur"}],
},
//
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
};
},
created() {
this.getList();
},
methods: {
/** 查询列表 */
getList() {
this.loading = true;
//
let params = {...this.queryParams};
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
//
getProductAttrKeyPage(params).then(response => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
/** 取消按钮 */
cancel() {
this.open = false;
this.reset();
},
/** 表单重置 */
reset() {
this.form = {
id: undefined,
name: undefined,
status: undefined,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeCreateTime = [];
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加商品规格键";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id;
getProductAttrKey(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改商品规格键";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (!valid) {
return;
}
//
if (this.form.id != null) {
updateProductAttrKey(this.form).then(response => {
this.msgSuccess("修改成功");
this.open = false;
this.getList();
});
return;
}
//
createProductAttrKey(this.form).then(response => {
this.msgSuccess("新增成功");
this.open = false;
this.getList();
});
});
},
/** 删除按钮操作 */
handleDelete(row) {
const id = row.id;
this.$confirm('是否确认删除商品规格键编号为"' + id + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return deleteProductAttrKey(id);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
})
},
/** 导出按钮操作 */
handleExport() {
//
let params = {...this.queryParams};
params.pageNo = undefined;
params.pageSize = undefined;
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
//
this.$confirm('是否确认导出所有商品规格键数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return exportProductAttrKeyExcel(params);
}).then(response => {
this.downloadExcel(response, '商品规格键.xls');
})
},
//
handleStatusChange(row) {
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
this.$confirm('确认要"' + text + '""' + row.name + '"当前商品规格吗?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function() {
return updateProductAttrKeyStatus(row.id, row.status);
}).then(() => {
this.msgSuccess(text + "成功");
}).catch(function() {
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
: SysCommonStatusEnum.ENABLE;
});
},
}
};
</script>