ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ListStatusDTO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.system.api.domain.dto; import com.ruoyi.common.core.enums.ListingStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotNull; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品上下架状态对象", description = "商品上下架状态对象") public class ListStatusDTO { @ApiModelProperty(value = "id") @NotNull(message = "id不能为空") private Long id; @ApiModelProperty(value = "上架状态 上架中 已下架", notes = "参数传文字") @NotNull(message = "上架状态不能为空") private ListingStatusEnum listingStatus; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -4,21 +4,14 @@ import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.*; import java.util.List; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; @Component public class SysUserFallbackFactory implements FallbackFactory<SysUserClient> { @Override public SysUserClient create(Throwable cause) { return new SysUserClient(){ @Override public R<List<CompanyUserListVo>> getSysUserFromCompanyId(CompanySysUserReq companySysUserReq) { return R.fail("公司获取关联已有账号失败:" + cause.getMessage()); } @Override public R<SysUser> getSysUser(Long userId) { @@ -31,25 +24,9 @@ } @Override public R<List<Integer>> companySaveSysUser(CompanyAddSysUserDto dto) { return R.fail("添加用户失败:" + cause.getMessage()); } @Override public R<List<Integer>> addTRepairSysUser(TRepairShopAddDto dto) { return R.fail("添加修理厂用户失败:" + cause.getMessage()); } @Override public R<List<SysUser>> getUserList(List<Integer> userIds) { return R.fail("通过用户id集合查询用户失败:" + cause.getMessage()); } @Override public R<List<CompanyUserListVo>> getSysUserFromCompanyIdOne(CompanySysUserReq companySysUserReq) { return R.fail("公司获取账号失败:" + cause.getMessage()); } @Override public R<Integer> isAdmin(Long userId) { return R.fail("获取角色信息失败:" + cause.getMessage()); @@ -73,11 +50,6 @@ @Override public R<List<SysUser>> queryUserByPhoneList(List<String> phoneList) { return R.fail("通过手机号集合查询用户失败:" + cause.getMessage()); } @Override public R<Boolean> addUserRole(List<SysUserRoleDTO> dtoList) { return R.fail("默认批量添加修理厂失败:" + cause.getMessage()); } @Override ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -5,21 +5,15 @@ import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.factory.SysUserFallbackFactory; import com.ruoyi.system.api.model.*; import java.util.List; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import javax.management.relation.Role; import java.util.List; @FeignClient(contextId = "sysUserClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserFallbackFactory.class) public interface SysUserClient { @PostMapping("/user/getSysUserFromCompanyId") R<List<CompanyUserListVo>> getSysUserFromCompanyId(@RequestBody CompanySysUserReq companySysUserReq); @PostMapping("/user/getSysUser") R<SysUser> getSysUser(Long userId); @@ -27,18 +21,8 @@ @PostMapping("/user/updateSysUser") R<Boolean> updateSysUser(@RequestBody SysUser sysUser); @PostMapping("/user/companySaveSysUser") R<List<Integer>> companySaveSysUser(@RequestBody CompanyAddSysUserDto dto); @PostMapping("/user/addTRepairSysUser") R<List<Integer>> addTRepairSysUser(@RequestBody TRepairShopAddDto dto); @PostMapping("/user/getUserList") R<List<SysUser>> getUserList(@RequestBody List<Integer> userIds); @PostMapping("/user/getSysUserFromCompanyIdOne") R<List<CompanyUserListVo>> getSysUserFromCompanyIdOne(@RequestBody CompanySysUserReq companySysUserReq); @PostMapping("/user/isAdmin") R<Integer> isAdmin(Long userId); @@ -70,14 +54,6 @@ */ @PostMapping("/user/queryUserByPhoneList") R<List<SysUser>> queryUserByPhoneList(@RequestBody List<String> phoneList); /** * 默认批量添加修理厂 * @param dtoList * @return */ @PostMapping("/user/addUserRole") R<Boolean> addUserRole(@RequestBody List<SysUserRoleDTO> dtoList); /** * 通过手机号查询用户 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyAddSysUserDto.java
File was deleted ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanySysUserReq.java
File was deleted ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyUserListVo.java
File was deleted ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleDTO.java
File was deleted ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAdd.java
File was deleted ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAddDto.java
File was deleted ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/BasePage.java
@@ -2,6 +2,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import javax.validation.constraints.DecimalMin; /** * <p></p> @@ -10,16 +12,20 @@ * @date 2020/8/24 16:39 */ @ApiModel(value = "基础查询列表dto") public class BasePage { public class BasePage implements Serializable { private static final long serialVersionUID = -6677391205868835849L; /** * 分页参数,当前页码 */ @ApiModelProperty(value = "分页参数,当前页码") @DecimalMin(value = "1", message = "当前页码最小为1") private Integer pageCurr = 1; /** * 分页参数,每页数量 */ @ApiModelProperty(value = "分页参数,每页数量,默认为10") @DecimalMin(value = "1", message = "每页数量最低为1") private Integer pageSize = 10; public Integer getPageCurr() { ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/pojo/AuctionSalesroom.java
@@ -71,8 +71,8 @@ @ApiModelProperty(value = "拍卖状态 0=预展中 1=拍卖中 2=已结束") private AuctionStartStatusEnum status; @ApiModelProperty(value = "拍卖场二维码") private String auctionSalesroomQrcode; @ApiModelProperty(value = "拍卖场编码") private String auctionSalesroomNo; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsBrandController.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.goods.controller.mamagement; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 品牌表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-brand") @RequiredArgsConstructor public class MgtGoodsBrandController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsCategoryController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.mamagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 商品分类表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-category") public class MgtGoodsCategoryController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsFlavorTypeController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.mamagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 香型表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-flavor-type") public class MgtGoodsFlavorTypeController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsGroupPurchaseController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.mamagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 商品团购表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-group-purchase") public class MgtGoodsGroupPurchaseController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsInfoTitleController.java
New file @@ -0,0 +1,78 @@ package com.ruoyi.goods.controller.mamagement; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsInfoTitleDTO; import com.ruoyi.goods.domain.query.GoodsInfoTitleQuery; import com.ruoyi.goods.domain.vo.GoodsInfoTitleVO; import com.ruoyi.goods.service.IGoodsInfoTitleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 商品信息标题表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/mgt/goods-info-title") @Api(value = "管理后台商品信息标题相关接口", tags = {"管理后台接口"}) public class MgtGoodsInfoTitleController { private final IGoodsInfoTitleService goodsInfoTitleService; /** * 获取商品信息标题列表的分页数据。 * * @param query 商品信息标题查询条件对象,通过验证后传入。 * @return 返回一个包含商品信息标题分页数据的结果对象。 */ @ApiOperation("获取商品信息标题列表的分页数据") @PostMapping("/page") public R<PageDTO<GoodsInfoTitleVO>> getGoodsInfoTitlePage( @Validated @RequestBody GoodsInfoTitleQuery query) { return R.ok(goodsInfoTitleService.getGoodsInfoTitlePage(query)); } /** * 添加/编辑商品信息标题。 该接口用于接收商品信息标题的数据,并将其保存。 * * @param dto 商品信息标题数据传输对象,经过验证确保数据的合法性。 * @return 返回操作结果,如果操作成功,返回一个成功的标识。 */ @ApiOperation("添加/编辑 商品信息标题") @PostMapping("/save") public R<Void> saveGoodsInfoTitle(@Validated @RequestBody GoodsInfoTitleDTO dto) { goodsInfoTitleService.saveGoodsInfoTitle(dto); return R.ok(); } /** * 删除商品信息标题 * * @param id 商品信息标题的ID,用于指定要删除的商品信息标题。 * @return 返回一个表示操作结果的R<Void>对象,如果操作成功,R对象的status为200;否则根据具体情况进行相应处理。 */ @ApiOperation("删除商品信息标题") @DeleteMapping("/{id}") public R<Void> deleteGoodsInfoTitle(@PathVariable("id") Long id) { goodsInfoTitleService.deleteGoodsInfoTitle(id); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsSeckillController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.mamagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 商品秒杀表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-seckill") public class MgtGoodsSeckillController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsSeriesController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.mamagement; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 系列表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @RestController @RequestMapping("/mgt/goods-series") public class MgtGoodsSeriesController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/mamagement/MgtGoodsSkuController.java
New file @@ -0,0 +1,167 @@ package com.ruoyi.goods.controller.mamagement; import com.fasterxml.jackson.core.JsonProcessingException; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsSkuDTO; import com.ruoyi.goods.domain.query.GoodsInfoTitleQuery; import com.ruoyi.goods.domain.query.GoodsSkuQuery; import com.ruoyi.goods.domain.vo.GoodsBrandVO; import com.ruoyi.goods.domain.vo.GoodsCategoryVO; import com.ruoyi.goods.domain.vo.GoodsFlavorTypeVO; import com.ruoyi.goods.domain.vo.GoodsInfoTitleVO; import com.ruoyi.goods.domain.vo.GoodsSeriesVO; import com.ruoyi.goods.domain.vo.GoodsSkuVO; import com.ruoyi.goods.service.IGoodsBrandService; import com.ruoyi.goods.service.IGoodsCategoryService; import com.ruoyi.goods.service.IGoodsFlavorTypeService; import com.ruoyi.goods.service.IGoodsInfoTitleService; import com.ruoyi.goods.service.IGoodsInfoTitleValueService; import com.ruoyi.goods.service.IGoodsSeriesService; import com.ruoyi.goods.service.IGoodsSkuService; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 商品表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @Slf4j @RestController @RequestMapping("/mgt/goods-sku") @RequiredArgsConstructor @Api(value = "管理后台商品相关接口", tags = {"管理后台接口"}) public class MgtGoodsSkuController { private final IGoodsSkuService goodsSkuService; private final IGoodsBrandService goodsBrandService; private final IGoodsSeriesService goodsSeriesService; private final IGoodsCategoryService goodsCategoryService; private final IGoodsInfoTitleService goodsInfoTitleService; private final IGoodsFlavorTypeService goodsFlavorTypeService; private final IGoodsInfoTitleValueService goodsInfoTitleValueService; /** * 获取商品分类列表的接口 该接口不需要接收任何参数,调用后返回商品分类的列表信息。 * * @return R<List < GoodsCategoryVO>> 返回类型为R的封装结果,其中包含商品分类的列表信息。 * List<GoodsCategoryVO>是商品分类的实体列表,GoodsCategoryVO是商品分类的视图对象。 */ @ApiOperation(value = "获取商品分类列表", notes = "获取商品分类列表") @GetMapping("/category/list") public R<List<GoodsCategoryVO>> getGoodsCategoryList() { return R.ok(goodsCategoryService.getGoodsCategoryList()); } /** * 获取商品系列列表的接口 * 该接口不需要任何请求参数,调用后返回商品系列的列表信息。 * * @return R<List < GoodsSeriesVO>> 返回类型为R的封装结果,其中包含商品系列的列表信息。 * List<GoodsSeriesVO>是商品系列的实体列表,GoodsSeriesVO是商品系列的视图对象。 */ @ApiOperation(value = "获取商品系列列表", notes = "获取商品系列列表") @GetMapping("/series/list") public R<List<GoodsSeriesVO>> getGoodsSeriesList() { return R.ok(goodsSeriesService.getGoodsSeriesList()); } /** * 获取商品品牌列表的接口 该接口不需要接收任何参数,调用后返回商品品牌的列表信息。 * * @return R<List < GoodsBrandVO>> 返回类型为R包装的GoodsBrandVO对象列表,R是框架定义的结果包装类, 其中包含了操作状态码和操作结果信息。 */ @ApiOperation(value = "获取商品品牌列表", notes = "获取商品品牌列表") @GetMapping("/brand/list") public R<List<GoodsBrandVO>> getGoodsBrandList() { return R.ok(goodsBrandService.getGoodsBrandList()); } /** * 获取商品香型列表 * <p> * 该接口用于查询商品的香型列表信息。 不需要传入任何参数,返回商品香型的列表。 * * @return R<List < GoodsFlavorTypeVO>> 包含商品香型列表的响应对象。 */ @GetMapping("/flavor/list") public R<List<GoodsFlavorTypeVO>> getGoodsFlavorTypeList() { return R.ok(goodsFlavorTypeService.getGoodsFlavorTypeList()); } /** * 获取商品信息标题列表的分页数据。 * * @param query 商品信息标题查询条件对象,通过验证后传入。 * @return 返回商品信息标题列表的分页数据响应对象。 */ @ApiOperation(value = "获取商品信息标题列表的分页数据", notes = "获取商品信息标题列表的分页数据") @PostMapping("/title/page") public R<PageDTO<GoodsInfoTitleVO>> getGoodsInfoTitlePage( @Validated @RequestBody GoodsInfoTitleQuery query) { return R.ok(goodsInfoTitleService.getGoodsInfoTitlePage(query)); } /** * 添加/编辑商品 * * @param dto 商品SKU数据传输对象,经过验证的请求体参数,用于传递商品信息。 * @return R<Void> */ @ApiOperation(value = "添加/编辑商品", notes = "添加商品") @PostMapping("/save") public R<Void> saveGoods(@Validated @RequestBody GoodsSkuDTO dto) { try { goodsSkuService.saveGoods(dto); } catch (JsonProcessingException e) { log.error("JSON转换异常", e); return R.fail(); } return R.ok(); } /** * 获取商品列表的分页数据 * * @param query 商品分页查询条件 * @return 返回商品分页数据的响应对象 */ @ApiOperation(value = "获取商品列表的分页数据", notes = "获取商品列表的分页数据") @PostMapping("/page") public R<PageDTO<GoodsSkuVO>> getGoodsPage(@Validated @RequestBody GoodsSkuQuery query) { return R.ok(goodsSkuService.getGoodsPage(query)); } /** * 更新商品状态,实现商品的下架或上架。 * * @param dto 包含需要更新状态的商品信息的数据传输对象,类型为 ListStatusDTO。 * @return 返回一个表示操作结果的 R<Void> 对象,如果操作成功,则 R<Void>.ok() 方法返回一个成功标记。 */ @ApiOperation(value = "下架/上架 商品") @PutMapping("/upd-status") public R<Void> updStatus(@RequestBody ListStatusDTO dto) { goodsSkuService.updStatus(dto); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/GoodsInfoTitleDTO.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.goods.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品信息标题数据传输对象", description = "商品信息标题数据传输对象") public class GoodsInfoTitleDTO { @ApiModelProperty(value = "商品信息标题id") @NotNull(message = "商品信息标题id不能为空") private Long id; @ApiModelProperty(value = "标题名称") @NotBlank(message = "标题名称不能为空") private String titleName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/GoodsInfoTitleValueDTO.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.goods.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import javax.validation.constraints.NotNull; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品信息数据传输对象", description = "商品信息数据传输对象") public class GoodsInfoTitleValueDTO implements Serializable { private static final long serialVersionUID = -6419722448469655827L; @ApiModelProperty(value = "商品信息标题id") @NotNull(message = "商品信息标题id不能为空") private Long goodsInfoTitleId; @ApiModelProperty(value = "内容") private String content; @ApiModelProperty(value = "排序") private Integer sortNum; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/GoodsSkuDTO.java
New file @@ -0,0 +1,102 @@ package com.ruoyi.goods.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品sku数据传输对象", description = "商品sku数据传输对象") public class GoodsSkuDTO implements Serializable { private static final long serialVersionUID = 1717246837055584271L; @ApiModelProperty(value = "商品id", notes = "更新必传") private Long id; @ApiModelProperty(value = "商品名称") @NotBlank(message = "商品名称不能为空") private String skuName; @ApiModelProperty(value = "商品年份") @NotBlank(message = "商品年份不能为空") private String years; @ApiModelProperty(value = "商品分类id") @NotNull(message = "商品分类id不能为空") private Long categoryId; @ApiModelProperty(value = "商品系列id") @NotNull(message = "商品系列id不能为空") private Long seriesId; @ApiModelProperty(value = "商品品牌id") @NotNull(message = "商品品牌id不能为空") private Long brandId; @ApiModelProperty(value = "商品香型id") @NotNull(message = "商品香型id不能为空") private Long flavorTypeId; @ApiModelProperty(value = "商品价格") @NotNull(message = "商品价格不能为空") private BigDecimal price; @ApiModelProperty(value = "库存") @NotNull(message = "库存不能为空") private Integer stock; @ApiModelProperty(value = "单位") @NotBlank(message = "单位不能为空") private String unit; @ApiModelProperty(value = "规格") private String spec; @ApiModelProperty(value = "规格单位") private String specUnit; @ApiModelProperty(value = "封面图") @NotBlank(message = "封面图不能为空") private String coverPic; @ApiModelProperty(value = "详情图,不超过五张图片,多张照片使用英文逗号拼接") @NotBlank(message = "详情图不能为空") private String album; @ApiModelProperty(value = "分享标题") @NotBlank(message = "分享标题不能为空") private String shareTitle; @ApiModelProperty(value = "分享图片") @NotBlank(message = "分享图片不能为空") private String sharePic; @ApiModelProperty(value = "商品信息") @NotEmpty(message = "商品信息不能为空") @Valid private List<GoodsInfoTitleValueDTO> goodsInfoTitleValueDTOList; @ApiModelProperty(value = "商品描述") @NotBlank(message = "商品描述不能为空") private String description; @ApiModelProperty(value = "商品说明") @NotBlank(message = "商品说明不能为空") private String detail; @ApiModelProperty(value = "排序") private Integer sortNum; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/GoodsSku.java
@@ -61,6 +61,9 @@ @ApiModelProperty(value = "库存") private Integer stock; @ApiModelProperty(value = "已售数量") private Integer soldQuantity; @ApiModelProperty(value = "单位") private String unit; @@ -74,7 +77,7 @@ private String coverPic; @ApiModelProperty(value = "详情图,不超过五张图片") private String alubm; private String album; @ApiModelProperty(value = "分享标题") private String shareTitle; ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/query/GoodsInfoTitleQuery.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.goods.domain.query; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author mitao * @date 2024/5/20 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "商品信息标题查询对象", description = "商品信息标题查询对象") public class GoodsInfoTitleQuery extends BasePage { private static final long serialVersionUID = -5680812329761912738L; @ApiModelProperty(value = "标题名称") private String titleName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/query/GoodsSkuQuery.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.goods.domain.query; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author mitao * @date 2024/5/20 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "商品sku查询对象", description = "商品sku查询对象") public class GoodsSkuQuery extends BasePage { private static final long serialVersionUID = 1936789008079678538L; @ApiModelProperty(value = "商品名称") private String skuName; @ApiModelProperty(value = "上架状态 上架中 已下架", notes = "参数传文字") private ListingStatusEnum listingStatus; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsBrandVO.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.goods.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品品牌视图对象", description = "商品品牌视图对象") public class GoodsBrandVO implements Serializable { private static final long serialVersionUID = -3410809707312808498L; @ApiModelProperty(value = "品牌id") private Long id; @ApiModelProperty(value = "品牌名称") private String brandName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsCategoryVO.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.goods.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品分类视图对象", description = "商品分类视图对象") public class GoodsCategoryVO implements Serializable { private static final long serialVersionUID = 5709489391987782043L; @ApiModelProperty(value = "商品分类id") private Long id; @ApiModelProperty(value = "分类名称") private String categoryName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsFlavorTypeVO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.goods.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "香型视图对象", description = "香型视图对象") public class GoodsFlavorTypeVO implements Serializable { private static final long serialVersionUID = -9190780555638450511L; @ApiModelProperty(value = "香型id") private Long id; @ApiModelProperty(value = "香型名称") private String flavorTypeName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsInfoTitleVO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.goods.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品信息标题视图对象", description = "商品信息标题视图对象") public class GoodsInfoTitleVO implements Serializable { private static final long serialVersionUID = 1305732550790329483L; @ApiModelProperty(value = "商品信息标题id") private Long id; @ApiModelProperty(value = "标题名称") private String titleName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsSeriesVO.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.goods.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品系列视图对象", description = "商品系列视图对象") public class GoodsSeriesVO implements Serializable { private static final long serialVersionUID = -4711563700322753898L; @ApiModelProperty(value = "系列id") private Long id; @ApiModelProperty(value = "系列名称") private String seriesName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/GoodsSkuVO.java
New file @@ -0,0 +1,87 @@ package com.ruoyi.goods.domain.vo; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.goods.domain.dto.GoodsInfoTitleValueDTO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; import lombok.Data; /** * @author mitao * @date 2024/5/20 */ @Data @ApiModel(value = "商品sku视图对象", description = "商品sku视图对象") public class GoodsSkuVO implements Serializable { private static final long serialVersionUID = 6605575092116471441L; @ApiModelProperty(value = "商品id", notes = "更新必传") private Long id; @ApiModelProperty(value = "商品名称") private String skuName; @ApiModelProperty(value = "商品年份") private String years; @ApiModelProperty(value = "商品分类id") private Long categoryId; @ApiModelProperty(value = "商品系列id") private Long seriesId; @ApiModelProperty(value = "商品品牌id") private Long brandId; @ApiModelProperty(value = "商品香型id") private Long flavorTypeId; @ApiModelProperty(value = "商品价格") private BigDecimal price; @ApiModelProperty(value = "库存") private Integer stock; @ApiModelProperty(value = "已售数量") private Integer soldQuantity; @ApiModelProperty(value = "单位") private String unit; @ApiModelProperty(value = "规格") private String spec; @ApiModelProperty(value = "规格单位") private String specUnit; @ApiModelProperty(value = "封面图") private String coverPic; @ApiModelProperty(value = "详情图,不超过五张图片,多张照片使用英文逗号拼接") private String album; @ApiModelProperty(value = "分享标题") private String shareTitle; @ApiModelProperty(value = "分享图片") private String sharePic; @ApiModelProperty(value = "商品信息") private List<GoodsInfoTitleValueDTO> goodsInfoTitleValueDTOList; @ApiModelProperty(value = "商品描述") private String description; @ApiModelProperty(value = "商品说明") private String detail; @ApiModelProperty(value = "排序") private Integer sortNum; @ApiModelProperty(value = "上架状态 0=上架中 1= 已下架") private ListingStatusEnum listingStatus; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrandService.java
@@ -1,7 +1,9 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsBrand; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.domain.pojo.GoodsBrand; import com.ruoyi.goods.domain.vo.GoodsBrandVO; import java.util.List; /** * <p> @@ -13,4 +15,5 @@ */ public interface IGoodsBrandService extends IService<GoodsBrand> { List<GoodsBrandVO> getGoodsBrandList(); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsCategoryService.java
@@ -1,7 +1,9 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsCategory; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.domain.pojo.GoodsCategory; import com.ruoyi.goods.domain.vo.GoodsCategoryVO; import java.util.List; /** * <p> @@ -13,4 +15,5 @@ */ public interface IGoodsCategoryService extends IService<GoodsCategory> { List<GoodsCategoryVO> getGoodsCategoryList(); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsFlavorTypeService.java
@@ -1,7 +1,9 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsFlavorType; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.domain.pojo.GoodsFlavorType; import com.ruoyi.goods.domain.vo.GoodsFlavorTypeVO; import java.util.List; /** * <p> @@ -13,4 +15,5 @@ */ public interface IGoodsFlavorTypeService extends IService<GoodsFlavorType> { List<GoodsFlavorTypeVO> getGoodsFlavorTypeList(); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleService.java
@@ -1,7 +1,11 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsInfoTitle; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsInfoTitleDTO; import com.ruoyi.goods.domain.pojo.GoodsInfoTitle; import com.ruoyi.goods.domain.query.GoodsInfoTitleQuery; import com.ruoyi.goods.domain.vo.GoodsInfoTitleVO; /** * <p> @@ -13,4 +17,27 @@ */ public interface IGoodsInfoTitleService extends IService<GoodsInfoTitle> { /** * 获取商品信息标题的分页数据。 * * @param query 查询条件,包含当前页、每页大小和标题名称等条件。 * @return 返回商品信息标题的分页DTO,包含分页信息和转换后的VO对象列表。 */ PageDTO<GoodsInfoTitleVO> getGoodsInfoTitlePage(GoodsInfoTitleQuery query); /** * 保存或更新商品信息标题。 * * @param dto 商品信息标题数据传输对象,包含商品标题的信息。 如果dto中的id为空,则认为是新纪录,执行保存操作; 如果id不为空,则认为是更新现有纪录。 * @return 无返回值。 */ void saveGoodsInfoTitle(GoodsInfoTitleDTO dto); /** * 删除商品信息标题 * * @param id 商品信息的唯一标识符 * @return 无返回值 */ void deleteGoodsInfoTitle(Long id); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsInfoTitleValueService.java
@@ -1,7 +1,7 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsInfoTitleValue; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.domain.pojo.GoodsInfoTitleValue; /** * <p> @@ -13,4 +13,10 @@ */ public interface IGoodsInfoTitleValueService extends IService<GoodsInfoTitleValue> { /** * 根据商品SKU ID移除相关记录。 * * @param id 商品SKU的唯一标识符。 */ void removeByGoodsSkuId(Long id); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeriesService.java
@@ -1,7 +1,9 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsSeries; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.domain.pojo.GoodsSeries; import com.ruoyi.goods.domain.vo.GoodsSeriesVO; import java.util.List; /** * <p> @@ -13,4 +15,5 @@ */ public interface IGoodsSeriesService extends IService<GoodsSeries> { List<GoodsSeriesVO> getGoodsSeriesList(); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
@@ -1,7 +1,13 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.pojo.GoodsSku; import com.baomidou.mybatisplus.extension.service.IService; import com.fasterxml.jackson.core.JsonProcessingException; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsSkuDTO; import com.ruoyi.goods.domain.pojo.GoodsSku; import com.ruoyi.goods.domain.query.GoodsSkuQuery; import com.ruoyi.goods.domain.vo.GoodsSkuVO; import com.ruoyi.system.api.domain.dto.ListStatusDTO; /** * <p> @@ -13,4 +19,27 @@ */ public interface IGoodsSkuService extends IService<GoodsSku> { /** * 保存商品SKU信息。 * * @param dto 商品SKU的DTO(数据传输对象),包含要保存或更新的商品SKU的详细信息。 * @throws JsonProcessingException 当处理JSON数据时发生错误。 */ void saveGoods(GoodsSkuDTO dto) throws JsonProcessingException; /** * 获取商品SKU分页数据 * * @param query 查询条件,包括SKU名称、上架状态、页码和页大小 * @return 分页数据对象,包含商品SKU的信息 */ PageDTO<GoodsSkuVO> getGoodsPage(GoodsSkuQuery query); /** * 更新商品SKU的状态。 * * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。 * @return 无返回值。 */ void updStatus(ListStatusDTO dto); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
@@ -1,9 +1,12 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.goods.domain.pojo.GoodsBrand; import com.ruoyi.goods.domain.vo.GoodsBrandVO; import com.ruoyi.goods.mapper.GoodsBrandMapper; import com.ruoyi.goods.service.IGoodsBrandService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,17 @@ @Service public class GoodsBrandServiceImpl extends ServiceImpl<GoodsBrandMapper, GoodsBrand> implements IGoodsBrandService { /** * 获取商品品牌列表。 * <p>此方法通过调用{@code list()}方法获取原始列表,并使用BeanUtils的{@code copyList}方法将其复制为{@code * GoodsBrandVO}类型的列表后返回。</p> * * @return 返回一个{@code GoodsBrandVO}类型的列表,包含商品品牌信息。 */ @Override public List<GoodsBrandVO> getGoodsBrandList() { // 将原始列表转换为GoodsBrandVO类型的列表 return BeanUtils.copyList(this.list(), GoodsBrandVO.class); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsCategoryServiceImpl.java
@@ -1,9 +1,12 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.goods.domain.pojo.GoodsCategory; import com.ruoyi.goods.domain.vo.GoodsCategoryVO; import com.ruoyi.goods.mapper.GoodsCategoryMapper; import com.ruoyi.goods.service.IGoodsCategoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,16 @@ @Service public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService { /** * 获取商品类别列表的副本。 * <p>此方法不接受任何参数,它会调用 {@code list()} 方法获取当前类别列表的副本,并将其转换为 {@code GoodsCategoryVO} 类型的列表后返回。</p> * * @return 返回一个 {@code List<GoodsCategoryVO>},包含当前商品类别的所有信息的副本。 */ @Override public List<GoodsCategoryVO> getGoodsCategoryList() { // 使用BeanUtils的copyList方法将当前列表转换为GoodsCategoryVO类型的列表并返回 return BeanUtils.copyList(this.list(), GoodsCategoryVO.class); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsFlavorTypeServiceImpl.java
@@ -1,9 +1,12 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.goods.domain.pojo.GoodsFlavorType; import com.ruoyi.goods.domain.vo.GoodsFlavorTypeVO; import com.ruoyi.goods.mapper.GoodsFlavorTypeMapper; import com.ruoyi.goods.service.IGoodsFlavorTypeService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,15 @@ @Service public class GoodsFlavorTypeServiceImpl extends ServiceImpl<GoodsFlavorTypeMapper, GoodsFlavorType> implements IGoodsFlavorTypeService { /** * 获取商品口味类型的列表。 * <p>此方法通过调用 {@code list()} 方法获取原始列表,并使用 {@code BeanUtils.copyList} 方法将每个元素转换为 * {@code GoodsFlavorTypeVO} 类型,最终返回转换后的列表。</p> * * @return 返回一个 {@code List<GoodsFlavorTypeVO>},包含转换后的商品口味类型信息。 */ @Override public List<GoodsFlavorTypeVO> getGoodsFlavorTypeList() { return BeanUtils.copyList(this.list(), GoodsFlavorTypeVO.class); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleServiceImpl.java
@@ -1,9 +1,16 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsInfoTitleDTO; import com.ruoyi.goods.domain.pojo.GoodsInfoTitle; import com.ruoyi.goods.domain.query.GoodsInfoTitleQuery; import com.ruoyi.goods.domain.vo.GoodsInfoTitleVO; import com.ruoyi.goods.mapper.GoodsInfoTitleMapper; import com.ruoyi.goods.service.IGoodsInfoTitleService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** @@ -17,4 +24,49 @@ @Service public class GoodsInfoTitleServiceImpl extends ServiceImpl<GoodsInfoTitleMapper, GoodsInfoTitle> implements IGoodsInfoTitleService { /** * 获取商品信息标题的分页数据。 * * @param query 查询条件,包含当前页、每页大小和标题名称等条件。 * @return 返回商品信息标题的分页DTO,包含分页信息和转换后的VO对象列表。 */ @Override public PageDTO<GoodsInfoTitleVO> getGoodsInfoTitlePage(GoodsInfoTitleQuery query) { // 根据查询条件进行查询,包括标题名称的模糊查询,并分页 Page<GoodsInfoTitle> page = this.lambdaQuery() .like(StringUtils.isNotEmpty(query.getTitleName()), GoodsInfoTitle::getTitleName, query.getTitleName()) .page(new Page<GoodsInfoTitle>(query.getPageCurr(), query.getPageSize())); // 将查询结果转换为VO对象的分页DTO返回 return PageDTO.of(page, GoodsInfoTitleVO.class); } /** * 保存或更新商品信息标题。 * * @param dto 商品信息标题数据传输对象,包含商品标题的信息。 如果dto中的id为空,则认为是新纪录,执行保存操作; 如果id不为空,则认为是更新现有纪录。 * @return 无返回值。 */ @Override public void saveGoodsInfoTitle(GoodsInfoTitleDTO dto) { // 将DTO对象复制为GoodsInfoTitle实体对象 GoodsInfoTitle goodsInfoTitle = BeanUtils.copyBean(dto, GoodsInfoTitle.class); // 判断DTO中的ID是否为空,决定是进行保存还是更新操作 if (StringUtils.isNull(dto.getId())) { this.save(goodsInfoTitle); // 保存新纪录 } else { this.updateById(goodsInfoTitle); // 更新现有纪录 } } /** * 删除商品信息标题 * * @param id 商品信息的唯一标识符 * @return 无返回值 */ @Override public void deleteGoodsInfoTitle(Long id) { this.removeById(id); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsInfoTitleValueServiceImpl.java
@@ -1,9 +1,9 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.goods.domain.pojo.GoodsInfoTitleValue; import com.ruoyi.goods.mapper.GoodsInfoTitleValueMapper; import com.ruoyi.goods.service.IGoodsInfoTitleValueService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** @@ -17,4 +17,16 @@ @Service public class GoodsInfoTitleValueServiceImpl extends ServiceImpl<GoodsInfoTitleValueMapper, GoodsInfoTitleValue> implements IGoodsInfoTitleValueService { /** * 根据商品SKU ID移除相应的商品信息标题值。 * * @param id 商品SKU的唯一标识符。 * <p> * 本方法通过使用Lambda更新表达式,设置条件为商品SKU ID与传入的ID相等,然后执行移除操作。 */ @Override public void removeByGoodsSkuId(Long id) { this.lambdaUpdate().eq(GoodsInfoTitleValue::getGoodsSkuId, id).remove(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeriesServiceImpl.java
@@ -1,9 +1,12 @@ package com.ruoyi.goods.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.goods.domain.pojo.GoodsSeries; import com.ruoyi.goods.domain.vo.GoodsSeriesVO; import com.ruoyi.goods.mapper.GoodsSeriesMapper; import com.ruoyi.goods.service.IGoodsSeriesService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,18 @@ @Service public class GoodsSeriesServiceImpl extends ServiceImpl<GoodsSeriesMapper, GoodsSeries> implements IGoodsSeriesService { /** * 获取商品系列列表的视图对象。 * * <p>此方法不接受任何参数,它会调用 {@code list()} 方法获取原始列表, * 然后使用 {@code BeanUtils.copyList} 将这些实体转换为视图对象。</p> * * @return 返回一个 {@link List} 类型的商品系列视图对象列表。每个视图对象代表一个商品系列的简要信息。 */ @Override public List<GoodsSeriesVO> getGoodsSeriesList() { // 使用BeanUtils工具类将实体列表转换为视图对象列表 return BeanUtils.copyList(this.list(), GoodsSeriesVO.class); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -1,10 +1,31 @@ package com.ruoyi.goods.service.impl; import com.ruoyi.goods.domain.pojo.GoodsSku; import com.ruoyi.goods.mapper.GoodsSkuMapper; import com.ruoyi.goods.service.IGoodsSkuService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.Checker; import com.ruoyi.common.core.utils.page.CollUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.goods.domain.dto.GoodsInfoTitleValueDTO; import com.ruoyi.goods.domain.dto.GoodsSkuDTO; import com.ruoyi.goods.domain.pojo.GoodsInfoTitleValue; import com.ruoyi.goods.domain.pojo.GoodsSku; import com.ruoyi.goods.domain.query.GoodsSkuQuery; import com.ruoyi.goods.domain.vo.GoodsSkuVO; import com.ruoyi.goods.mapper.GoodsSkuMapper; import com.ruoyi.goods.service.IGoodsInfoTitleValueService; import com.ruoyi.goods.service.IGoodsSkuService; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -15,6 +36,126 @@ * @since 2024-05-16 */ @Service @Slf4j @RequiredArgsConstructor public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements IGoodsSkuService { private final IGoodsInfoTitleValueService goodsInfoTitleValueService; private static final ObjectMapper objectMapper = new ObjectMapper(); /** * 保存商品SKU信息。 * * @param dto 商品SKU的DTO(数据传输对象),包含要保存或更新的商品SKU的详细信息。 * @throws JsonProcessingException 当处理JSON数据时发生错误。 */ @Override @Transactional(rollbackFor = Exception.class) public void saveGoods(GoodsSkuDTO dto) throws JsonProcessingException { // 使用BeanUtils将DTO对象复制到GoodsSku实体对象 GoodsSku goodsSku = BeanUtils.copyBean(dto, GoodsSku.class); // 分割并处理专辑图片字符串,将其转换为JSON格式 String albumStr = processAlbumString(goodsSku.getAlbum()); goodsSku.setAlbum(albumStr); // 根据ID判断是进行新增还是更新操作 if (Objects.isNull(dto.getId())) { this.save(goodsSku); } else { this.updateById(goodsSku); } // 处理商品额外信息,如规格、属性等 processGoodsInfoTitleValue(dto, goodsSku); } /** * 处理相册字符串。 该方法将输入的相册字符串分割为字符串数组,并将其序列化为JSON字符串形式返回。 如果输入的相册字符串为空或仅包含空白字符,则返回空字符串。 * * @param album 输入的相册字符串,可能包含多个相册名称,各相册名称之间以逗号分隔。 * @return 返回序列化后的相册名称数组的JSON字符串。如果输入为空,则返回空字符串。 * @throws JsonProcessingException 如果在序列化过程中发生错误,则抛出此异常。 */ private String processAlbumString(String album) throws JsonProcessingException { if (StringUtils.isEmpty(album)) { return ""; // 返回空字符串,避免后续处理出现问题 } String[] albumArr = album.split(","); return objectMapper.writeValueAsString(albumArr); } /** * 处理商品信息标题和值的逻辑。 将DTO列表复制到实体列表中,校验其完整性和正确性,然后关联SKU ID,并最后保存到数据库。 * * @param dto 包含商品信息标题和值的DTO对象 * @param goodsSku 商品SKU实体,用于关联商品额外信息 * @throws ServiceException 如果校验失败或数据处理出现异常,则抛出服务异常 */ private void processGoodsInfoTitleValue(GoodsSkuDTO dto, GoodsSku goodsSku) throws ServiceException { List<GoodsInfoTitleValueDTO> goodsInfoTitleValueDTOList = dto.getGoodsInfoTitleValueDTOList(); // 复制DTO列表到实体列表 List<GoodsInfoTitleValue> goodsInfoTitleValues = BeanUtils.copyList( goodsInfoTitleValueDTOList, GoodsInfoTitleValue.class); // 校验商品额外信息的完整性和正确性 CollUtils.check(goodsInfoTitleValues, new Checker<GoodsInfoTitleValue>() { @Override public void check(GoodsInfoTitleValue data) { if (StringUtils.isNull(data.getGoodsInfoTitleId())) { throw new ServiceException("商品信息标题id不能为空"); } if (StringUtils.isEmpty(data.getContent())) { throw new ServiceException("商品信息内容不能为空"); } } }); // 给每个商品额外信息关联上SKU ID for (GoodsInfoTitleValue goodsInfoTitleValue : goodsInfoTitleValues) { goodsInfoTitleValue.setGoodsSkuId(goodsSku.getId()); } // 先清除旧的商品信息,再批量保存新的商品信息 goodsInfoTitleValueService.removeByGoodsSkuId(goodsSku.getId()); goodsInfoTitleValueService.saveBatch(goodsInfoTitleValues); } /** * 获取商品SKU分页数据 * * @param query 查询条件,包括SKU名称、上架状态、页码和页大小 * @return 分页数据对象,包含商品SKU的信息 */ @Override public PageDTO<GoodsSkuVO> getGoodsPage(GoodsSkuQuery query) { Page<GoodsSku> page = this.lambdaQuery() .select(GoodsSku::getId, GoodsSku::getSkuName, GoodsSku::getPrice, GoodsSku::getStock, GoodsSku::getSoldQuantity, GoodsSku::getSortNum, GoodsSku::getListingStatus) .like(StringUtils.isNotEmpty(query.getSkuName()), GoodsSku::getSkuName, query.getSkuName()) .eq(StringUtils.isNotNull(query.getListingStatus() ), GoodsSku::getListingStatus, query.getListingStatus()) .page(new Page<GoodsSku>(query.getPageCurr(), query.getPageSize())); return PageDTO.of(page, GoodsSkuVO.class); } /** * 更新商品SKU的状态。 * * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。 * @return 无返回值。 */ @Override public void updStatus(ListStatusDTO dto) { this.lambdaUpdate() .eq(GoodsSku::getId, dto.getId()) .set(GoodsSku::getListingStatus, dto.getListingStatus()) .update(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -16,13 +16,7 @@ import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.CompanyAddSysUserDto; import com.ruoyi.system.api.model.CompanySysUserReq; import com.ruoyi.system.api.model.CompanyUserListVo; import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.SysUserRoleDTO; import com.ruoyi.system.api.model.TRepairShopAdd; import com.ruoyi.system.api.model.TRepairShopAddDto; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysDeptService; @@ -34,7 +28,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -228,53 +221,7 @@ return R.ok(list); } @PostMapping("/getSysUserFromCompanyId") public R<List<CompanyUserListVo>> getSysUserFromCompanyId(@RequestBody CompanySysUserReq companySysUserReq) { LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); if (companySysUserReq.getUserIds().size() == 0) { List<Integer> userIds = companySysUserReq.getUserIds(); userIds.add(-1); companySysUserReq.setUserIds(userIds); } sysUserLambdaQueryWrapper.in(SysUser::getUserId, companySysUserReq.getUserIds()); if (companySysUserReq.getName() != null && !"".equals(companySysUserReq.getName())) { sysUserLambdaQueryWrapper.like(SysUser::getUserName, companySysUserReq.getName()).or().like(SysUser::getPhonenumber, companySysUserReq.getName()); } sysUserLambdaQueryWrapper.eq(SysUser::getRoleType,2); List<SysUser> list = userService.list(sysUserLambdaQueryWrapper); ArrayList<CompanyUserListVo> companyUserListVos = new ArrayList<>(); for (SysUser sysUser : list) { CompanyUserListVo companyUserListVo = new CompanyUserListVo(); companyUserListVo.setId(sysUser.getUserId()); companyUserListVo.setPassword(sysUser.getPassword()); companyUserListVo.setPhoneNumber(sysUser.getPhonenumber()); companyUserListVo.setUserName(sysUser.getUserName()); companyUserListVo.setNickName(sysUser.getNickName()); companyUserListVos.add(companyUserListVo); } return R.ok(companyUserListVos); } @PostMapping("/getSysUserFromCompanyIdOne") public R<List<CompanyUserListVo>> getSysUserFromCompanyIdOne(@RequestBody CompanySysUserReq companySysUserReq) { LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysUserLambdaQueryWrapper.eq(SysUser::getRoleType, 2); if (companySysUserReq.getName() != null && !"".equals(companySysUserReq.getName())) { sysUserLambdaQueryWrapper.like(SysUser::getPhonenumber, companySysUserReq.getName()); } List<SysUser> list = userService.list(sysUserLambdaQueryWrapper); ArrayList<CompanyUserListVo> companyUserListVos = new ArrayList<>(); for (SysUser sysUser : list) { CompanyUserListVo companyUserListVo = new CompanyUserListVo(); companyUserListVo.setId(sysUser.getUserId()); companyUserListVo.setPassword(sysUser.getPassword()); companyUserListVo.setPhoneNumber(sysUser.getPhonenumber()); companyUserListVo.setUserName(sysUser.getUserName()); companyUserListVo.setNickName(sysUser.getNickName()); companyUserListVos.add(companyUserListVo); } return R.ok(companyUserListVos); } @PostMapping("/isAdmin") public R<Integer> isAdmin(@RequestBody Long userId){ SysUserRole one = sysUserRoleService.getOne(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId)); @@ -305,86 +252,6 @@ return R.ok(); } } @PostMapping("/companySaveSysUser") public R<List<Integer>> companySaveSysUser(@RequestBody CompanyAddSysUserDto dto) { List<CompanyUserListVo> list = dto.getList(); ArrayList<Integer> userIds = new ArrayList<>(); try { for (CompanyUserListVo companyUserListVo : list) { List<Long> ids = userService.getSysUserFromPhone(companyUserListVo.getPhoneNumber()); SysUser sysUser = new SysUser(); if (ids.size() > 0) { sysUser.setRoleType(2); sysUser.setObjectId(dto.getCompanyId()); if(companyUserListVo.getPassword()!=null){ sysUser.setPassword(SecurityUtils.encryptPassword(companyUserListVo.getPassword())); } sysUser.setPhonenumber(companyUserListVo.getPhoneNumber()); sysUser.setUserName(companyUserListVo.getPhoneNumber()); sysUser.setNickName(companyUserListVo.getNickName()); sysUser.setUserId(ids.get(0).longValue()); userService.updateUser(sysUser); userIds.add(ids.get(0).intValue()); } else { sysUser.setRoleType(2); sysUser.setObjectId(dto.getCompanyId()); if(companyUserListVo.getPassword()!=null){ sysUser.setPassword(SecurityUtils.encryptPassword(companyUserListVo.getPassword())); } sysUser.setPhonenumber(companyUserListVo.getPhoneNumber()); sysUser.setUserName(companyUserListVo.getPhoneNumber()); sysUser.setNickName(companyUserListVo.getNickName()); sysUser.setCreateBy(SecurityUtils.getUsername()); sysUser.setCreateTime(new Date()); userService.insertUser(sysUser); SysUserRole sysUserRole = new SysUserRole(); sysUserRole.setRoleId(20l); sysUserRole.setUserId(sysUser.getUserId()); sysUserRoleService.insertSysUserRole(sysUserRole); userIds.add(sysUser.getUserId().intValue()); } } return R.ok(userIds); } catch (Exception e) { e.printStackTrace(); return R.ok(new ArrayList<>()); } } @PostMapping("/addTRepairSysUser") public R<List<Integer>> addTRepairSysUser(@RequestBody TRepairShopAddDto dto) { List<TRepairShopAdd> list = dto.getList(); ArrayList<Integer> userIds = new ArrayList<>(); try { for (TRepairShopAdd add : list) { List<Long> ids = userService.getSysUserFromPhone(add.getPhonenumber()); if (ids.size() > 0) { userIds.add(ids.get(0).intValue()); } else { SysUser sysUser = new SysUser(); sysUser.setPhonenumber(add.getPhonenumber()); sysUser.setCreateTime(new Date()); sysUser.setCreateBy(SecurityUtils.getUsername()); sysUser.setPassword(SecurityUtils.encryptPassword(add.getPwd())); sysUser.setRoleType(4); sysUser.setObjectId(dto.getRepairId()); sysUser.setUserName(add.getPhonenumber()); sysUser.setNickName(add.getPhonenumber()); userService.insertUser(sysUser); userIds.add(sysUser.getUserId().intValue()); } } return R.ok(userIds); } catch (Exception e) { e.printStackTrace(); return R.ok(new ArrayList<>()); } } @Log(title = "用户管理", businessType = BusinessType.EXPORT) @RequiresPermissions("system:user:export") @@ -594,23 +461,6 @@ .in(SysUser::getPhonenumber, phoneList) .ne(SysUser::getDelFlag,2)); return R.ok(list); } /** * 默认批量添加修理厂 * @param dtoList * @return */ @PostMapping("/addUserRole") public R<Boolean> addUserRole(@RequestBody List<SysUserRoleDTO> dtoList){ List<SysUserRole> userRoles = new ArrayList<>(); for (SysUserRoleDTO userRoleDTO : dtoList) { SysUserRole userRole = new SysUserRole(); userRole.setRoleId(userRoleDTO.getRoleId()); userRole.setUserId(userRoleDTO.getUserId()); userRoles.add(userRole); } return R.ok(sysUserRoleService.saveBatch(userRoles)); } /**