Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
7b48b64ef0
|
|
@ -1,29 +1,12 @@
|
|||
package com.czg;
|
||||
|
||||
import com.czg.account.entity.SysMenu;
|
||||
import com.czg.account.entity.SysRolesMenus;
|
||||
import com.czg.account.service.SysMenuService;
|
||||
import com.czg.account.service.SysRolesMenusService;
|
||||
import com.czg.annotation.SaAdminCheckPermission;
|
||||
import com.mybatisflex.core.dialect.DbType;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* @author ww
|
||||
|
|
@ -34,51 +17,9 @@ import java.util.Map;
|
|||
@MapperScan("com.czg.service.account.mapper")
|
||||
@EnableDubbo
|
||||
@Slf4j
|
||||
public class AccountApplication implements CommandLineRunner {
|
||||
public class AccountApplication{
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AccountApplication.class, args);
|
||||
}
|
||||
@Autowired
|
||||
private RequestMappingHandlerMapping requestMappingHandlerMapping;
|
||||
@Autowired
|
||||
private SysMenuService sysMenuService;
|
||||
@Autowired
|
||||
private SysRolesMenusService sysRolesMenusService;
|
||||
|
||||
|
||||
|
||||
public void run(String... args) {
|
||||
Map<RequestMappingInfo, HandlerMethod> handlerMethods = this.requestMappingHandlerMapping.getHandlerMethods();
|
||||
handlerMethods.forEach((key, value) -> {
|
||||
Method method = value.getMethod();
|
||||
SaAdminCheckPermission annotation = AnnotationUtils.getAnnotation(method, SaAdminCheckPermission.class);
|
||||
if (annotation == null) return;
|
||||
for (String s : annotation.value()) {
|
||||
SysMenu menu1 = sysMenuService.queryChain().eq(SysMenu::getPermission, s).one();
|
||||
if (menu1 !=null) {
|
||||
long count1 = sysRolesMenusService.queryChain().eq(SysRolesMenus::getMenuId, menu1.getMenuId()).eq(SysRolesMenus::getRoleId, 1L).count();
|
||||
if (count1 == 0) {
|
||||
SysRolesMenus sysRolesMenus = new SysRolesMenus();
|
||||
sysRolesMenus.setMenuId(menu1.getMenuId());
|
||||
sysRolesMenus.setRoleId(1L);
|
||||
sysRolesMenusService.save(sysRolesMenus);
|
||||
log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", menu1.getName(), menu1.getPermission());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
SysMenu sysMenu = new SysMenu();
|
||||
sysMenu.setPermission(s);
|
||||
sysMenu.setName(s);
|
||||
sysMenu.setType(2);
|
||||
sysMenuService.save(sysMenu);
|
||||
SysRolesMenus sysRolesMenus = new SysRolesMenus();
|
||||
sysRolesMenus.setMenuId(sysMenu.getMenuId());
|
||||
sysRolesMenus.setRoleId(1L);
|
||||
sysRolesMenusService.save(sysRolesMenus);
|
||||
log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", sysMenu.getName(), sysMenu.getPermission());
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ public class MerchantRegisterController {
|
|||
* @return 激活码列表
|
||||
*/
|
||||
@SaAdminCheckRole("管理员")
|
||||
@SaAdminCheckPermission("merchantRegister:list")
|
||||
@SaAdminCheckPermission(value = "merchantRegister:list", name = "激活码列表")
|
||||
@GetMapping
|
||||
public CzgResult<Page<MerchantRegister>> get(PageDTO pageDTO, Integer state, String startTime, String endTime) {
|
||||
return CzgResult.success(merchantRegisterService.get(pageDTO, state, startTime, endTime));
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@ package com.czg.controller.user;
|
|||
import com.czg.log.annotation.OperationLog;
|
||||
import com.czg.product.param.MiniHomeProductParam;
|
||||
import com.czg.product.service.UProductService;
|
||||
import com.czg.product.vo.HotsProductVo;
|
||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||
import com.czg.product.vo.ShopGroupProductVo;
|
||||
import com.czg.product.vo.ShopProductVo;
|
||||
import com.czg.resp.CzgResult;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
|
@ -38,12 +39,22 @@ public class UProductController {
|
|||
}
|
||||
|
||||
/**
|
||||
* 小程序点餐-热销商品查询
|
||||
* 小程序点餐-热销商品列表
|
||||
*/
|
||||
@GetMapping("/miniApp/hots/query")
|
||||
@OperationLog("小程序点餐-热销商品列表")
|
||||
public CzgResult<List<HotsProductVo>> queryProductForMiniAppHome() {
|
||||
List<HotsProductVo> list = uProductService.queryHotsProductList();
|
||||
public CzgResult<List<ShopProductVo>> queryHotsProductList() {
|
||||
List<ShopProductVo> list = uProductService.queryHotsProductList();
|
||||
return CzgResult.success(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 小程序点餐-分组商品列表
|
||||
*/
|
||||
@GetMapping("/miniApp/group/query")
|
||||
@OperationLog("小程序点餐-分组商品列表")
|
||||
public CzgResult<List<ShopGroupProductVo>> queryGroupProductList() {
|
||||
List<ShopGroupProductVo> list = uProductService.queryGroupProductList();
|
||||
return CzgResult.success(list);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ public @interface SaAdminCheckPermission {
|
|||
@AliasFor(annotation = SaCheckPermission.class)
|
||||
String [] value() default {};
|
||||
|
||||
String name() default "";
|
||||
|
||||
/**
|
||||
* 验证模式:AND | OR,默认AND
|
||||
* @return 验证模式
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@ package com.czg.product.service;
|
|||
|
||||
import com.czg.product.entity.Product;
|
||||
import com.czg.product.param.MiniHomeProductParam;
|
||||
import com.czg.product.vo.HotsProductVo;
|
||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||
import com.czg.product.vo.ShopGroupProductVo;
|
||||
import com.czg.product.vo.ShopProductVo;
|
||||
import com.mybatisflex.core.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -17,5 +18,7 @@ public interface UProductService extends IService<Product> {
|
|||
|
||||
MiniAppHomeProductVo queryProductForMiniAppHome(MiniHomeProductParam param);
|
||||
|
||||
List<HotsProductVo> queryHotsProductList();
|
||||
List<ShopProductVo> queryHotsProductList();
|
||||
|
||||
List<ShopGroupProductVo> queryGroupProductList();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
package com.czg.product.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分组商品
|
||||
*
|
||||
* @author tankaikai
|
||||
* @since 2025-02-19 15:39
|
||||
*/
|
||||
@Data
|
||||
public class ShopGroupProductVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 分组id
|
||||
*/
|
||||
private Long id;
|
||||
/**
|
||||
* 分组名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 商品列表
|
||||
*/
|
||||
private List<ShopProductVo> productList;
|
||||
}
|
||||
|
|
@ -15,7 +15,7 @@ import java.time.LocalTime;
|
|||
* @since 2025-02-19 09:23
|
||||
*/
|
||||
@Data
|
||||
public class HotsProductVo implements Serializable {
|
||||
public class ShopProductVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
package com.czg;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.mybatisflex.core.row.Db;
|
||||
import com.mybatisflex.core.row.Row;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@SuppressWarnings("all")
|
||||
@ConditionalOnClass(name = "com.czg.annotation.SaAdminCheckPermission")
|
||||
public class LoadingRole implements CommandLineRunner {
|
||||
@Autowired
|
||||
private RequestMappingHandlerMapping requestMappingHandlerMapping;
|
||||
|
||||
public void run(String... args) {
|
||||
Map<RequestMappingInfo, HandlerMethod> handlerMethods = this.requestMappingHandlerMapping.getHandlerMethods();
|
||||
handlerMethods.forEach((key, value) -> {
|
||||
Method method = value.getMethod();
|
||||
|
||||
try {
|
||||
// 使用反射获取注解(不 import SaAdminCheckPermission)
|
||||
Class<?> annotationClass = Class.forName("com.czg.annotation.SaAdminCheckPermission");
|
||||
Object annotation = AnnotationUtils.getAnnotation(method, (Class) annotationClass);
|
||||
|
||||
if (annotation == null) return;
|
||||
|
||||
// 通过反射获取注解的 value() 方法
|
||||
Method valueMethod = annotationClass.getMethod("value");
|
||||
String[] permissions = (String[]) valueMethod.invoke(annotation);
|
||||
|
||||
Method nameMethod = annotationClass.getMethod("name");
|
||||
String permissionName = (String) nameMethod.invoke(annotation);
|
||||
|
||||
for (String s : permissions) {
|
||||
String sql = "select * from sys_menu where permission=?";
|
||||
Row menu1 = Db.selectOneBySql(sql, s);
|
||||
if (menu1 != null) {
|
||||
Long menuId = menu1.getLong("menu_id");
|
||||
String title = menu1.getString("title");
|
||||
String permission = menu1.getString("permission");
|
||||
String listSql = "select * from sys_roles_menus where menu_id=? and role_id=?";
|
||||
List<Row> count1 = Db.selectListBySql(listSql, menuId, 1L);
|
||||
|
||||
if (count1.isEmpty()) {
|
||||
sql = "INSERT INTO `sys_roles_menus` (`menu_id`, `role_id`) VALUES (?, ?);";
|
||||
Db.insertBySql(sql, menu1, 1L);
|
||||
log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", title, permission);
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(permissionName) && !title.equals(permissionName)) {
|
||||
sql = "update sys_menu set title=? where menu_id=?";
|
||||
Db.updateBySql(sql, permissionName, menuId);
|
||||
log.info("接口菜单修改成功, 旧名称: {}, 新菜单名称: {}", title, permissionName);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
sql = "INSERT INTO `czg_cashier`.`sys_menu` ( `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `active_menu`, `is_shop`) VALUES " +
|
||||
"(0, 2, ?, NULL, '', 2, '', '', b'0', b'0', b'0', ?, NULL, NULL, ?, NULL, NULL, 0);";
|
||||
Db.insertBySql(sql, StrUtil.isNotBlank(permissionName) ? permissionName : s, s, DateUtil.date());
|
||||
sql = "select * from sys_menu where permission=?";
|
||||
Row info = Db.selectOneBySql(sql, s);
|
||||
Long menuId = info.getLong("menu_id");
|
||||
|
||||
sql = "INSERT INTO `sys_roles_menus` (`menu_id`, `role_id`) VALUES (?, ?);";
|
||||
Db.insertBySql(sql, menuId, 1L);
|
||||
|
||||
log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", s, s);
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
log.warn("SaAdminCheckPermission 注解未找到,跳过权限检查");
|
||||
} catch (Exception e) {
|
||||
log.error("获取 SaAdminCheckPermission 注解失败", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package com.czg.service.product.mapper;
|
||||
|
||||
import com.czg.product.entity.Product;
|
||||
import com.czg.product.vo.HotsProductVo;
|
||||
import com.czg.product.vo.ShopProductVo;
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
|
@ -9,14 +9,15 @@ import org.apache.ibatis.annotations.Param;
|
|||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
* 商品
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
@Mapper
|
||||
public interface ProductMapper extends BaseMapper<Product> {
|
||||
|
||||
List<HotsProductVo> queryHotsProductList(@Param("shopId") Long shopId);
|
||||
|
||||
List<ShopProductVo> selectHotsProductList(@Param("shopId") Long shopId);
|
||||
|
||||
List<ShopProductVo> selectGroupProductList(@Param("shopId") Long shopId);
|
||||
}
|
||||
|
|
@ -14,10 +14,7 @@ import com.czg.product.entity.ProdSku;
|
|||
import com.czg.product.entity.Product;
|
||||
import com.czg.product.param.MiniHomeProductParam;
|
||||
import com.czg.product.service.UProductService;
|
||||
import com.czg.product.vo.HotsProductVo;
|
||||
import com.czg.product.vo.MiniAppHomeProdGroupVo;
|
||||
import com.czg.product.vo.MiniAppHomeProductInfoVo;
|
||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||
import com.czg.product.vo.*;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.product.mapper.ProdGroupMapper;
|
||||
import com.czg.service.product.mapper.ProdGroupRelationMapper;
|
||||
|
|
@ -164,15 +161,42 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<HotsProductVo> queryHotsProductList() {
|
||||
public List<ShopProductVo> queryHotsProductList() {
|
||||
Long shopId = StpKit.USER.getShopId(0L);
|
||||
List<HotsProductVo> list = productMapper.queryHotsProductList(shopId);
|
||||
List<ShopProductVo> list = productMapper.selectHotsProductList(shopId);
|
||||
list.forEach(item -> {
|
||||
item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime()));
|
||||
});
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ShopGroupProductVo> queryGroupProductList() {
|
||||
Long shopId = StpKit.USER.getShopId(0L);
|
||||
List<ShopGroupProductVo> groupList = prodGroupMapper.selectListByQueryAs(query().select(ProdGroup::getId, ProdGroup::getName).eq(ProdGroup::getShopId, shopId).eq(ProdGroup::getStatus, StatusEnum.ENABLED.value()).orderBy(ProdGroup::getSort, true), ShopGroupProductVo.class);
|
||||
List<ShopProductVo> productAllList = productMapper.selectGroupProductList(shopId);
|
||||
productAllList.forEach(item -> {
|
||||
item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime()));
|
||||
});
|
||||
Map<Long, ShopProductVo> productKv = productAllList.stream().collect(Collectors.toMap(ShopProductVo::getId, shopProductVo -> shopProductVo));
|
||||
for (ShopGroupProductVo group : groupList) {
|
||||
List<Long> productIdList = prodGroupRelationMapper.selectListByQueryAs(query().select(ProdGroupRelation::getProductId).eq(ProdGroupRelation::getProdGroupId, group.getId()), Long.class);
|
||||
if (CollUtil.isEmpty(productIdList)) {
|
||||
group.setProductList(List.of());
|
||||
continue;
|
||||
}
|
||||
List<ShopProductVo> productList = new ArrayList<>();
|
||||
for (Long productId : productIdList) {
|
||||
ShopProductVo product = productKv.get(productId);
|
||||
if (product != null) {
|
||||
productList.add(product);
|
||||
}
|
||||
}
|
||||
group.setProductList(productList);
|
||||
}
|
||||
return groupList.stream().filter(group -> CollUtil.isNotEmpty(group.getProductList())).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算是否在可售时间内
|
||||
*
|
||||
|
|
|
|||
|
|
@ -2,34 +2,53 @@
|
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="com.czg.service.product.mapper.ProductMapper">
|
||||
|
||||
<select id="queryHotsProductList" resultType="com.czg.product.vo.HotsProductVo">
|
||||
select
|
||||
t1.id,
|
||||
t1.name,
|
||||
t2.origin_price,
|
||||
t2.sale_price,
|
||||
t2.member_price,
|
||||
t1.cover_img,
|
||||
t3.name as unit_name,
|
||||
t1.is_sold_stock,
|
||||
t1.stock_number,
|
||||
t1.type,
|
||||
t1.group_type,
|
||||
t1.days,
|
||||
t1.start_time,
|
||||
t1.end_time,
|
||||
ifnull(t2.suit_num, 1) as suit_num
|
||||
<sql id="shopProductQuery">
|
||||
select t1.id,
|
||||
t1.name,
|
||||
t2.origin_price,
|
||||
t2.sale_price,
|
||||
t2.member_price,
|
||||
t1.cover_img,
|
||||
t3.name as unit_name,
|
||||
t1.is_sold_stock,
|
||||
t1.stock_number,
|
||||
t1.type,
|
||||
t1.group_type,
|
||||
t1.days,
|
||||
t1.start_time,
|
||||
t1.end_time,
|
||||
ifnull(t2.suit_num, 1) as suit_num
|
||||
from tb_product t1
|
||||
left join (select x.product_id,MIN(x.sale_price) as sale_price,x.origin_price,x.member_price,x.suit_num from
|
||||
tb_prod_sku x
|
||||
where x.is_del=0 and x.is_grounding = 1 and x.shop_id = #{shopId} group by x.product_id) t2 on t1.id =
|
||||
t2.product_id
|
||||
left join (select x.product_id,
|
||||
MIN(x.sale_price) as sale_price,
|
||||
x.origin_price,
|
||||
x.member_price,
|
||||
x.suit_num
|
||||
from tb_prod_sku x
|
||||
where x.is_del = 0
|
||||
and x.is_grounding = 1
|
||||
and x.shop_id = #{shopId}
|
||||
group by x.product_id) t2 on t1.id = t2.product_id
|
||||
left join tb_shop_prod_unit t3 on t1.unit_id = t3.id
|
||||
</sql>
|
||||
|
||||
<select id="selectHotsProductList" resultType="com.czg.product.vo.ShopProductVo">
|
||||
<include refid="shopProductQuery"/>
|
||||
<where>
|
||||
and t1.is_del = 0
|
||||
and t1.is_sale = 1
|
||||
and t1.is_hot = 1
|
||||
and t2.sale_price is not null
|
||||
and t1.shop_id = #{shopId}
|
||||
</where>
|
||||
order by t1.sort desc,t1.id desc
|
||||
</select>
|
||||
<select id="selectGroupProductList" resultType="com.czg.product.vo.ShopProductVo">
|
||||
<include refid="shopProductQuery"/>
|
||||
<where>
|
||||
and t1.is_del = 0
|
||||
and t1.is_sale = 1
|
||||
and t2.sale_price is not null
|
||||
and t1.shop_id = #{shopId}
|
||||
</where>
|
||||
order by t1.sort desc,t1.id desc
|
||||
|
|
|
|||
Loading…
Reference in New Issue