From 2134c13b7b2815983281fdc819e3138ffde1bc48 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期二, 05 八月 2025 21:10:42 +0800
Subject: [PATCH] 所有代码

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java |  296 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 257 insertions(+), 39 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
index 21f2f8a..c3d4c79 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
@@ -1,25 +1,40 @@
 package com.ruoyi.other.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.chargingPile.api.feignClient.SiteClient;
+import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.other.api.domain.IntegralPay;
+import com.ruoyi.other.api.domain.IntegralRecord;
+import com.ruoyi.other.api.domain.ServicePay;
 import com.ruoyi.other.api.domain.TIntegralRule;
 import com.ruoyi.other.query.IntegralListQuery;
 import com.ruoyi.other.service.TIntegralPayService;
 import com.ruoyi.other.service.TIntegralRecordService;
 import com.ruoyi.other.service.TIntegralRuleService;
+import com.ruoyi.other.service.TServicePayService;
 import com.ruoyi.other.util.MyQrCodeUtil;
 import com.ruoyi.other.util.ObsUploadUtil;
 import com.ruoyi.other.util.QRCodeUtil;
 import com.ruoyi.other.util.UUIDUtil;
+import com.ruoyi.other.util.pay.CreateLinkStringByGet1;
+import com.ruoyi.other.util.pay.HttpRequester;
+import com.ruoyi.other.util.pay.HttpRespons;
+import com.ruoyi.other.util.pay.Md5_Sign;
 import com.ruoyi.other.util.payment.wx.WechatPayService;
 import com.ruoyi.other.vo.IntegralListVO;
 import com.ruoyi.other.vo.IntegralVO;
+import com.ruoyi.other.vo.PayDto;
+import com.ruoyi.other.vo.WorkPlatformVO;
+import com.ruoyi.system.api.domain.SysConfig;
 import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysConfigClient;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import io.swagger.annotations.ApiOperation;
 import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
@@ -38,11 +53,13 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author 无关风月
@@ -58,15 +75,62 @@
     private TIntegralRecordService integralRecordService;
     @Autowired
     private TIntegralPayService integralPayService;
+    @Autowired
+    private SysConfigClient sysConfigClient;
 
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private TServicePayService servicePayService;
     @Resource
     private SysUserClient sysUserClient;
     @Resource
+    private SiteClient siteClient;
+    @Resource
     private WechatPayService wechatPayService;
+
+
+    /**
+     * 充电保存积分记录
+     *
+     * @return
+     */
+    @PostMapping("/saveIntegralRecord")
+    public R saveIntegralRecord(@RequestBody IntegralRecord record) {
+        integralRecordService.save(record);
+        return R.ok();
+    }
+
+    @PostMapping("/workPlatform")
+    @ApiOperation(tags = {"小程序工作台"}, value = "小程序工作台")
+    public R<WorkPlatformVO> workPlatform() {
+        Long userid = tokenService.getLoginUser().getUserid();
+        R<SysUser> data = sysUserClient.getSysUser(userid);
+        SysUser user = data.getData();
+        List<Site> sites = siteClient.getSiteAll().getData();
+        Site site = sites.stream().filter(e -> e.getId().equals(user.getSiteId())).findFirst().orElse(null);
+        if (site==null){
+            return R.fail("当前登录用户未绑定站点");
+        }
+        WorkPlatformVO workPlatformVO = new WorkPlatformVO();
+        workPlatformVO.setSiteName(site.getName());
+        workPlatformVO.setHeaderName(user.getNickName());
+        ServicePay one = servicePayService.lambdaQuery().eq(ServicePay::getPayStatus, 2)
+                .eq(ServicePay::getUserId, userid).orderByDesc(ServicePay::getCreateTime)
+                .last("limit 1").one();
+        if (one!=null){
+            workPlatformVO.setServiceStatus(1);
+            workPlatformVO.setEndTime(one.getEndTime());
+        }else{
+            workPlatformVO.setServiceStatus(0);
+            workPlatformVO.setEndTime(null);
+        }
+
+
+        return R.ok(workPlatformVO);
+    }
     @PostMapping("/integralPageList")
-    @ApiOperation(tags = {"2.0-积分钱包"},value = "积分钱包")
+    @ApiOperation(tags = {"2.0-积分钱包"}, value = "积分钱包")
     public R<IntegralVO> integralPageList(@RequestBody IntegralListQuery query) {
         Long userid = tokenService.getLoginUser().getUserid();
         R<SysUser> sysUser = sysUserClient.getSysUser(userid);
@@ -78,55 +142,196 @@
         integralVO.setIntegral(integral);
         return R.ok(integralVO);
     }
-    @PostMapping("/queryPayStatus")
-    @ApiOperation(tags = {"2.0-积分钱包"},value = "查询支付结果 true成功 false失败")
-    public R<Boolean> integralPageList(@RequestParam("code") String code) throws Exception {
-        Map<String, String> resMap = wechatPayService.queryOrder(code);
-        if("SUCCESS".equals(resMap.get("return_code"))){
+
+    @ApiOperation(tags = {"2.0-积分钱包"}, value = "查询支付结果 true成功 false失败")
+    @PostMapping(value = "/queryPayStatus")
+    public R buy(@RequestParam Integer id) {
+        IntegralPay integralPay = integralPayService.getById(id);
+        if (integralPay.getPayStatus() == 2) {
             return R.ok(true);
-        }else{
+        } else {
             return R.ok(false);
         }
     }
 
     @PostMapping("/nativePay")
-    @ApiOperation(tags = {"2.0-积分钱包"},value = "获取支付二维码")
-    public R nativePay(@RequestParam("amount") String amount) throws Exception {
+    @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取支付二维码")
+    public R<PayDto> nativePay(@RequestParam("amount") String amount) throws Exception {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
-        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
+//        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
         Long userid = tokenService.getLoginUser().getUserid();
         R<SysUser> sysUser = sysUserClient.getSysUser(userid);
         SysUser data = sysUser.getData();
         // 生成待支付记录
         IntegralPay integralPay = new IntegralPay();
         integralPay.setUserId(data.getUserId());
-        TIntegralRule one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
-        if (one==null){
-            return R.fail("获取支付失败,平台未设置充值积分比例");
+//        TIntegralRule one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
+//        if (one==null){
+//            return R.fail("获取支付失败,平台未设置充值积分比例");
+//        }
+//        String chargeCredit = one.getChargeCredit();
+//        JSONObject jsonObject = JSONObject.parseObject(chargeCredit);
+//        Integer num1 = jsonObject.getInteger("num1");
+//        BigDecimal bigDecimal = new BigDecimal(amount);
+//        // 向上取整 比如5.1 当作6 5.9也当作6
+//        integralPay.setIntegralCount(bigDecimal.divide(new BigDecimal(num1), RoundingMode.UP).intValue());
+//        int i = bigDecimal.multiply(new BigDecimal(num1)).intValue();
+
+        BigDecimal cash = new BigDecimal(amount);
+        // 获取积分兑换比例配置
+        R<SysConfig> info = sysConfigClient.getInfo(8L);
+        if (info == null || info.getData() == null) {
+            throw new RuntimeException("获取积分兑换比例配置失败");
         }
-        String chargeCredit = one.getChargeCredit();
-        JSONObject jsonObject = JSONObject.parseObject(chargeCredit);
-        Integer num1 = jsonObject.getInteger("num1");
-        BigDecimal bigDecimal = new BigDecimal(amount);
-        // 向上取整 比如5.1 当作6 5.9也当作6
-        integralPay.setIntegralCount(bigDecimal.divide(new BigDecimal(num1), RoundingMode.UP).intValue());
-        int i = bigDecimal.multiply(new BigDecimal(num1)).intValue();
+        String configValue = info.getData().getConfigValue();
+        if (StringUtils.isBlank(configValue)) {
+            throw new RuntimeException("积分兑换比例配置值为空");
+        }
+        // 使用BigDecimal处理比例,避免精度问题
+        BigDecimal ratio = new BigDecimal(configValue.trim());
+        if (ratio.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new RuntimeException("积分兑换比例必须大于0");
+        }
+        // 计算积分并向下取整(Floor)
+        BigDecimal points = cash.multiply(ratio);
+        int i = points.setScale(0, RoundingMode.FLOOR).intValue();
         integralPay.setIntegralCount(i);
+        integralPay.setUserId(userid);
         integralPay.setAmount(new BigDecimal(amount));
         integralPay.setCode(code);
         integralPay.setPayStatus(1);
         integralPay.setDelFlag(0);
         integralPay.setCreateTime(LocalDateTime.now());
         integralPayService.save(integralPay);
-        String codeUrl = res.get("code_url");
-        MyQrCodeUtil.createCodeToFile(codeUrl);
-        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
-        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
-        String s = ObsUploadUtil.obsUpload(blueFile);
-        System.err.println(s);
-        return R.ok(s);
+//        String codeUrl = res.get("code_url");
+//        MyQrCodeUtil.createCodeToFile(codeUrl);
+//        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
+//        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
+//        String s = ObsUploadUtil.obsUpload(blueFile);
+//        System.err.println(s);
+        String key = "ad273ceb5e1b49e68d5c565d28d1d305";/** md5密钥商户后台-商户中心-商户设置-密钥管理获取 必填!*/
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("p0_Version", "2.5");/** 版本号 */
+        map.put("p1_MerchantNo", "888122400007793");/** 商户编号 */
+        map.put("p2_OrderNo", code); /**商户订单号*/
+        map.put("p3_Amount", String.valueOf(amount));/**订单金额*/
+        map.put("p4_Cur", "1"); /**交易币种 */
+        map.put("p5_ProductName", "充值"); /** 商品名称 */
+        map.put("p6_ProductDesc", "积分充值"); /** 商品名称 */
+//        map.put("p7_Mp", ""); /** 如果商户请求时传递了该参数,则返回给商户时会原值传 回。 */
+        map.put("p9_NotifyUrl", "http://221.182.45.100:8084/other/wx/integralCallback"); /** 服务器异步通知地址 */
+        map.put("q1_FrpCode", "WEIXIN_NATIVE"); /** 微信扫码(主扫)【注:此为用户主扫,商户被扫】*/
+        map.put("q4_IsShowPic", "1"); /** 是否展示二 维码图片 1表示输出*/
+        map.put("q7_AppId", "wx1a4a7760be53a835"); /** 交易类型*/
+        map.put("qa_TradeMerchantNo", "777165000859101"); /** 777开头的报备商户号   必填!*/
+        map.put("qi_FqSellerPercen", "0"); /** 卖家承担收 费比例 目前仅支持传入 0 ,即用户承 担手续费!*/
+        String Strmap = CreateLinkStringByGet1.createLinkStringByGet(map);
+        // 签名
+        String sign = "";
+        sign = Md5_Sign.SignByMD5(Strmap, key);
+        map.put("hmac", sign);/** 签名数据 */
+        System.out.println("发送:" + JSON.toJSONString(map).toString());
+
+        // post请求参数内容
+        HttpRequester hr = new HttpRequester();
+        HttpRespons HP = hr.sendPost("https://trade.joinpay.com/tradeRt/uniPay", map);
+        System.out.println("接收返回参数:" + HP.getContent());
+        JSONObject resPay = JSONObject.parseObject(HP.getContent());
+        String rcResult = resPay.getString("rd_Pic");
+        Map<String, Object> map2 = new HashMap<>();
+        map2.put("rcResult", rcResult);
+        PayDto payDto = new PayDto();
+        payDto.setId(integralPay.getId());
+        payDto.setQrCode(rcResult);
+        return R.ok(payDto);
     }
+    @PostMapping("/integralPayApplet")
+    @ApiOperation(tags = {"2.0-积分钱包"},value = "小程序积分充值")
+    public R servicePayApplet() throws Exception {
+        Long userid = tokenService.getLoginUser().getUserid();
+        R<SysUser> sysUser = sysUserClient.getSysUser(userid);
+        SysUser data = sysUser.getData();
+        List<Site> sites = siteClient.getSiteAll().getData();
+        Site site = sites.stream().filter(e -> e.getId().equals(data.getSiteId())).findFirst().orElse(null);
+        if (site==null){
+            return R.fail("当前登录用户未绑定站点");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+        ServicePay servicePay = new ServicePay();
+        servicePay.setUserId(data.getUserId());
+        servicePay.setAmount(site.getAnnualServiceFee());
+        servicePay.setCode(code);
+        servicePay.setPayStatus(1);
+        servicePay.setPayType(1);
+        servicePay.setDelFlag(0);
+        servicePay.setCreateTime(LocalDateTime.now());
+        servicePayService.save(servicePay);
+
+
+        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
+    }
+    public static void main(String[] args) throws IOException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+//        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
+
+//        TIntegralRule one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
+//        if (one==null){
+//            return R.fail("获取支付失败,平台未设置充值积分比例");
+//        }
+//        String chargeCredit = one.getChargeCredit();
+//        JSONObject jsonObject = JSONObject.parseObject(chargeCredit);
+//        Integer num1 = jsonObject.getInteger("num1");
+//        BigDecimal bigDecimal = new BigDecimal(amount);
+//        // 向上取整 比如5.1 当作6 5.9也当作6
+//        integralPay.setIntegralCount(bigDecimal.divide(new BigDecimal(num1), RoundingMode.UP).intValue());
+//        int i = bigDecimal.multiply(new BigDecimal(num1)).intValue();
+
+
+//        String codeUrl = res.get("code_url");
+//        MyQrCodeUtil.createCodeToFile(codeUrl);
+//        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
+//        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
+//        String s = ObsUploadUtil.obsUpload(blueFile);
+//        System.err.println(s);
+        String key = "ad273ceb5e1b49e68d5c565d28d1d305";/** md5密钥商户后台-商户中心-商户设置-密钥管理获取 必填!*/
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("p0_Version", "2.5");/** 版本号 */
+        map.put("p1_MerchantNo", "888122400007793");/** 商户编号 */
+        map.put("p2_OrderNo", code); /**商户订单号*/
+        map.put("p3_Amount", String.valueOf(0.01));/**订单金额*/
+        map.put("p4_Cur", "1"); /**交易币种 */
+        map.put("p5_ProductName", "充值"); /** 商品名称 */
+        map.put("p6_ProductDesc", "积分充值"); /** 商品名称 */
+//        map.put("p7_Mp", ""); /** 如果商户请求时传递了该参数,则返回给商户时会原值传 回。 */
+        map.put("p9_NotifyUrl", "http://221.182.45.100:8084/other/wx/integralCallback"); /** 服务器异步通知地址 */
+        map.put("q1_FrpCode", "WEIXIN_NATIVE"); /** 微信扫码(主扫)【注:此为用户主扫,商户被扫】*/
+        map.put("q4_IsShowPic", "1"); /** 是否展示二 维码图片 1表示输出*/
+        map.put("q7_AppId", "wx1a4a7760be53a835"); /** 交易类型*/
+        map.put("qa_TradeMerchantNo", "777165000859101"); /** 777开头的报备商户号   必填!*/
+        map.put("qi_FqSellerPercen", "0"); /** 卖家承担收 费比例 目前仅支持传入 0 ,即用户承 担手续费!*/
+        String Strmap = CreateLinkStringByGet1.createLinkStringByGet(map);
+        // 签名
+        String sign = "";
+        sign = Md5_Sign.SignByMD5(Strmap, key);
+        map.put("hmac", sign);/** 签名数据 */
+        System.out.println("发送:" + JSON.toJSONString(map).toString());
+
+        // post请求参数内容
+        HttpRequester hr = new HttpRequester();
+        HttpRespons HP = hr.sendPost("https://trade.joinpay.com/tradeRt/uniPay", map);
+        System.out.println("接收返回参数:" + HP.getContent());
+        JSONObject resPay = JSONObject.parseObject(HP.getContent());
+        String rcResult = resPay.getString("rd_Pic");
+        Map<String, Object> map2 = new HashMap<>();
+        map2.put("rcResult", rcResult);
+        PayDto payDto = new PayDto();
+        payDto.setQrCode(rcResult);
+        System.err.println(payDto);
+    }
+
     public static MultipartFile convert(BufferedImage bufferedImage, String fileName) throws IOException {
         // 将 BufferedImage 转换为字节数组
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -146,42 +351,55 @@
 
         return multipartFile;
     }
+
     @GetMapping("/getSet")
-    @ApiOperation(tags = {"2.0-积分管理"},value = "获取积分设置")
+    @ApiOperation(tags = {"2.0-积分管理"}, value = "获取积分设置")
     public R<TIntegralRule> getSet() {
         Long userid = tokenService.getLoginUser().getUserid();
         SysUser data = sysUserClient.getSysUser(userid).getData();
 
-        if (data!=null&&data.getSiteId()!=null){
-            if (data.getRoleType()==1){
+        if (data != null && data.getSiteId() != null) {
+            if (data.getRoleType() == 1) {
                 // 平台
                 TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
                 return R.ok(res);
-            }else{
+            } else if (data.getRoleType() == 3){
                 TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
                 return R.ok(res);
+            }else{
+                return R.ok(new TIntegralRule());
             }
-        }else {
+        } else {
             return R.ok(new TIntegralRule());
         }
     }
-    
+
+    @GetMapping("/getSetBySiteId")
+    @ApiOperation(tags = {"2.0-积分管理"}, value = "获取积分设置")
+    public R<TIntegralRule> getSetBySiteId(@RequestParam("siteId") Integer siteId) {
+        TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, siteId).last("limit 1").one();
+        return R.ok(res);
+    }
+
     @PostMapping("/saveSet")
-    @ApiOperation(tags = {"2.0-积分管理"},value = "保存积分设置")
+    @ApiOperation(tags = {"2.0-积分管理"}, value = "保存积分设置")
     @Log(title = "【积分管理】保存积分设置", businessType = BusinessType.INSERT)
     public R saveSet(@RequestBody TIntegralRule dto) {
         Long userid = tokenService.getLoginUser().getUserid();
         SysUser data = sysUserClient.getSysUser(userid).getData();
         TIntegralRule one;
-        if (data.getRoleType()==1){
+
+        if (data.getRoleType() == 1) {
             one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, 0).one();
-        }else{
+        } else {
             one = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
         }
-        if (one!=null){
+        if (one != null) {
             dto.setId(one.getId());
+            dto.setSiteId(data.getSiteId());
             integralRuleService.saveOrUpdate(dto);
-        }else{
+        } else {
+            dto.setSiteId(data.getSiteId());
             integralRuleService.saveOrUpdate(dto);
         }
         return R.ok();

--
Gitblit v1.7.1