From 2485a4875adda2ffd0e8cfccdf749f15fe8d48cb Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期四, 17 七月 2025 08:47:48 +0800 Subject: [PATCH] bug修改 --- ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java | 20 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java | 38 + ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java | 4 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java | 6 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java | 2 ruoyi-admin/src/main/resources/application.yml | 17 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java | 2 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java | 35 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java | 3 ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml | 15 ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java | 7 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java | 57 + ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java | 5 ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml | 178 ++-- ruoyi-system/src/main/resources/cert/apiclient_cert.pem | 25 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml | 2 ruoyi-system/src/main/resources/cert/apiclient_cert.p12 | 0 ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java | 3 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java | 21 ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml | 8 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java | 3 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java | 4 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java | 8 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java | 7 ruoyi-system/pom.xml | 10 ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java | 2 ruoyi-system/src/main/resources/cert/apiclient_key.pem | 28 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java | 475 +++++++++++- ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java | 52 + ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java | 64 + ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml | 9 /dev/null | 73 - ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 7 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java | 2 ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml | 5 ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java | 99 ++ ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java | 726 +++++++++++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java | 16 ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java | 27 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 13 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java | 59 53 files changed, 1,864 insertions(+), 315 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java index 3436c14..d9fb40c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FinanceController.java @@ -36,8 +36,8 @@ @PostMapping("/top") @ApiOperation(value = "财务流水-顶部") @PreAuthorize("@ss.hasPermi('finance:flows')") - public R<FinanceFlowsTopVO> top(){ - return R.ok(orderService.financeTop()); + public R<FinanceFlowsTopVO> top(@RequestBody FinanceFlowsDTO dto){ + return R.ok(orderService.financeTop(dto)); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java index a6d35e9..e782110 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/IndexController.java @@ -19,6 +19,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @Slf4j @@ -60,21 +61,25 @@ @ApiOperation(value = "收入统计-折线图") @PreAuthorize("@ss.hasPermi('index:manage')") public R<IndexLineChartVO> chart(@RequestParam(required = false, defaultValue = "7") Integer days, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd ") LocalDate startDate, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) { + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) { // 处理日期范围 LocalDate now = LocalDate.now(); - if (startDate == null || endDate == null) { - startDate = now.minusDays(days - 1); - endDate = now; + LocalDate start; + LocalDate end ; + if (startTime == null || endTime == null) { + start = now.minusDays(days - 1); + end = now; } else { // 验证日期范围不超过30天 - long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); + long daysBetween = ChronoUnit.DAYS.between(startTime, endTime); + start=startTime.toLocalDate(); + end = endTime.toLocalDate(); if (daysBetween > 30) { - endDate = startDate.plusDays(30); + endTime = startTime.plusDays(30); } } - return R.ok(orderService.chart(startDate,endDate)); + return R.ok(orderService.chart(start,end)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java index 2fc1507..d69021d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/OrderController.java @@ -2,8 +2,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.wx.RefundCallbackResult; -import com.ruoyi.system.pojo.dto.AppUserPageDTO; import com.ruoyi.system.pojo.dto.OrderPageDTO; import com.ruoyi.system.pojo.vo.*; import com.ruoyi.system.service.OrderService; @@ -14,9 +12,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; + @Slf4j @RestController @@ -57,41 +53,41 @@ /** - * todo redis 企业异常信息 + * 企业异常信息 */ @GetMapping("/error/{id}") @ApiOperation(value = "查看详情-企业异常信息") @PreAuthorize("@ss.hasPermi('order:manage')") - public R<ErrorVO> error(@PathVariable("id") String id) { - return R.ok(orderService.error(id)); + public R error(@PathVariable("id") String id) { + return orderService.error(id); } /** - * todo redis 企业变更信息 + * 企业变更信息 */ @GetMapping("/change/{id}") @ApiOperation(value = "查看详情-企业变更信息") @PreAuthorize("@ss.hasPermi('order:manage')") - public R<ChangeVO> change(@PathVariable("id") String id) { - return R.ok(orderService.change(id)); + public R change(@PathVariable("id") String id) { + return orderService.change(id); } /** - * todo redis 企业纳税信息 + * 企业纳税信息 */ @GetMapping("/tax/{id}") @ApiOperation(value = "查看详情-企业纳税信息") @PreAuthorize("@ss.hasPermi('order:manage')") - public R<TaxVO> tax(@PathVariable("id") String id) { - return R.ok(orderService.tax(id)); + public R tax(@PathVariable("id") String id) { + return orderService.tax(id); } /** - * todo redis 企业发票信息 + * 企业发票信息 */ @GetMapping("/invoice/{id}") - @ApiOperation(value = "查看详情-企业纳税信息") + @ApiOperation(value = "查看详情-企业发票信息") @PreAuthorize("@ss.hasPermi('order:manage')") - public R<InvoiceVO> invoice(@PathVariable("id") String id) { - return R.ok(orderService.invoice(id)); + public R invoice(@PathVariable("id") String id) { + return orderService.invoice(id); } /** * 删除 @@ -127,28 +123,21 @@ return R.ok(); } + /** - * 订单取消支付回退 - * - * @param refundCallbackResult - * @param response + * 平台取消订单支付回退 * @return */ @ResponseBody - @GetMapping("/refundPayMoneyCallback") - public void refundPayMoneyCallback(RefundCallbackResult refundCallbackResult, HttpServletResponse response) { - R callback = orderService.refundPayMoneyCallback(refundCallbackResult); + @PostMapping("/refundPayMoneyCallback") + public String refundPayMoneyCallback(@RequestBody(required = false) String xmlData) { + System.out.println("平台取消订单:" + xmlData); + R callback = orderService.refundPayMoneyCallback(xmlData); if (callback.getCode() == 200) { - response.setStatus(200); - PrintWriter out = null; - try { - out = response.getWriter(); - } catch (IOException e) { - throw new RuntimeException(e); - } - out.println("success"); - out.flush(); - out.close(); + return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; + }else { + System.err.println("支付回退错误:"+callback.getMsg()); + return "<xml><return_code><![CDATA[FAIL]]></return_code></xml>"; } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java index e868390..57ddc84 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/QuestionController.java @@ -38,8 +38,8 @@ public R<IPage<QuestionPageVO>> getQuestionPage( @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize, - @RequestParam(value = "name",required = false) String name) { - return R.ok(questionService.getQuestionPage(pageNum,pageSize,name)); + @RequestParam(value = "title",required = false) String title) { + return R.ok(questionService.getQuestionPage(pageNum,pageSize,title)); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 92ec449..4cbdfd5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -48,6 +48,8 @@ @Autowired private TokenService tokenService; + + @Autowired private ISysConfigService configService; @@ -74,7 +76,7 @@ * * @return 用户信息 */ - @GetMapping("getInfo") + @GetMapping("/getInfo") public AjaxResult getInfo() { LoginUser loginUser = SecurityUtils.getLoginUser(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index f6d7bce..0455aae 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -1,7 +1,15 @@ package com.ruoyi.web.controller.system; +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.system.mapper.SysMenuMapper; import com.ruoyi.system.pojo.dto.UpdatePwdDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -48,6 +56,8 @@ @Autowired private TokenService tokenService; + @Autowired + private SysMenuMapper sysMenuMapper; /** * 个人信息 @@ -61,8 +71,33 @@ AjaxResult ajax = AjaxResult.success(user); ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + ajax.put("permissions" ,getUserPaths(user.getUserId())); return ajax; } + /** + * 获取用户拥有的所有path + * @param userId 用户ID + * @return 用户拥有的所有path列表 + */ + public List<String> getUserPaths(Long userId) { + List<Long> ids = new ArrayList<>(); + // 根据用户id查询出menus + List<SysMenu> menus = sysMenuMapper.selectMenusByUserId(userId); + //将id和父类id取出 + menus.forEach(menu -> { + ids.add(menu.getMenuId()); + if (null!= menu.getParentId() && menu.getParentId() != 0) { + ids.add(menu.getParentId()); + } + }); + + if (menus.isEmpty()) { + return Collections.emptyList(); + } + + + return sysMenuMapper.getPathsByMenuIds(ids); + } /** * 修改用户 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 4b00660..a1233d6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -327,7 +327,7 @@ // 更新缓存用户权限 LoginUser loginUser = getLoginUser(); if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) { - loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getPhonenumber())); loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); tokenService.setLoginUser(loginUser); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 500ad3d..c491a36 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -270,9 +270,9 @@ @GetMapping("/page/list") public R<IPage<SysUserPageListVO>> getSysUserPageList(@RequestParam("pageNum")Integer pageNum, @RequestParam("pageSize")Integer pageSize, - @RequestParam("nickName")String nickName, - @RequestParam("phone")Integer phone, - @RequestParam("status")String status) { + @RequestParam(value = "nickName",required = false)String nickName, + @RequestParam(value = "phone",required = false)Integer phone, + @RequestParam(value = "status",required = false)String status) { IPage<SysUserPageListVO> page=new Page<>(pageNum,pageSize); return R.ok(userService.getSysUserPageList(page,nickName,phone,status)); } @@ -310,7 +310,7 @@ /** * 新增 */ - @ApiOperation(value = "账号管理-查看详情(回显)", tags = "系统后台-权限管理") + @ApiOperation(value = "账号管理-新增", tags = "系统后台-权限管理") @PreAuthorize("@ss.hasPermi('permission:account')") @Log(title = "账号管理", businessType = BusinessType.INSERT) @PostMapping("/add") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java index d7af45d..7ea4d58 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SystemConfigController.java @@ -34,7 +34,7 @@ * 系统配置-查看 */ @GetMapping("/getSystemConfigByType") - @ApiOperation(value = "根据类型获取配置内容") + @ApiOperation(value = "根据类型获取配置内容(1-启动页 2-客服 3-抽单)") public R<SystemConfigVO> getSystemConfigByType(@RequestParam(value = "type") Integer type) { return R.ok(systemConfigService.getSystemConfigByType(type)); } diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 5237ad1..39812b1 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -16,7 +16,7 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8081 + port: 8084 servlet: # 应用的访问路径 context-path: / @@ -94,8 +94,8 @@ header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 30 + # 令牌有效期(默认72000分钟) + expireTime: 72000 # MyBatis配置 mybatis: @@ -117,7 +117,7 @@ # 是否开启swagger enabled: true # 请求前缀 - pathMapping: /dev-api + pathMapping: # 防止XSS攻击 xss: @@ -127,3 +127,12 @@ excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* + +wx: + appid: wx180c41e1915992e8 + appletsAppSecret: 8c6cc3410891d3096988b92c154ba5e9 + mchId: 1720552698 + key: 5Kb8zX9qR3r4D7Yw3vHnJgLp6sA4cE1M + callbackPath: http://221.182.45.100:8084 + certPath: classpath:cert/apiclient_cert.p12 + RASPath: \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 7bcc2ea..b729d93 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -178,11 +178,12 @@ } public static void main(String[] args) { + System.out.println("19923261698".substring(5, 11)); String hash = Md5Utils.hash("123456"); System.out.println(hash); System.out.println(encryptPassword(hash)); - System.out.println(matchesPassword(hash, "$2a$10$VhdvkOtOTUq1NndvwPC36./D9bPVhDJWbt.tVWtGdqW3.sA07Ikx.")); + System.out.println(matchesPassword(hash, "$2a$10$rk6XzddjDljPCCTghplExe2rgcLCJHVEEOAOuUaHalsIp/FCWObkG")); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java deleted file mode 100644 index 1d9b0c6..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/CloseOrderResult.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class CloseOrderResult { - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 业务结果 100:成功,101:失败 - */ - private String ra_Status; - /** - * 响应码 - * 0 系统连接超时 - * 4 服务不可用 - * 100 关单成功 - * 101 失败,详见响应码描述 - * 10080000 系统异常 - * 10080002 验证签名失败 - * 10080003 订单号不正确 - * 10080042 交易类型不合法 - * 10083001 订单正在处理中 - * 10083002 该订单请求多次交易 - * 10083003 订单已关闭,无需关单操作 - * 10083003 交易成功,无需关单操作 - * 10083004 通道系统异常,请用相同参数重新请求 - * 10083005 通道其他异常信息 - */ - private String rb_Code; - /** - * 响应码描述 - */ - private String rc_CodeMsg; - /** - * 签名数据 - */ - private String hmac; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java deleted file mode 100644 index 63d9321..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/FrpCodeEnum.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ruoyi.common.utils.wx; - -public enum FrpCodeEnum { - ALIPAY_NATIVE("支付宝扫码(主扫)", "ALIPAY_NATIVE"), - ALIPAY_CARD("支付宝刷卡(被扫)", "ALIPAY_CARD"), - ALIPAY_H5("支付宝 H5", "ALIPAY_H5"), - ALIPAY_FWC("支付宝服务窗", "ALIPAY_FWC"), - ALIPAY_SYT("支付宝收银台", "ALIPAY_SYT"), - WEIXIN_NATIVE("微信扫码(主扫)", "WEIXIN_NATIVE"), - WEIXIN_CARD("微信刷卡(被扫)", "WEIXIN_CARD"), - WEIXIN_APP3("微信 APP+支付", "WEIXIN_APP3"), - WEIXIN_H5_PLUS("微信 H5 支付", "WEIXIN_H5_PLUS"), - WEIXIN_GZH("微信公众号支付", "WEIXIN_GZH"), - WEIXIN_XCX("微信小程序支付", "WEIXIN_XCX"), - QQ_NATIVE("QQ 扫码(主扫)", "QQ_NATIVE"), - QQ_CARD("QQ 刷卡(被扫)", "QQ_CARD"), - QQ_APP("QQ APP 支付", "QQ_APP"), - QQ_H5("QQH5 支付", "QQ_H5"), - QQ_GZH("QQ 公众号支付", "QQ_GZH"), - UNIONPAY_NATIVE("银联扫码(主扫)", "UNIONPAY_NATIVE"), - UNIONPAY_CARD("银联刷卡(被扫)", "UNIONPAY_CARD"), - UNIONPAY_APP("银联 APP 支付", "UNIONPAY_APP"), - UNIONPAY_H5("银联 H5", "UNIONPAY_H5"), - UNIONPAY_SYT("银联统一收银台", "UNIONPAY_SYT"), - UNIONPAY_WXMP("银联云微小程序(无感支付)", "UNIONPAY_WXMP") - ; - - private String name; - - private String code; - - FrpCodeEnum(String name, String code) { - this.name = name; - this.code = code; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java deleted file mode 100644 index c33c581..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/PaymentUtil.java +++ /dev/null @@ -1,286 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import cn.hutool.http.Header; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; -import com.ruoyi.common.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; - -import java.util.*; - -@Slf4j -public class PaymentUtil { - - //todo 商户号配置 微信公众号、微信小程序、微信 APP+/H5、云微小程序支付 - private static final String appId = ""; - /** - * 商户密钥 - */ - private static final String key = ""; - /** - * 商户号 - */ - private static final String merchantNo = ""; - /** - * 平台-报备商户号 - */ - private static final String sysTradeMerchantNo = ""; - /** - * 支付回调地址 - */ - private static final String callbackUrl = ""; - - - /** - * 支付 - * @param orderNo 商户订单号 - * @param amount 订单金额 - * @param productName 商品名称 - * @param productDesc 商品描述 - * @param mp 公用回传参数 - * @param notifyUrl 服务器异步通知地址 - * @param openId 微信 Openid - * @param tradeMerchantNo 报备商户号 - * @return - */ - public static UniPayResult uniPay(String orderNo, Double amount, String productName, String productDesc, String mp, String notifyUrl, String openId, String tradeMerchantNo){ - String url = "https://trade.joinpay.com/tradeRt/uniPay"; - HttpRequest post = HttpUtil.createPost(url); - post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); - JSONObject body = new JSONObject(); - //版本号 - body.put("p0_Version", "2.5"); - //商户编号 - body.put("p1_MerchantNo", merchantNo); - //商户订单号 - body.put("p2_OrderNo", orderNo); - //订单金额 - body.put("p3_Amount", amount); - //交易币种 - body.put("p4_Cur", "1"); - //商品名称 - body.put("p5_ProductName", productName); - //商品描述 - body.put("p6_ProductDesc", productDesc); - //公用回传参数 - body.put("p7_Mp", mp); - //服务器异步通知地址 - body.put("p9_NotifyUrl", callbackUrl + notifyUrl); - //交易类型 - body.put("q1_FrpCode", FrpCodeEnum.WEIXIN_XCX.getCode()); - //微信 Openid - body.put("q5_OpenId", openId); - //APPID - body.put("q7_AppId", appId); - //报备商户号 - body.put("qa_TradeMerchantNo", StringUtils.isNotEmpty(tradeMerchantNo) ? tradeMerchantNo : sysTradeMerchantNo); - String sign = null; - try { - sign = sign(body); - } catch (Exception e) { - throw new RuntimeException(e); - } - body.put("hmac", sign); - post.form(body); - log.info("支付接口请求参数:" + body); - HttpResponse execute = post.execute(); - log.info("支付接口请求响应:" + execute.body()); - if(200 != execute.getStatus()){ - log.error("支付接口异常:" + execute.body()); - return null; - } - UniPayResult uniPayResult = JSON.parseObject(execute.body(), UniPayResult.class); - return uniPayResult; - } - - - /** - * 查询支付订单 - * @param orderNo 订单号 - * @return - */ - public static QueryOrderResult queryOrder(String orderNo){ - String url = "https://trade.joinpay.com/tradeRt/queryOrder"; - HttpRequest post = HttpUtil.createPost(url); - post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); - JSONObject body = new JSONObject(); - //版本号 - body.put("p0_Version", "2.5"); - //商户编号 - body.put("p1_MerchantNo", merchantNo); - //商户订单号 - body.put("p2_OrderNo", orderNo); - String sign = null; - try { - sign = sign(body); - } catch (Exception e) { - throw new RuntimeException(e); - } - body.put("hmac", sign); - post.form(body); - log.info("查询支付接口请求参数:" + body); - HttpResponse execute = post.execute(); - log.info("查询支付接口请求响应:" + execute.body()); - if(200 != execute.getStatus()){ - log.error("查询支付接口异常:" + execute.body()); - return null; - } - QueryOrderResult uniPayResult = JSON.parseObject(execute.body(), QueryOrderResult.class); - return uniPayResult; - } - - - /** - * 退款 - * @param orderNo 支付订单号 - * @param refundOrderNo 退款订单号 - * @param refundAmount 退款金额 - * @param notifyUrl 异步通知地址 - * @return - */ - public static RefundResult refund(String orderNo, String refundOrderNo, Double refundAmount, String notifyUrl){ - String url = "https://trade.joinpay.com/tradeRt/refund"; - HttpRequest post = HttpUtil.createPost(url); - post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); - JSONObject body = new JSONObject(); - //版本号 - body.put("p0_Version", "2.3"); - //商户编号 - body.put("p1_MerchantNo", merchantNo); - //商户订单号 - body.put("p2_OrderNo", orderNo); - //商户退款订单号 - body.put("p3_RefundOrderNo", refundOrderNo); - //退款金额 - body.put("p4_RefundAmount", refundAmount); - //服务器异步通知地址 - body.put("p6_NotifyUrl", callbackUrl + notifyUrl); - String sign = null; - try { - sign = sign(body); - } catch (Exception e) { - throw new RuntimeException(e); - } - body.put("hmac", sign); - post.form(body); - log.info("退款接口请求参数:" + body); - HttpResponse execute = post.execute(); - log.info("退款接口请求响应:" + execute.body()); - if(200 != execute.getStatus()){ - log.error("退款接口异常:" + execute.body()); - return null; - } - RefundResult uniPayResult = JSON.parseObject(execute.body(), RefundResult.class); - return uniPayResult; - } - - - /** - * 查询退款订单 - * @param refundOrderNo 退款订单号 - * @return - */ - public static QueryRefundResult queryRefund(String refundOrderNo){ - String url = "https://trade.joinpay.com/tradeRt/refund"; - HttpRequest post = HttpUtil.createPost(url); - post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); - JSONObject body = new JSONObject(); - //版本号 - body.put("p0_Version", "2.3"); - //商户编号 - body.put("p1_MerchantNo", merchantNo); - //商户退款订单号 - body.put("p2_RefundOrderNo", refundOrderNo); - String sign = null; - try { - sign = sign(body); - } catch (Exception e) { - throw new RuntimeException(e); - } - body.put("hmac", sign); - post.form(body); - log.info("退款接口请求参数:" + body); - HttpResponse execute = post.execute(); - log.info("退款接口请求响应:" + execute.body()); - if(200 != execute.getStatus()){ - log.error("退款接口异常:" + execute.body()); - return null; - } - QueryRefundResult uniPayResult = JSON.parseObject(execute.body(), QueryRefundResult.class); - return uniPayResult; - } - - - /** - * 关闭订单(仅支持微信和支付宝) - * @param orderNo 订单号 - * @return - */ - public static CloseOrderResult closeOrder(String orderNo){ - String url = "https://www.joinpay.com/trade/closeOrder.action"; - HttpRequest post = HttpUtil.createPost(url); - post.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded"); - JSONObject body = new JSONObject(); - //商户编号 - body.put("p1_MerchantNo", merchantNo); - //商户订单号 - body.put("p2_OrderNo", orderNo); - //交易类型 - body.put("p3_FrpCode", FrpCodeEnum.WEIXIN_XCX.getCode()); - String sign = null; - try { - sign = sign(body); - } catch (Exception e) { - throw new RuntimeException(e); - } - body.put("hmac", sign); - post.form(body); - log.info("关闭订单接口请求参数:" + body); - HttpResponse execute = post.execute(); - log.info("关闭订单接口请求响应:" + execute.body()); - if(200 != execute.getStatus()){ - log.error("关闭订单接口异常:" + execute.body()); - return null; - } - CloseOrderResult uniPayResult = JSON.parseObject(execute.body(), CloseOrderResult.class); - return uniPayResult; - } - - - - public static String sign(JSONObject body) { - Set<Map.Entry<String, Object>> entries = body.entrySet(); - List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries); - // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) - Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() { - public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) { - return (o1.getKey()).compareTo(o2.getKey()); - } - }); - // 构造签名键值对的格式 - StringBuilder sb = new StringBuilder(); - for (Map.Entry<String, Object> item : infoIds) { - if (item.getKey() != null || item.getKey() != "") { - Object val = item.getValue(); - if (!(val == "" || val == null)) { - sb.append(val); - } - } - } - sb.append(key); - log.info("待签名串:{}", sb.toString()); - return MD5AndKL.MD5(sb.toString()); - } - - - public static void main(String[] args) { -// UniPayResult uniPayResult = PaymentUtil.uniPay("852963742", 0.01D, "测试商品", "这是用于对接支付测试的商品描述", -// "", "/order/shopping-cart/shoppingCartPaymentCallback", "ooOrs64zHLuInkZ_GF0LpIN9_Rxc", "777168500885852"); -// PaymentUtil.queryOrder("852963742"); -// PaymentUtil.closeOrder("852963742"); - - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java deleted file mode 100644 index 5909fae..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryOrderResult.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class QueryOrderResult { - /** - * 版本号 - */ - private Double r0_Version; - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 商户订单号 - */ - private String r2_OrderNo; - /** - * 支付金额 - */ - private Double r3_Amount; - /** - * 商品名称 - */ - private String r4_ProductName; - /** - * 交易流水号 - */ - private String r5_TrxNo; - /** - * 银行流水号 - */ - private String r6_BankTrxNo; - /** - * 订单手续费 - */ - private Double r7_Fee; - /** - * 交易类型 - */ - private String r8_FrpCode; - /** - * 订单状态 100:成功,101:失败,102:已创建,105:订单已关闭 - */ - private String ra_Status; - /** - * 响应码 - */ - private String rb_Code; - /** - * 响应码描述 - */ - private String rc_CodeMsg; - /** - * 用户标识 - */ - private String rd_OpenId; - /** - * 平台优惠金额 - */ - private Double re_DiscountAmount; - /** - * 支付时间 - */ - private String rf_PayTime; - /** - * 卡类型 - */ - private String rh_cardType; - /** - * 银行编码 - */ - private String rj_BankCode; - /** - * 签约 ID - */ - private String rl_ContractId; - /** - * 签名数据 - */ - private String hmac; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java deleted file mode 100644 index a6910ad..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/QueryRefundResult.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class QueryRefundResult { - /** - * 版本号 - */ - private Double r0_Version; - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 商户退款订单号 - */ - private String r2_RefundOrderNo; - /** - * 退款金额 - */ - private Double r3_RefundAmount; - /** - * 退款流水号 - */ - private String r4_RefundTrxNo; - /** - * 退款完成时间 - */ - private String r5_RefundCompleteTime; - /** - * 退款渠道 - */ - private String r8_RefundWay; - /** - * 退款入账账户 - */ - private String r9_ReceiveAccountNo; - /** - * 退款状态 - * 100:退款成功 - * 101:退款失败 - * 102:退款处理中 - */ - private String ra_Status; - /** - * 响应码 - */ - private String rb_Code; - /** - * 响应码描述 - */ - private String rc_CodeMsg; - /** - * 签名数据 - */ - private String hmac; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java deleted file mode 100644 index 270c7e5..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundCallbackResult.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class RefundCallbackResult { - /** - * 版本号 - */ - private Double r0_Version; - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 商户订单号 - */ - private String r2_OrderNo; - /** - * 商户退款订单号 - */ - private String r3_RefundOrderNo; - /** - * 退款金额 - */ - private Double r4_RefundAmount; - /** - * 商户退款流水号 - */ - private String r5_RefundTrxNo; - /** - * 退款完成时间 - */ - private String r6_RefundCompleteTime; - /** - * 退款渠道 - */ - private String r7_RefundWay; - /** - * 退款入账账户 - */ - private String r8_ReceiveAccountNo; - /** - * 退款状态 100:成功;101:失败 - */ - private String ra_Status; - /** - * 响应码 - */ - private String rb_Code; - /** - * 响应码描述 - */ - private String rc_CodeMsg; - /** - * 签名数据 - */ - private String hmac; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java deleted file mode 100644 index e1a4e59..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/RefundResult.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class RefundResult { - /** - * 版本号 - */ - private Double r0_Version; - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 商户订单号 - */ - private String r2_OrderNo; - /** - * 商户退款订单号 - */ - private String r3_RefundOrderNo; - /** - * 退款金额 - */ - private Double r4_RefundAmount; - /** - * 商户退款流水号 - */ - private String r5_RefundTrxNo; - /** - * 退款申请状态 - * 100:成功, - * 101:失败 。 - */ - private String ra_Status; - /** - * 响应码 - */ - private String rb_Code; - /** - * 响应码描述 - */ - private String rc_CodeMsg; - /** - * 营销退款金额 - */ - private Double rd_MarketRefAmount; - /** - * 签名数据 - */ - private String hmac; - - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java deleted file mode 100644 index 49fafd4..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/UniPayResult.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ruoyi.common.utils.wx; - -import lombok.Data; - -@Data -public class UniPayResult { - /** - * 版本号 - */ - private Double r0_Version; - /** - * 商户编号 - */ - private String r1_MerchantNo; - /** - * 商户订单号 - */ - private String r2_OrderNo; - /** - * 支付金额 - */ - private Double r3_Amount; - /** - * 币种 - */ - private String r4_Cur; - /** - * 公用回传参数 - */ - private String r5_Mp; - /** - * 交易类型 - */ - private String r6_FrpCode; - /** - * 交易流水号 - */ - private String r7_TrxNo; - /** - * 银行商户编码 - */ - private String r8_MerchantBankCode; - /** - * 响应码,返回 100 时表示成功 - */ - private String ra_Code; - /** - * 响应码描述 - */ - private String rb_CodeMsg; - /** - * 1.主扫支付返回二维码地址。 - * 2.支付宝 H5,mode1/2/3 参考请求参数q9_TransactionModel 说明。 - * 3.微信 H5_PLUS,获取支付信息的 openlink,通过手机端浏览器跳转并唤起微信 APP客户端,直接打开对应的小程序进行支付。 - * 3.公众号支付:需要商户参考微信的官方文档 JSAPI 支付接口进行处理,详情请见:https://pay.weixin.qq.com/wiki/doc/api/index.html - * 4.微信小程序支付返回支付信息。 - * 5.支付宝收银台返回支付宝收银台跳转链接,通过请求该链接跳转至支付宝。 - * 6.微信 app3 支付,返回预支付信息,集成微信 SDK 唤起小程序进行支付。 - * 7.支付宝服务窗支付返回银联交易号 trade_no,可用以唤起支付宝 APP,调起支付宝APP 收银台。 - * 8.银联 app 或银联统一收银台支付,返回预支付信息用此网址的接口调起支付。https://open.unionpay.com/tjweb/acproduct/list?apiservId=450#nav02 - * 9.银联云微小程序返回跳转地址,格式:{“cqpMpAppId”:”云闪付小程序 id”,”cqpMpPath”:”云闪付小程序 path”} - * 10.其他类型支付返回支付信息。 - */ - private String rc_Result; - /** - * 二维码图片码 - */ - private String rd_Pic; - /** - * 签名数据 - */ - private String hmac; -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index fe16427..0d58f07 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -29,6 +29,8 @@ import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; +import java.util.List; + /** * 登录校验方法 * diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index c095fca..8eda2e6 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -22,6 +22,16 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency> + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + <version>1.70</version> + </dependency> + <dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + <version>1.6.1</version> + </dependency> </dependencies> diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java index 048be72..c196e80 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Qichacha.java @@ -1,9 +1,12 @@ package com.ruoyi.system.domain; import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + +import java.time.LocalDateTime; import java.util.Date; @Data @@ -21,5 +24,6 @@ @TableField(value = "time") @ApiModelProperty(value = "调用时间") - private Date time; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime time; } \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java index 0af246b..afe0925 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderMapper.java @@ -27,7 +27,7 @@ List<DailyStatistics> getDailyStatistics(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); - FinanceFlowsTopVO financeTop(); + FinanceFlowsTopVO financeTop(@Param("dto") FinanceFlowsDTO dto); IPage<FinanceFlowsPageVO> flowsPage(@Param("page") IPage<FinanceFlowsPageVO> page, @Param("dto")FinanceFlowsDTO dto); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java index 47d19f5..696de9d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/QuestionMapper.java @@ -12,5 +12,5 @@ @Mapper public interface QuestionMapper extends BaseMapper<Question> { - IPage<QuestionPageVO> getQuestionPage(@Param("page")IPage<BannerPageVO> page,@Param("name") String name); + IPage<QuestionPageVO> getQuestionPage(@Param("page")IPage<BannerPageVO> page,@Param("title") String title); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java index 5ae6e43..1f32e8b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -128,4 +128,9 @@ List<MenuTreeVO> selectMenusByParentId(@Param("menuId")Long menuId); List<MenuTreeVO> getAllRootMenu(); + + List<SysMenu> selectMenusByUserId(@Param("userId")Long userId); + + + List<String> getPathsByMenuIds(@Param("ids")List<Long> ids); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 66137bb..a0c1732 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -134,7 +134,7 @@ IPage<SysUserPageListVO> getSysUserPageList(@Param("page") IPage<SysUserPageListVO> page, @Param("nickName") String nickName,@Param("phone") Integer phone, @Param("status") String status); - R<SysUserVO> getSysUserVO(@Param("userId") Long userId); + SysUserVO getSysUserVO(@Param("userId") Long userId); SysUser selectuserByPhone(@Param("phonenumber") String phonenumber); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java index 550bed8..9d52757 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/AppUserPageDTO.java @@ -15,7 +15,7 @@ @ApiModelProperty("分页大小") private Integer pageSize=10; @ApiModelProperty("用户姓名") - private String username; + private String userName; @ApiModelProperty("联系电话") private String phone; @ApiModelProperty("状态") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java index 4c06185..f9f7d27 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/dto/FinanceFlowsDTO.java @@ -21,8 +21,8 @@ private String orderNo; - @ApiModelProperty(value = "类型:0-全部 1-收入 2-退款") - private Integer type = 0; + @ApiModelProperty(value = "类型: 1-收入 2-退款") + private Integer type ; @ApiModelProperty(value = "操作时间-开始") @@ -34,4 +34,7 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime operateTimeEnd; + @ApiModelProperty(hidden = true) + private Integer offset; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java index 93607e2..017953e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ChangeVO.java @@ -1,9 +1,18 @@ package com.ruoyi.system.pojo.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; + +import java.util.List; @Data @ApiModel("企业变更信息") public class ChangeVO { + @ApiModelProperty("银税互动授权记录") + private List<Object> bankAndTaxInteractive; + @ApiModelProperty("股东明细") + private List<Object> sharesRatioList; + @ApiModelProperty("法人/股东变更") + private List<Object> legalPersonGdChange; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java index 820b0d3..0e107a4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/ErrorVO.java @@ -1,10 +1,17 @@ package com.ruoyi.system.pojo.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; import lombok.Data; + +import java.util.List; @Data @ApiModel("企业异常信息VO") public class ErrorVO { - + @ApiModelProperty("数据是否存在(1-存在 0-不存在)") + private Integer VerifyResult; + @ApiModelProperty("数据信息") + private Object Data; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java index 34ed01f..0b8f1a7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/InvoiceVO.java @@ -1,9 +1,73 @@ package com.ruoyi.system.pojo.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; @Data @ApiModel("企业发票信息") public class InvoiceVO { + + @ApiModelProperty("近45日是否有开票记录") + private Boolean anyPre45daysFpRcd; + + @ApiModelProperty("近一个月开票金额(元)") + private BigDecimal hjjeZc1; + + @ApiModelProperty("近3个月开票环比增长率") + private BigDecimal avgMonJshjYxMomRate3; + + @ApiModelProperty("近3个月开票金额(元)") + private BigDecimal hjjeZc3; + + @ApiModelProperty("近6个月开票环比增长率") + private BigDecimal avgMonJshjYxMomRate6; + + @ApiModelProperty("近6个月开票金额(元)") + private BigDecimal hjjeZc6; + + @ApiModelProperty("近12个月开票环比增长率") + private BigDecimal avgMonJshjYxMomRate12; + + @ApiModelProperty("近12个月开票金额(元)") + private BigDecimal hjjeZc12; + + @ApiModelProperty("近24个月开票金额(元)") + private BigDecimal hjjeZc24; + + @ApiModelProperty("近3个月下游客户统计") + private Integer downCusCnt3; + + @ApiModelProperty("近12月下游客户数量(家)") + private Integer downCusCnt12; + + @ApiModelProperty("近12个月下游开票张数") + private Integer kpslQb; + + @ApiModelProperty("近12月作废发票数量占比") + private BigDecimal kpslFpRatio; + + @ApiModelProperty("近12月月均开票金额增长率") + private BigDecimal avgMonJshjYxYoyRate; + + @ApiModelProperty("近12月红冲发票张数占比") + private BigDecimal kpslHpRatio; + + @ApiModelProperty("近12个月红冲金额占比") + private BigDecimal hjjeHpRatio; + + @ApiModelProperty("近12个月最大连续未开票间隔天数(销项)") + private Integer nokpslYxMaxdayCnt; + + + //todo 近12个月最长连续断票月数 + //todo 近12个月断票月数(不含2月份) + + @ApiModelProperty("近三年开票信息报表(元)") + private List<Object> f4yPer1mDownFpInfoList; + + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java index 7773715..903f302 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/LicencePageVO.java @@ -3,8 +3,11 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +@Data public class LicencePageVO { @ApiModelProperty(value = "主键ID") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java index 0a46ed1..ba34683 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderDetailVO.java @@ -21,7 +21,7 @@ @ApiModelProperty(value = "公司主键ID") private String id; - @ApiModelProperty(value = "订单状态:1-待交易 2待确认(预订) 3已确认(待支付) 4办理中 5-已完成 6-已下架 ") + @ApiModelProperty(value = "订单状态: 2待确认(预订) 3已确认(待支付) 4办理中 5-卖家已完成 6-卖家已完成 7-已下架 ") private Integer status; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java index 0012d62..93181c0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/OrderPageVO.java @@ -43,7 +43,7 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime bookTime; - @ApiModelProperty(value = "订单状态:1-待交易 2待确认(预订) 3已确认(待支付) 4办理中 5-已完成 6-已下架 ") + @ApiModelProperty(value = "订单状态:-1-已取消 1-待交易 2待确认(预订) 3已确认(待支付) 4办理中 6-已完成 7-已下架 ") private Integer status; @ApiModelProperty(value = "完成时间") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java index e0e518c..1a8d1fc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/QuestionPageVO.java @@ -11,7 +11,7 @@ @ApiModelProperty("主键ID") private Integer id; @ApiModelProperty("问题标题") - private String name; + private String title; @ApiModelProperty("排序") private Integer orderNum; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java index 53bed86..ff4798f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/pojo/vo/TaxVO.java @@ -1,9 +1,66 @@ package com.ruoyi.system.pojo.vo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; @Data @ApiModel("企业纳税信息") public class TaxVO { + + @ApiModelProperty("纳税信用等级") + private String taxCreditRating; + + @ApiModelProperty("纳税人种类") + private String taxpayerType; + + @ApiModelProperty("近12月增税销售额") + private BigDecimal vatTaxShouldsaleAmt12; + + @ApiModelProperty("近24月增税销售额") + private BigDecimal vatTaxShouldsaleAmt24; + + @ApiModelProperty("近12月纳税总额(元)") + private BigDecimal taxAmt12; + + @ApiModelProperty("近24月纳税总额(元)") + private BigDecimal taxAmt24; + + @ApiModelProperty("近12月增税应纳额(元)") + private BigDecimal vatTaxShouldpay; + + @ApiModelProperty("近3月滞纳金次数") + private Integer overdueFineInfoCnt3; + + @ApiModelProperty("近12个月滞纳金金额(元)") + private BigDecimal overdueFineInfoAmt12; + + @ApiModelProperty("近12月滞纳金次数") + private Integer overdueFineInfoCnt12; + + @ApiModelProperty("近12月0申报月数(月)") + private Integer vatTax0dclrMonCnt; + + // todo 近12月0申报月数(月) + // todo 当前欠税余额(元) + // todo 近12月最长连续0纳税申报月数 + + //todo 资产金额(去年年报) + //todo 负债率(去年年报) + //todo 营业利润额(去年年报) + //todo 营业净利率(去年年报) + + + @ApiModelProperty("滞纳金情况") + private List<Object> overdueFineDetailsList; + + @ApiModelProperty("近四年纳税信息完税表") + private List<Object> taxPrev4yearsTaxInfoDict; + + @ApiModelProperty("税务处罚") + private Object enterprise; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java index 2fa893c..ad09472 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OrderService.java @@ -3,13 +3,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.utils.wx.RefundCallbackResult; -import com.ruoyi.system.domain.Agreement; + + import com.ruoyi.system.domain.Order; -import com.ruoyi.system.pojo.dto.AddAgreementDTO; + import com.ruoyi.system.pojo.dto.FinanceFlowsDTO; import com.ruoyi.system.pojo.dto.OrderPageDTO; -import com.ruoyi.system.pojo.dto.WithdrawPageDTO; + import com.ruoyi.system.pojo.vo.*; import java.time.LocalDate; @@ -23,13 +23,13 @@ BusinessVO business(String id); - ErrorVO error(String id); + R error(String id); - ChangeVO change(String id); + R change(String id); - TaxVO tax(String id); + R tax(String id); - InvoiceVO invoice(String id); + R invoice(String id); void delete(String id); @@ -37,13 +37,13 @@ void cancel(String id); - R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult); + R refundPayMoneyCallback(String xmlData); TodayStatisticsVO today(); IndexLineChartVO chart(LocalDate startDate, LocalDate endDate); - FinanceFlowsTopVO financeTop(); + FinanceFlowsTopVO financeTop(FinanceFlowsDTO dto); IPage<FinanceFlowsPageVO> flowsPage(FinanceFlowsDTO dto); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java index 442480e..f9f2ba5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/QuestionService.java @@ -15,7 +15,7 @@ public interface QuestionService extends IService<Question> { - IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String name); + IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String title); void add(AddQuestionDTO dto); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java index e1f73aa..d3beba4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AppUserServiceImpl.java @@ -62,9 +62,12 @@ //2.2计算订单金额 扣减超时订单金额 for(BuyerInfoAndOrder order :orders) { BigDecimal total = new BigDecimal("0.00"); + order.setPrice(order.getPrice()==null?BigDecimal.ZERO:order.getPrice()); + order.setCommissionPrice(order.getCommissionPrice()==null?BigDecimal.ZERO:order.getCommissionPrice()); + order.setCommissionPlatform(order.getCommissionPlatform()==null?BigDecimal.ZERO:order.getCommissionPlatform()); total = total.add(order.getPrice()).subtract(order.getCommissionPrice()).subtract(order.getCommissionPlatform()); System.out.println(total); - //扣减超时订单 + /*//扣减超时订单 //到期时间 支付时间 + 预计时间 + 新增时间 LocalDateTime end = order.getPayTime().plusDays(order.getEstimatedDays()).plusDays(order.getAddDay()); LocalDateTime now = LocalDateTime.now();//计算扣费时间 @@ -78,7 +81,7 @@ long days= (seconds + 86399) / 86400;//24小时 //计算天数差 BigDecimal dailyAmount = new BigDecimal("100.00"); - total = total.subtract((dailyAmount.multiply(BigDecimal.valueOf(days)))); + total = total.subtract((dailyAmount.multiply(BigDecimal.valueOf(days))));*/ recorded = recorded.add(total); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java index 2f34ded..b9d5164 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LicenceServiceImpl.java @@ -27,10 +27,11 @@ public void add(AddLicenceDTO dto) { //判断是否存在 Licence licence = this.baseMapper.selectOne(new LambdaQueryWrapper<Licence>().eq(Licence::getName, dto.getName()).eq(Licence::getDelFlag, 0)); - if (null == licence) { + if (null != licence) { throw new ServiceException("许可证名称重复"); } + licence = new Licence(); BeanUtils.copyProperties(dto, licence); String grand = String.join(";", dto.getGrandNameList());//多个以分号相隔 licence.setGradeName(grand); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java index 126b219..74a060b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderServiceImpl.java @@ -1,29 +1,32 @@ package com.ruoyi.system.service.impl; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.wx.PaymentUtil; -import com.ruoyi.common.utils.wx.RefundCallbackResult; -import com.ruoyi.common.utils.wx.RefundResult; import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; -import com.ruoyi.system.pojo.dto.AddAgreementDTO; import com.ruoyi.system.pojo.dto.FinanceFlowsDTO; import com.ruoyi.system.pojo.dto.OrderPageDTO; -import com.ruoyi.system.pojo.dto.WithdrawPageDTO; import com.ruoyi.system.pojo.model.DailyStatistics; -import com.ruoyi.system.pojo.model.DrawSheet; import com.ruoyi.system.pojo.vo.*; -import com.ruoyi.system.service.AgreementService; import com.ruoyi.system.service.OrderService; +import com.ruoyi.system.wx.RefundCallbackResult; +import com.ruoyi.system.wx.WechatPayService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.provisioning.UserDetailsManager; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,9 +35,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.concurrent.TimeUnit; @Slf4j @Service @@ -53,12 +55,15 @@ private ScheduleMapper scheduleMapper; @Resource private CompanyMapper companyMapper; - @Autowired - private SystemConfigMapper systemConfigMapper; + @Autowired private AppUserMapper appUserMapper; - @Autowired - private WithdrawMapper withdrawMapper; + + @Resource + private RedisCache redisCache; + @Resource + private QichachaMapper qichachaMapper; + @Override public IPage<OrderPageVO> getOrderPage(OrderPageDTO dto) { @@ -77,8 +82,11 @@ List<PermitVO> permitVOs = new ArrayList<>(); LocalDateTime now = LocalDateTime.now(); for (Permit permit : permits) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime expireTime = LocalDateTime.parse(permit.getExpireTime(), formatter); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate expireDate = LocalDate.parse(permit.getExpireTime(), dateFormatter); + + // 如果需要转为 LocalDateTime(添加默认时间) + LocalDateTime expireTime = expireDate.atTime(23,59,59); // 默认00:00:00 if (now.isAfter(expireTime)) { //过滤 未过期的 PermitVO permitVO = new PermitVO(); @@ -98,7 +106,7 @@ } vo.setOpeningBankVOList(openingBankVOs); - if (vo.getStatus() != 4 && vo.getStatus() != 5) { + if (vo.getStatus() != 4 && vo.getStatus() != 5&& vo.getStatus() != 6) { return vo; } @@ -146,6 +154,7 @@ @Override public BusinessVO business(String id) { + //先查询数据库中的 Company company = companyMapper.selectById(id); if (null == company || company.getIsDelete() != 0) { throw new ServiceException("公司不存在"); @@ -153,29 +162,347 @@ BusinessVO vo = new BusinessVO(); BeanUtils.copyProperties(company, vo); vo.setPlace(company.getCity()+company.getProvince()+company.getArea()); + + //todo 再查企业工商信息 覆盖掉之前的 + + return vo; } @Override - public ErrorVO error(String id) { - return null; + public R error(String id) { + ErrorVO errorVO = new ErrorVO(); + Company company = companyMapper.selectById(id); + if (null == company || company.getIsDelete() != 0) { + throw new ServiceException("公司不存在"); + } + JSONObject result = getQiChaChaCompanyExceptionCheck(company.getCompanyName()); + if("200".equals(result.get("Status"))){ + //查询成功 + JSONObject data = (JSONObject) result.get("Result"); + Integer verifyResult = (Integer) data.get("VerifyResult"); + errorVO.setVerifyResult(verifyResult); + if (verifyResult==1){ + //该企业有异常数据 + JSONArray list = (JSONArray) data.get("Data"); + errorVO.setData(list); + } + return R.ok(errorVO); + }else { + //查询失败 + return R.fail(result.get("Message")); + } + + } + + + /** + * 经营异常核查 + * @param companyName + * @return + * VerifyResult int 数据是否存在(1-存在,0-不存在) + * Data List<Object> 数据信息 + * Data:[{ + * AddReason 列入经营异常名录原因 + * AddDate 列入日期 + * RomoveReason 移出经营异常名录原因(保留字段) + * RemoveDate 移出日期(保留字段) + * DecisionOffice 作出决定机关 + * RemoveDecisionOffice 移出决定机关(保留字段) + * }] + * Status + * Message + * OrderNumber + */ + public JSONObject getQiChaChaBasicDetailsCompany(String companyName){ + Object cacheObject = redisCache.getCacheObject("qichacha_" +"basic_"+ companyName); + if(cacheObject != null){ + JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString()); + return jsonObject; + } + String url = "https://api.qichacha.com/ECIV4/GetBasicDetailsByName?key=642987ca3faf4a7daeac70463ae22695&keyword="+companyName; + HttpRequest get = HttpUtil.createGet(url); + String timeStr = String.valueOf(System.currentTimeMillis() / 1000); + get.header("Token", SecureUtil.md5("642987ca3faf4a7daeac70463ae22695"+timeStr+"AC776F2957291EAE3B4161702E89A9F3").toUpperCase()); + get.header("Timespan", timeStr); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + if("200".equals(jsonObject.get("Status"))){ + //查询成功 + String string = jsonObject.toString(); + redisCache.setCacheObject("qichacha_"+"basic_"+companyName,string,24, TimeUnit.HOURS); + //统计调用次数 + Qichacha qichacha = new Qichacha(); + qichacha.setTime(LocalDateTime.now()); + qichacha.setType(1);//企业异常查询 + qichachaMapper.insert(qichacha); + + return jsonObject; + } + return jsonObject; + } + + /** + * 经营异常核查 + * @param companyName + * @return + * VerifyResult int 数据是否存在(1-存在,0-不存在) + * Data List<Object> 数据信息 + * Data:[{ + * AddReason 列入经营异常名录原因 + * AddDate 列入日期 + * RomoveReason 移出经营异常名录原因(保留字段) + * RemoveDate 移出日期(保留字段) + * DecisionOffice 作出决定机关 + * RemoveDecisionOffice 移出决定机关(保留字段) + * }] + * Status + * Message + * OrderNumber + */ + public JSONObject getQiChaChaCompanyExceptionCheck(String companyName){ + Object cacheObject = redisCache.getCacheObject("qichacha_" + companyName); + if(cacheObject != null){ + JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString()); + return jsonObject; + } + String url = "https://api.qichacha.com/ExceptionCheck/GetList?key=642987ca3faf4a7daeac70463ae22695&searchKey="+companyName; + HttpRequest get = HttpUtil.createGet(url); + String timeStr = String.valueOf(System.currentTimeMillis() / 1000); + get.header("Token", SecureUtil.md5("642987ca3faf4a7daeac70463ae22695"+timeStr+"AC776F2957291EAE3B4161702E89A9F3").toUpperCase()); + get.header("Timespan", timeStr); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + if("200".equals(jsonObject.get("Status"))){ + //查询成功 + String string = jsonObject.toString(); + redisCache.setCacheObject("qichacha_"+companyName,string,24, TimeUnit.HOURS); + //统计调用次数 + Qichacha qichacha = new Qichacha(); + qichacha.setTime(LocalDateTime.now()); + qichacha.setType(2);//企业异常查询 + qichachaMapper.insert(qichacha); + + return jsonObject; + } + return jsonObject; + } + private JSONObject getReport(String sign){ + Object cacheObject = redisCache.getCacheObject("shuimu_" + sign); + if(cacheObject != null){ + JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString()); + return jsonObject; + } + HttpRequest post = HttpUtil.createPost("https://shuimui.szsmjr.com/index/index/result"); + HashMap<String, String> stringStringHashMap = new HashMap<>(); + stringStringHashMap.put("Origin","https://shuimui.szsmjr.com"); + post.addHeaders(stringStringHashMap); + post.body("{\"sn\":\""+sign+"\"}"); + HttpResponse execute = post.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + if("1001".equals(jsonObject.get("code"))){ + //查询成功 + String string = jsonObject.toString(); + redisCache.setCacheObject("shuimu_"+sign,string,1, TimeUnit.MINUTES); + return jsonObject; + } + return jsonObject; + } + @Override + public R change(String id) { +// System.err.println(getReport("ZZD20250508017232394218445")); + ChangeVO changeVO = new ChangeVO(); + /* Company companyInfo = companyMapper.selectById(id); + if (null == companyInfo || companyInfo.getIsDelete() != 0) { + throw new ServiceException("公司不存在"); + }*/ +// JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]); + JSONObject jsonObject=getReport("ZZD20250508017232394218445"); + if (!"1001".equals(jsonObject.getString("code"))){ + return R.fail(jsonObject.get("msg")); + } + JSONObject data1 = (JSONObject) jsonObject.get("data"); + JSONObject data2 = (JSONObject) data1.get("data"); + JSONObject company = (JSONObject) data2.get("company"); + // 银税互动 + JSONArray bankAndTaxInteractive = (JSONArray) company.get("bankAndTaxInteractive"); + changeVO.setBankAndTaxInteractive(bankAndTaxInteractive); + //股东明细 + JSONArray sharesRatioList = (JSONArray) company.get("sharesRatioList"); + changeVO.setSharesRatioList(sharesRatioList); + //法人/股东变更 + JSONArray legalPersonGdChange = (JSONArray) company.get("legalPersonGdChange"); + changeVO.setLegalPersonGdChange(legalPersonGdChange); + + return R.ok(changeVO); } @Override - public ChangeVO change(String id) { - return null; + public R tax(String id) { + TaxVO taxVO = new TaxVO(); + /* Company companyInfo = companyMapper.selectById(id); + if (null == companyInfo || companyInfo.getIsDelete() != 0) { + throw new ServiceException("公司不存在"); + }*/ +// JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]); + JSONObject jsonObject=getReport("ZZD20250508017232394218445"); + if (!"1001".equals(jsonObject.getString("code"))){ + return R.fail(jsonObject.get("msg")); + } + JSONObject data1 = (JSONObject) jsonObject.get("data"); + JSONObject data2 = (JSONObject) data1.get("data"); + JSONObject taxInfo = (JSONObject) data2.get("taxInfo"); + //税务处罚 + JSONObject enterprise = (JSONObject) data2.get("enterprise"); + taxVO.setEnterprise(enterprise); + //滞纳金情况 + JSONArray overdueFineDetailsList = (JSONArray) taxInfo.get("overdueFineDetailsList"); + taxVO.setOverdueFineDetailsList(overdueFineDetailsList); + + //近四年纳税信息完税表 + JSONArray taxPrev4yearsTaxInfoDict = (JSONArray) taxInfo.get("taxPrev4yearsTaxInfoDict"); + taxVO.setTaxPrev4yearsTaxInfoDict(taxPrev4yearsTaxInfoDict); + + //纳税信用等级 + String taxCreditRating = (String) taxInfo.get("taxCreditRating"); + taxVO.setTaxCreditRating(taxCreditRating); + + //纳税人种类 + String taxpayerType = (String) taxInfo.get("taxpayerType"); + taxVO.setTaxpayerType(taxpayerType); + + //近12月增税销售额 + JSONObject taxPrevMnMthsAllTaxDclrPrjInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsAllTaxDclrPrjInfoDict"); + + JSONObject taxPrev12mthsAllTaxDclrPrjInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrPrjInfoDict.get("taxPrev12mthsAllTaxDclrPrjInfoDict"); + taxVO.setVatTaxShouldsaleAmt12((BigDecimal) taxPrev12mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldsaleAmt")); + //近24月增税销售额 + JSONObject taxPrev24mthsAllTaxDclrPrjInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrPrjInfoDict.get("taxPrev24mthsAllTaxDclrPrjInfoDict"); + + taxVO.setVatTaxShouldsaleAmt24( (BigDecimal) taxPrev24mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldsaleAmt")); + JSONObject taxPrevMnMthsTaxInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsTaxInfoDict"); + + //近12月纳税总额(元) + JSONObject taxPrev12mthsTaxInfo = (JSONObject) taxPrevMnMthsTaxInfoDict.get("taxPrev12mthsTaxInfo"); + taxVO.setTaxAmt12( (BigDecimal) taxPrev12mthsTaxInfo.get("taxAmt")); + + //近24月纳税总额(元) + JSONObject taxPrev24mthsTaxInfo = (JSONObject) taxPrevMnMthsTaxInfoDict.get("taxPrev24mthsTaxInfo"); + taxVO.setTaxAmt24( (BigDecimal) taxPrev24mthsTaxInfo.get("taxAmt")); + + //近12月增税应纳额(元) + taxVO.setVatTaxShouldpay( (BigDecimal) taxPrev12mthsAllTaxDclrPrjInfoDict.get("vatTaxShouldpay")); + + //近12个月滞纳金金额(元) 次数 + JSONObject taxPrevMnMthsOverdueFineInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsOverdueFineInfoDict"); + JSONObject taxPrev12mthsOverdueFineInfo = (JSONObject) taxPrevMnMthsOverdueFineInfoDict.get("taxPrev12mthsOverdueFineInfo"); + taxVO.setOverdueFineInfoAmt12( (BigDecimal) taxPrev12mthsOverdueFineInfo.get("overdueFineInfoAmt")); + taxVO.setOverdueFineInfoCnt12( (Integer) taxPrev12mthsOverdueFineInfo.get("overdueFineInfoCnt")); + + + // 近3个月滞纳金金额(元) + JSONObject taxPrev3mthsOverdueFineInfo = (JSONObject) taxPrevMnMthsOverdueFineInfoDict.get("taxPrev3mthsOverdueFineInfo"); + taxVO.setOverdueFineInfoCnt3( (Integer) taxPrev3mthsOverdueFineInfo.get("overdueFineInfoCnt")); + + //近12月0申报月数(月数) + JSONObject taxPrevMnMthsAllTaxDclrInfoDict = (JSONObject) taxInfo.get("taxPrevMnMthsAllTaxDclrInfoDict"); + JSONObject taxPrev12mthsAllTaxDclrInfoDict = (JSONObject) taxPrevMnMthsAllTaxDclrInfoDict.get("taxPrev12mthsAllTaxDclrInfoDict"); + taxVO.setVatTax0dclrMonCnt( (Integer) taxPrev12mthsAllTaxDclrInfoDict.get("vatTax0dclrMonCnt")); + + return R.ok(taxVO); } @Override - public TaxVO tax(String id) { - return null; + public R invoice(String id) { + InvoiceVO vo = new InvoiceVO(); + /* Company companyInfo = companyMapper.selectById(id); + if (null == companyInfo || companyInfo.getIsDelete() != 0) { + throw new ServiceException("公司不存在"); + }*/ +// JSONObject jsonObject=getReport(companyInfo.getLink().split("=")[1]); + JSONObject jsonObject=getReport("ZZD20250508017232394218445"); + if (!"1001".equals(jsonObject.getString("code"))){ + return R.fail(jsonObject.get("msg")); + } + JSONObject data1 = (JSONObject) jsonObject.get("data"); + JSONObject data2 = (JSONObject) data1.get("data"); + JSONObject invoiceInfo = (JSONObject) data2.get("invoiceInfo"); + //近45日是否有开票记录 + vo.setAnyPre45daysFpRcd((Boolean) invoiceInfo.get("anyPre45daysFpRcd")); + + //近一个月开票金额(元) + JSONArray f4yPer1mDownFpInfoList = (JSONArray) invoiceInfo.get("f4yPer1mDownFpInfoList"); + JSONObject f4yPer1mDownFpInfo1 = (JSONObject) f4yPer1mDownFpInfoList.get(1); + vo.setHjjeZc1( ObjectToBigDecimal(f4yPer1mDownFpInfo1.get("hjjeZc")) ); + + + JSONObject fpPrevMnMthsDownFpInfoList = (JSONObject) invoiceInfo.get("fpPrevMnMthsDownFpInfoList"); + JSONObject fpPrev3mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev3mthsDownFpInfoList"); + //近3个月开票环比增长率 + vo.setAvgMonJshjYxMomRate3( ObjectToBigDecimal(fpPrev3mthsDownFpInfoList.get("avgMonJshjYxMomRate")) ); + //近3个月开票金额(元) + vo.setHjjeZc3( ObjectToBigDecimal( fpPrev3mthsDownFpInfoList.get("hjjeZc") )); + + JSONObject fpPrev6mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev6mthsDownFpInfoList"); + //近6个月开票环比增长率 + vo.setAvgMonJshjYxMomRate6( ObjectToBigDecimal(fpPrev6mthsDownFpInfoList.get("avgMonJshjYxMomRate")) ); + //近6月开票金额(元) + vo.setHjjeZc6( ObjectToBigDecimal(fpPrev6mthsDownFpInfoList.get("hjjeZc")) ); + + + JSONObject fpPrev12mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev12mthsDownFpInfoList"); + //近12个月开票环比增长率 + vo.setAvgMonJshjYxMomRate12( ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("avgMonJshjYxMomRate")) ); + //近12月开票金额(元) + vo.setHjjeZc12( ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("hjjeZc")) ); + + //近24个月开票金额(元) + JSONObject fpPrev24mthsDownFpInfoList = (JSONObject) fpPrevMnMthsDownFpInfoList.get("fpPrev24mthsDownFpInfoList"); + vo.setHjjeZc24( ObjectToBigDecimal(fpPrev24mthsDownFpInfoList.get("hjjeZc") )); + + //近12个月下游客户统计 + vo.setDownCusCnt3( (Integer) fpPrev3mthsDownFpInfoList.get("downCusCnt")); + //近12个月下游客户统计 + vo.setDownCusCnt12( (Integer) fpPrev12mthsDownFpInfoList.get("downCusCnt")); + + //近12个月下游开票张数 + vo.setKpslQb( (Integer) fpPrev12mthsDownFpInfoList.get("kpslQb")); + + //近12月作废发票数量占比 + vo.setKpslFpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("kpslFpRatio"))); + + //近12月月均开票金额增长率 + vo.setAvgMonJshjYxYoyRate(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("avgMonJshjYxYoyRate")) ); + + //近12月红冲发票张数占比 + vo.setKpslHpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("kpslHpRatio"))); + + //近12个月红冲金额占比 + vo.setHjjeHpRatio(ObjectToBigDecimal(fpPrev12mthsDownFpInfoList.get("hjjeHpRatio")) ); + + //近12个月最大连续未开票间隔天数(销项) + vo.setNokpslYxMaxdayCnt((Integer) fpPrev12mthsDownFpInfoList.get("nokpslYxMaxdayCnt")); + + //近三年开票信息报表(元) + vo.setF4yPer1mDownFpInfoList(f4yPer1mDownFpInfoList); + + return R.ok(vo); } - @Override - public InvoiceVO invoice(String id) { - return null; - } + private BigDecimal ObjectToBigDecimal(Object o) { + // 处理不同类型的情况 + if ( o instanceof BigDecimal) { + return (BigDecimal) o; + } else if (o instanceof Number) { + // 将其他数字类型(如 Integer、Double)转换为 BigDecimal + return BigDecimal.valueOf(((Number) o).doubleValue()); + } + return BigDecimal.ZERO; + } @Transactional @Override public void delete(String id) { @@ -191,6 +518,7 @@ //查看订单状态是否为待确认 Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>() .eq(Order::getCompanyId, company.getId()) + .eq(Order::getIsRefund,0) .ne(Order::getStatus,-1));//取消的订单不要 if (null == order) { throw new ServiceException("订单不存在"); @@ -254,7 +582,7 @@ if (!company.getStatus().equals(4)){// 4-锁定中 throw new ServiceException("订单状态错误,不能操作"); } - //查看订单 取消的不要 + //查看订单 Order order = this.baseMapper.selectOne(new LambdaQueryWrapper<Order>() .eq(Order::getCompanyId, company.getId()) .ne(Order::getStatus,-1)); @@ -262,10 +590,10 @@ throw new ServiceException("订单不存在"); } //检查状态 3已确认(未付款) 4办理中 5卖家已完成 - if (!order.getStatus().equals(3)||!order.getStatus().equals(4)||!order.getStatus().equals(5)) { + if (!order.getStatus().equals(3)&&!order.getStatus().equals(4)&&!order.getStatus().equals(5)) { throw new ServiceException("订单状态错误,不能操作"); } - if (company.getStatus().equals(3)){ + if (order.getStatus().equals(3)){ //未付款 直接取消订单 order.setStatus(-1); this.baseMapper.updateById(order); @@ -275,52 +603,91 @@ appUserMapper.updateById(user); //商品状态修改 company.setStatus(1); + order.setIsRefund(1); + order.setRefundTime(LocalDateTime.now()); companyMapper.updateById(company); }else{ R r = refundPayMoney(order);//退款 if (200 == r.getCode()) { - //退款成功 - order.setStatus(-1);//订单取消状态 - order.setIsRefund(1);//退款标志 - order.setRefundTime(LocalDateTime.now());//退款时间 - this.updateById(order); - //将分佣次数加回 - User user = appUserMapper.selectById(order.getUserId()); - user.setInviteNum(user.getInviteNum()+1); - appUserMapper.updateById(user); - //商品状态修改 - company.setStatus(1); - companyMapper.updateById(company); + //退款申请成功 + log.info("退款申请成功,订单id:{}",order.getId()); } } } @Override - public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) { - String code = refundCallbackResult.getR3_RefundOrderNo().substring(1); - log.info("退款回调:{}",code); - Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, code)); + public R refundPayMoneyCallback(String xmlData ) { + RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData); + if (!result.isSuccess()) { + System.out.println("会员退费错误:"+result.getMsg()); + return R.fail(result.getMsg()); + } + Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, result.getOrderNo())); if (null == order || order.getStatus() == -1) { return R.ok(); } order.setStatus(-1); + order.setIsRefund(1); + order.setRefundTime(LocalDateTime.now()); this.updateById(order); + //查找公司 + Company company = companyMapper.selectById(order.getCompanyId()); + + //取消订单 + order.setStatus(-1); + order.setIsRefund(1); + order.setRefundTime(LocalDateTime.now()); + this.baseMapper.updateById(order); + //将分佣次数加回 + User user = appUserMapper.selectById(order.getUserId()); + User inviter = appUserMapper.selectById(user.getInviteId()); + if (inviter!=null && inviter.getIsDelete()==0){ + inviter.setInviteNum(inviter.getInviteNum()+1); + appUserMapper.updateById(inviter); + } + + //商品状态修改 + company.setStatus(1); + companyMapper.updateById(company); + return R.ok(); } /** * 返回订单支付金额 */ + @Autowired + private WechatPayService wechatPayService; + @Transactional public R refundPayMoney(Order order) { //开始退款 - BigDecimal paymentAmount = order.getPrice(); if (BigDecimal.ZERO.compareTo(order.getPrice()) < 0) {//支付的金额是否大于0 //微信退款 - RefundResult refund = PaymentUtil.refund(order.getOrderNo(), "R" + order.getOrderNo(), paymentAmount.doubleValue(), - "/system/order/refundPayMoneyCallback"); - if (!"100".equals(refund.getRa_Status())) { - return R.fail(refund.getRc_CodeMsg());//退款失败 + Map<String,String> map = wechatPayService.refund(order.getOrderNo(), order.getOrderNo(), order.getPrice().toString(), order.getPrice().toString(), "平台取消订单", "/system/order/refundPayMoneyCallback"); + + if (!"SUCCESS".equals(map.get("return_code"))) { + return R.fail(map.get("return_msg"));//退款失败 } } + //查找公司 + Company company = companyMapper.selectById(order.getCompanyId()); + + //取消订单 + order.setStatus(-1); + order.setIsRefund(1); + order.setRefundTime(LocalDateTime.now()); + this.baseMapper.updateById(order); + //将分佣次数加回 + User user = appUserMapper.selectById(order.getUserId()); + User inviter = appUserMapper.selectById(user.getInviteId()); + if (inviter!=null && inviter.getIsDelete()==0){ + inviter.setInviteNum(inviter.getInviteNum()+1); + appUserMapper.updateById(inviter); + } + + //商品状态修改 + company.setStatus(1); + companyMapper.updateById(company); + return R.ok(); } @@ -369,14 +736,16 @@ } @Override - public FinanceFlowsTopVO financeTop() { - return this.baseMapper.financeTop(); + public FinanceFlowsTopVO financeTop(FinanceFlowsDTO dto) { + return this.baseMapper.financeTop(dto); } @Override public IPage<FinanceFlowsPageVO> flowsPage(FinanceFlowsDTO dto) { IPage<FinanceFlowsPageVO> page = new Page<>(dto.getPageNum(), dto.getPageSize()); Long total = this.baseMapper.countFlowsPage(dto); + //分页处理 + dto.setOffset((dto.getPageNum()-1)*dto.getPageSize()); IPage<FinanceFlowsPageVO> financeFlowsPageVOIPage = this.baseMapper.flowsPage(page, dto); financeFlowsPageVOIPage.setTotal(total); return financeFlowsPageVOIPage; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java index d2caa93..62a1800 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QuestionServiceImpl.java @@ -20,9 +20,9 @@ @Override - public IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String name) { + public IPage<QuestionPageVO> getQuestionPage(Integer pageNum, Integer pageSize, String title) { IPage<BannerPageVO> page=new Page<>(pageNum, pageSize); - return this.baseMapper.getQuestionPage(page,name); + return this.baseMapper.getQuestionPage(page,title); } @Override diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index 7ad7bd7..91ce918 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -480,14 +480,21 @@ //判断角色名称是否存在 SysRole sysRole = new SysRole(); sysRole.setRoleName(dto.getRoleName()); + List<SysRole> sysRoles = roleMapper.selectRoleList(sysRole); if (sysRoles!=null && !sysRoles.isEmpty()){ - throw new ServiceException("该角色名称重复"); + sysRoles.forEach(role -> { + if (!role.getRoleId().equals(dto.getRoleId())){ + throw new ServiceException("该角色名称重复"); + } + }); } - //删除之前的 + //删除之前的角色菜单关联 roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId()); + //修改角色名称 + roleMapper.updateRole(sysRole); //添加角色菜单 - roleMenuMapper.insert(sysRole.getRoleId(),dto.getMenuIds()); + roleMenuMapper.insert(dto.getRoleId(),dto.getMenuIds()); } @Override diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index ed505eb..bb440b2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -565,7 +566,7 @@ @Override public R<SysUserVO> getInfo(Long userId) { - return userMapper.getSysUserVO(userId); + return R.ok(userMapper.getSysUserVO(userId)); } @Override @@ -591,7 +592,7 @@ sysUser.setPhonenumber(dto.getPhonenumber()); sysUser.setNickName(dto.getNickName()); //后六位为默认密码 - sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(dto.getPhonenumber().substring(6,12)))); + sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(dto.getPhonenumber().substring(5,11)))); sysUser.setStatus("0"); sysUser.setDeptId(dto.getDeptId()); //添加用户-部门关系 userMapper.insertUser(sysUser); @@ -662,7 +663,7 @@ if (sysUser==null){ throw new ServiceException("该用户不存在"); } - sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(sysUser.getPassword().substring(6,12)))); + sysUser.setPassword(SecurityUtils.encryptPassword(Md5Utils.hash(sysUser.getPhonenumber().substring(5,11)))); userMapper.updateUser(sysUser); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java new file mode 100644 index 0000000..1b121d0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/HttpUtil.java @@ -0,0 +1,99 @@ +package com.ruoyi.system.wx; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; + +import javax.net.ssl.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * HTTP工具类 + */ +public class HttpUtil { + + /** + * 发送POST请求 + */ + public static String post(String urlStr, String data) throws Exception { + // 设置超时时间(单位:毫秒) + int timeout = 5000; // 5秒 + + // 发送 POST 请求 + try (HttpResponse response = HttpRequest.post(urlStr) + .body(data, "application/xml") // 设置 XML 请求体 + .timeout(timeout) + .execute()) { + + // 检查 HTTP 状态码 + if (!response.isOk()) { + throw new RuntimeException("HTTP请求失败,状态码: " + response.getStatus() + + ", 响应: " + response.body()); + } + return response.body(); + } + } + + /** + * 发送HTTPS请求 + */ + public static String postHttps(String urlStr, String data, String certPath, String certPassword) throws Exception { + // 创建SSL上下文 + SSLContext sslContext = SSLContext.getInstance("SSL"); + TrustManager[] trustManagers = {new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }}; + sslContext.init(null, trustManagers, new java.security.SecureRandom()); + + // 创建HTTPS连接 + URL url = new URL(urlStr); + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + conn.setSSLSocketFactory(sslContext.getSocketFactory()); + conn.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setUseCaches(false); + conn.setRequestProperty("Content-Type", "application/xml"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Charset", "UTF-8"); + + // 发送请求 + OutputStream os = conn.getOutputStream(); + os.write(data.getBytes("UTF-8")); + os.flush(); + os.close(); + + // 获取响应 + StringBuilder result = new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line; + while ((line = br.readLine()) != null) { + result.append(line); + } + br.close(); + + return result.toString(); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java similarity index 98% rename from ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java rename to ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java index dc4eee4..cb4dd72 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/wx/MD5AndKL.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/MD5AndKL.java @@ -1,4 +1,4 @@ -package com.ruoyi.common.utils.wx; +package com.ruoyi.system.wx; import java.security.MessageDigest; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java new file mode 100644 index 0000000..f9c7fd6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/PayResult.java @@ -0,0 +1,16 @@ +package com.ruoyi.system.wx; + +import lombok.Data; + +/** + * 支付结果VO + */ +@Data +public class PayResult { + // 订单ID + private String orderNumber; + // 微信交易ID + private String transactionId; + // 支付金额 + private String totalFee; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java new file mode 100644 index 0000000..f3b7096 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/RefundCallbackResult.java @@ -0,0 +1,38 @@ +package com.ruoyi.system.wx; + +import lombok.Data; + +/** + * 退款回调结果实体 + */ +@Data +public class RefundCallbackResult { + private boolean success; // 处理是否成功 + private String msg; // 结果描述 + private String orderNo; // 原订单号 + private String refundNo; // 退款订单号 + private String refundId; // 微信退款ID + private String totalFee; // 原订单金额(分) + private String refundFee; // 退款金额(分) + private String refundStatus; // 退款状态 + + // 成功响应 + public static RefundCallbackResult success() { + return success("处理成功"); + } + + public static RefundCallbackResult success(String msg) { + RefundCallbackResult result = new RefundCallbackResult(); + result.setSuccess(true); + result.setMsg(msg); + return result; + } + + // 失败响应 + public static RefundCallbackResult fail(String msg) { + RefundCallbackResult result = new RefundCallbackResult(); + result.setSuccess(false); + result.setMsg(msg); + return result; + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java new file mode 100644 index 0000000..a7e700c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayConfig.java @@ -0,0 +1,27 @@ +package com.ruoyi.system.wx; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 微信支付配置类 + */ +@Data +@Component +@ConfigurationProperties(prefix = "wx") +public class WechatPayConfig { + // 小程序APPID + private String appId; + // 商户号 + private String mchId; + // 商户API密钥 + private String key; + // 支付结果通知地址 + private String callbackPath; + // 证书路径 + private String certPath; + // 商户RAS加密公钥路径 + private String RASPath; + private String wxAppletsAppSecret; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java new file mode 100644 index 0000000..c6bf171 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/WechatPayService.java @@ -0,0 +1,726 @@ +package com.ruoyi.system.wx; + + +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.core.domain.R; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.dom4j.DocumentException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import sun.security.util.DerInputStream; +import sun.security.util.DerValue; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.URL; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.*; +import java.security.spec.RSAPublicKeySpec; +import java.util.*; + +/** + * 微信支付服务类 + */ +@Service +public class WechatPayService { + + @Autowired + private WechatPayConfig wechatPayConfig; + private static final String RSA_PUBLIC_KEY_FILENAME = "wechat_rsa_public_key.pem"; + private static final String CERT_FOLDER = "cert/"; + /** + * 统一下单 + * @param orderNumber 订单号 + * @param totalFee 总金额(分) + * @param body 商品描述 + * @param openid 用户openid + * @return 预支付订单信息 + */ + public R unifiedOrder(String orderId,String orderNumber, String totalFee, String body, String openid, String callbackPath) throws Exception { + int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue(); + String hostAddress = null; + try { + hostAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + // 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("appid", wechatPayConfig.getAppId()); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("nonce_str", generateNonceStr()); + params.put("body", body); + params.put("out_trade_no", orderNumber); + params.put("total_fee", String.valueOf(i) ); + params.put("spbill_create_ip", "221.182.45.100"); // 实际应用中应获取客户端IP + params.put("notify_url", wechatPayConfig.getCallbackPath()+callbackPath); + params.put("trade_type", "JSAPI"); + params.put("openid", openid); + + // 生成签名 + String sign = weixinSignature(params); + params.put("sign", sign); + + // 将参数转换为XML + String xmlParams = XMLUtil.mapToXml(params).replaceFirst("^<\\?xml.+?\\?>\\s*", ""); + + // 发送请求到微信支付统一下单接口 + String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; + String result = HttpUtil.post(url, xmlParams); + + // 解析返回结果 + Map<String, String> resultMap = XMLUtil.xmlToMap(result); + + // 验证签名 + if (!verifySign(resultMap, wechatPayConfig.getKey())) { + return R.fail("微信支付签名验证失败"); +// throw new Exception("微信支付签名验证失败"); + } + if (!resultMap.get("return_code").equals("SUCCESS")) { + return R.fail(resultMap.get("return_msg")); + } + + // 构建小程序支付所需参数 + Map<String, String> payParams = new HashMap<>(); + payParams.put("appId", wechatPayConfig.getAppId()); + payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payParams.put("nonceStr", generateNonceStr()); + payParams.put("package", "prepay_id=" + resultMap.get("prepay_id")); + payParams.put("signType", "MD5"); + + // 生成支付签名 + String paySign = weixinSignature(payParams); + payParams.put("paySign", paySign); + + //给前端标识 +// payParams.put("payMethod","1"); + payParams.put("orderId", orderId); + return R.ok(JSON.toJSONString(payParams)); + } + /** + * 微信下单的签名算法 + * @param map + * @return + */ + private String weixinSignature(Map<String, String> map){ + try { + Set<Map.Entry<String, String>> entries = map.entrySet(); + List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(entries); + // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) + Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() { + public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { + return (o1.getKey()).toString().compareTo(o2.getKey()); + } + }); + // 构造签名键值对的格式 + StringBuilder sb = new StringBuilder(); + for (Map.Entry<String, String> item : infoIds) { + if (item.getKey() != null || item.getKey() != "") { + String key = item.getKey(); + Object val = item.getValue(); + if (!(val == "" || val == null)) { + sb.append(key + "=" + val + "&"); + } + } + } + sb.append("key=" + wechatPayConfig.getKey()); + String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式 + return sign; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 处理支付结果通知 + * @param request HTTP请求 + * @return 处理结果 + */ + public PayResult processNotify(HttpServletRequest request) throws Exception { + // 读取请求内容 + BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8)); + String line; + StringBuilder xml = new StringBuilder(); + while ((line = br.readLine()) != null) { + xml.append(line); + } + br.close(); + + // 解析XML + Map<String, String> resultMap = XMLUtil.xmlToMap(xml.toString()); + + // 验证签名 + if (!verifySign(resultMap, wechatPayConfig.getKey())) { + throw new Exception("微信支付签名验证失败"); + } + + // 验证支付结果 + if (!"SUCCESS".equals(resultMap.get("return_code")) || !"SUCCESS".equals(resultMap.get("result_code"))) { + throw new Exception("微信支付结果异常"); + } + + // 处理业务逻辑 + PayResult payResult = new PayResult(); + payResult.setOrderNumber(resultMap.get("out_trade_no")); + payResult.setTransactionId(resultMap.get("transaction_id")); + payResult.setTotalFee(resultMap.get("total_fee")); + + return payResult; + } + + /** + * 生成随机字符串 + */ + private String generateNonceStr() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + } + + /** + * 微信支付API V2签名算法 + * @param params 请求参数 + * @param apiKey 商户API密钥 + * @return 签名结果 + */ + public static String generateSign(Map<String, String> params, String apiKey) throws Exception { + // 1. 过滤空值参数 + Map<String, String> filteredParams = new HashMap<>(); + for (Map.Entry<String, String> entry : params.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + // 排除sign字段和空值字段 + if (!"sign".equals(key) && value != null && !value.isEmpty()) { + filteredParams.put(key, value); + } + } + + // 2. 按照ASCII码排序参数名 + List<String> keys = new ArrayList<>(filteredParams.keySet()); + Collections.sort(keys); + + // 3. 构建签名原始字符串 + StringBuilder sb = new StringBuilder(); + for (String key : keys) { + String value = filteredParams.get(key); + sb.append(key).append("=").append(value).append("&"); + } + + // 4. 添加API密钥 + sb.append("key=").append(apiKey); + + // 5. MD5加密并转为大写 + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(sb.toString().getBytes("UTF-8")); + + // 6. 转换为十六进制字符串 + StringBuilder sign = new StringBuilder(); + for (byte b : digest) { + sign.append(String.format("%02x", b & 0xff)); + } + + return sign.toString().toUpperCase(); + } + /** + * 验证签名 + */ + private boolean verifySign(Map<String, String> params, String key) throws Exception { + String sign = params.get("sign"); + if (StringUtils.isEmpty(sign)) { + return false; + } + + // 移除sign字段 + Map<String, String> newParams = new HashMap<>(params); + newParams.remove("sign"); + + // 生成新签名 + String newSign = generateSign(newParams, key); + + return sign.equals(newSign); + } + + /** + * 关闭订单 + */ + public Map<String, String> closeOrder(String orderId){ + // 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("appid", wechatPayConfig.getAppId()); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("nonce_str", generateNonceStr()); + params.put("out_trade_no", orderId); + + // 生成签名 + String sign = weixinSignature(params); + params.put("sign", sign); + + // 将参数转换为XML + String xmlParams = XMLUtil.mapToXml(params); + + // 发送请求到微信支付关闭订单接口 + String url = "https://api.mch.weixin.qq.com/pay/closeorder"; + String result = null; + try { + result = HttpUtil.post(url, xmlParams); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // 解析返回结果 + try { + return XMLUtil.xmlToMap(result); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + } + + /** + * 查询订单 + */ + public Map<String, String> queryOrder(String orderId) throws Exception { + // 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("appid", wechatPayConfig.getAppId()); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("nonce_str", generateNonceStr()); + params.put("out_trade_no", orderId); + + // 生成签名 + String sign = generateSign(params, wechatPayConfig.getKey()); + params.put("sign", sign); + + // 将参数转换为XML + String xmlParams = XMLUtil.mapToXml(params); + + // 发送请求到微信支付查询订单接口 + String url = "https://api.mch.weixin.qq.com/pay/orderquery"; + String result = HttpUtil.post(url, xmlParams); + + // 解析返回结果 + return XMLUtil.xmlToMap(result); + } + + + /** + * 申请退款 - 使用证书 + */ + public Map<String, String> refund(String orderNo, String refundNo, String totalFee, String refundFee, String refundDesc,String callbackPath) { + int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue(); + int j = new BigDecimal(refundFee).multiply(new BigDecimal("100")).intValue(); + try { + // 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("appid", wechatPayConfig.getAppId()); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "")); + params.put("out_trade_no", orderNo); + params.put("out_refund_no", refundNo); + params.put("total_fee", String.valueOf(i)); + params.put("refund_fee", String.valueOf(j)); + params.put("refund_desc", refundDesc); + params.put("notify_url", wechatPayConfig.getCallbackPath() + callbackPath); // 退款结果 + + // 生成签名 + String sign = weixinSignature(params); + params.put("sign", sign); + + // 转换为XML + String xmlParams = XMLUtil.mapToXml(params); + + // 使用证书发送请求 + String result = postWithCert("https://api.mch.weixin.qq.com/secapi/pay/refund", xmlParams); + + // 解析结果 + Map<String, String> resultMap = XMLUtil.xmlToMap(result); + System.out.println("申请退款结果"+resultMap); + + // 验证签名 + if (!verifySign(resultMap, wechatPayConfig.getKey())) { + resultMap.put("return_code","FAILED"); + resultMap.put("return_msg","申请退款结果签名验证失败"); + return resultMap; + } + + return resultMap; + } catch (Exception e) { + Map<String, String> resultMap=new HashMap<>(); + resultMap.put("return_code","FAILED"); + resultMap.put("return_msg","申请退款失败"); + return resultMap; + } + } + + /** + * 使用证书发送请求 + */ + private String postWithCert(String url, String xmlData) throws Exception { + // 证书类型为PKCS12 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + // 获取证书路径 + String certPath = wechatPayConfig.getCertPath(); + + // 如果是classpath路径,使用ClassLoader加载 + if (certPath.startsWith("classpath:")) { + String path = certPath.substring("classpath:".length()); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path)) { + if (inputStream == null) { + throw new FileNotFoundException("证书文件不存在: " + path); + } + keyStore.load(inputStream, wechatPayConfig.getMchId().toCharArray()); + } + } else { + // 传统文件路径 + try (FileInputStream inputStream = new FileInputStream(new File(certPath))) { + keyStore.load(inputStream, wechatPayConfig.getMchId().toCharArray()); + } + } + + // 实例化密钥库 & 初始化密钥工厂 + SSLContext sslContext = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, wechatPayConfig.getMchId().toCharArray()); + sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); + + // 创建HttpsURLConnection对象 + URL httpsUrl = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection) httpsUrl.openConnection(); + conn.setSSLSocketFactory(sslContext.getSocketFactory()); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setUseCaches(false); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + + // 发送请求 + OutputStream outputStream = conn.getOutputStream(); + outputStream.write(xmlData.getBytes("UTF-8")); + outputStream.flush(); + outputStream.close(); + + // 获取响应 + InputStream inputStream = conn.getInputStream(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + StringBuilder result = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + result.append(line); + } + bufferedReader.close(); + inputStream.close(); + conn.disconnect(); + + return result.toString(); + } + + /** + * 处理退款回调 + */ + public RefundCallbackResult processRefundCallback(String xmlData) { + try { + // 1. 解析回调XML数据 + if (StringUtils.isEmpty(xmlData)) { + return RefundCallbackResult.fail("回调数据为空"); + } + + //2.解析参数 + System.out.println(xmlData); + System.out.println("----------------------------------------"); + Map<String, String> resultMap = XMLUtil.xmlToMap(xmlData); + System.out.println(resultMap.get("req_info")); + // 3. 检查返回状态 + String returnCode = resultMap.get("return_code"); + + if (!"SUCCESS".equals(returnCode)) { + String errMsg = resultMap.get("return_msg"); + return RefundCallbackResult.fail("通信失败:" + errMsg); + } + + //4 使用商户API密钥解密req_info(AES-256-CBC算法) + String decryptData = decrypt(resultMap.get("req_info"), wechatPayConfig.getKey()); + Map<String, String> refundDetail = XMLUtil.xmlToMap(decryptData); + + + // 4. 提取退款信息 + String orderNo = refundDetail.get("out_trade_no"); // 原订单号 + String refundNo = refundDetail.get("out_refund_no"); // 退款订单号 + String refundId = refundDetail.get("refund_id"); // 微信退款ID + System.err.println("退款回调成功,订单号:"+orderNo+",退款号:"+refundNo+",状态:{}"+refundId); + RefundCallbackResult refundCallbackResult = RefundCallbackResult.success(); + refundCallbackResult.setOrderNo(orderNo); + refundCallbackResult.setRefundNo(refundId); + + return refundCallbackResult; + + } catch (Exception e) { + return RefundCallbackResult.fail("系统异常:" + e.getMessage()); + } + } + + private static String wxDecrypt(String req_info, String key) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, + InvalidKeyException, BadPaddingException, IllegalBlockSizeException{ + byte[] decode = Base64.getDecoder().decode(req_info); + System.out.println(Arrays.toString(decode)); + String sign = MD5AndKL.MD5Encode(key, "UTF-8").toLowerCase(); + System.out.println(sign); + if (Security.getProvider("BC") == null){ + Security.addProvider(new BouncyCastleProvider()); + } + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); + SecretKeySpec secretKeySpec = new SecretKeySpec(sign.getBytes(), "AES"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + return new String(cipher.doFinal(decode)); + } + + /** + * 获取RSA加密公钥 + */ + public String getRsaPublicKey() { + int maxRetries = 3; + for (int retryCount = 0; retryCount < maxRetries; retryCount++) { + try { + System.out.println("尝试获取RSA公钥,第" + (retryCount + 1) + "次"); + + // 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("sign_type", "MD5"); + params.put("nonce_str", generateNonceStr()); + + // 生成签名 + String sign = weixinSignature(params); + params.put("sign", sign); + + // 转换为XML + String xmlParams = XMLUtil.mapToXml(params); + + // 打印请求参数 + System.out.println("请求参数: " + xmlParams); + + // 使用证书发送请求(关键修改:使用postWithCert而非普通HTTP请求) + String result = postWithCert("https://fraud.mch.weixin.qq.com/risk/getpublickey", xmlParams); + + // 打印响应结果 + System.out.println("响应结果: " + result); + + // 解析结果 + Map<String, String> resultMap = XMLUtil.xmlToMap(result); + System.out.println("获取RSA公钥结果: " + resultMap); + + // 检查返回状态 + if (!"SUCCESS".equals(resultMap.get("return_code"))) { + throw new Exception("RSA公钥获取失败: " + resultMap.get("return_msg")); + } + + // 保存公钥到本地文件 + savePublicKeyToClasspath(resultMap.get("pub_key")); + + return resultMap.get("pub_key"); + } catch (Exception e) { + System.err.println("获取RSA公钥异常: " + e.getMessage() + ", 重试次数: " + (retryCount + 1)); + e.printStackTrace(); + + // 如果是最后一次重试,抛出异常 + if (retryCount == maxRetries - 1) { + return null; + } + + // 重试前等待一段时间 + try { + Thread.sleep(1000 * (retryCount + 1)); // 指数退避 + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + return null; + } + } + } + + return null; + } + + /** + * 保存RSA公钥到文件夹 + * @param publicKey RSA公钥内容 + */ + private static void savePublicKeyToClasspath(String publicKey) throws IOException { + // 创建 cert 目录(如果不存在) + Path certDir = Paths.get(CERT_FOLDER); + if (!Files.exists(certDir)) { + Files.createDirectories(certDir); // 自动创建目录 + } + + // 写入公钥文件(UTF-8 编码) + Path keyFile = certDir.resolve(RSA_PUBLIC_KEY_FILENAME); + Files.write(keyFile, publicKey.getBytes(StandardCharsets.UTF_8)); + } + /** + * 从文件夹加载RSA公钥 + * @return RSA公钥内容 + */ + private static String loadPublicKeyFromClasspath() throws IOException { + Path keyFile = Paths.get(CERT_FOLDER + RSA_PUBLIC_KEY_FILENAME); + byte[] bytes = Files.readAllBytes(keyFile); // 读取所有字节 + return new String(bytes, StandardCharsets.UTF_8); // 转为UTF-8字符串 + } + + /** + * 加载公钥 返回PublicKey对象 + */ + public static PublicKey loadPublicKey(String pemContent) throws Exception { + // 读取PEM文件内容 +// String pemContent = new String(Files.readAllBytes(Paths.get(CERT_FOLDER + RSA_PUBLIC_KEY_FILENAME)), StandardCharsets.UTF_8); + + // 移除PEM头尾标记 + String publicKeyPEM = pemContent + .replace("-----BEGIN RSA PUBLIC KEY-----", "") + .replace("-----END RSA PUBLIC KEY-----", "") + .replaceAll("\\s", ""); // 去除换行/空格 + + // 解码Base64 + byte[] encoded = Base64.getDecoder().decode(publicKeyPEM); + + // 手动解析PKCS#1格式 + DerInputStream derReader = new DerInputStream(encoded); + DerValue[] seq = derReader.getSequence(0); + BigInteger modulus = seq[0].getBigInteger(); + BigInteger exponent = seq[1].getBigInteger(); + + RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent); + return KeyFactory.getInstance("RSA").generatePublic(keySpec); + } + + /** + * 使用RSA-OAEP加密数据 + * @param plaintext 待加密的明文 + * @return Base64编码的密文 + */ + public static String encrypt(String plaintext, PublicKey publicKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(encryptedBytes); + } + + + + /** + * 商户付款到银行卡(优先使用本地保存的公钥) + * @param partnerTradeNo 商户订单号 + * @param bankNo 银行卡号 + * @param trueName 银行卡真实姓名 + * @param bankCode 银行编码 + * @param amount 金额(分) + * @param desc 付款说明 + * @return 付款结果 + */ + public Map<String, String> payToBankCard(String partnerTradeNo, String bankNo, String trueName, + String bankCode, BigDecimal amount, String desc) throws Exception { + int i = amount.multiply(new BigDecimal("100")).intValue(); + // 1. 尝试从本地加载RSA公钥 + String pubKey = loadPublicKeyFromClasspath(); + + // 2. 如果本地没有公钥或公钥无效,则从微信获取新公钥 + if (pubKey == null || pubKey.isEmpty()) { + pubKey = getRsaPublicKey(); + + } + //公钥对象 + PublicKey publicKey = loadPublicKey(pubKey); + + // 3. 使用RSA公钥加密银行卡号和真实姓名 + String encryptedBankNo = encrypt(bankNo, publicKey); + String encryptedTrueName = encrypt(trueName, publicKey); + + // 4. 构建请求参数 + Map<String, String> params = new HashMap<>(); + params.put("mch_id", wechatPayConfig.getMchId()); + params.put("partner_trade_no", partnerTradeNo); + params.put("enc_bank_no", encryptedBankNo); + params.put("enc_true_name", encryptedTrueName); + params.put("bank_code", bankCode); + params.put("amount", String.valueOf(i)); + params.put("desc", desc); + params.put("nonce_str", generateNonceStr()); + + // 生成签名 + String sign = weixinSignature(params); + params.put("sign", sign); + + // 将参数转换为XML + String xmlParams = XMLUtil.mapToXml(params); + + // 5. 发送请求到微信支付付款到银行卡接口 + String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank"; + String result = postWithCert(url, xmlParams); + + // 解析返回结果 + Map<String, String> resultMap = XMLUtil.xmlToMap(result); + + // 验证签名 + if (!verifySign(resultMap, wechatPayConfig.getKey())) { + throw new Exception("付款到银行卡签名验证失败"); + } + + return resultMap; + } + + public static void main(String[] args) throws IOException { + + String info="CjlaS7RVnPn7zzP5ByZDxUN7OrXGp1/DEdO0qahpIqDH/gTNHb/U7VmrVV0S4lXrIa0N8FEREC3CdIeT4XB5P4D0E8TSURu6J/cD01hFu28f0JDRfeips3vSpTgznRGyCfnUBDPYwyrVeP29Wac7WAb3CCcJf7OZWaweOUkaKjaBRa1GzMZcguSZnQJz0cD5Jb4HbTMvM0VAebfCY9aXdfFBIbm+cPYESo3awqwkNTQeT4V+FViw8f8sjkH0TScMgWBiSKmQC837BLD27yIGklqlYkDP2IMeiNw+b12qCAGszfp2vYd3X+HpViXkQQet3PJWYlAm55R+IgvschP7Ub65XzLINfQrJKrQUXiKKO2LwoSRSwZvfDkR8G8E8X59CnU2XvWKeos5Y0q8ckbJb97yI+09nNgMjYyJoVCVjTFgFMDEQ4+e3CpYRhD6V/3RBp+TvBwszldbRav2XEuCXL2kCJyJEAqLPMNyfYBSNF8z1btjyz0+y/xQQcySKlQInZ710FxSE7KwRSBQ92j9nDdlR7UxCrPVCkEd+GrVNSqqnyjNh1J/rPJPHvvGwkPPq72TKiw6ZgaIgIDhy0/lWHTclo4sjYAWuUVfg3CJ8dqkuQwVZ7i0+NiahIl78RtcUph8NR48yUgBkN7WhCcu5wLbg2tu8Qe0SIwHF+RW1x9Yc8akEkNbMd4xzs8lY5MYEU9V16U8RyWJuwPDph3RnmV8HQ+2hfzmjCvPkBwtfR8P5VdK86OIsHfnfQxAcPM2a86tOBBzFXPrLHgd2CRcDKH+MXTw7RSH/bk1PiMUAWF8TQsNDzgUlznJnkjiQxoym/4ZUf4C6072KKQHbp6bgBYkBhJLT2lmjVMNSX5b1SXM9eTQixRfq6MKGw3P8XJnKdofktVv+KtSzWQlW0C8p504NWACiExupF5EII7FG+xCWt7urWUbc4NRI36UFrKToQCLVv6UBCXt/t9iWlvs6SfuZhpCexeMmZWeiIldzRu87U9rXR46Hu7DAL8dZ+0ItsIZYThSIABzZgaLKggXlkjyAcbcPYKO7egrCmDtFhzHuh4uA3VeBylL3/ZLZ4FUedn/8L4e2iAu22Qj46ORlu17W5R8Ez9kubydeAgC9PkWnjptaubPxE0bjPN69tec"; + + String key="fD0JzscfMf295SYtRK3MnPRjSCA4Gahr"; + try { + String decrypted = decrypt(info, key); + System.out.println("解密结果: " + decrypted); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public static String decrypt(String encryptedStringA, String merchantKey) throws Exception { + // 1. 对加密串A做base64解码,得到加密串B + byte[] decode = Base64.getDecoder().decode(encryptedStringA); + + // 2. 对商户key做md5,得到32位小写key* + String sign = MD5AndKL.MD5Encode(merchantKey, "UTF-8").toLowerCase(); + + // 3. 确保BouncyCastle提供者已添加 + if (Security.getProvider("BC") == null) { + Security.addProvider(new BouncyCastleProvider()); + } + + // 4. 使用AES-256-ECB解密(PKCS7Padding) + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); + + // 注意:微信要求使用AES-256,所以密钥应为32字节(256位) + // 如果MD5结果是32字节(256位),直接使用 + byte[] aesKey = sign.getBytes(StandardCharsets.UTF_8); + + SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey, "AES"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + + // 执行解密并指定UTF-8编码 + byte[] decryptedBytes = cipher.doFinal(decode); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java new file mode 100644 index 0000000..82e7139 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/wx/XMLUtil.java @@ -0,0 +1,52 @@ +package com.ruoyi.system.wx; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * XML工具类 + */ +public class XMLUtil { + + /** + * 将Map转换为XML字符串 + */ + public static String mapToXml(Map<String, String> params) { + Document document = DocumentHelper.createDocument(); + // 禁用XML声明 + document.setXMLEncoding(null); // 关键设置 + + Element root = document.addElement("xml"); + for (Map.Entry<String, String> entry : params.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue() != null ? entry.getValue() : ""; + root.addElement(key).setText(value); + } + + return document.asXML(); + } + + /** + * 将XML字符串转换为Map + */ + public static Map<String, String> xmlToMap(String xmlStr) throws DocumentException { + Map<String, String> map = new HashMap<>(); + Document document = DocumentHelper.parseText(xmlStr); + Element root = document.getRootElement(); + + for (Iterator<?> iterator = root.elementIterator(); iterator.hasNext();) { + Element element = (Element) iterator.next(); + // 关键修改:获取元素内所有内容(包括CDATA) + String value = element.getStringValue(); // 自动处理CDATA + map.put(element.getName(), value); + } + + return map; + } +} diff --git a/ruoyi-system/src/main/resources/cert/apiclient_cert.p12 b/ruoyi-system/src/main/resources/cert/apiclient_cert.p12 new file mode 100644 index 0000000..2acc9b5 --- /dev/null +++ b/ruoyi-system/src/main/resources/cert/apiclient_cert.p12 Binary files differ diff --git a/ruoyi-system/src/main/resources/cert/apiclient_cert.pem b/ruoyi-system/src/main/resources/cert/apiclient_cert.pem new file mode 100644 index 0000000..56a3461 --- /dev/null +++ b/ruoyi-system/src/main/resources/cert/apiclient_cert.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEJDCCAwygAwIBAgIUPzcz2XhuGAdLsR4fKcRiVtSVTEkwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjUwNjIzMDkwNDI4WhcNMzAwNjIyMDkwNDI4WjB+MRMwEQYDVQQDDAox +NzIwNTUyNjk4MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM +IeWbm+W3neS4gOivgeaIkOenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04x +ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAu5sppa1rG+Xc0XPW78kKw0Bq+oYjuzEfjh3pwurmwrOsqmPaQj4aHXS8M2eW +nRG6oP4BR3dQnphDRCGTdBoVTHOrNJt3xBJ+iSkbnQLH7aHhymyZxo5bZ7q9LnzZ +SMqojYJ9CoDeriubrNWR5pXTB02xJsSPXKo4KwrJIgUQJ0bc2EuyngwZ5rJKeetW +yA7Pw4NZ5X3X0iBXTfhItaW1RLcBegny+K14AneYjpvAqMt3ynV6xQqvl3s0dCDr +8Bo33ds0vi1dr40gM7HvBaQ2oMXIvVdl4xX1H4OM84JwVOKyG/hTC9PWIznxV+es +vDKenuBhRJ0I1N/fy7q0aYDiIwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P +BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1 +cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE +Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz +QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAAiJH9rQLYd9 +3OX8FDxGLetiUd8tIS+Y3fjZhxYiGTF6wz6mR5L3RMYqxZcbb2OWFi1dzYQ97lrY +1spt4+1a5pjeMNlEX9hPUVriWTDN0YhNIvQ2vQ3IbXgWTve0cuwSfc/cyWqhdSCq +7V7jzVs+LRewXsvUyXgqG3Tshzadhi6CL1njAa3PUcSkzgLHKptaD/3irx/nniLB +j6ktq7e/0Orj3BJYQueYtA0LZrk3OacnbDiIeHgw6qLGounfSHbuIWSSLUa6ghW9 +JovmWWENapQF7kT6kh+FalMi0au1xpgKnEgRDjuVyXt9PfLWi+2GWKtsy2gLCzq7 +wS2ob3v4ey8= +-----END CERTIFICATE----- diff --git a/ruoyi-system/src/main/resources/cert/apiclient_key.pem b/ruoyi-system/src/main/resources/cert/apiclient_key.pem new file mode 100644 index 0000000..dc74834 --- /dev/null +++ b/ruoyi-system/src/main/resources/cert/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7mymlrWsb5dzR +c9bvyQrDQGr6hiO7MR+OHenC6ubCs6yqY9pCPhoddLwzZ5adEbqg/gFHd1CemENE +IZN0GhVMc6s0m3fEEn6JKRudAsftoeHKbJnGjltnur0ufNlIyqiNgn0KgN6uK5us +1ZHmldMHTbEmxI9cqjgrCskiBRAnRtzYS7KeDBnmskp561bIDs/Dg1nlfdfSIFdN ++Ei1pbVEtwF6CfL4rXgCd5iOm8Coy3fKdXrFCq+XezR0IOvwGjfd2zS+LV2vjSAz +se8FpDagxci9V2XjFfUfg4zzgnBU4rIb+FML09YjOfFX56y8Mp6e4GFEnQjU39/L +urRpgOIjAgMBAAECggEBAIn+kd3J97UnmQt/16O9D2ubYJUyQeoZMgrJOf8j5eVl +YCZdGFgNcgwkp6JwGbsjJVHyRGKbAvQFL8VXpSyLWwtHMbGagbf5mpWtZSBSwVir +8HeC9oG0iMt98lXVg8YlO2ILj4pATIt0jCfPWGhx4C3JGftYLdONaY9Pea7KZp1c +IgOsXA84+7V+ndyOTDbXTot6UOjOccwfQ3qUHDtCWmGoauoO0ftCqMa4SxADKiMg +auQup9wYpApnqvIZuD2TzXUCGjXxmfTYM9pesrq11zWH2u7vJ6fbFLlM+zKgmxkp +lqIWChDpzMrUjMaAW4ufIN/ekuGMdAyYKGET3pK5F2ECgYEA2zLGzwB6BZ87ponR +bcULQCQ6dsZt6X+dTSTO6Qopsabcdxtqb5W0iopMSVK18byV6eVZxYIUaHnATIry +KKpLEM4N0ghjG6e0zv2yGEXfdEnmGAy/HPaRh2osPT9zXA+Kofliv9MUbIb4h+bl +EtGOsIlp/juUOoBPh3kGAUkvOAsCgYEA2xqKS/LaNnHUR38SHvCJKAJlZxqFFAuf +AdL2jCo5BKsFAt0BOhx/gdaw7z0uf4oGYs1RxOcF9Cun6IHC+mvM8tKrbyL0Xv3x +/syEuVpjJtxSctQUVgOq14jqJSsBZpMr8bJhK3sAs7BoPqIFPCoTljtGxL+lb+9o +VIkQMQvzFUkCgYBC2zDiMD4HevLBr+Vtupzc2m/ujEU349GBlwl48L2YztENjxIe +qKWhX982ugB+k8uRxH9mC2/YEdKCRhroJlCw9ngmqKI57CPswlpQpvcpy+RfT3v3 +BImMqOiHYdP4r1DUaHEjGulu1Jf3M4iI/dusoqzuexOR6FLZeiNHvx+k0wKBgFD2 +YK4p4hqGO3Pj77VBGt2O7RuJQC2lEa+h3frzSzh/XY2uTtrDVxaKV70/tWPpg+yU +hCenWprcWuJeuMbCeOwtjq21k+laG0cVGeJIFSVx+oF1/sG9/y4/6I2tc4oMzgs0 +6BUiEaNUh2DFi/usbKpx4vem/aH8LGg4caQ+DygJAoGBAJsZ265oRTC2LshrGVeD +yXCmTs4DjkK7EXgMrl8OyIymG64XdEUnpnN50dvFYnW2a7jlUhzBcwVAf4/gJ0k4 +gfymOwkk9dsAUEkuiWXNVpUFi1Fdf39ADqeh3kwRpbBnOv3bwJ7h+i8i590TIGNK +RINSd54kN0iLwgVC5/d+lSv1 +-----END PRIVATE KEY----- diff --git a/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml index b2eb90f..b316e91 100644 --- a/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/AppUserMapper.xml @@ -19,8 +19,9 @@ left join (select user_id, count(1) as num from tb_order where status = 6 group by user_id) buy on tbu.id = buy.user_id left join (select c.user_id,count(o.company_id) as num from tb_company c left join tb_order o on c.id=o.company_id and o.status=6 group by c.user_id) sell on tbu.id = sell.user_id where tbu.is_delete =0 - <if test="null != dto.username and dto.username != '' "> - and tbu.user_name like concat('%',#{dto.username},'%') + and tbu.status != 3 + <if test="null != dto.userName and dto.userName != '' "> + and tbu.user_name like concat('%',#{dto.userName},'%') </if> <if test="null != dto.phone and dto.phone != '' "> and tbu.phone like concat('%',#{dto.phone},'%') diff --git a/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml index c1a5b93..0c4e091 100644 --- a/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/OrderMapper.xml @@ -7,86 +7,84 @@ select COALESCE(SUM(commission_price), 0.00) AS total_commission from tb_order where status in (4,5) and share_user_id =#{id} </select> <select id="getOrderPage" resultType="com.ruoyi.system.pojo.vo.OrderPageVO"> - select - c.id, - o.order_no, - publish.user_name as publishName, - publish.phone as publishPhone, - o.price, - book.user_name as bookName, - book.phone as bookPhone, - c.create_time as createTime, - o.create_time as bookTime, - o.finish_time as finishTime, - -- 状态映射逻辑 + SELECT + c.id, + o.order_no, + publish.user_name AS publishName, + publish.phone AS publishPhone, + o.price, + book.user_name AS bookName, + book.phone AS bookPhone, + c.create_time AS createTime, + o.create_time AS bookTime, + o.finish_time AS finishTime, + -- 状态映射逻辑 + CASE + WHEN c.status = -1 THEN -1 + WHEN c.status = 1 THEN 1 + WHEN c.status = 2 THEN 7 + WHEN c.status = 3 THEN 6 + WHEN c.status = 4 THEN + CASE + WHEN o.status = 1 THEN 1 + WHEN o.status = 2 THEN 2 + WHEN o.status = 3 THEN 3 + WHEN o.status IN (4, 5) THEN 4 + WHEN o.status = 6 THEN 6 + ELSE c.status + END + ELSE c.status + END AS status + FROM + tb_company c + LEFT JOIN tb_order o ON o.company_id = c.id AND o.status != -1 + LEFT JOIN (SELECT id, user_name, phone FROM tb_user GROUP BY id) publish ON c.user_id = publish.id + LEFT JOIN (SELECT id, user_name, phone FROM tb_user GROUP BY id) book ON o.user_id = book.id + WHERE + c.is_delete = 0 + <if test="null != dto.orderNo"> + AND o.order_no LIKE CONCAT('%', #{dto.orderNo}, '%') + </if> + <if test="null != dto.publishName and '' != dto.publishName"> + AND publish.user_name LIKE CONCAT('%', #{dto.publishName}, '%') + </if> + <if test="null != dto.publishPhone and '' != dto.publishPhone"> + AND publish.phone LIKE CONCAT('%', #{dto.publishPhone}, '%') + </if> + <if test="null != dto.bookName and '' != dto.bookName"> + AND book.user_name LIKE CONCAT('%', #{dto.bookName}, '%') + </if> + <if test="null != dto.bookPhone and '' != dto.bookPhone"> + AND book.phone LIKE CONCAT('%', #{dto.bookPhone}, '%') + </if> + <if test="null != dto.createTimeStart and null != dto.createTimeEnd"> + AND c.create_time BETWEEN #{dto.createTimeStart} AND #{dto.createTimeEnd} + </if> + <if test="null != dto.bookTimeStart and null != dto.bookTimeEnd"> + AND o.create_time BETWEEN #{dto.bookTimeStart} AND #{dto.bookTimeEnd} + </if> + <if test="null != dto.finishTimeStart and null != dto.finishTimeEnd"> + AND o.finish_time BETWEEN #{dto.finishTimeStart} AND #{dto.finishTimeEnd} + </if> + <if test="null != dto.status"> + AND ( + -- 直接匹配原始状态 + (c.status IN (1,2,3) AND CASE - WHEN c.status = 1 THEN 1 - WHEN c.status = 2 THEN 6 - WHEN c.status = 3 THEN 5 - WHEN c.status = 4 THEN - CASE - WHEN o.status = 2 THEN 2 - WHEN o.status = 3 THEN 3 - WHEN o.status IN (4, 5) THEN 4 - ELSE c.status -- 默认保持原状态(可根据需求调整) - END - ELSE c.status -- 其他状态保持不变 - END AS status - from - tb_company c - left join tb_order o on c.id = o.company_id and o.status != -1 - left join (select id,user_name,phone from tb_user group by id) publish on c.user_id = publish.id - left join (select id,user_name,phone from tb_user group by id) book on o.user_id = book.id - where - c.is_delete=0 - - <if test="null != dto.orderNo"> - and o.order_no like concat('%',#{dto.orderNo},'%') - </if> - <if test="null != dto.publishName and '' != dto.publishName"> - and publish.user_name like concat('%',#{dto.publishName},'%') - </if> - <if test="null != dto.publishPhone and '' != dto.publishPhone"> - and publish.phone like concat('%',#{dto.publishPhone},'%') - </if> - - <if test="null != dto.bookName and '' != dto.bookName"> - and book.user_name like concat('%',#{dto.bookName},'%') - </if> - <if test="null != dto.bookPhone and '' != dto.bookPhone"> - and book.phone like concat('%',#{dto.bookPhone},'%') - </if> - - <if test="null != dto.createTimeStart and null != dto.createTimeEnd"> - and c.create_time between #{dto.createTimeStart} and #{dto.createTimeEnd} - </if> - - <if test="null != dto.bookTimeStart and null != dto.bookTimeEnd"> - and o.create_time between #{dto.bookTimeStart} and #{dto.bookTimeEnd} - </if> - - <if test="null != dto.finishTimeStart and null != dto.finishTimeEnd"> - and o.finish_time between #{dto.finishTimeStart} and #{dto.finishTimeEnd} - </if> - - <if test="null != dto.status"> - AND ( - <!-- 直接匹配原始状态 --> - (c.status IN (1,2,3) AND - CASE - WHEN c.status = 1 THEN 1 - WHEN c.status = 2 THEN 6 - WHEN c.status = 3 THEN 5 - ELSE c.status - END = #{dto.status}) - <!-- 匹配映射后的状态4(c.status=4且o.status=4/5) --> - OR (c.status = 4 AND o.status IN (4,5) AND 4 = #{dto.status}) - <!-- 匹配映射后的状态2(c.status=4且o.status=2) --> - OR (c.status = 4 AND o.status = 2 AND 2 = #{dto.status}) - <!-- 匹配映射后的状态3(c.status=4且o.status=3) --> - OR (c.status = 4 AND o.status = 3 AND 3 = #{dto.status}) - ) - </if> + WHEN c.status = 1 THEN 1 + WHEN c.status = 2 THEN 6 + WHEN c.status = 3 THEN 5 + ELSE c.status + END = #{dto.status}) + -- 匹配映射后的状态4(c.status=4且o.status=4/5) + OR (c.status = 4 AND o.status IN (4,5) AND 4 = #{dto.status}) + -- 匹配映射后的状态2(c.status=4且o.status=2) + OR (c.status = 4 AND o.status = 2 AND 2 = #{dto.status}) + -- 匹配映射后的状态3(c.status=4且o.status=3) + OR (c.status = 4 AND o.status = 3 AND 3 = #{dto.status}) + ) + order by c.create_time,o.create_time + </if> </select> <select id="getDetailById" resultType="com.ruoyi.system.pojo.vo.OrderDetailVO"> @@ -95,8 +93,8 @@ -- 状态映射逻辑 CASE WHEN c.status = 1 THEN 1 - WHEN c.status = 2 THEN 6 - WHEN c.status = 3 THEN 5 + WHEN c.status = 2 THEN 7 + WHEN c.status = 3 THEN 6 WHEN c.status = 4 THEN CASE WHEN o.status = 2 THEN 2 @@ -107,6 +105,7 @@ ELSE c.status -- 其他状态保持不变 END AS status, o.id as orderId, + c.company_name, c.establish_time, concat(c.city,c.province,c.area) as place, @@ -144,8 +143,8 @@ ( CASE WHEN c.status = 1 THEN 1 - WHEN c.status = 2 THEN 6 - WHEN c.status = 3 THEN 5 + WHEN c.status = 2 THEN 7 + WHEN c.status = 3 THEN 6 WHEN c.status = 4 THEN CASE WHEN o.status = 2 THEN 2 @@ -204,6 +203,13 @@ FROM tb_order WHERE status IN (4, 5, 6) AND is_refund = 0 + <if test="null != dto.orderNo and '' != dto.orderNo"> + and order_no LIKE CONCAT('%', #{dto.orderNo}, '%') + </if> + <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd"> + and pay_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd} + </if> + AND ( #{dto.type} IS NULL OR 1 = #{dto.type} ) </select> <select id="flowsPage" resultType="com.ruoyi.system.pojo.vo.FinanceFlowsPageVO"> SELECT @@ -225,7 +231,7 @@ <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd"> and pay_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd} </if> - AND ( #{dto.type} IS NULL OR 1 = #{dto.type} ) + AND ( #{dto.type} IS NULL OR 1 = #{dto.type} ) UNION ALL SELECT order_no, @@ -243,9 +249,9 @@ <if test="null != dto.operateTimeStart and null != dto.operateTimeEnd"> and refund_time between #{dto.operateTimeStart} and #{dto.operateTimeEnd} </if> - AND ( #{dto.type} IS NULL OR 2 = #{dto.type} ) + AND ( #{dto.type} IS NULL OR 2 = #{dto.type} ) ORDER BY operateTime DESC - LIMIT #{dto.pageNum}, #{dto.pageSize}; + LIMIT #{dto.offset}, #{dto.pageSize}; </select> <select id="countFlowsPage" resultType="java.lang.Long"> SELECT COUNT(*) FROM ( diff --git a/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml index a403bb8..b0b19cd 100644 --- a/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/QuestionMapper.xml @@ -4,12 +4,12 @@ <select id="getQuestionPage" resultType="com.ruoyi.system.pojo.vo.QuestionPageVO"> - select id,name ,order_num + select id,title ,order_num from tb_question where - del_flg=0 - <if test="null != name and '' != name"> - and name like concat('%',#{name},'%') + del_flag=0 + <if test="null != title and '' != title"> + and title like concat('%',#{title},'%') </if> </select> diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 0b2a2d1..b72e412 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -142,6 +142,21 @@ where sm.parent_id = 0 order by sm.order_num asc </select> + <select id="selectMenusByUserId" resultType="com.ruoyi.common.core.domain.entity.SysMenu"> + select + m.menu_id, m.parent_id + from sys_user_role ur + left join sys_role_menu rm on ur.role_id = rm.role_id + left join sys_menu m on rm.menu_id = m.menu_id + where + ur.user_id=#{userId} + </select> + <select id="getPathsByMenuIds" resultType="java.lang.String"> + select path from sys_menu where menu_id in + <foreach collection='ids' item='id' open='(' separator=',' close=')'> + #{id} + </foreach> + </select> <update id="updateMenu" parameterType="SysMenu"> update sys_menu diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml index 3dc43fc..ae80bf1 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -14,9 +14,12 @@ </select> <select id="selectMenuIdsByRoleIds" resultType="java.lang.Long"> select menu_id from sys_role_menu where role_id in - <foreach collection="roleList" item="roleId" open="(" separator="," close=")"> - #{roleId} - </foreach> + <if test="roleList != null and !roleList.isEmpty"> + <foreach collection="roleList" item="roleId" open="(" separator="," close=")"> + #{roleId} + </foreach> + </if> + </select> <delete id="deleteRoleMenuByRoleId" parameterType="Long"> diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 8d1b8a7..bcce7c4 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -123,7 +123,7 @@ <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult"> <include refid="selectUserVo"/> - where u.user_name = #{userName} and u.del_flag = '0' + where u.phonenumber = #{userName} </select> <select id="selectUserById" parameterType="Long" resultMap="SysUserResult"> -- Gitblit v1.7.1