商品模块代码提交

This commit is contained in:
谭凯凯 2025-02-11 16:40:15 +08:00 committed by Tankaikai
parent ae7e9c6b12
commit 37affc558d
9 changed files with 85 additions and 185 deletions

View File

@ -21,11 +21,11 @@ import java.util.Map;
/** /**
* 商品 * 商品
* *
* @author Tankaikai tankaikai@aliyun.com * @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-02-10 * @since 1.0 2025-02-10
*/ */
@AllArgsConstructor @AllArgsConstructor
@RestController @RestController
@RequestMapping("/prod/product") @RequestMapping("/prod/product")
@ -35,7 +35,7 @@ public class ProductController {
@GetMapping("page") @GetMapping("page")
@LogOperation("分页") @LogOperation("分页")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<Page<ProductDTO>> page(@RequestParam Map<String, Object> params){ public CzgResult<Page<ProductDTO>> page(@RequestParam Map<String, Object> params) {
Page<ProductDTO> data = productService.pageAs(null, null, ProductDTO.class); Page<ProductDTO> data = productService.pageAs(null, null, ProductDTO.class);
return CzgResult.success(data); return CzgResult.success(data);
} }
@ -43,7 +43,7 @@ public class ProductController {
@GetMapping("list") @GetMapping("list")
@LogOperation("列表") @LogOperation("列表")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<List<ProductDTO>> list(@RequestParam Map<String, Object> params){ public CzgResult<List<ProductDTO>> list(@RequestParam Map<String, Object> params) {
List<ProductDTO> data = null; List<ProductDTO> data = null;
return CzgResult.success(data); return CzgResult.success(data);
@ -52,7 +52,7 @@ public class ProductController {
@GetMapping("{id}") @GetMapping("{id}")
@LogOperation("信息") @LogOperation("信息")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<ProductDTO> get(@PathVariable("id") Long id){ public CzgResult<ProductDTO> get(@PathVariable("id") Long id) {
ProductDTO data = null; ProductDTO data = null;
return CzgResult.success(data); return CzgResult.success(data);
@ -61,7 +61,7 @@ public class ProductController {
@PostMapping @PostMapping
@LogOperation("保存") @LogOperation("保存")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<Void> save(@RequestBody ProductDTO dto){ public CzgResult<Void> save(@RequestBody ProductDTO dto) {
//效验数据 //效验数据
ValidatorUtil.validateEntity(dto, InsertGroup.class, DefaultGroup.class); ValidatorUtil.validateEntity(dto, InsertGroup.class, DefaultGroup.class);
@ -73,7 +73,7 @@ public class ProductController {
@PutMapping @PutMapping
@LogOperation("修改") @LogOperation("修改")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<Void> update(@RequestBody ProductDTO dto){ public CzgResult<Void> update(@RequestBody ProductDTO dto) {
//效验数据 //效验数据
ValidatorUtil.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); ValidatorUtil.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
@ -85,7 +85,7 @@ public class ProductController {
@DeleteMapping @DeleteMapping
@LogOperation("删除") @LogOperation("删除")
@SaAdminCheckPermission("prod:product:all") @SaAdminCheckPermission("prod:product:all")
public CzgResult<Void> delete(@RequestBody Long[] ids){ public CzgResult<Void> delete(@RequestBody Long[] ids) {
//效验数据 //效验数据
Assert.notNull(ids, "{}不能为空", "id"); Assert.notNull(ids, "{}不能为空", "id");
AssertUtil.isArrayEmpty(ids, "请求id数组不能为空"); AssertUtil.isArrayEmpty(ids, "请求id数组不能为空");

View File

@ -15,7 +15,6 @@ import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
@ -33,16 +32,16 @@ public class ShopProdUnitController {
@GetMapping("page") @GetMapping("page")
@LogOperation("分页") @LogOperation("分页")
@SaAdminCheckPermission("prod:unit:all") @SaAdminCheckPermission("prod:unit:all")
public CzgResult<Page<ShopProdUnitDTO>> page(@RequestParam Map<String, Object> params) { public CzgResult<Page<ShopProdUnitDTO>> page(@RequestParam ShopProdUnitDTO param) {
Page<ShopProdUnitDTO> data = shopProdUnitService.page(params); Page<ShopProdUnitDTO> data = shopProdUnitService.page(param);
return CzgResult.success(data); return CzgResult.success(data);
} }
@GetMapping("list") @GetMapping("list")
@LogOperation("列表") @LogOperation("列表")
@SaAdminCheckPermission("prod:unit:all") @SaAdminCheckPermission("prod:unit:all")
public CzgResult<List<ShopProdUnitDTO>> list(@RequestParam Map<String, Object> params) { public CzgResult<List<ShopProdUnitDTO>> list(@RequestParam ShopProdUnitDTO param) {
List<ShopProdUnitDTO> data = shopProdUnitService.list(params); List<ShopProdUnitDTO> data = shopProdUnitService.list(param);
return CzgResult.success(data); return CzgResult.success(data);
} }

View File

@ -6,7 +6,6 @@ import com.czg.product.entity.ShopProdUnit;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 商品单位Service接口 * 商品单位Service接口
@ -16,9 +15,9 @@ import java.util.Map;
*/ */
public interface ShopProdUnitService extends IBaseService<ShopProdUnit> { public interface ShopProdUnitService extends IBaseService<ShopProdUnit> {
Page<ShopProdUnitDTO> page(Map<String, Object> params); Page<ShopProdUnitDTO> page(ShopProdUnitDTO param);
List<ShopProdUnitDTO> list(Map<String, Object> params); List<ShopProdUnitDTO> list(ShopProdUnitDTO param);
ShopProdUnitDTO get(Long id); ShopProdUnitDTO get(Long id);

View File

@ -1,95 +1,65 @@
package com.czg.core.page; package com.czg.core.page;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import io.micrometer.common.util.StringUtils; import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/** /**
* 分页数据 * 分页数据
* *
* @author cashier * @author cashier
*/ */
@Data
public class PageDomain { public class PageDomain {
/** /**
* 当前记录起始索引 * 当前记录起始索引
*/ */
private Integer pageNum; private Integer page;
/** /**
* 每页显示记录数 * 每页显示记录数
*/ */
private Integer pageSize; private Integer size;
/** /**
* 排序列 * 排序列多个用逗号隔开
*/ */
private String orderByColumn; private String orderField;
/** /**
* 排序的方向desc或者asc * 排序方式多个用逗号分隔asc:升序,desc:降序
*/ */
private String isAsc = "asc"; private String order;
/** /**
* 分页参数合理化 * 组合后的排序规则
*/ */
private Boolean reasonable = true; private String orderBy;
public String getOrderBy() { public String getOrderBy() {
if (StrUtil.isEmpty(orderByColumn)) { if (StrUtil.isEmpty(orderField)) {
return ""; return "";
} }
return StrUtil.toUnderlineCase(orderByColumn) + " " + isAsc; if (StrUtil.isEmpty(orderBy)) {
return "";
}
String[] orderFields = orderField.split(",");
String[] orders = orderBy.split(",");
if (orderFields.length != orders.length) {
return "";
}
List<String> orderBy = new ArrayList<>();
for (int i = 0; i < orderFields.length; i++) {
String orderField = orderFields[i];
String order = orders[i];
orderBy.add(StrUtil.toUnderlineCase(orderField) + " " + order);
}
return CollUtil.join(orderBy, ",");
} }
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getOrderByColumn() {
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn) {
this.orderByColumn = orderByColumn;
}
public String getIsAsc() {
return isAsc;
}
public void setIsAsc(String isAsc) {
if (StringUtils.isNotEmpty(isAsc)) {
// 兼容前端排序类型
if ("ascending".equals(isAsc)) {
isAsc = "asc";
} else if ("descending".equals(isAsc)) {
isAsc = "desc";
}
this.isAsc = isAsc;
}
}
public Boolean getReasonable() {
if (reasonable == null) {
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable) {
this.reasonable = reasonable;
}
} }

View File

@ -61,8 +61,9 @@ public class PageQuery implements Serializable {
/** /**
* 构造分页查询参数 * 构造分页查询参数
* @return *
* @param <T> * @param <T>
* @return
*/ */
public static <T> Page<T> build() { public static <T> Page<T> build() {
Integer pageNum = Convert.toInt(TableSupport.getHttpServletRequest().getParameter(PAGE_NUM), DEFAULT_PAGE_NUM); Integer pageNum = Convert.toInt(TableSupport.getHttpServletRequest().getParameter(PAGE_NUM), DEFAULT_PAGE_NUM);

View File

@ -11,58 +11,49 @@ import org.springframework.web.context.request.ServletRequestAttributes;
* *
* @author Cashier * @author Cashier
*/ */
public class TableSupport public class TableSupport {
{
/** /**
* 当前记录起始索引 * 当前记录起始索引
*/ */
public static final String PAGE_NUM = "pageNum"; public static final String PAGE = "page";
/** /**
* 每页显示记录数 * 每页显示记录数
*/ */
public static final String PAGE_SIZE = "pageSize"; public static final String SIZE = "size";
/** /**
* 排序 * 排序字段多个用逗号分隔
*/ */
public static final String ORDER_BY_COLUMN = "orderByColumn"; public static final String ORDER_FIELD = "orderField";
/** /**
* 排序的方向 "desc" 或者 "asc". * 排序方式多个用逗号分隔asc:升序,desc:降序
*/ */
public static final String IS_ASC = "isAsc"; public static final String ORDER = "order";
/**
* 分页参数合理化
*/
public static final String REASONABLE = "reasonable";
/** /**
* 封装分页对象 * 封装分页对象
*/ */
public static PageDomain getPageDomain() public static PageDomain getPageDomain() {
{
PageDomain pageDomain = new PageDomain(); PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(Convert.toInt(getHttpServletRequest().getParameter(PAGE_NUM), 1)); pageDomain.setPage(Convert.toInt(getHttpServletRequest().getParameter(PAGE), 1));
pageDomain.setPageSize(Convert.toInt(getHttpServletRequest().getParameter(PAGE_SIZE), 10)); pageDomain.setPage(Convert.toInt(getHttpServletRequest().getParameter(SIZE), 10));
pageDomain.setOrderByColumn(getHttpServletRequest().getParameter(ORDER_BY_COLUMN)); pageDomain.setOrderField(getHttpServletRequest().getParameter(ORDER_FIELD));
pageDomain.setIsAsc(getHttpServletRequest().getParameter(IS_ASC)); pageDomain.setOrder(getHttpServletRequest().getParameter(ORDER));
pageDomain.setReasonable(Convert.toBool(getHttpServletRequest().getParameter(REASONABLE)));
return pageDomain; return pageDomain;
} }
public static PageDomain buildPageRequest() public static PageDomain buildPageRequest() {
{
return getPageDomain(); return getPageDomain();
} }
public static HttpServletRequest getHttpServletRequest() { public static HttpServletRequest getHttpServletRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if(requestAttributes == null){ if (requestAttributes == null) {
return null; return null;
} }
return ((ServletRequestAttributes) requestAttributes).getRequest(); return ((ServletRequestAttributes) requestAttributes).getRequest();
} }

View File

@ -1,54 +1,12 @@
package com.czg.core.service; package com.czg.core.service;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
import com.mybatisflex.core.util.ClassUtil;
import com.mybatisflex.core.util.SqlUtil;
import java.util.Collection;
/** /**
* 自定义的服务基类接口 * 自定义的服务基类接口
* *
* @author dataprince数据小王子 * @author Cashier
*/ */
public interface IBaseService<T> extends IService<T> { public interface IBaseService<T> extends IService<T> {
/**
* <p>带主键保存实体类对象数据适用于中间表有联合主键场合但是不通过主键生成器生成主键值而是程序自己提供主键值
*
* @param entity 实体类对象
* @return 受影响的行数
* @apiNote 默认调用的是 {@link BaseMapper#insertSelectiveWithPk(Object)} 方法忽略实体类
* {@code null} 属性的数据使数据库配置的默认值生效
*/
default int saveWithPk(T entity) {
return getMapper().insertSelectiveWithPk(entity);
}
/**
* <p>带主键批量保存实体类对象数据适用于中间表有联合主键场合但是不通过主键生成器生成主键值而是程序自己提供主键值例如sys_role_menu
*
* @param entities 实体类对象
* @return {@code true} 保存成功{@code false} 保存失败
* @apiNote 默认调用的是 {@link BaseMapper#insertSelectiveWithPk(Object)} 方法忽略实体类
* {@code null} 属性的数据使数据库配置的默认值生效
*/
default boolean saveBatchWithPk(Collection<T> entities) {
return saveBatchWithPk(entities, DEFAULT_BATCH_SIZE);
}
/**
* <p>带主键批量保存实体类对象数据适用于中间表有联合主键场合但是不通过主键生成器生成主键值而是程序自己提供主键值例如sys_role_menu
*
* @param entities 实体类对象
* @param batchSize 每次保存切分的数量
* @return {@code true} 保存成功{@code false} 保存失败
* @apiNote 默认调用的是 {@link BaseMapper#insertSelectiveWithPk(Object)} 方法忽略实体类
* {@code null} 属性的数据使数据库配置的默认值生效
*/
default boolean saveBatchWithPk(Collection<T> entities, int batchSize) {
Class<BaseMapper<T>> usefulClass = (Class<BaseMapper<T>>) ClassUtil.getUsefulClass(getMapper().getClass());
return SqlUtil.toBool(Db.executeBatch(entities, batchSize, usefulClass, BaseMapper::insertSelectiveWithPk));
}
} }

View File

@ -12,7 +12,7 @@ import com.mybatisflex.spring.service.impl.ServiceImpl;
/** /**
* 自定义的服务基类接口实现 * 自定义的服务基类接口实现
* *
* @author dataprince数据小王子 * @author Cashier
*/ */
public class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M , T> implements IBaseService<T> { public class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M , T> implements IBaseService<T> {
@ -20,7 +20,7 @@ public class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M ,
* 构造基本查询条件 * 构造基本查询条件
* @return QueryWrapper * @return QueryWrapper
*/ */
protected QueryWrapper buildBaseQueryWrapper(){ protected QueryWrapper buildPageQueryWrapper(){
QueryWrapper queryWrapper = query(); QueryWrapper queryWrapper = query();
PageDomain pageDomain = TableSupport.buildPageRequest(); PageDomain pageDomain = TableSupport.buildPageRequest();
if (StrUtil.isNotEmpty(pageDomain.getOrderBy())) { if (StrUtil.isNotEmpty(pageDomain.getOrderBy())) {

View File

@ -14,15 +14,11 @@ import com.czg.product.service.ShopProdUnitService;
import com.czg.sa.StpKit; import com.czg.sa.StpKit;
import com.czg.service.product.mapper.ShopProdUnitMapper; import com.czg.service.product.mapper.ShopProdUnitMapper;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain; import com.mybatisflex.core.update.UpdateChain;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT;
/** /**
@ -34,48 +30,40 @@ import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT;
@Service @Service
public class ShopProdUnitServiceImpl extends BaseServiceImpl<ShopProdUnitMapper, ShopProdUnit> implements ShopProdUnitService { public class ShopProdUnitServiceImpl extends BaseServiceImpl<ShopProdUnitMapper, ShopProdUnit> implements ShopProdUnitService {
@Override private QueryWrapper buildQueryWrapper(ShopProdUnitDTO param) {
public QueryWrapper query() { QueryWrapper queryWrapper = super.buildPageQueryWrapper();
return super.query().from(SHOP_PROD_UNIT);
}
private QueryWrapper buildQueryWrapper(Map<String, Object> params) {
QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
ShopProdUnit param = BeanUtil.toBean(params, ShopProdUnit.class);
if (StrUtil.isEmpty(param.getName())) { if (StrUtil.isEmpty(param.getName())) {
queryWrapper.and(SHOP_PROD_UNIT.NAME.like(param.getName())); queryWrapper.like(ShopProdUnit::getName, param.getName());
} }
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
queryWrapper.and(SHOP_PROD_UNIT.SHOP_ID.eq(shopId)); queryWrapper.eq(ShopProdUnit::getShopId, shopId);
queryWrapper.orderBy(SHOP_PROD_UNIT.ID.desc()); queryWrapper.orderBy(ShopProdUnit::getId, false);
return queryWrapper; return queryWrapper;
} }
@Override @Override
public Page<ShopProdUnitDTO> page(Map<String, Object> params) { public Page<ShopProdUnitDTO> page(ShopProdUnitDTO param) {
QueryWrapper queryWrapper = buildQueryWrapper(params); QueryWrapper queryWrapper = buildQueryWrapper(param);
Page<ShopProdUnitDTO> page = super.pageAs(PageQuery.build(), queryWrapper, ShopProdUnitDTO.class); return super.pageAs(PageQuery.build(), queryWrapper, ShopProdUnitDTO.class);
return page;
} }
@Override @Override
public List<ShopProdUnitDTO> list(Map<String, Object> params) { public List<ShopProdUnitDTO> list(ShopProdUnitDTO param) {
QueryWrapper queryWrapper = buildQueryWrapper(params); QueryWrapper queryWrapper = buildQueryWrapper(param);
return super.listAs(queryWrapper, ShopProdUnitDTO.class); return super.listAs(queryWrapper, ShopProdUnitDTO.class);
} }
@Override @Override
public ShopProdUnitDTO get(Long id) { public ShopProdUnitDTO get(Long id) {
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
ShopProdUnitDTO data = super.getOneAs(query().where(SHOP_PROD_UNIT.ID.eq(id).and(SHOP_PROD_UNIT.SHOP_ID.eq(shopId))), ShopProdUnitDTO.class); return super.getOneAs(query().eq(ShopProdUnit::getId, id).eq(ShopProdUnit::getShopId, shopId), ShopProdUnitDTO.class);
return data;
} }
@Override @Override
public boolean save(ShopProdUnitDTO dto) { public boolean save(ShopProdUnitDTO dto) {
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
long count = QueryChain.of(ShopProdUnit.class).where(ShopProdUnit::getName).eq(dto.getName()).and(ShopProdUnit::getShopId).eq(shopId).count(); boolean exists = super.exists(query().eq(ShopProdUnit::getName, dto.getName()).eq(ShopProdUnit::getShopId, shopId));
if(count > 0){ if (exists) {
throw new CzgException("单位名称已存在"); throw new CzgException("单位名称已存在");
} }
ShopProdUnit entity = BeanUtil.copyProperties(dto, ShopProdUnit.class); ShopProdUnit entity = BeanUtil.copyProperties(dto, ShopProdUnit.class);
@ -91,12 +79,8 @@ public class ShopProdUnitServiceImpl extends BaseServiceImpl<ShopProdUnitMapper,
@Override @Override
public boolean update(ShopProdUnitDTO dto) { public boolean update(ShopProdUnitDTO dto) {
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
long count = QueryChain.of(ShopProdUnit.class) boolean exists = super.exists(query().eq(ShopProdUnit::getName, dto.getName()).eq(ShopProdUnit::getShopId, shopId).ne(ShopProdUnit::getId, dto.getId()));
.where(ShopProdUnit::getName).eq(dto.getName()) if (exists) {
.and(ShopProdUnit::getShopId).eq(shopId)
.and(ShopProdUnit::getId).ne(dto.getId())
.count();
if(count > 0){
throw new CzgException("单位名称已存在"); throw new CzgException("单位名称已存在");
} }
ShopProdUnit entity = BeanUtil.copyProperties(dto, ShopProdUnit.class); ShopProdUnit entity = BeanUtil.copyProperties(dto, ShopProdUnit.class);
@ -106,22 +90,20 @@ public class ShopProdUnitServiceImpl extends BaseServiceImpl<ShopProdUnitMapper,
@Override @Override
public boolean disable(Long id) { public boolean disable(Long id) {
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
boolean ret = UpdateChain.of(ShopProdUnit.class) return UpdateChain.of(ShopProdUnit.class)
.set(ShopProdUnit::getStatus, StatusEnum.DISABLE.value()) .set(ShopProdUnit::getStatus, StatusEnum.DISABLE.value())
.where(ShopProdUnit::getId).eq(id) .eq(ShopProdUnit::getId, id)
.and(ShopProdUnit::getShopId).eq(shopId) .eq(ShopProdUnit::getShopId, shopId)
.update(); .update();
return ret;
} }
@Override @Override
public boolean enable(Long id) { public boolean enable(Long id) {
Long shopId = StpKit.ADMIN.getLoginIdAsLong(); Long shopId = StpKit.ADMIN.getLoginIdAsLong();
boolean ret = UpdateChain.of(ShopProdUnit.class) return UpdateChain.of(ShopProdUnit.class)
.set(ShopProdUnit::getStatus, StatusEnum.ENABLED.value()) .set(ShopProdUnit::getStatus, StatusEnum.ENABLED.value())
.where(ShopProdUnit::getId).eq(id) .where(ShopProdUnit::getId).eq(id)
.eq(ShopProdUnit::getShopId, shopId) .eq(ShopProdUnit::getShopId, shopId)
.update(); .update();
return ret;
} }
} }