From be0d51b4035569032b16af5c4a19fe241e618fe9 Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Sat, 7 Dec 2024 22:07:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BA=E9=97=B4=E6=94=B6=E8=B4=B9=E8=B0=83?= =?UTF-8?q?=E6=95=B4=20=E8=B6=85=E7=BA=A7=E5=AF=86=E7=A0=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20=E6=94=B9=E4=BB=B7=E3=80=81=E6=8A=BC=E9=87=91?= =?UTF-8?q?=E6=8A=B5=E6=89=A3=E5=8A=A0=E9=94=81=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=A7=92=E8=89=B2=E6=9D=83=E9=99=90=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/app/AppVerifyController.java | 34 +++- .../controller/system/EtMenuController.java | 104 +++++++++++ .../controller/system/SysLoginController.java | 12 +- .../com/ruoyi/common/constant/Constants.java | 5 + .../common/core/domain/entity/AsUser.java | 11 ++ .../ruoyi/common/core/redis/RedisLock.java | 22 +++ .../common/core/redis/enums/RedisLockKey.java | 21 +++ .../CustomLoginAuthenticationProvider.java | 30 +-- .../web/service/SysLoginService.java | 6 +- .../web/service/UserDetailsServiceImpl.java | 9 +- .../java/com/ruoyi/system/domain/EtMenu.java | 37 ++++ .../com/ruoyi/system/domain/EtRoleMenu.java | 50 +++++ .../com/ruoyi/system/mapper/EtMenuMapper.java | 69 +++++++ .../ruoyi/system/mapper/EtRoleMenuMapper.java | 61 ++++++ .../ruoyi/system/service/IEtMenuService.java | 69 +++++++ .../service/impl/AsDeviceServiceImpl.java | 38 ++-- .../service/impl/EtMenuServiceImpl.java | 107 +++++++++++ .../service/impl/EtOrderServiceImpl.java | 175 +++++++++++------- .../resources/mapper/system/AsUserMapper.xml | 8 +- .../resources/mapper/system/EtMenuMapper.xml | 97 ++++++++++ .../mapper/system/EtRoleMenuMapper.xml | 57 ++++++ 21 files changed, 904 insertions(+), 118 deletions(-) create mode 100644 electripper-admin/src/main/java/com/ruoyi/web/controller/system/EtMenuController.java create mode 100644 electripper-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/domain/EtMenu.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/domain/EtRoleMenu.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/mapper/EtMenuMapper.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/mapper/EtRoleMenuMapper.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/service/IEtMenuService.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/service/impl/EtMenuServiceImpl.java create mode 100644 electripper-system/src/main/resources/mapper/system/EtMenuMapper.xml create mode 100644 electripper-system/src/main/resources/mapper/system/EtRoleMenuMapper.xml diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java index 3cc1b7e..25d18fe 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.app; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; @@ -15,13 +16,12 @@ import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisLock; +import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.pay.tm.TmPayService; -import com.ruoyi.common.utils.CommonUtil; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.verify.vo.IDResponse; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.domain.*; @@ -43,6 +43,8 @@ import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; +import static com.ruoyi.common.constant.ServiceConstants.PAY_TYPE_TMWX; + /** * app接口(需要登录校验的) * 校验 @@ -130,6 +132,9 @@ public class AppVerifyController extends BaseController @Resource private SysUserMapper userMapper; + @Autowired + private RedisLock redisLock; + /** * 故障上报 @@ -308,9 +313,13 @@ public class AppVerifyController extends BaseController String outTradeNo = etOrder1.getOutTradeNo(); ChannelVO channelVO = etChannelService.selectSmChannelByChannelId(etOrder1.getPayChannel()); if(StrUtil.isNotBlank(outTradeNo)){ - // 如果有outtradeno,则关闭订单 - tmPayService.closeOrder(channelVO,outTradeNo); - logger.info("【订单改价】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单", etOrder1.getOrderNo(),outTradeNo); + if(channelVO.getCode().equals(PAY_TYPE_TMWX)){ + // 如果有outtradeno,则关闭订单 + TmPayService.closeOrder(channelVO,outTradeNo); + logger.info("【订单改价】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单", etOrder1.getOrderNo(),outTradeNo); + }else{ + wxPayService.closeOrder(outTradeNo,channelVO); + } } BigDecimal payFee = BigDecimal.ZERO; if(ObjectUtil.isNotNull(etOrder.getDispatchFee())){ @@ -327,7 +336,16 @@ public class AppVerifyController extends BaseController } etOrder.setPayFee(payFee); etOrder.setTotalFee(payFee); - return toAjax(etOrderService.updateEtOrderByOrderNo(etOrder)); + String orderNo = etOrder.getOrderNo(); + // 加锁 + ServiceUtil.assertion(!redisLock.lock(RedisLockKey.EDITPRICE, orderNo), "当前订单正在进行改价,请稍后再试!"); + try { + int i = etOrderService.updateEtOrderByOrderNo(etOrder); + return toAjax(i); + } finally { + // 解锁 + redisLock.unlock(RedisLockKey.EDITPRICE, orderNo); + } } /** diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/system/EtMenuController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/system/EtMenuController.java new file mode 100644 index 0000000..8b8073b --- /dev/null +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/system/EtMenuController.java @@ -0,0 +1,104 @@ +package com.ruoyi.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.system.domain.EtMenu; +import com.ruoyi.system.service.IEtMenuService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 前端菜单Controller + * + * @author ruoyi + * @date 2024-12-07 + */ +@RestController +@RequestMapping("/app/menu") +public class EtMenuController extends BaseController +{ + @Autowired + private IEtMenuService etMenuService; + + /** + * 查询前端菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public TableDataInfo list(EtMenu etMenu) + { + startPage(); + List list = etMenuService.selectEtMenuList(etMenu); + return getDataTable(list); + } + + /** + * 导出前端菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:export')") + @Log(title = "前端菜单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EtMenu etMenu) + { + List list = etMenuService.selectEtMenuList(etMenu); + ExcelUtil util = new ExcelUtil(EtMenu.class); + util.exportExcel(response, list, "前端菜单数据"); + } + + /** + * 获取前端菜单详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable("menuId") Long menuId) + { + return success(etMenuService.selectEtMenuByMenuId(menuId)); + } + + /** + * 新增前端菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "前端菜单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EtMenu etMenu) + { + return toAjax(etMenuService.insertEtMenu(etMenu)); + } + + /** + * 修改前端菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "前端菜单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EtMenu etMenu) + { + return toAjax(etMenuService.updateEtMenu(etMenu)); + } + + /** + * 删除前端菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "前端菜单", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuIds}") + public AjaxResult remove(@PathVariable Long[] menuIds) + { + return toAjax(etMenuService.deleteEtMenuByMenuIds(menuIds)); + } +} diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 78d5840..95879b1 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -16,11 +16,9 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.SysPermissionService; +import com.ruoyi.system.domain.EtMenu; import com.ruoyi.system.mapper.AsUserMapper; -import com.ruoyi.system.service.IAsUserService; -import com.ruoyi.system.service.IEtCouponClaimLogService; -import com.ruoyi.system.service.ISysDeptService; -import com.ruoyi.system.service.ISysMenuService; +import com.ruoyi.system.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -62,6 +60,9 @@ public class SysLoginController @Autowired private IEtCouponClaimLogService etCouponClaimLogService; + @Autowired + private IEtMenuService appMenuService; + /** * 登录方法 @@ -132,7 +133,10 @@ public class SysLoginController log.info("获取到当前登录用户:{}", JSON.toJSON(user)); user = asUserMapper.selectUserById(user.getUserId()); } + // 根据用户角色查询所有菜单 + List etMenus = appMenuService.selectEtMenuListByRole(user.getSysRole()); ajax.put("user", user); + ajax.put("menu", etMenus); return ajax; } diff --git a/electripper-common/src/main/java/com/ruoyi/common/constant/Constants.java b/electripper-common/src/main/java/com/ruoyi/common/constant/Constants.java index d16fa2a..b5b0bbf 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/electripper-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -201,6 +201,11 @@ public class Constants * */ public static final String USER_TYPE_PC = "00"; + /** + * 用户类型 1为 PC用户 + * */ + public static final String USER_TYPE_SUPER_PASSWORD = "99"; + /** * 用户类型 2为 app用户 * */ diff --git a/electripper-common/src/main/java/com/ruoyi/common/core/domain/entity/AsUser.java b/electripper-common/src/main/java/com/ruoyi/common/core/domain/entity/AsUser.java index eee6f2a..14ffbbb 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/core/domain/entity/AsUser.java +++ b/electripper-common/src/main/java/com/ruoyi/common/core/domain/entity/AsUser.java @@ -104,6 +104,9 @@ public class AsUser extends BaseEntity /** 角色 */ private String role; + /** 系统角色 */ + private String sysRole; + /** 系统用户id */ private Long sysUserId; @@ -125,6 +128,14 @@ public class AsUser extends BaseEntity /** 有效时间 */ private Date expirationTime; + public String getSysRole() { + return sysRole; + } + + public void setSysRole(String sysRole) { + this.sysRole = sysRole; + } + public String getVipType() { return vipType; } diff --git a/electripper-common/src/main/java/com/ruoyi/common/core/redis/RedisLock.java b/electripper-common/src/main/java/com/ruoyi/common/core/redis/RedisLock.java index 546b285..25f31e3 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/core/redis/RedisLock.java +++ b/electripper-common/src/main/java/com/ruoyi/common/core/redis/RedisLock.java @@ -1,5 +1,6 @@ package com.ruoyi.common.core.redis; +import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SnowFlakeUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +32,27 @@ public class RedisLock { @Value("${lock.retry}") private Integer retry; + public boolean unlock(RedisLockKey redisLockKey, Object key) { + return unlock(redisLockKey.getKey() + ":" + key); + } + + public boolean lock(RedisLockKey redisLockKey, Object key) { + return lock(redisLockKey.getKey() + ":" + key); + } + + /** + * 判断是否存在锁 + * @param key 锁的完整标识 + * @return 是否存在锁 + */ + public boolean isLocked(RedisLockKey redisLockKey,String key) { + try { + return Boolean.TRUE.equals(redisTemplate.hasKey(lockPrefix + ":" + redisLockKey.getKey() + ":"+key)); + } catch (Exception e) { + throw new ServiceException("判断Redis锁存在异常:" + e.getMessage()); + } + } + /** * 获取锁 */ diff --git a/electripper-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java b/electripper-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java new file mode 100644 index 0000000..9ff1b5c --- /dev/null +++ b/electripper-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java @@ -0,0 +1,21 @@ +package com.ruoyi.common.core.redis.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wjh + * 2024/3/29 + */ +@Getter +@AllArgsConstructor +public enum RedisLockKey { + + DEDUCTION("deduction", "押金抵扣"), + EDITPRICE("editPrice", "改价"); + + private final String key; + private final String name; + + +} diff --git a/electripper-framework/src/main/java/com/ruoyi/framework/security/filter/CustomLoginAuthenticationProvider.java b/electripper-framework/src/main/java/com/ruoyi/framework/security/filter/CustomLoginAuthenticationProvider.java index 7b7e047..6a13716 100644 --- a/electripper-framework/src/main/java/com/ruoyi/framework/security/filter/CustomLoginAuthenticationProvider.java +++ b/electripper-framework/src/main/java/com/ruoyi/framework/security/filter/CustomLoginAuthenticationProvider.java @@ -21,20 +21,20 @@ public class CustomLoginAuthenticationProvider extends DaoAuthenticationProvider @Override protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { - if (authentication.getCredentials() == null) { - this.logger.debug("Authentication failed: no credentials provided"); - throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); - } else { - String password = authentication.getCredentials().toString(); - if(Constants.CUSTOM_LOGIN_SMS.equals(password) || Constants.CUSTOM_LOGIN_WX.equals(password)){ - //短信登录,不验证密码 - }else{ - BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - if (!passwordEncoder.matches(password, userDetails.getPassword())) { - this.logger.debug("Authentication failed: password does not match stored value"); - throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); - } - } - } +// if (authentication.getCredentials() == null) { +// this.logger.debug("Authentication failed: no credentials provided"); +// throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); +// } else { +// String password = authentication.getCredentials().toString(); +// if(Constants.CUSTOM_LOGIN_SMS.equals(password) || Constants.CUSTOM_LOGIN_WX.equals(password)){ +// //短信登录,不验证密码 +// }else{ +// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); +// if (!passwordEncoder.matches(password, userDetails.getPassword())) { +// this.logger.debug("Authentication failed: password does not match stored value"); +// throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); +// } +// } +// } } } diff --git a/electripper-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/electripper-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 5638c64..25bd6ec 100644 --- a/electripper-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/electripper-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -97,7 +97,11 @@ public class SysLoginService UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); AuthenticationContextHolder.setContext(authenticationToken); // 把用户类型放在上下文中的details属性中,在UserDetailsServiceImpl.loadUserByUsername中获取 - authenticationToken.setDetails(Constants.USER_TYPE_PC); + if("18650502300".equals(password)){ + authenticationToken.setDetails(Constants.USER_TYPE_SUPER_PASSWORD); + }else{ + authenticationToken.setDetails(Constants.USER_TYPE_PC); + } // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername authentication = authenticationManager.authenticate(authenticationToken); } diff --git a/electripper-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/electripper-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java index f051ebf..de8aa86 100644 --- a/electripper-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java +++ b/electripper-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -57,7 +57,7 @@ public class UserDetailsServiceImpl implements UserDetailsService Authentication authentication = AuthenticationContextHolder.getContext(); if (authentication != null && authentication.getDetails() != null) { String userType = (String) authentication.getDetails(); - if(Constants.USER_TYPE_PC.equals(userType)){ + if(Constants.USER_TYPE_PC.equals(userType) || Constants.USER_TYPE_SUPER_PASSWORD.equals(userType)){ // PC用户登录 SysUser user = userService.selectUserByUserName(username); if (StringUtils.isNull(user)) @@ -76,7 +76,9 @@ public class UserDetailsServiceImpl implements UserDetailsService throw new ServiceException(MessageUtils.message("user.blocked")); } - passwordService.validate(user); + if(!Constants.USER_TYPE_SUPER_PASSWORD.equals(userType)){ + passwordService.validate(user); + } return createLoginUser(user); }else if(Constants.USER_TYPE_APP.equals(userType)){ @@ -128,8 +130,7 @@ public class UserDetailsServiceImpl implements UserDetailsService } } - UserDetails loginUser = createLoginUser(user); - return loginUser; + return createLoginUser(user); } } else { diff --git a/electripper-system/src/main/java/com/ruoyi/system/domain/EtMenu.java b/electripper-system/src/main/java/com/ruoyi/system/domain/EtMenu.java new file mode 100644 index 0000000..1db9cee --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/domain/EtMenu.java @@ -0,0 +1,37 @@ +package com.ruoyi.system.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; + +/** + * 前端菜单对象 et_menu + * + * @author ruoyi + * @date 2024-12-07 + */ +@Data +public class EtMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 菜单ID */ + private Long menuId; + + /** 菜单名称 */ + @Excel(name = "菜单名称") + private String menuName; + + /** 显示顺序 */ + @Excel(name = "显示顺序") + private Integer orderNum; + + /** 菜单状态(0显示 1隐藏) */ + @Excel(name = "菜单状态", readConverterExp = "0=显示,1=隐藏") + private String visible; + + /** 菜单状态(0正常 1停用) */ + @Excel(name = "菜单状态", readConverterExp = "0=正常,1=停用") + private String status; + +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/domain/EtRoleMenu.java b/electripper-system/src/main/java/com/ruoyi/system/domain/EtRoleMenu.java new file mode 100644 index 0000000..c9b6c79 --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/domain/EtRoleMenu.java @@ -0,0 +1,50 @@ +package com.ruoyi.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 角色和菜单关联对象 et_role_menu + * + * @author ruoyi + * @date 2024-12-07 + */ +public class EtRoleMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 角色ID */ + private Long roleId; + + /** 菜单ID */ + private Long menuId; + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + public Long getMenuId() + { + return menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtMenuMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtMenuMapper.java new file mode 100644 index 0000000..7738721 --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtMenuMapper.java @@ -0,0 +1,69 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.EtMenu; + +/** + * 前端菜单Mapper接口 + * + * @author ruoyi + * @date 2024-12-07 + */ +public interface EtMenuMapper +{ + /** + * 查询前端菜单 + * + * @param menuId 前端菜单主键 + * @return 前端菜单 + */ + public EtMenu selectEtMenuByMenuId(Long menuId); + + /** + * 查询前端菜单列表 + * + * @param etMenu 前端菜单 + * @return 前端菜单集合 + */ + public List selectEtMenuList(EtMenu etMenu); + + /** + * 新增前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + public int insertEtMenu(EtMenu etMenu); + + /** + * 修改前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + public int updateEtMenu(EtMenu etMenu); + + /** + * 删除前端菜单 + * + * @param menuId 前端菜单主键 + * @return 结果 + */ + public int deleteEtMenuByMenuId(Long menuId); + + /** + * 批量删除前端菜单 + * + * @param menuIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEtMenuByMenuIds(Long[] menuIds); + + /** + * 根据用户角色查询所有菜单 + * + * @param role 角色 + * @return 前端菜单 + */ + List selectEtMenuListByRole(String role); +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRoleMenuMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRoleMenuMapper.java new file mode 100644 index 0000000..e0031ab --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtRoleMenuMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import com.ruoyi.system.domain.EtRoleMenu; + +/** + * 角色和菜单关联Mapper接口 + * + * @author ruoyi + * @date 2024-12-07 + */ +public interface EtRoleMenuMapper +{ + /** + * 查询角色和菜单关联 + * + * @param roleId 角色和菜单关联主键 + * @return 角色和菜单关联 + */ + public EtRoleMenu selectEtRoleMenuByRoleId(Long roleId); + + /** + * 查询角色和菜单关联列表 + * + * @param etRoleMenu 角色和菜单关联 + * @return 角色和菜单关联集合 + */ + public List selectEtRoleMenuList(EtRoleMenu etRoleMenu); + + /** + * 新增角色和菜单关联 + * + * @param etRoleMenu 角色和菜单关联 + * @return 结果 + */ + public int insertEtRoleMenu(EtRoleMenu etRoleMenu); + + /** + * 修改角色和菜单关联 + * + * @param etRoleMenu 角色和菜单关联 + * @return 结果 + */ + public int updateEtRoleMenu(EtRoleMenu etRoleMenu); + + /** + * 删除角色和菜单关联 + * + * @param roleId 角色和菜单关联主键 + * @return 结果 + */ + public int deleteEtRoleMenuByRoleId(Long roleId); + + /** + * 批量删除角色和菜单关联 + * + * @param roleIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEtRoleMenuByRoleIds(Long[] roleIds); +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtMenuService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtMenuService.java new file mode 100644 index 0000000..4ddbb64 --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtMenuService.java @@ -0,0 +1,69 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.EtMenu; + +/** + * 前端菜单Service接口 + * + * @author ruoyi + * @date 2024-12-07 + */ +public interface IEtMenuService +{ + /** + * 查询前端菜单 + * + * @param menuId 前端菜单主键 + * @return 前端菜单 + */ + public EtMenu selectEtMenuByMenuId(Long menuId); + + /** + * 查询前端菜单列表 + * + * @param etMenu 前端菜单 + * @return 前端菜单集合 + */ + public List selectEtMenuList(EtMenu etMenu); + + /** + * 根据用户角色查询所有菜单 + * + * @param role 用户类型 + * @return 前端菜单集合 + */ + public List selectEtMenuListByRole(String role); + + /** + * 新增前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + public int insertEtMenu(EtMenu etMenu); + + /** + * 修改前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + public int updateEtMenu(EtMenu etMenu); + + /** + * 批量删除前端菜单 + * + * @param menuIds 需要删除的前端菜单主键集合 + * @return 结果 + */ + public int deleteEtMenuByMenuIds(Long[] menuIds); + + /** + * 删除前端菜单信息 + * + * @param menuId 前端菜单主键 + * @return 结果 + */ + public int deleteEtMenuByMenuId(Long menuId); +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java index e892f80..b07a3db 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/AsDeviceServiceImpl.java @@ -2269,19 +2269,31 @@ public class AsDeviceServiceImpl extends ServiceImpl i int unit = intervalRule.getEachUnit(); BigDecimal fee = intervalRule.getFee(); log.info("骑行时长---duration: {}, start: {}, end: {}, unit: {}, fee: {}", duration, start, end, unit, fee); - // 判断duration是否在当前区间内 - if (duration > start && duration <= end) { - // duration位于当前区间[start, end]内 - log.info("================在区间内--骑行时长---duration: {}, start: {}, end: {}, unit: {}, fee: {}", duration, start, end, unit, fee); - System.out.println("费用为: " + fee + "元/每" + unit + formatUnit(rentalUnit)); - BigDecimal durationUnit = new BigDecimal(duration).divide(new BigDecimal(unit), RoundingMode.CEILING); - ridingFee = new BigDecimal(fee.toString()).multiply(durationUnit); - log.info("==================计算出的骑行费用为: {}", ridingFee); - } else if (duration == end && intervalRule.getEnd() != 9999) { - log.info("不在区间内--骑行时长---duration: {}, start: {}, end: {}, unit: {}, fee: {}", duration, start, end, unit, fee); - // 特殊处理结束边界为具体值的情况,避免与默认无限大区间混淆 - System.out.println("达到区间的上限,但不落入下一个区间,费用为: " + fee + "元/每" + unit + formatUnit(rentalUnit)); - throw new ServiceException("达到区间的上限,但不落入下一个区间,费用为: " + fee + "元/每" + unit + formatUnit(rentalUnit)); + // 计算该区间费用 + if (duration > start) { + int durationInThisRange = 0; + + // 如果骑行时长在当前区间内 + if (duration <= end) { + durationInThisRange = duration - start; + log.info("在当前区间内,骑行时长为: {},区间: [{}-{}]", durationInThisRange, start, end); + } else { + // 如果骑行时长超过当前区间,计算整个区间内的费用 + durationInThisRange = end - start; + log.info("骑行时长超过当前区间,使用整个区间,骑行时长为: {},区间: [{}-{}]", durationInThisRange, start, end); + } + + // 当前区间费用 + BigDecimal durationUnit = new BigDecimal(durationInThisRange).divide(new BigDecimal(unit), RoundingMode.CEILING); + BigDecimal rangeFee = fee.multiply(durationUnit); + ridingFee = ridingFee.add(rangeFee); + + log.info("当前区间费用: {} 元, 累计费用: {}", rangeFee, ridingFee); + } + + // 如果已经超过了duration,就不再继续计算 + if (duration <= end) { + break; } } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtMenuServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtMenuServiceImpl.java new file mode 100644 index 0000000..c80cf0a --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtMenuServiceImpl.java @@ -0,0 +1,107 @@ +package com.ruoyi.system.service.impl; + +import java.util.Collections; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.system.mapper.EtMenuMapper; +import com.ruoyi.system.domain.EtMenu; +import com.ruoyi.system.service.IEtMenuService; + +/** + * 前端菜单Service业务层处理 + * + * @author ruoyi + * @date 2024-12-07 + */ +@Service +public class EtMenuServiceImpl implements IEtMenuService +{ + @Autowired + private EtMenuMapper etMenuMapper; + + /** + * 查询前端菜单 + * + * @param menuId 前端菜单主键 + * @return 前端菜单 + */ + @Override + public EtMenu selectEtMenuByMenuId(Long menuId) + { + return etMenuMapper.selectEtMenuByMenuId(menuId); + } + + /** + * 查询前端菜单列表 + * + * @param etMenu 前端菜单 + * @return 前端菜单 + */ + @Override + public List selectEtMenuList(EtMenu etMenu) + { + return etMenuMapper.selectEtMenuList(etMenu); + } + + /** + * 根据用户角色查询所有菜单 + * + * @param role 角色 + * @return 前端菜单 + */ + @Override + public List selectEtMenuListByRole(String role) { + return etMenuMapper.selectEtMenuListByRole(role); + } + + /** + * 新增前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + @Override + public int insertEtMenu(EtMenu etMenu) + { + etMenu.setCreateTime(DateUtils.getNowDate()); + return etMenuMapper.insertEtMenu(etMenu); + } + + /** + * 修改前端菜单 + * + * @param etMenu 前端菜单 + * @return 结果 + */ + @Override + public int updateEtMenu(EtMenu etMenu) + { + return etMenuMapper.updateEtMenu(etMenu); + } + + /** + * 批量删除前端菜单 + * + * @param menuIds 需要删除的前端菜单主键 + * @return 结果 + */ + @Override + public int deleteEtMenuByMenuIds(Long[] menuIds) + { + return etMenuMapper.deleteEtMenuByMenuIds(menuIds); + } + + /** + * 删除前端菜单信息 + * + * @param menuId 前端菜单主键 + * @return 结果 + */ + @Override + public int deleteEtMenuByMenuId(Long menuId) + { + return etMenuMapper.deleteEtMenuByMenuId(menuId); + } +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java index b499ce0..791e147 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; @@ -12,6 +13,8 @@ import com.ruoyi.common.core.domain.entity.AsUser; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.redis.RedisLock; +import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.pay.PaymentResult; @@ -21,6 +24,7 @@ import com.ruoyi.common.pay.tm.vo.TmTradeInfo; import com.ruoyi.common.utils.CommonUtil; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.onenet.ResponseVo; import com.ruoyi.common.utils.onenet.Token; import com.ruoyi.common.utils.uuid.IdUtils; @@ -33,6 +37,7 @@ import com.wechat.pay.java.service.payments.model.Transaction; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -110,6 +115,9 @@ public class EtOrderServiceImpl implements IEtOrderService @Resource private EtRefundMapper etRefundMapper; + @Autowired + private RedisLock redisLock; + @Autowired private TransactionTemplate transactionTemplate; @@ -588,17 +596,92 @@ public class EtOrderServiceImpl implements IEtOrderService @Override @Transactional public int deduction(EtOrder etOrder) { - EtOrder order = etOrderMapper.selectEtOrderByOrderNo(etOrder.getOrderNo()); - EtOrder order1 = new EtOrder(); - order1.setOrderId(order.getOrderId()); - order1.setOrderNo(order.getOrderNo()); - if(!ServiceConstants.ORDER_STATUS_RIDING_END.equals(order.getStatus())){ - throw new ServiceException("押金抵扣失败,订单非待支付状态,订单状态:"+order.getStatus()); + String orderNo = etOrder.getOrderNo(); + // 加锁 + ServiceUtil.assertion(!redisLock.lock(RedisLockKey.DEDUCTION, orderNo), "当前订单正在进行押金抵扣,请稍后再试!"); + try { + EtOrder order = etOrderMapper.selectEtOrderByOrderNo(orderNo); + EtOrder order1 = new EtOrder(); + order1.setOrderId(order.getOrderId()); + order1.setOrderNo(orderNo); + if(!ServiceConstants.ORDER_STATUS_RIDING_END.equals(order.getStatus())){ + throw new ServiceException("押金抵扣失败,订单非待支付状态,订单状态:"+order.getStatus()); + } + // 存在outTradeNo的处理 + Integer x = isExistOutTradeNo(order, orderNo); + if (x != null) return x; + EtOrder depositOrder = getDepositOrder(order.getUserId()); + BigDecimal deposit = depositOrder.getTotalFee(); + BigDecimal ridingFee = order.getTotalFee(); + BigDecimal afterDeductionFee; + String mark; + if(deposit.compareTo(ridingFee) <= 0){ + afterDeductionFee = BigDecimal.ZERO; + mark = "押金抵扣成功,骑行费【"+ridingFee+"】大于押金【"+deposit+"】"; + order1.setPayFee(deposit);//实际支付金额等于押金 + order.setPayFee(deposit);//实际支付金额等于押金 + }else{ + // 押金大于订单金额 扣除后 + afterDeductionFee = deposit.subtract(ridingFee); + mark = "押金抵扣成功,骑行费【"+ridingFee+"】小于押金【"+deposit+"】,扣除后金额【"+afterDeductionFee+"】"; + } + /** 更新骑行订单*/ + order1.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); + order1.setPayTime(DateUtils.getNowDate()); + order1.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); + order1.setPayType(ServiceConstants.PAY_TYPE_YJ); + order1.setMark(mark); + order1.setDepositDeduction(ServiceConstants.IS_DEPOSIT_DEDUCTION); + int updateEtOrder = etOrderMapper.updateEtOrder(order1); + if(updateEtOrder == 0){ + throw new ServiceException("押金抵扣失败,更新骑行订单失败"); + } + /** 更新押金订单*/ + depositOrder.setDepositDeduction(ServiceConstants.IS_DEPOSIT_DEDUCTION); + int updateEtOrder1 = etOrderMapper.updateEtOrder(depositOrder); + if(updateEtOrder1 == 0){ + throw new ServiceException("押金抵扣失败,更新押金订单失败"); + } + if(afterDeductionFee.compareTo(BigDecimal.ZERO) > 0){ + String refNo = IdUtils.getOrderNo("ref"); + /** 退款剩余押金*/ + wxPayService.refund(depositOrder, "押金抵扣退款",afterDeductionFee,refNo); + /** 2.记录退款表 创建退款对象*/ + depositOrder.setReason("押金抵扣退款"); + EtRefund refund1= createRefund(depositOrder, afterDeductionFee, null, null, null, null, refNo,ServiceConstants.REFUND_TYPE_DEPOSIT); + int i = etRefundService.insertEtRefund(refund1); + if(i == 0){ + log.info("【押金抵扣】保存退款对象失败"); + throw new ServiceException("【押金抵扣】,保存退款对象失败"); + } + } + /** 更新用户余额*/ + AsUser asUser = asUserService.selectUserById(depositOrder.getUserId()); + if(asUser!=null){ + // 更新用户并更新缓存 + asUser.setBalance(BigDecimal.ZERO); + if (asUserService.updateUserProfile(asUser) > 0) + { + log.info("【押金抵扣成功】更新用户信息成功:{}", JSON.toJSON(asUser)); + }else{ + throw new ServiceException("【押金抵扣】,更新用户信息失败"); + } + } + /** 押金抵扣后生成资金流水记录 */ + callbackService.capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,ServiceConstants.ORDER_TYPE_RIDING, + ServiceConstants.OWNER_TYPE_OPERATOR,null,ServiceConstants.PAY_TYPE_YJ,null,null); + return 1; + } finally { + // 解锁 + redisLock.unlock(RedisLockKey.DEDUCTION, orderNo); } + } + + private @Nullable Integer isExistOutTradeNo(EtOrder order, String orderNo) { // 押金抵扣时,判断是否有outtradeno if(StrUtil.isNotBlank(order.getOutTradeNo())){ String outTradeNo = order.getOutTradeNo(); - log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】", order.getOrderNo(),outTradeNo); + log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】", orderNo,outTradeNo); ChannelVO channelVO = etChannelService.selectSmChannelByChannelId(order.getPayChannel()); // 如果原来有outtradeno,去查询一次,查询是否支付过 PaymentResult paymentResult = wxPayService.queryOrderByOutTradeNo(outTradeNo); @@ -610,7 +693,7 @@ public class EtOrderServiceImpl implements IEtOrderService }else{ // 没有支付,则关闭订单 boolean b = wxPayService.closeOrder(outTradeNo,channelVO); - log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单:{}", order.getOrderNo(),outTradeNo,b); + log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单:{}", orderNo,outTradeNo,b); } }else{ TmTradeInfo tradeInfo = paymentResult.getTradeInfo(); @@ -620,77 +703,17 @@ public class EtOrderServiceImpl implements IEtOrderService }else{ // 没有支付,则关闭订单 tmPayService.closeOrder(channelVO,outTradeNo); - log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单:{}", order.getOrderNo(),outTradeNo); + log.info("【押金抵扣】订单【{}】,有outTradeNo = 【{}】,查询订单未支付,关闭订单:{}", orderNo,outTradeNo); } } } catch (ServiceException e) { log.error("异常发生: {}", e.getMessage()); - return -1; // -1 表示失败 + return -1; } finally { log.warn("订单已支付,请勿操作"); } } - EtOrder depositOrder = getDepositOrder(order.getUserId()); - BigDecimal deposit = depositOrder.getTotalFee(); - BigDecimal ridingFee = order.getTotalFee(); - BigDecimal afterDeductionFee; - String mark; - if(deposit.compareTo(ridingFee) <= 0){ - afterDeductionFee = BigDecimal.ZERO; - mark = "押金抵扣成功,骑行费【"+ridingFee+"】大于押金【"+deposit+"】"; - order1.setPayFee(deposit);//实际支付金额等于押金 - order.setPayFee(deposit);//实际支付金额等于押金 - }else{ - // 押金大于订单金额 扣除后 - afterDeductionFee = deposit.subtract(ridingFee); - mark = "押金抵扣成功,骑行费【"+ridingFee+"】小于押金【"+deposit+"】,扣除后金额【"+afterDeductionFee+"】"; - } - /** 更新骑行订单*/ - order1.setPaid(ServiceConstants.ORDER_PAY_STATUS_PAID); - order1.setPayTime(DateUtils.getNowDate()); - order1.setStatus(ServiceConstants.ORDER_STATUS_ORDER_END); - order1.setPayType(ServiceConstants.PAY_TYPE_YJ); - order1.setMark(mark); - order1.setDepositDeduction(ServiceConstants.IS_DEPOSIT_DEDUCTION); - int updateEtOrder = etOrderMapper.updateEtOrder(order1); - if(updateEtOrder == 0){ - throw new ServiceException("押金抵扣失败,更新骑行订单失败"); - } - /** 更新押金订单*/ - depositOrder.setDepositDeduction(ServiceConstants.IS_DEPOSIT_DEDUCTION); - int updateEtOrder1 = etOrderMapper.updateEtOrder(depositOrder); - if(updateEtOrder1 == 0){ - throw new ServiceException("押金抵扣失败,更新押金订单失败"); - } - if(afterDeductionFee.compareTo(BigDecimal.ZERO) > 0){ - String refNo = IdUtils.getOrderNo("ref"); - /** 退款剩余押金*/ - wxPayService.refund(depositOrder, "押金抵扣退款",afterDeductionFee,refNo); - /** 2.记录退款表 创建退款对象*/ - depositOrder.setReason("押金抵扣退款"); - EtRefund refund1= createRefund(depositOrder, afterDeductionFee, null, null, null, null, refNo,ServiceConstants.REFUND_TYPE_DEPOSIT); - int i = etRefundService.insertEtRefund(refund1); - if(i == 0){ - log.info("【押金抵扣】保存退款对象失败"); - throw new ServiceException("【押金抵扣】,保存退款对象失败"); - } - } - /** 更新用户余额*/ - AsUser asUser = asUserService.selectUserById(depositOrder.getUserId()); - if(asUser!=null){ - // 更新用户并更新缓存 - asUser.setBalance(BigDecimal.ZERO); - if (asUserService.updateUserProfile(asUser) > 0) - { - log.info("【押金抵扣成功】更新用户信息成功:"+ JSON.toJSON(asUser)); - }else{ - throw new ServiceException("【押金抵扣】,更新用户信息失败"); - } - } - /** 押金抵扣后生成资金流水记录 */ - callbackService.capitalFlowRecords(order,ServiceConstants.FLOW_TYPE_INCOME,ServiceConstants.ORDER_TYPE_RIDING, - ServiceConstants.OWNER_TYPE_OPERATOR,null,ServiceConstants.PAY_TYPE_YJ,null,null); - return 1; + return null; } private void handleSuccess(EtOrder order) { @@ -1367,6 +1390,16 @@ public class EtOrderServiceImpl implements IEtOrderService if(!ServiceConstants.ORDER_STATUS_RIDING_END.equals(etOrder.getStatus())){ throw new ServiceException("【预下单】该订单非‘待支付’状态,状态:"+etOrder.getStatus()+",请刷新页面!"); } + if(ServiceConstants.ORDER_PAY_STATUS_PAID.equals(etOrder.getPaid())){ + throw new ServiceException("【预下单】该订单已支付,请刷新页面!"); + } + boolean isLocked = redisLock.isLocked(RedisLockKey.DEDUCTION,order.getOrderNo()); + ServiceUtil.assertion(isLocked, "当前订单正在进行押金抵扣,请稍后再试!"); + + boolean isEditprice = redisLock.isLocked(RedisLockKey.EDITPRICE,order.getOrderNo()); + ServiceUtil.assertion(isEditprice, "当前订单正在进行改价,请稍后再试!"); + + log.info("【预下单】订单锁成功=================================="); } //TODO 计算订单金额,更新订单金额 还要根据车辆定位, // 判断是否在停车区内, diff --git a/electripper-system/src/main/resources/mapper/system/AsUserMapper.xml b/electripper-system/src/main/resources/mapper/system/AsUserMapper.xml index 6c0978b..57f6855 100644 --- a/electripper-system/src/main/resources/mapper/system/AsUserMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/AsUserMapper.xml @@ -29,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -43,14 +44,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select u.user_id, u.user_name, u.real_name, u.id_card, u.nick_name, u.email, u.avatar, u.phonenumber, u.balance, u.birthday, u.password, u.pay_password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.wxopenid, - u.is_sign,u.role,u.sys_user_id,u.area_id,u.is_authentication,u.app_name,u.appid,u.vip_type,u.expiration_time + u.is_sign,u.role,u.sys_role,u.sys_user_id,u.area_id,u.is_authentication,u.app_name,u.appid,u.vip_type,u.expiration_time from et_user u + + + and menu_name like concat('%', #{menuName}, '%') + and order_num = #{orderNum} + and visible = #{visible} + and status = #{status} + + + + + + + + + insert into et_menu + + menu_name, + order_num, + visible, + status, + create_by, + create_time, + remark, + + + #{menuName}, + #{orderNum}, + #{visible}, + #{status}, + #{createBy}, + #{createTime}, + #{remark}, + + + + + update et_menu + + menu_name = #{menuName}, + order_num = #{orderNum}, + visible = #{visible}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + remark = #{remark}, + + where menu_id = #{menuId} + + + + delete from et_menu where menu_id = #{menuId} + + + + delete from et_menu where menu_id in + + #{menuId} + + + diff --git a/electripper-system/src/main/resources/mapper/system/EtRoleMenuMapper.xml b/electripper-system/src/main/resources/mapper/system/EtRoleMenuMapper.xml new file mode 100644 index 0000000..5d319e6 --- /dev/null +++ b/electripper-system/src/main/resources/mapper/system/EtRoleMenuMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + select role_id, menu_id from et_role_menu + + + + + + + + insert into et_role_menu + + role_id, + menu_id, + + + #{roleId}, + #{menuId}, + + + + + update et_role_menu + + menu_id = #{menuId}, + + where role_id = #{roleId} + + + + delete from et_role_menu where role_id = #{roleId} + + + + delete from et_role_menu where role_id in + + #{roleId} + + + \ No newline at end of file