无关风月
2024-11-26 5cf8494a6da08dfcdc5fdb4c5e55aefd8b27d684
代码提交
1 文件已重命名
28个文件已修改
1个文件已删除
5个文件已添加
2249 ■■■■■ 已修改文件
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-auth/src/main/java/com/xinquan/auth/util/HWSendSms.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/EncryptUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java 627 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseChapterController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java 258 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java 457 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/PageController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/Turn.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/TurnMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TurnService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TurnServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWalletRecordController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java
@@ -174,6 +174,10 @@
    @ApiModelProperty(value = "标签id,多个id使用英文逗号拼接")
    @TableField("tag_id")
    private String tagId;
    @ApiModelProperty(value = "第三方分账接收方id 用于提现")
    @TableField("fenzhangId")
    private String fenzhangId;
    @ApiModelProperty(value = "用户标签")
    @TableField(exist = false)
    private List<String> tags;
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java
@@ -26,6 +26,8 @@
    private Integer status;
    @ApiModelProperty(value = "阈值")
    private Integer nextLevel;
    @ApiModelProperty(value = "浇水后剩余能量值")
    private Integer energyValue;
xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/LoginUser.java
@@ -27,6 +27,8 @@
     */
    @ApiModelProperty(value = "用户id")
    private Long userid;
    @ApiModelProperty(value = "app用户id")
    private Long appUserId;
    /**
     * 用户名
@@ -159,4 +161,12 @@
    {
        this.sysUser = sysUser;
    }
    public Long getAppUserId() {
        return appUserId;
    }
    public void setAppUserId(Long appUserId) {
        this.appUserId = appUserId;
    }
}
xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java
@@ -215,6 +215,15 @@
            public R<List<AppUser>> getAppUserList(Collection<Long> appUserIdSet, String source) {
                return R.fail("获取APP用户列表失败。");
            }
            @Override
            public void deleteAppUserCourse(Long courseId, Long appUserId) {
            }
            @Override
            public void subVipExpireTime(Long appUserId, Integer type) {
            }
        };
    }
}
xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java
@@ -198,4 +198,8 @@
    @PostMapping("/inner/app-user/getAppUserList")
    R<List<AppUser>> getAppUserList(@RequestBody Collection<Long> appUserIdSet,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/client/app-user-course/deleteAppUserCourse/{courseId}/{appUserId}")
    void deleteAppUserCourse(@PathVariable("courseId") Long courseId,@PathVariable("appUserId") Long appUserId);
    @PostMapping("/client/app-user/subVipExpireTime/{appUserId}/{type}")
    public void subVipExpireTime(@PathVariable("appUserId") Long appUserId,@PathVariable("type") Integer type);
}
xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java
@@ -10,6 +10,7 @@
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.utils.JwtUtils;
import com.xinquan.common.core.utils.StringUtils;
import com.xinquan.common.redis.service.RedisService;
import com.xinquan.common.security.auth.AuthUtil;
import com.xinquan.common.security.service.TokenService;
import com.xinquan.common.security.utils.SecurityUtils;
@@ -63,6 +64,7 @@
    @Resource
    private RemoteAppUserService remoteAppUserService;
    /**
     * 发送验证码
     * @param cellPhone 手机号码
@@ -72,21 +74,11 @@
    @ApiOperation(value = "发送验证码",tags = {"APP端"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "cellPhone", value = "手机号码", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "type", value = "类型 1=注册 2=验证码登录 3=找回密码 4=第三方登录后验证手机 5=切换手机号 6= 添加银行卡", required = true, dataType = "Integer", paramType = "query")})
            @ApiImplicitParam(name = "type", value = "类型 1=注册 2=验证码登录 3=找回密码 4=第三方登录后验证手机 5=切换手机号 6= 添加银行卡,7=管理后台修改密码", required = true, dataType = "Integer", paramType = "query")})
    public R<?> sendCaptchaCode(
            @RequestParam(value = "cellPhone", required = true) String cellPhone,
            @RequestParam("type") Integer type) {
        if(type==5){
            LoginUser loginUser = tokenService.getLoginUser();
            if (loginUser==null){
                return R.tokenError("登录失效");
            }
            AppUser data1 = remoteAppUserService.getAppUserById(loginUser.getUserid() + "").getData();
            if (!cellPhone.equals(data1.getCellPhone())){
                return R.fail("手机号错误");
            }
        }
        if(type==5){
            AppUser data = remoteAppUserService.getUserByPhone(cellPhone).getData();
            if (data!=null){
xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java
@@ -281,6 +281,8 @@
                return CacheConstants.APP_CHANGE_PHONE_CODE_PREFIX;
            case 6:
                return CacheConstants.ADD_CARD_PHONE_CODE_PREFIX;
            case 7:
                return CacheConstants.MANAGEMENT_PASSWORD_SECRET_PREFIX;
            default:
                return "";
        }
@@ -303,10 +305,10 @@
                    TimeUnit.MINUTES);
            log.info("发送验证码成功,手机号:{} 验证码:{}", cellPhone, code);
            // TODO 修改sender参数及templateId
//             HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8824110423893",
//                     "767ad27dce184a32a4b4863517fbd301");
             HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8824110423893",
                     "767ad27dce184a32a4b4863517fbd301");
            hwSendSms.sendSms(code, cellPhone);
//            hwSendSms.sendSms(code, cellPhone);
        } catch (Exception e) {
            log.error("发送短信失败", e);
            throw new ServiceException("验证码发送失败");
@@ -331,7 +333,7 @@
        }
        // 查询用户信息
        AppUser appUser = remoteAppUserService.getUserByCondition(
                AppUserDTO.builder().cellPhone(body.getCellPhone()).device(body.getDevice()).build(),
                AppUserDTO.builder().cellPhone(body.getCellPhone()).build(),
                SecurityConstants.INNER).getData();
        if (StringUtils.isNull(appUser)) {
            recordLogService.recordLogininfor(body.getCellPhone(), Constants.LOGIN_FAIL,
xinquan-auth/src/main/java/com/xinquan/auth/util/HWSendSms.java
@@ -63,7 +63,7 @@
        String templateParas = "[\""+code+"\"]"; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。
        //请求Body,不携带签名名称时,signature请填null
        String body = buildRequestBody("8823121426646", receiver, "767ad27dce184a32a4b4863517fbd301",
        String body = buildRequestBody("8824110423893", receiver, "767ad27dce184a32a4b4863517fbd301",
                templateParas, statusCallBack, "心泉智慧");
        if (null == body || body.isEmpty()) {
            LOGGER.warn("body is null.");
@@ -74,7 +74,7 @@
        request.setKey("dFbKS778KG0jvQrQ672b9RaOktfV");
        request.setSecret("3QsteXCIY3KRfgXf5zXyi6f3cHBj");
        request.setMethod("POST");
        request.setUrl("https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1");
        request.setUrl("https://smsapi.cn-south-1.myhuaweicloud.com:443/sms/batchSendSms/v1");
        request.addHeader("Content-Type", "application/x-www-form-urlencoded");
        request.setBody(body);
        LOGGER.info("Print the body: {}", body);
xinquan-auth/src/main/java/com/xinquan/auth/util/HuaWeiSMSUtil.java
@@ -33,7 +33,7 @@
    public static void main(String[] args) throws Exception {
        sendSms("[\"" + 12356 + "\"]", "19983174515", "8824110423893",
        sendSms("[\"" + 123456 + "\"]", "19983174515", "8824110423893",
                "767ad27dce184a32a4b4863517fbd301");
//        sendSms("[\"17623778642\",\"蓉A-7823\"]","17623778642","8819122535459","6c848255000c4619833ab690e393f906");
@@ -52,13 +52,13 @@
    public static void sendSms(String code, String phone, String sender, String templateId)
            throws Exception {
        // TODO 必填,请参考"开发准备"获取如下数据,替换为实际值
        String url = "https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1"; // APP接入地址+接口访问URI
        String url = "https://smsapi.cn-south-1.myhuaweicloud.com:443/sms/batchSendSms/v1"; // APP接入地址+接口访问URI
        String appKey = "dFbKS778KG0jvQrQ672b9RaOktfV"; // APP_Key
        String appSecret = "3QsteXCIY3KRfgXf5zXyi6f3cHBj"; // APP_Secret
        // 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
        // 国际/港澳台短信不用关注该参数
        String signature = "心泉智慧"; // 签名名称
        String signature = null; // 签名名称
        // 必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
        String receiver = "+86" + phone; // 短信接收人号码
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java
@@ -89,5 +89,6 @@
     * APP第三方登录手机号校验验证码修改密码秘钥 redis key
     */
    public static final String APP_PASSWORD_SECRET_PREFIX = "app_password_secret:";
    public static final String MANAGEMENT_PASSWORD_SECRET_PREFIX = "management_password_secret:";
}
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/EncryptUtils.java
File was renamed from xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/EncryptUtils.java
@@ -1,4 +1,4 @@
package com.xinquan.order.utils;
package com.xinquan.common.core.utils;
import java.nio.charset.StandardCharsets;
import java.security.Security;
xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java
New file
@@ -0,0 +1,627 @@
package com.xinquan.common.core.utils;
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.xinquan.common.core.domain.R;
import com.xinquan.common.core.exception.ServiceException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.omg.PortableServer.SERVANT_RETENTION_POLICY_ID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
 * 桔禾付支付工具类
 *
 * @author mitao
 * @date 2024/9/7
 */
public class JuHeFuUtil {
    private static Logger logger = LoggerFactory.getLogger(JuHeFuUtil.class);
    // 商户RSA私钥 TODO
    private static final String MERCHANT_PRIVATE_KEY = "\"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKOuwQkWiVCNY5SI\"" +
            "                    \"w6fXcIHj/e8UuQ5Gro1v4yguVnNhCdC6HsWbF6jf1ios8CQKxIQViI2I8GfVPsjB\"" +
            "                    \"Bpfp7TK5zup0BHHYg7JUk0tC6ojL8WgbtVpKX7GJFQOdjNbZmYBlDQuBiCfvxWuL\"" +
            "                    \"ki8juL8NlY4aj7FgSDboSHq7A+ZjAgMBAAECgYAEhei5qpDC1BVjXmAhvDdUr4st\"" +
            "                    \"1yHB/jwGloftbVJgP9c4mFwPU9jUhtLxOWqtZErH55xtZNJX3DGu9H6NJh6y09UC\"" +
            "                    \"LdQJJY2/BQBrTlDsVFQl5h2PwDOO+qwUkZPTVd+822Sv0lukVS4c5sCwcdYwShmi\"" +
            "                    \"IQCuudpygHDCBxJ6AQJBANAmfr6j8PxnCKlSUfaO1PqcnT6BGOJEBbnT0CGiKwNw\"" +
            "                    \"XKecEKh5O8Ev4Ak9FhGad4eFkKZDNvHLE+yfCPy8nwECQQDJT10Hwi9+1KFdTacQ\"" +
            "                    \"rC94fZzipuqBOeVzgTPQrQ0iM38uKx5Sj5o4Ii9cyfkw2EoG/gFSim57U/OApLab\"" +
            "                    \"22ljAkBoL0xzWZWOkHfaYHTcB0P9KJTgKzfsUQXYrHdZzlTfRMdrsYb4/K13FeJ6\"" +
            "                    \"XVQFfZ5ke+sZ/TysK+yOHFAgSL0BAkAXLdYuYIOLfPwffCNyXgERRJVd245A1uO+\"" +
            "                    \"iu/mZSaP+5H3ROu24eYF9Jmze2X/48eSSojochwKgz4UX+LOy1K1AkBQycFQjRWC\"" +
            "                    \"jPi8biMhdLzzX47CNFkwigVp0At6VcZmb86cS9ohoTHCbeG0+hlX7p9eNMiFKLVn\"" +
            "                    \"nCdjY6j1xqtv\"";
    // 平台RSA公钥 TODO
    private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOKBBFXirWIJth+SNJCY4mhbAT" +
            "bL60sKV66bRixHMVz8vpBqONio9X6A+Pm9LNutBe+hLpI1BMmFJk3Mb1/QEcklWp" +
            "tRGgHqIrBxR4b19qc/2/pSxyqlpaifYJFZhOg2+OcQ/fqpAmhNXN5uc1pcYvbvWT" +
            "am0j+6+nBNQeAAku5QIDAQAB";
    // 应用的app_id TODO
    private static final String APP_ID = "app_e7301b75-19f1-40e5-96ac-0fee847d4da0";
    // 商户id TODO
    private static final String MER_ID = "1120241105365033";
    // AES密钥 TODO
    private static final String AES_KEY = "6d548eb01bad44bbbb4a23743e733103";
    // 创建用户接口
    private static final String CREATE_USER_INTERFACE = "/api/member/create_user_a";
    private static final String UPDATE_ACCOUNT_INTERFACE = "/api/member/update_account_a";
    private static final String BALANCE_QUERY_INTERFACE = "/api/member/balance_query_a";
    private static final String BALANCE_WITHDRAW_INTERFACE = "/api/member/balance_withdraw_a";
    private static final String BALANCE_PAY = "/api/account/balance_pay";
    // 创建支付订单
    private static final String CREATE_PAYMENT_INTERFACE = "/api/payment/create_payment";
    private static final String CREATE_PAYMENT_INTERFACE_CODE = "/api/payment/create_payment_qrcode";
    private static final String CREATE_PAYMENT_INTERFACE_THIRD = "/api/payment/create_payment_third";
    // 退款接口
    private static final String PAYMENT_REFUND_INTERFACE = "/api/payment/payment_refund";
    private static final String QUERY_PAYMENT_INTERFACE = "/api/query/query_payment";
    private static final String MERCHANT_PAY_INTERFACE = "/api/account/merchant_pay";
    // 接口地址 TODO
    private static final String BASE_URL = "https://payapi.juhefu.com/";
    // 支付宝支付渠道
    private static final String PAY_CHANNEL_ALIPAY = "alipay_qr";
    // 微信支付渠道
    private static final String PAY_CHANNEL_WECHAT = "wx_lite";
    private static final String PAY_CHANNEL_WECHAT_THiRD = "wx";
    // 微信小程序id TODO
    private static final String WX_APP_ID = "";
    /**
     * 创建用户
     *
     * @param memberId 用户id
     * @return boolean
     * @throws Exception
     */
    public static String createUser(
            String memberId
            ,String username
            ,String certType
            ,String certId
            ,String telNo
            ,String cardId
    )
            throws Exception {
        JSONObject memberP = new JSONObject();
        memberP.put("user_name",username);
        memberP.put("cert_type",certType);
        memberP.put("cert_id",certId);
        memberP.put("tel_no",telNo);
        memberP.put("card_id",cardId);
        JSONObject data = new JSONObject();
//        data.put("app_id", APP_ID);
        data.put("app_id", "app_e7301b75-19f1-40e5-96ac-0fee847d4da0");
        data.put("member_id", memberId);
        data.put("member_type", "01");
        TreeMap treeMap = JSONObject.parseObject(JSONObject.toJSONString(memberP), TreeMap.class);
        // 转化为json
        String jsonString = JSONObject.toJSONString(treeMap);
        JSONObject memberP1 = JSONObject.parseObject(jsonString);
        data.put("member_p", memberP1);
        System.err.println(data);
        JSONObject body = new JSONObject();
//        body.put("merId", MER_ID);
        body.put("merId", "1120241105365033");
        body.put("sign", sign(JSONObject.toJSONString(data)));
//        body.put("reqCipher",
//                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), "6d548eb01bad44bbbb4a23743e733103"));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        System.err.println(body);
//        String result = sendPost(BASE_URL + CREATE_USER_INTERFACE, body);
        String result = sendPost("https://payapi.juhefu.com/" + CREATE_USER_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("reqCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        if (resJsonObject.get("error_msg")!=null){
            return resJsonObject.getString("error_msg");
        }
        return "success";
    }
    public static String updateAccount(
            String memberId
            ,String username
            ,String telNo
            ,String cardId
    )
            throws Exception {
        JSONObject data = new JSONObject();
//        data.put("app_id", APP_ID);
        data.put("app_id", "app_e7301b75-19f1-40e5-96ac-0fee847d4da0");
        data.put("member_id", memberId);
        data.put("member_type", "01");
        data.put("card_id", cardId);
        data.put("card_name", username);
        data.put("tel_no", telNo);
        JSONObject body = new JSONObject();
//        body.put("merId", MER_ID);
        body.put("merId", "1120241105365033");
        body.put("sign", sign(JSONObject.toJSONString(data)));
//        body.put("reqCipher",
//                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), "6d548eb01bad44bbbb4a23743e733103"));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        System.err.println(body);
//        String result = sendPost(BASE_URL + CREATE_USER_INTERFACE, body);
        String result = sendPost("https://payapi.juhefu.com/" + UPDATE_ACCOUNT_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        if (resJsonObject.get("error_msg")!=null){
            return resJsonObject.getString("error_msg");
        }
        String string = resJsonObject.getString("reqCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        System.err.println(jsonObject);
        return "success";
    }
    public static String queryBalance(
            String memberId
    )
            throws Exception {
        JSONObject data = new JSONObject();
//        data.put("app_id", APP_ID);
        data.put("app_id", "app_e7301b75-19f1-40e5-96ac-0fee847d4da0");
        data.put("member_id", memberId);
        data.put("member_type", "01");
        JSONObject body = new JSONObject();
//        body.put("merId", MER_ID);
        body.put("merId", "1120241105365033");
        body.put("sign", sign(JSONObject.toJSONString(data)));
//        body.put("reqCipher",
//                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), "6d548eb01bad44bbbb4a23743e733103"));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        System.err.println(body);
//        String result = sendPost(BASE_URL + CREATE_USER_INTERFACE, body);
        String result = sendPost("https://payapi.juhefu.com/" + BALANCE_QUERY_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        if (resJsonObject.get("error_msg")!=null){
            return resJsonObject.getString("error_msg");
        }
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        System.err.println(jsonObject);
        return "success";
    }
    public static void main(String[] args) throws Exception {
//        createPayment1("CZ192818331231230901", 1, "0.01",
//                "充值", "充值",
//                "127.0.0.1", "o4Q_v6QMqkcO7kIOOxp-x1-UpOww",
//                "https://xq.xqzhihui.com/api/order/client/order/order/base/callback")
////        "https://xq.xqzhihui.com/api/order/client/order/order/base/callback")
//       ;
//        String orderNo = OrderUtil.getOrderNoForPrefix("User");
//        createUser("test945622121","周帅","00"
//                ,"513902200006257079"
//                ,"19983174515"
//                ,"6228480469852935177");
//        updateAccount("test945622121","周帅","19983174515"
//                ,"6228480469852935177");
//        queryBalance("test945622121");
          balancePay("12345678912", "test945622121","0.01", "");
//        String decrypt = decrypt("z8Che/JwxrGj/oTOuAvU8HFN6vXL/OqeioV41ZuPV/xVQPt9vCHHc1R5LgAO51Hq5ilD9wqsminRvSiJj6Fs/Bfk8espZSOO2g1OE7FZyqcLB1w01MSWyxfQT8nc2GH/EfOKXCuaKBCeyW24OvW3ng==");
//        System.err.println(decrypt);
    }
    public static JSONObject balancePay(String orderNo, String memberId,  String payAmt, String notifyUrl) throws Exception {
        JSONObject data = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        data.put("pay_amt", payAmt);
        data.put("member_id", memberId);
        data.put("notify_url", notifyUrl);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + BALANCE_PAY, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        if (resJsonObject.getString("error_msg")!=null){
            return resJsonObject;
        }
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        return jsonObject;
    }
    public static JSONObject balanceWithdraw(String orderNo,String payAmt, String memberId,String notifyUrl) throws Exception {
        JSONObject data = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        data.put("amt", payAmt);
        data.put("member_id", memberId);
        data.put("notify_url", notifyUrl);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + BALANCE_WITHDRAW_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        if (resJsonObject.getString("error_msg")!=null){
            return resJsonObject;
        }
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        return jsonObject;
    }
    /**
     * 创建支付订单
     *
     * @param orderNo    订单号
     * @param payChannel 支付渠道 1:支付宝 2:微信
     * @param payAmt     支付金额
     * @param goodsTitle 商品标题
     * @param goodsDesc  商品描述信息,微信小程序和微信公众号该字段 最大长度 42 个字符
     * @param deviceIp   设备支付公网ip
     * @param openId     微信openId
     * @param notifyUrl  回调地址
     * @return JSONObject
     * @throws Exception
     */
    public static JSONObject createPayment(String orderNo, Integer payChannel, String payAmt,
            String goodsTitle, String goodsDesc, String deviceIp, String openId,
            String notifyUrl) throws Exception {
        JSONObject data = new JSONObject();
        JSONObject expand = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        if (payChannel == 1) {
            data.put("pay_channel", PAY_CHANNEL_WECHAT);
            expand.put("open_id", openId);
            expand.put("wx_app_id", WX_APP_ID);
            data.put("expand", expand);
        } else {
            data.put("pay_channel", PAY_CHANNEL_ALIPAY);
        }
        data.put("pay_amt", payAmt);
        data.put("goods_title", goodsTitle);
        data.put("goods_desc", goodsDesc);
        Map<String, Object> deviceInfo = new HashMap<>();
        deviceInfo.put("device_ip", deviceIp);
        data.put("device_info", deviceInfo);
        data.put("notify_url", notifyUrl);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + CREATE_PAYMENT_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
//        if (resJsonObject.getString("status").equals("failed")) {
//            throw new ServiceException(resJsonObject.getString("error_msg"));
//        }
//        if (resJsonObject.getString("status").equals("succeeded")) {
//            return resJsonObject.getJSONObject("expand");
//        }
        return jsonObject;
    }
    public static JSONObject createPaymentCode(String orderNo, Integer payChannel, String payAmt,
            String goodsTitle, String goodsDesc, String deviceIp, String openId,
            String notifyUrl) throws Exception {
        JSONObject data = new JSONObject();
        JSONObject expand = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        if (payChannel == 1) {
            data.put("pay_channel", PAY_CHANNEL_ALIPAY);
        } else {
            data.put("pay_channel", PAY_CHANNEL_WECHAT);
            expand.put("open_id", openId);
            expand.put("wx_app_id", WX_APP_ID);
            data.put("expand", expand);
        }
        data.put("pay_amt", payAmt);
        data.put("goods_title", goodsTitle);
        data.put("goods_desc", goodsDesc);
        data.put("time_expire", "20241031000000");
        Map<String, Object> deviceInfo = new HashMap<>();
        deviceInfo.put("device_ip", deviceIp);
        data.put("device_info", deviceInfo);
        data.put("notify_url", notifyUrl);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + CREATE_PAYMENT_INTERFACE_CODE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println(decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
//        if (resJsonObject.getString("status").equals("failed")) {
//            throw new ServiceException(resJsonObject.getString("error_msg"));
//        }
//        if (resJsonObject.getString("status").equals("succeeded")) {
//            return resJsonObject.getJSONObject("expand");
//        }
        return jsonObject.getJSONObject("expand");
    }
    /**
     * 创建支付订单 微信托管支付
     *
     * @param orderNo    订单号
     * @param payChannel 支付渠道 1:支付宝 2:微信
     * @param payAmt     支付金额
     * @param goodsTitle 商品标题
     * @param goodsDesc  商品描述信息,微信小程序和微信公众号该字段 最大长度 42 个字符
     * @param deviceIp   设备支付公网ip
     * @param openId     微信openId
     * @param notifyUrl  回调地址
     * @return JSONObject
     * @throws Exception
     */
    public static JSONObject createPayment1(String orderNo, Integer payChannel, String payAmt,
            String goodsTitle, String goodsDesc, String deviceIp, String openId,
            String notifyUrl) throws Exception {
        JSONObject data = new JSONObject();
        JSONObject expand = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        data.put("pay_channel", PAY_CHANNEL_WECHAT_THiRD);
        data.put("pay_amt", payAmt);
        data.put("goods_title", goodsTitle);
        data.put("goods_desc", goodsDesc);
        Map<String, Object> deviceInfo = new HashMap<>();
        deviceInfo.put("device_ip", deviceIp);
        data.put("device_info", deviceInfo);
        data.put("notify_url", notifyUrl);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + CREATE_PAYMENT_INTERFACE_THIRD, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println("解密后"+decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
//        if (resJsonObject.getString("status").equals("failed")) {
//            throw new ServiceException(resJsonObject.getString("error_msg"));
//        }
//        if (resJsonObject.getString("status").equals("succeeded")) {
//            return resJsonObject.getJSONObject("expand");
//        }
        return jsonObject;
    }
    /**
     * 申请退款
     *
     * @param paymentId 支付单号
     * @param orderNo   订单号
     * @return
     */
    public static JSONObject refund(String paymentId, String orderNo) throws Exception {
        JSONObject data = new JSONObject();
        data.put("payment_id", paymentId);
        data.put("order_no", orderNo);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + PAYMENT_REFUND_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        if (resJsonObject.getString("error_msg")!=null){
            return resJsonObject;
        }
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println("解密后"+decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        return jsonObject;
    }
    public static JSONObject queryPayment(String paymentId) throws Exception {
        JSONObject data = new JSONObject();
        data.put("payment_id", paymentId);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmsssss"));
        String result = sendPost(BASE_URL + QUERY_PAYMENT_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        if (resJsonObject.getString("error_msg")!=null){
            return resJsonObject;
        }
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println("解密后"+decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        return jsonObject;
    }
    /**
     * 商户付款
     *
     * @param orderNo  订单号
     * @param payAmt   交易金额
     * @param cardName 收款银行开户名
     * @param cardId   收款银行卡号
     * @param cardType 收款银行账户类型 DEBIT_CARD:借记卡 CREDIT_CARD:贷记卡 76 QUASI_CREDIT_CARD:准贷卡 PASSBOOK:存折
     *                 UNIT_SETTLE_CARD:单位结算卡 PUBLIC_CARD:对公卡
     * @return
     * @throws Exception
     */
    public static JSONObject merchantPay(String orderNo, String payAmt, String cardName, String cardId,
            String cardType)
            throws Exception {
        JSONObject data = new JSONObject();
        data.put("order_no", orderNo);
        data.put("app_id", APP_ID);
        data.put("pay_amt", payAmt);
        data.put("card_name", cardName);
        data.put("card_id", cardId);
        data.put("card_type", cardType);
        JSONObject body = new JSONObject();
        body.put("merId", MER_ID);
        body.put("sign", sign(JSONObject.toJSONString(data)));
        body.put("reqCipher",
                EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY));
        body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmss"));
        String result = sendPost(BASE_URL + MERCHANT_PAY_INTERFACE, body);
        JSONObject resJsonObject = JSONObject.parseObject(result);
        System.err.println(resJsonObject);
        String string = resJsonObject.getString("resCipher");
        String decrypt = decrypt(string);
        System.err.println("解密后"+decrypt);
        JSONObject jsonObject = JSONObject.parseObject(decrypt);
        return jsonObject;
    }
    /**
     * 发送post请求
     *
     * @param url  请求地址
     * @param body 请求体
     * @return
     */
    private static String sendPost(String url, JSONObject body) {
        HttpRequest post = HttpUtil.createPost(url);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-type", "application/json; charset=utf-8");
        headers.put("Accept", "application/json");
        post.addHeaders(headers);
        post.body(body.toJSONString());
        HttpResponse execute = post.execute();
        String result = execute.body();
        execute.close();
        if (StringUtils.isBlank(result)) {
            throw new ServiceException("请求第三方支付平台异常");
        }
        return result;
    }
    /**
     * RSA私钥签名:签名方式SHA256WithRSA
     *
     * @param data 待签名字符串
     * @return 签名byte[]
     * @throws Exception
     */
    public static String sign(String data) {
        // 先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。
        data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class));
        // Base64 --> Key
        try {
//            byte[] bytes = Base64.getDecoder().decode(MERCHANT_PRIVATE_KEY);
            byte[] bytes = Base64.getDecoder().decode("MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKOuwQkWiVCNY5SI" +
                    "w6fXcIHj/e8UuQ5Gro1v4yguVnNhCdC6HsWbF6jf1ios8CQKxIQViI2I8GfVPsjB" +
                    "Bpfp7TK5zup0BHHYg7JUk0tC6ojL8WgbtVpKX7GJFQOdjNbZmYBlDQuBiCfvxWuL" +
                    "ki8juL8NlY4aj7FgSDboSHq7A+ZjAgMBAAECgYAEhei5qpDC1BVjXmAhvDdUr4st" +
                    "1yHB/jwGloftbVJgP9c4mFwPU9jUhtLxOWqtZErH55xtZNJX3DGu9H6NJh6y09UC" +
                    "LdQJJY2/BQBrTlDsVFQl5h2PwDOO+qwUkZPTVd+822Sv0lukVS4c5sCwcdYwShmi" +
                    "IQCuudpygHDCBxJ6AQJBANAmfr6j8PxnCKlSUfaO1PqcnT6BGOJEBbnT0CGiKwNw" +
                    "XKecEKh5O8Ev4Ak9FhGad4eFkKZDNvHLE+yfCPy8nwECQQDJT10Hwi9+1KFdTacQ" +
                    "rC94fZzipuqBOeVzgTPQrQ0iM38uKx5Sj5o4Ii9cyfkw2EoG/gFSim57U/OApLab" +
                    "22ljAkBoL0xzWZWOkHfaYHTcB0P9KJTgKzfsUQXYrHdZzlTfRMdrsYb4/K13FeJ6" +
                    "XVQFfZ5ke+sZ/TysK+yOHFAgSL0BAkAXLdYuYIOLfPwffCNyXgERRJVd245A1uO+" +
                    "iu/mZSaP+5H3ROu24eYF9Jmze2X/48eSSojochwKgz4UX+LOy1K1AkBQycFQjRWC" +
                    "jPi8biMhdLzzX47CNFkwigVp0At6VcZmb86cS9ohoTHCbeG0+hlX7p9eNMiFKLVn" +
                    "nCdjY6j1xqtv");
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
            KeyFactory keyFactory;
            keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            // Sign
            Signature signature = Signature.getInstance("SHA256WithRSA");
            signature.initSign(privateKey);
            signature.update(data.getBytes("UTF-8"));
            return Base64.getEncoder().encodeToString(signature.sign());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    public static String decrypt(String strToDecrypt) {
        try {
        SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
    } catch (Exception e) {
            System.out.println("Error while decrypting: " + e.toString());
    }
        return null;}
//    public static boolean verify(String data, String publicKeyStr) {
//        try {
//            // 解码公钥
//            byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
//            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
//            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//            PublicKey publicKey = keyFactory.generatePublic(keySpec);
//            // 验证签名
//            Signature signature = Signature.getInstance("SHA256WithRSA");
//            signature.initVerify(publicKey);
//            signature.update(data.getBytes("UTF-8"));
//
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
}
xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java
@@ -162,6 +162,8 @@
        // 根据uuid将loginUser缓存
        String userKey = getTokenKey(loginUser.getToken());
        redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
        // 存放token 到 redis 获取用户id
        redisService.setCacheObject(loginUser.getAppUserId()+"", userKey, expireTime, TimeUnit.MINUTES);
    }
    private void refreshToken4AppLoginUser(AppLoginUser appLoginUser) {
@@ -199,6 +201,7 @@
        appLoginUser.setUserid(userId);
        appLoginUser.setIpaddr(IpUtils.getIpAddr());
        LoginUser loginUser = new LoginUser();
        loginUser.setAppUserId(appLoginUser.getAppUserId());
        loginUser.setSysUser(appLoginUser.getSysUser());
        loginUser.setToken(token);
        loginUser.setUserid(userId);
xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseChapterController.java
@@ -58,12 +58,10 @@
        }
        for (CourseChapter record : page.getRecords()) {
            record.setUid(record.getId()+"");
            int a = 0;
            int b = 0;
            a+= record.getVirtualLearnedNum();
            Long data1 = remoteAppUserService.getCourseChapterHistoryCount(record.getId()).getData();
            b+=data1;
            record.setRealLearnedNum(a+b);
            record.setRealLearnedNum(b);
        }
        return R.ok(PageDTO.of(page, CourseChapter.class));
xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java
@@ -342,18 +342,17 @@
            long count1 = courseUserFavoriteService.count(new LambdaQueryWrapper<CourseUserFavorite>()
                    .eq(CourseUserFavorite::getCourseId, record.getId()));
            record.setCollectCount(count1);
            // 查询学习人数
//            record.setCount(remoteAppUserService.getUserByCourseId(record.getId()).getData().size());
            int size1 = courseLearningRecordService.lambdaQuery().eq(CourseLearningRecord::getCourseId, record.getId())
                    .groupBy(CourseLearningRecord::getAppUserId).list().size();
            List<CourseChapter> list = courseChapterService.lambdaQuery()
                    .eq(CourseChapter::getCourseId, record.getId()).list();
            // 章节列表累加虚拟学习人数
            int temp = 0;
            int a = 0;
            int b = 0;
            for (CourseChapter courseChapter : list) {
                temp+=courseChapter.getVirtualLearnedNum();
                a+= courseChapter.getVirtualLearnedNum();
                Long data1 = remoteAppUserService.getCourseChapterHistoryCount(courseChapter.getId()).getData();
                b+=data1;
                courseChapter.setRealLearnedNum(Integer.valueOf(data1+""));
            }
            record.setCount(size1+temp);
            record.setCount(a+b);
        }
        return R.ok(PageDTO.of(page, Course.class));
    }
@@ -381,10 +380,9 @@
            a+= courseChapter.getVirtualLearnedNum();
            Long data1 = remoteAppUserService.getCourseChapterHistoryCount(courseChapter.getId()).getData();
            b+=data1;
            courseChapter.setRealLearnedNum(Integer.valueOf(data1+""));
        }
        int size1 = courseLearningRecordService.lambdaQuery()
                .eq(CourseLearningRecord::getCourseId, uid).groupBy(CourseLearningRecord::getAppUserId)
                .list().size();
        byId.setVirtualLearnedNum(a);
        byId.setRealLearnedNum(b);
        byId.setCount(a+b);
@@ -616,7 +614,6 @@
            @ApiImplicitParam(value = "课程id", name = "id", required = true, dataType = "String"),
    })
    public R<ClientCourseVO> getPayCourseInfoById(@RequestParam(value = "id")Long id) {
        Course byId = courseService.getById(id);
        ClientCourseVO clientCourseVO = new ClientCourseVO();
        BeanUtils.copyProperties(byId, clientCourseVO);
@@ -1012,7 +1009,10 @@
                course.setRealLearnedNum(a+b);
                course.setVirtualLearnedNum(0);
                BeanUtils.copyProperties(course, courseVO);
                courseVOS.add(courseVO);
                List<Long> collect = courseVOS.stream().map(CourseVO::getId).collect(Collectors.toList());
                if (!collect.contains(courseVO.getId())){
                    courseVOS.add(courseVO);
                }
            }
        }
        List<Long> data1 = remoteAppUserService.getCourseHistoryByUserId(userId).getData();
@@ -1035,7 +1035,10 @@
                courseVO.setVirtualLearnedNum(0);
                courseVO.setId(byId.getId());
                courseVO.setCoverUrl(byId.getCoverUrl());
                courseVOS.add(courseVO);
                List<Long> collect = courseVOS.stream().map(CourseVO::getId).collect(Collectors.toList());
                if (!collect.contains(courseVO.getId())){
                    courseVOS.add(courseVO);
                }
            }
        }
        // 查询两个相同类型的线上免费课程
@@ -1099,7 +1102,10 @@
                    courseVO.setVirtualLearnedNum(0);
                    courseVO.setId(byId.getId());
                    courseVO.setCoverUrl(byId.getCoverUrl());
                    courseVOS.add(courseVO);
                    List<Long> collect = courseVOS.stream().map(CourseVO::getId).collect(Collectors.toList());
                    if (!collect.contains(courseVO.getId())){
                        courseVOS.add(courseVO);
                    }
                }
            }
            studyPageVO.setCourseList(courseVOS);
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java
@@ -11,6 +11,7 @@
import com.sun.corba.se.spi.ior.IdentifiableFactory;
import com.xinquan.common.core.constant.SecurityConstants;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.utils.JuHeFuUtil;
import com.xinquan.common.core.utils.page.BeanUtils;
import com.xinquan.common.core.utils.page.CollUtils;
import com.xinquan.common.core.utils.page.PageDTO;
@@ -93,6 +94,17 @@
    private SysUserClient sysUserClient;
    @Autowired
    private TokenService tokenService;
    @ResponseBody
    @PostMapping("/queryPayment")
    @ApiOperation(value = "查询订单支付状态", tags = "查询订单支付状态")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", required = true),
    })
    public R<String> queryPayment(@RequestParam(value = "orderId") String orderId) throws Exception {
        JSONObject jsonObject = JuHeFuUtil.queryPayment(orderId);
        return R.ok(jsonObject.getString("status"));
    }
    @GetMapping("/getMeditationIsBuy/{id}/{meditationId}")
    public R<Integer> getMeditationIsBuy(@PathVariable("id")Long id,@PathVariable("meditationId")Long meditationId) {
        List<Order> list = orderService.lambdaQuery().eq(Order::getBusinessId, meditationId)
@@ -225,11 +237,13 @@
                    Course data4 = remoteCourseService.getCourseById(data.getBusinessId()).getData();
                    List<CourseChapter> data2 = remoteCourseService.getChapterByCourseId(orderCourseVO.getBusinessId() + "").getData();
                    int temp = 0 ;
                    int b = 0 ;
                    for (CourseChapter courseChapter : data2) {
                        temp+=courseChapter.getVirtualLearnedNum();
                        Long data9 = remoteAppUserService.getCourseChapterHistoryCount(courseChapter.getId()).getData();
                        b+=data9;
                    }
                    Integer data3 = remoteCourseService.getCountByCourseId(orderCourseVO.getBusinessId() + "").getData();
                    orderCourseVO.setCount(data3+temp);
                    orderCourseVO.setCount(b+temp);
                    if (data4!=null){
                        orderCourseVO.setCourseTitle(data4.getCourseTitle());
                        orderCourseVO.setCoverUrl(data4.getCoverUrl());
@@ -302,10 +316,12 @@
     * @return 下单返回数据视图对象
     * @see com.xinquan.order.domain.vo.ClientPlaceOrderVO
     */
    @PostMapping("/placeOrder")
    @ApiOperation(value = "创建支付订单", notes = "微信|支付宝")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "targetId", value = "目标id 订单类型为会员和充值时不传", dataType = "Long", required = false),
            @ApiImplicitParam(name = "type", value = "类型 用于判断苹果支付还是安卓支付", dataType = "Long", required = false),
            @ApiImplicitParam(name = "orderId", value = "订单id 待支付时传", dataType = "Long", required = false),
            @ApiImplicitParam(name = "orderFrom", value = "订单来源 1=冥想音频 2=课程 3=购买会员 4充值", dataType = "Integer", required = true),
            @ApiImplicitParam(name = "receiverId", value = "被赠送课程APP用户id", dataType = "Long", required = false),
@@ -316,6 +332,7 @@
    })
    public R<ClientPlaceOrderVO> placeOrder(
            @RequestParam(value = "targetId", required = false) Long targetId,
            @RequestParam(value = "type", required = false) Integer type,
            @RequestParam(value = "orderId", required = false) Long orderId,
            @RequestParam(value = "orderFrom") Integer orderFrom,
            @RequestParam(value = "receiverId", required = false) Long receiverId,
@@ -323,12 +340,14 @@
            @RequestParam(value = "payType") Integer payType,
            @RequestParam(value = "amount", required = false) BigDecimal amount,
            @RequestParam(value = "vipType", required = false) Integer vipType)
    {
        try {
            ClientPlaceOrderVO clientPlaceOrderVO = orderService.placeOrder(targetId, orderFrom, receiverId, orderId,
                    balanceFlag, payType, amount, vipType,type);
            System.err.println("支付返回参数"+clientPlaceOrderVO);
            return R.ok(
                    orderService.placeOrder(targetId, orderFrom, receiverId,orderId,
                            balanceFlag, payType,amount,vipType));
                    clientPlaceOrderVO);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
@@ -343,11 +362,16 @@
    public R refund(@RequestParam(value = "uid") String uid,
                    @RequestParam(value = "remark") String remark) throws Exception {
        Order byId = orderService.getById(uid);
        String refund = orderService.refund(Long.valueOf(uid));
        if (refund!=null && (!refund.equals("success"))){
            return  R.fail(refund);
        }
        byId.setRefundStatus(2);
        byId.setRefundRemark(remark);
        byId.setPaymentStatus(3);
        byId.setRefundTime(LocalDateTime.now());
        orderService.updateById(byId);
        orderService.refund(Long.valueOf(uid));
        return R.ok();
    }
    @ResponseBody
@@ -490,7 +514,7 @@
//                    if (data1.getProportion() != null) {
//
//                        BigDecimal bigDecimal = one1.getPayAmount().multiply(data1.getProportion()).divide(new BigDecimal("100"))
//                                .setScale(2, BigDecimal.ROUND_HALF_DOWN);
//                                .setScale(2, BigDecimal.ROUND_DOWN);
//                        // 上级获取的分佣金额
//                        AppUser appUserById = remoteAppUserService.getAppUserById(data.getInviteUserId() + "").getData();
//                        // 更新用户余额
@@ -551,7 +575,7 @@
                // 支付金额
                String string3 = jsonObject1.getString("pay_fee");
                Order one = orderService.lambdaQuery().eq(Order::getBizOrderNo, string).one();
                if (one.getPaymentStatus()==2){
                if (one.getPaymentStatus()!=1){
                    return;
                }
                one.setPaymentStatus(2);
@@ -560,8 +584,7 @@
                        .ne(OrderPaymentRecord::getPaymentType, 4).one();
                if (one2!=null){
                    one2.setPaymentStatus(2);
                    // 扣除用户余额
                    Object data = remoteAppUserService.deleteBalance(one.getAppUserId() + "", one2.getPayAmount() + "").getData();
                    one2.setPayOrderNo(string2);
                    orderPaymentRecordService.updateById(one2);
                }
                // 实际支付金额
@@ -585,7 +608,7 @@
                        if (data1.getProportion() != null) {
                            BigDecimal bigDecimal = one1.getPayAmount().multiply(data1.getProportion()).divide(new BigDecimal("100"))
                                    .setScale(2, BigDecimal.ROUND_HALF_DOWN);
                                    .setScale(2, BigDecimal.ROUND_DOWN);
                            // 上级获取的分佣金额
                            AppUser appUserById = remoteAppUserService.getAppUserById(data.getInviteUserId() + "").getData();
                            // 更新用户余额
@@ -696,7 +719,7 @@
            e.printStackTrace();
        }
    }
    private static final String AES_KEY = "cb0a181ac97395c6942be19315fc0727";
    private static final String AES_KEY = "6d548eb01bad44bbbb4a23743e733103";
    public static String decrypt(String strToDecrypt) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(), "AES");
@@ -782,7 +805,7 @@
                            if (data1.getProportion() != null) {
                                BigDecimal bigDecimal = one1.getPayAmount().multiply(data1.getProportion()).divide(new BigDecimal("100"))
                                        .setScale(2, BigDecimal.ROUND_HALF_DOWN);
                                        .setScale(2, BigDecimal.ROUND_DOWN);
                                // 上级获取的分佣金额
                                AppUser appUserById = remoteAppUserService.getAppUserById(data9.getInviteUserId() + "").getData();
                                // 更新用户余额
@@ -998,22 +1021,29 @@
            OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery()
                    .eq(OrderPaymentRecord::getOrderId, orderId)
                    .ne(OrderPaymentRecord::getPaymentType, 4)
                    .eq(OrderPaymentRecord::getPaymentStatus, 2).one();
                    .ne(OrderPaymentRecord::getPaymentStatus, 1).one();
            OrderPaymentRecord three = orderPaymentRecordService.lambdaQuery()
                    .eq(OrderPaymentRecord::getOrderId, orderId)
                    .eq(OrderPaymentRecord::getPaymentType, 4)
                    .ne(OrderPaymentRecord::getPaymentStatus, 1).one();
            if (two==null){
                one.setRemark("余额支付");
                one.setBalance(one.getTotalAmount());
            }else{
                switch (two.getPaymentType()){
                    case 1:
                        one.setRemark("微信支付");
                switch (one.getPayType()){
                    case 5:
                        one.setRemark("微信支付+余额");
                        break;
                    case 2:
                        one.setRemark("支付宝支付");
                    case 6:
                        one.setRemark("支付宝支付+余额");
                        break;
                    case 3:
                        one.setRemark("苹果内购");
                    case 7:
                        one.setRemark("苹果内购+余额");
                }
                one.setPayOrderNo(two.getPayOrderNo());
                if (three!=null){
                    one.setBalance(three.getPayAmount());
                }
            }
            if (one.getCommissionId()!=null){
                switch (one.getOrderFrom()){
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java
@@ -19,6 +19,8 @@
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "三方支付id 用于查询订单状态")
    private String orderId;
    
    @ApiModelProperty(value = "金额为零无需支付 1是 2否")
    private Integer zeroFlag;
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java
@@ -29,7 +29,7 @@
     * @see com.xinquan.order.domain.vo.ClientPlaceOrderVO
     */
    ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId,Long orderId,
            Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType) throws Exception;
            Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType,Integer type) throws Exception;
    /**
     * 根据类型获取已完成的订单列表
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java
@@ -1,11 +1,8 @@
package com.xinquan.order.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinquan.common.core.constant.Constants;
import com.xinquan.common.core.constant.SecurityConstants;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.enums.ChargeTypeEnum;
import com.xinquan.common.core.enums.DisabledEnum;
import com.xinquan.common.core.enums.PaymentStatusEnum;
@@ -13,7 +10,6 @@
import com.xinquan.common.core.exception.ServiceException;
import com.xinquan.common.core.utils.ip.IpUtils;
import com.xinquan.common.security.service.TokenService;
import com.xinquan.common.security.utils.SecurityUtils;
import com.xinquan.course.api.domain.Course;
import com.xinquan.course.api.feign.RemoteCourseService;
import com.xinquan.meditation.api.domain.Meditation;
@@ -24,15 +20,19 @@
import com.xinquan.order.mapper.OrderMapper;
import com.xinquan.order.service.OrderPaymentRecordService;
import com.xinquan.order.service.OrderService;
import com.xinquan.order.utils.JuHeFuUtil;
import com.xinquan.common.core.utils.JuHeFuUtil;
import com.xinquan.order.utils.OrderUtil;
import com.xinquan.system.api.domain.AppUser;
import com.xinquan.system.api.domain.AppUserWalletRecord;
import com.xinquan.system.api.model.LoginUser;
import com.xinquan.user.api.domain.dto.AppUserDTO;
import com.xinquan.user.api.feign.RemoteAppUserService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
@@ -77,7 +77,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, Long orderId,
            Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType) throws Exception {
            Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType,Integer type) throws Exception {
        // 获取当前登录用户id
        LoginUser loginUser = tokenService.getLoginUser();
        if (loginUser==null){
@@ -91,6 +91,9 @@
        AppUser appUser = getAppUserById(userId);
        ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO();
        Order order = new Order();
        order.setPayType(payType);
        AppUser data = remoteAppUserService.getAppUserById(userId + "").getData();
        // 购买冥想音频
        if (orderFrom == 1) {
            Meditation meditation = remoteMeditationService.getMeditationById(targetId,
@@ -106,41 +109,33 @@
                order.setBizOrderNo(orderNo);
                order.setBusinessId(meditation.getId());
                order.setAppUserId(userId);
                order.setRealPayAmount(meditation.getGeneralPrice());
                order.setRealPayAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice());
                order.setTotalAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice());
                order.setPayType(payType);
                order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                order.setTotalAmount(meditation.getGeneralPrice());
                order.setGiveUserId(receiverId);
                this.save(order);
            }else{
                 order = this.getById(orderId);
                order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                 order.setBuyContent("购买疗愈【"+meditationTitle+"】");
            }
            Long orderId9 = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId9);
            // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣
            if (balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
            if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser,
                        meditation.getGeneralPrice(),
                        type==null?meditation.getGeneralPrice():meditation.getIosPrice(),
                        orderId9);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setRealPayAmount(meditation.getGeneralPrice());
                    order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                    this.updateById(order);
                    return clientPlaceOrderVO;
                }else{
                    // 余额抵扣不完
                    OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getPaymentType, 4)
                            .eq(OrderPaymentRecord::getOrderId, orderId9).one();
                    if (one!=null){
                        one.setPayAmount(meditation.getGeneralPrice().subtract(needPayAmount));
                        orderPaymentRecordService.updateById(one);
                    }
                }
                if (payType==1){
                    // 微信+余额
@@ -156,7 +151,7 @@
                        wxOpenId, orderId9, clientPlaceOrderVO);
            } else {
                // 创建支付订单
                createPayment(payType, orderNo, meditation.getGeneralPrice(), meditationTitle,
                createPayment(payType, orderNo, type==null?order.getRealPayAmount():order.getRealPayAmount(), meditationTitle,
                        detailDescription, wxOpenId, orderId9, clientPlaceOrderVO);
            }
        }
@@ -174,10 +169,11 @@
                order.setBizOrderNo(orderNo);
                order.setGiveUserId(receiverId);
                order.setBusinessId(course.getId());
                order.setAppUserId(userId);
                order.setBuyContent("购买课程【"+courseTitle+"】");
                order.setRealPayAmount(course.getGeneralPrice());
                order.setTotalAmount(course.getGeneralPrice());
                order.setRealPayAmount(type==null?course.getGeneralPrice():course.getIosPrice());
                order.setTotalAmount(type==null?course.getGeneralPrice():course.getIosPrice());
                this.save(order);
            }else{
                order = this.getById(orderId);
@@ -188,28 +184,19 @@
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId8);
            if (balanceFlag.equals(1) && course.getChargeType()
            if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && course.getChargeType()
                    .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(),
                BigDecimal needPayAmount = handleBalancePayment(appUser, type==null?course.getGeneralPrice():course.getIosPrice(),
                        orderId8);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setRealPayAmount(course.getGeneralPrice());
                    order.setBuyContent("购买课程【"+courseTitle+"】");
                    this.updateById(order);
                    return clientPlaceOrderVO;
                }else{
                    // 余额抵扣不完
                    OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getPaymentType, 4)
                            .eq(OrderPaymentRecord::getOrderId, orderId8).one();
                    if (one!=null){
                        one.setPayAmount(course.getGeneralPrice().subtract(needPayAmount));
                        orderPaymentRecordService.updateById(one);
                    }
                }
                if (payType==1){
                    // 微信+余额
@@ -226,7 +213,7 @@
                        wxOpenId, orderId8, clientPlaceOrderVO);
            } else {
                // 创建支付订单
                createPayment(payType, orderNo, course.getGeneralPrice(), courseTitle,
                createPayment(payType, orderNo, order.getRealPayAmount(), courseTitle,
                        description, wxOpenId, orderId8, clientPlaceOrderVO);
            }
        }
@@ -298,21 +285,40 @@
        if (appUser.getBalance().compareTo(BigDecimal.ZERO) < 0) {
            throw new ServiceException("用户可用余额不足,请重新选择支付方案");
        }
        // 更新用户余额
        remoteAppUserService.updateAppUser(
                AppUserDTO.builder().balance(
                                appUser.getBalance().subtract(generalPrice))
                        .build(), SecurityConstants.INNER);
        Order one = this.lambdaQuery().eq(Order::getId, orderId).one();
        OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
        balancePaymentRecord.setOrderId(orderId);
        balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
        balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
        orderPaymentRecordService.save(balancePaymentRecord);
        // 如果余额大于通用价格 则实际支付价格为0
        if (appUser.getBalance().compareTo(one.getRealPayAmount())>=0){
            // 更新用户余额
//            remoteAppUserService.updateAppUser(
//                    AppUserDTO.builder().balance(
//                                    appUser.getBalance().subtract(one.getRealPayAmount()))
//                            .build(), SecurityConstants.INNER);
            OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
            balancePaymentRecord.setOrderId(orderId);
            balancePaymentRecord.setPayAmount(one.getRealPayAmount());
            balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
            balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
            orderPaymentRecordService.save(balancePaymentRecord);
            return new BigDecimal("0");
        }else {
            // 更新用户余额
//            remoteAppUserService.updateAppUser(
//                    AppUserDTO.builder().balance(
//                                    one.getRealPayAmount().subtract(appUser.getBalance()))
//                            .build(), SecurityConstants.INNER);
        // 计算除去余额还需支付的金额
        return generalPrice
                .subtract(appUser.getBalance());
            OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
            balancePaymentRecord.setOrderId(orderId);
            balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
            balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
            balancePaymentRecord.setPayAmount(appUser.getBalance());
            orderPaymentRecordService.save(balancePaymentRecord);
            // 计算除去余额还需支付的金额
            return one.getRealPayAmount()
                    .subtract(appUser.getBalance());
        }
    }
    /**
@@ -348,8 +354,9 @@
            JSONObject payInfo = JuHeFuUtil.createPayment1(orderNo, payType,
                    needPayAmount.toString(), goodsTitle, goodsDesc,
                    IpUtils.getIpAddr(), wxOpenId,
                    //                "https://v7ro848ar5jx.ngrok.xiaomiqiu123.top/order/client/order/order/base/callback")
                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback");
                                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
//                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
            );
            // 第三方支付记录
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setOrderId(orderId);
@@ -358,10 +365,11 @@
            clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt"));
            clientPlaceOrderVO.setPath(payInfo.getJSONObject("expend").getString("path"));
            clientPlaceOrderVO.setPayInfo(payInfo.getJSONObject("expend").getString("pay_info"));
            clientPlaceOrderVO.setOrgId(payInfo.getJSONObject("expend").getString("org_id"));
            clientPlaceOrderVO.setAppId(payInfo.getJSONObject("expend").getString("app_id"));
            clientPlaceOrderVO.setOrgId(payInfo.getJSONObject("expend").getString("orgId"));
            clientPlaceOrderVO.setAppId(payInfo.getJSONObject("expend").getString("appId"));
            paymentRecord.setPaymentType(PaymentTypeEnum.WECHAT_PAY.getCode());
            paymentRecord.setPayOrderNo(payInfo.getString("id"));
            clientPlaceOrderVO.setOrderId(payInfo.getString("id"));
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            paymentRecord.setPayAmount(needPayAmount);
            orderPaymentRecordService.save(paymentRecord);
@@ -372,19 +380,25 @@
            JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType,
                    needPayAmount.toString(), goodsTitle, goodsDesc,
                    IpUtils.getIpAddr(), wxOpenId,
                    //                "https://v7ro848ar5jx.ngrok.xiaomiqiu123.top/order/client/order/order/base/callback")
                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback");
                                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
//                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
            );
            // 第三方支付记录
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setOrderId(orderId);
            paymentRecord.setPayAmount(needPayAmount);
            Order byId = this.getById(orderId);
            byId.setPayOrderNo(payInfo.getString("id"));
            this.updateById(byId);
            clientPlaceOrderVO.setQrcodeUrl(payInfo.getString("qrcode_url"));
            JSONObject expend = payInfo.getJSONObject("expend");
            String string = expend.getString("qrcode_url");
            clientPlaceOrderVO.setQrcodeUrl(string);
            paymentRecord.setPaymentType(PaymentTypeEnum.ALI_PAY.getCode());
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            paymentRecord.setPayOrderNo(payInfo.getString("id"));
            orderPaymentRecordService.save(paymentRecord);
            clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt"));
            clientPlaceOrderVO.setOrderId(payInfo.getString("id"));
            // 设置订单是否需要支付标识
            clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode());
        }
@@ -584,15 +598,139 @@
        return order.getId()+"";
    }
    @Override
    public String refund(Long uid) throws Exception {
        Order byId = this.getById(uid);
        OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery()
                .eq(OrderPaymentRecord::getPaymentType,4)
                .eq(OrderPaymentRecord::getOrderId, uid)
                .one();
        if (byId.getPayType() == 4){
            // 纯余额支付 直接退还余额
            // 回退余额记录
            AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
            appUserWalletRecord.setAppUserId(byId.getAppUserId());
            appUserWalletRecord.setChangeType(1);
            appUserWalletRecord.setReason("后台退款");
            appUserWalletRecord.setOrderId(byId.getId());
            appUserWalletRecord.setAmount(two.getPayAmount());
            remoteAppUserService.addBalanceRecord(appUserWalletRecord);
            remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount());
            byId.setRefundStatus(3);
            byId.setRefundRemark("后台退款");
            byId.setRefundTime(LocalDateTime.now());
            byId.setPaymentStatus(3);
            two.setPaymentStatus(3);
            this.updateById(byId);
            orderPaymentRecordService.updateById(two);
            switch (byId.getOrderFrom()){
                case 1:
                    // 冥想订单 删除
                    break;
                case 2:
                    // 删除用户与课程的关系表
                    remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                    break;
                case 3:
                    // 会员订单 将用户会员到期时间回退
                    if (byId.getBuyContent().contains("月")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                    }else if (byId.getBuyContent().contains("季")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                    }else if (byId.getBuyContent().contains("年")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                    }
                    break;
            }
            return "success";
        }else if (byId.getPayType() == 5 || byId.getPayType() == 6 || byId.getPayType() == 7){
            OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery()
                    .eq(OrderPaymentRecord::getOrderId, uid)
                    .ne(OrderPaymentRecord::getPaymentType, 4)
                    .ne(OrderPaymentRecord::getPaymentType, 3)
                    .one();
            JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo());
            if (refund.getString("error_msg")!=null){
                return refund.getString("error_msg");
            }
            // 回退余额记录
            AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
            appUserWalletRecord.setAppUserId(byId.getAppUserId());
            appUserWalletRecord.setChangeType(1);
            appUserWalletRecord.setReason("后台退款");
            appUserWalletRecord.setOrderId(byId.getId());
            appUserWalletRecord.setAmount(two.getPayAmount());
            remoteAppUserService.addBalanceRecord(appUserWalletRecord);
            remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount());
            byId.setRefundStatus(3);
            byId.setRefundRemark("后台退款");
            byId.setRefundTime(LocalDateTime.now());
            byId.setPaymentStatus(3);
            two.setPaymentStatus(3);
            this.updateById(byId);
            orderPaymentRecordService.updateById(two);
            switch (byId.getOrderFrom()){
                case 1:
                    // 冥想订单 删除
                    break;
                case 2:
                    // 删除用户与课程的关系表
                    remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                    break;
                case 3:
                    // 会员订单 将用户会员到期时间回退
                    if (byId.getBuyContent().contains("月")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                    }else if (byId.getBuyContent().contains("季")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                    }else if (byId.getBuyContent().contains("年")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                    }
                    break;
            }
            return "success";
        }
        OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery()
                .eq(OrderPaymentRecord::getOrderId, uid)
                .ne(OrderPaymentRecord::getPaymentType, 4)
                .ne(OrderPaymentRecord::getPaymentType, 3)
                .ne(OrderPaymentRecord::getPaymentType, 4).one();
        JuHeFuUtil.refund(one.getPayOrderNo(),byId.getBizOrderNo());
        return null;
                .one();
        JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo());
        if (refund.getString("error_msg")!=null){
            return refund.getString("error_msg");
        }
        one.setPaymentStatus(3);
        orderPaymentRecordService.updateById(one);
        String string = refund.getString("payment_id");
        if (string!=null){
            byId.setRefundCode(string);
        }
        byId.setRefundTime(LocalDateTime.now());
        byId.setRefundStatus(3);
        byId.setRefundRemark("后台退款");
        this.updateById(byId);
        switch (byId.getOrderFrom()){
            case 1:
                // 冥想订单 删除
                break;
            case 2:
                // 删除用户与课程的关系表
                remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                break;
            case 3:
                // 会员订单 将用户会员到期时间回退
                if (byId.getBuyContent().contains("月")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                }else if (byId.getBuyContent().contains("季")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                }else if (byId.getBuyContent().contains("年")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                }
                break;
        }
        return "success";
    }
}
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java
File was deleted
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java
@@ -204,6 +204,17 @@
        one.setQrCode(s);
        return R.ok(one);
    }
    public static void main(String[] args) throws Exception {
        HashMap<String, String> blueCode = new HashMap<>();
        blueCode.put("url", "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/apkAndroid.apk");
        String blueS = "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/apkAndroid.apk";
        MyQrCodeUtil.createCodeToFile(blueS);
        BufferedImage blueImage = QRCodeUtil.createImage(blueS);
        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
        String s = ObsUploadUtil.obsUpload(blueFile);
        System.err.println(s);
    }
    @PostMapping("/getCommissionRuleShare")
    @ApiOperation(value = "推广活动页",tags = "H5分享")
    public R<CommissionRule> getCommissionRuleShare(String userId) throws Exception {
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java
@@ -3,11 +3,16 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.xinquan.common.core.constant.CacheConstants;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.exception.ServiceException;
import com.xinquan.common.core.utils.DateUtils;
import com.xinquan.common.core.utils.WebUtils;
import com.xinquan.common.core.utils.page.BeanUtils;
import com.xinquan.common.core.utils.page.PageDTO;
import com.xinquan.common.core.web.domain.BaseModel;
import com.xinquan.common.redis.service.RedisService;
import com.xinquan.common.security.utils.SecurityUtils;
import com.xinquan.course.api.domain.Course;
import com.xinquan.course.api.domain.CourseCategory;
import com.xinquan.course.api.domain.CourseDTO;
@@ -16,10 +21,15 @@
import com.xinquan.order.api.domain.Order;
import com.xinquan.order.api.domain.vo.HomeDto;
import com.xinquan.order.api.feign.RemoteOrderService;
import com.xinquan.system.api.domain.SysUser;
import com.xinquan.system.api.domain.vo.HomeVO;
import com.xinquan.system.domain.Banner;
import com.xinquan.system.domain.Turn;
import com.xinquan.system.domain.Version;
import com.xinquan.system.domain.export.HomeExport;
import com.xinquan.system.service.BannerService;
import com.xinquan.system.service.ISysUserService;
import com.xinquan.system.service.TurnService;
import com.xinquan.user.api.feign.RemoteAppUserService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -64,7 +74,43 @@
    private RemoteMeditationService remoteMeditationService;
    @Resource
    private RemoteOrderService remoteOrderService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private RedisService redisService;
    @Resource
    private TurnService turnService;
    @GetMapping("/getTurn")
    @ApiOperation(value = "IOS获取是否跳转三方支付", tags = "IOS获取是否跳转三方支付")
    public R getTurn() {
        Turn one = turnService.getOne(null);
        if (one.getIsTurn()==1){
            return R.ok(true);
        }else{
            return R.ok(false);
        }
    }
    @GetMapping("/updatePassword")
    @ApiOperation(value = "管理后台-修改密码", tags = "管理后台-修改密码")
    public R updatePassword(String userName,String password) {
        SysUser one = sysUserService.lambdaQuery()
                .eq(SysUser::getUserType, "00")
                .eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getUserName, userName).one();
        if (one!=null){
//            if (one.getStatus().equals("1")){
//                return R.fail("账号已被冻结");
//            }
            one.setPassword(SecurityUtils.encryptPassword(password));
            sysUserService.updateById(one);
            return R.ok();
        }
        return R.fail("修改失败,账号不存在");
    }
    @PostMapping("/homeStatistics")
    @ApiOperation(value = "首页统计",tags = "管理后台-首页统计")
    public R<HomeVO> bannerList(@RequestBody HomeDto homeDto) {
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/PageController.java
@@ -3,7 +3,9 @@
import com.xinquan.common.core.domain.R;
import com.xinquan.system.domain.Page;
import com.xinquan.system.domain.Turn;
import com.xinquan.system.service.PageService;
import com.xinquan.system.service.TurnService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
@@ -22,6 +24,8 @@
public class PageController {
    @Resource
    private PageService pageService;
    @Resource
    private TurnService turnService;
    @PostMapping("/getPage")
    @ApiOperation(value = "获取启动页",tags = "获取启动页")
    public R<String> getPage() {
@@ -47,6 +51,18 @@
        }
        return R.ok();
    }
    @GetMapping("/updateTurn")
    @ApiOperation(value = "修改IOS获取是否跳转三方支付", tags = "管理后台-启动页")
    public R updateTurn() {
        Turn one = turnService.getOne(null);
        if (one.getIsTurn()==1){
            one.setIsTurn(2);
        }else {
            one.setIsTurn(1);
        }
        turnService.updateById(one);
        return R.ok();
    }
    @PostMapping("/getPlan")
    @ApiOperation(value = "获取计划引导设置",tags = "计划引导设置")
    public R<String> getPlan() {
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/Turn.java
New file
@@ -0,0 +1,39 @@
package com.xinquan.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xinquan.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
 * <p>
 * 用户信息表
 * </p>
 *
 * @author mitao
 * @since 2024-08-21
 */
@Data
@TableName("t_turn")
@ApiModel(value="Turn对象", description="是否跳转")
public class Turn  {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "ios是否跳转第三方支付 1是2否")
    @TableField("isTurn")
    private Integer isTurn;
}
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/TurnMapper.java
New file
@@ -0,0 +1,17 @@
package com.xinquan.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xinquan.system.domain.Banner;
import com.xinquan.system.domain.Turn;
/**
 * <p>
 * 用户信息表 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2024-08-21
 */
public interface TurnMapper extends BaseMapper<Turn> {
}
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/TurnService.java
New file
@@ -0,0 +1,20 @@
package com.xinquan.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xinquan.common.core.utils.page.PageDTO;
import com.xinquan.system.api.domain.vo.BannerVO;
import com.xinquan.system.domain.Banner;
import com.xinquan.system.domain.Turn;
import java.util.List;
/**
 * <p>
 * 用户信息表 服务类
 * </p>
 *
 * @author mitao
 * @since 2024-08-23
 */
public interface TurnService extends IService<Turn> {
}
xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/TurnServiceImpl.java
New file
@@ -0,0 +1,35 @@
package com.xinquan.system.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinquan.common.core.utils.page.BeanUtils;
import com.xinquan.common.core.utils.page.CollUtils;
import com.xinquan.common.core.utils.page.PageDTO;
import com.xinquan.course.api.domain.Course;
import com.xinquan.course.api.domain.CourseCategory;
import com.xinquan.course.api.domain.CourseDTO;
import com.xinquan.course.api.feign.RemoteCourseService;
import com.xinquan.system.api.domain.vo.BannerVO;
import com.xinquan.system.domain.Banner;
import com.xinquan.system.domain.Turn;
import com.xinquan.system.mapper.BannerMapper;
import com.xinquan.system.mapper.TurnMapper;
import com.xinquan.system.service.BannerService;
import com.xinquan.system.service.TurnService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * 用户信息表 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-08-23
 */
@Service
public class TurnServiceImpl extends ServiceImpl<TurnMapper, Turn> implements TurnService {
}
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java
@@ -124,6 +124,27 @@
    private RemoteUserService remoteUserService;
    @Resource
    private NoticeRecordService noticeRecordService;
    @PostMapping("/subVipExpireTime/{appUserId}/{type}")
    public void subVipExpireTime(@PathVariable("appUserId") Long appUserId,@PathVariable("type") Integer type){
        AppUser byId = appUserService.getById(appUserId);
        switch (type){
            case 1:
                LocalDateTime localDateTime = byId.getVipExpireTime().minusDays(30);
                byId.setVipExpireTime(localDateTime);
                break;
            case 2:
                LocalDateTime localDateTime1 = byId.getVipExpireTime().minusDays(90);
                byId.setVipExpireTime(localDateTime1);
                break;
            case 3:
                LocalDateTime localDateTime2 = byId.getVipExpireTime().minusDays(365);
                byId.setVipExpireTime(localDateTime2);
                break;
        }
        appUserService.updateById(byId);
    }
    @ApiOperation(value = "会员临期", tags = "会员临期")
    @PostMapping("/testVip")
    public void testVip() {
@@ -458,7 +479,9 @@
        SysUser data = remoteUserService.getSysUserById(userid + "").getData();
        byId.setFreezingOperator(data.getNickName()+"("+data.getUserName()+")");
        appUserService.updateById(byId);
        // 将被冻结的用户token清除
        String cacheList = redisService.getCacheObject(byId.getId() + "");
        redisService.deleteObject(cacheList);
        return R.ok();
    }
    @GetMapping("/detail")
@@ -1303,7 +1326,7 @@
            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
    })
    public R<PageDTO<InviteRankListVO>> inviteRankListShareInfo(
            @RequestParam(value = "id") Integer id,
            @RequestParam(value = "id") Long id,
            @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        LambdaQueryWrapper<AppUser> appUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java
@@ -2,6 +2,7 @@
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.utils.page.CollUtils;
@@ -79,6 +80,12 @@
        List<AppUser> collect1 = appUserService.lambdaQuery().in(!collect.isEmpty(), AppUser::getId, collect).list();
        return R.ok(collect1);
    }
    @GetMapping("/deleteAppUserCourse/{courseId}/{appUserId}")
    void deleteAppUserCourse(@PathVariable("courseId") Long courseId,@PathVariable("appUserId") Long appUserId){
        appUserCourseService.remove(new LambdaQueryWrapper<AppUserCourse>()
                .eq(AppUserCourse::getCourseId,courseId)
                .eq(AppUserCourse::getAppUserId,appUserId));
    }
    @Autowired
    private TokenService tokenService;
    /**
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java
@@ -161,6 +161,8 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈30分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 10);
                        byId.setEnergyValue(byId.getEnergyValue() + 10);
                    }
                    if (appUserTree.getTaskTwo() == 2) {
                        AppUserEnergyRecord appUserEnergyRecord = new AppUserEnergyRecord();
@@ -170,6 +172,7 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈60分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 20);
                        byId.setEnergyValue(byId.getEnergyValue() + 20);
                    }
                    appUserTree.setTaskOne(1);
@@ -183,9 +186,10 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈30分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 10);
                        byId.setEnergyValue(byId.getEnergyValue() + 10);
                    }
                    appUserTree.setTaskOne(1);
                    appUserTree.setTaskTwo(2);
                    appUserTree.setTaskOne(2);
                    appUserTree.setTaskTwo(1);
                } else {
                    appUserTree.setTaskOne(2);
                    appUserTree.setTaskTwo(2);
@@ -205,6 +209,9 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈30分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 10);
                        one.setTaskOne(1);
                        byId.setEnergyValue(byId.getEnergyValue() + 10);
                    }
                    if (one.getTaskTwo() == 2) {
                        AppUserEnergyRecord appUserEnergyRecord = new AppUserEnergyRecord();
@@ -214,10 +221,11 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈60分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 20);
                        one.setTaskTwo(1);
                        byId.setEnergyValue(byId.getEnergyValue() + 20);
                    }
                    one.setTaskOne(1);
                    one.setTaskTwo(1);
                } else if (temp >= 1800) {
                    if (one.getTaskOne() == 2) {
                        AppUserEnergyRecord appUserEnergyRecord = new AppUserEnergyRecord();
@@ -227,9 +235,9 @@
                        appUserEnergyRecord.setReason("完成【每日疗愈30分钟】任务");
                        appUserEnergyRecordService.save(appUserEnergyRecord);
                        byId.setTotalEnergyValue(byId.getTotalEnergyValue() + 10);
                        one.setTaskOne(1);
                        byId.setEnergyValue(byId.getEnergyValue() + 10);
                    }
                    one.setTaskOne(1);
                    one.setTaskTwo(2);
                } else {
                    one.setTaskOne(2);
                    one.setTaskTwo(2);
@@ -282,6 +290,7 @@
                one.setEnergyValue(byId.getEnergyValue());
                appUserTreeService.updateById(one);
                one.setTotalEnergyValue(byId.getTotalEnergyValue());
                appUserService.updateById(byId);
                return R.ok(one);
            }
        }else{
@@ -347,12 +356,14 @@
        AppUser byId = appUserService.getById(userId);
        if (byId.getEnergyValue() == 0){
            return R.energyValueError("能量值不足");
        }
        WateringVO wateringVO = new WateringVO();
        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
                .eq(AppUserTree::getSowAgain,2).one();
        if (one.getTreeLevelType() == 10){
            return R.fail("成长值已满,请重新播种");
        }
        one.setStatus(2);
        one.setTotal(one.getTotal()+byId.getEnergyValue());
        one.setTime(LocalDateTime.now());
@@ -400,9 +411,17 @@
        one.setGrowthValue(total1);
        one.setEnergyValue(byId.getEnergyValue());
        appUserTreeService.updateById(one);
        if (one.getTotal()>=data.get(9).getGrowthValue()){
            // 本次浇水量
            byId.setEnergyValue(one.getTotal()-data.get(9).getGrowthValue());
            appUserService.updateById(byId);
            one.setTotal(data.get(9).getGrowthValue());
            appUserTreeService.updateById(one);
        }
        wateringVO.setNextLevel(tem);
        wateringVO.setTreeLevelType(x);
        wateringVO.setGrowthValue(total1);
        wateringVO.setEnergyValue(byId.getEnergyValue());
        if (x>y){
            wateringVO.setIsNext(true);
            NoticeRecord noticeRecord = new NoticeRecord();
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java
@@ -8,6 +8,7 @@
import com.xinquan.common.security.service.TokenService;
import com.xinquan.common.security.utils.SecurityUtils;
import com.xinquan.course.api.domain.Course;
import com.xinquan.course.api.domain.CourseChapter;
import com.xinquan.course.api.domain.OrderCourseVO;
import com.xinquan.course.api.feign.RemoteCourseService;
import com.xinquan.meditation.api.domain.Meditation;
@@ -199,8 +200,15 @@
                    orderCourseVO.setGeneralPrice(record.getGeneralPrice());
                    orderCourseVO.setIosPrice(record.getIosPrice());
                    orderCourseVO.setCoverUrl(record.getCoverUrl());
                    List<AppUser> data1 = remoteAppUserService.getUserByCourseId(record.getId()).getData();
                    orderCourseVO.setCount(data1.size());
                    List<CourseChapter> data1 = remoteCourseService.getChapterByCourseId(orderCourseVO.getBusinessId() + "").getData();
                    int a = 0 ;
                    int b = 0 ;
                    for (CourseChapter courseChapter : data1) {
                        a+=courseChapter.getVirtualLearnedNum();
                        Long data9 = remoteAppUserService.getCourseChapterHistoryCount(courseChapter.getId()).getData();
                        b+=data9;
                    }
                    orderCourseVO.setCount(a+b);
                    orderCourseVOS.add(orderCourseVO);
                }
                break;
@@ -225,7 +233,6 @@
            return R.tokenError("登录失效");
        }
        Long userId = loginUser.getUserid();
        AppUser byId = appUserService.getById(userId);
        AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory();
        appUserViewingHistory.setAppUserId(userId);
        appUserViewingHistory.setBizId(id);
@@ -233,48 +240,6 @@
        appUserViewingHistory.setTimeLook(timeLook);
        appUserViewingHistory.setCreateTime(LocalDateTime.now());
        appUserViewingHistoryService.save(appUserViewingHistory);
        // 查询用户今日观看了多久冥想 如果达到30分钟 用户能量+10 如果达到60分钟 用户能量额外增加20
        // 查询用户今日观看疗愈多少秒
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
        LocalDateTime endOfDay = now.toLocalDate().atTime(LocalTime.MAX);
        List<AppUserViewingHistory> list = appUserViewingHistoryService
                .lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
                .eq(AppUserViewingHistory::getViewingType, 1)
                .eq(BaseModel::getDelFlag,0)
                .between(AppUserViewingHistory::getCreateTime, startOfDay,endOfDay).list();
        int temp = 0;
        for (AppUserViewingHistory appUserViewingHistory1 : list) {
            temp += appUserViewingHistory1.getTimeLook();
        }
        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
                .eq(AppUserTree::getSowAgain,2).one();
        if (one == null){
            AppUserTree appUserTree = new AppUserTree();
            appUserTree.setAppUserId(userId);
            appUserTree.setTreeLevelType(1);
            appUserTree.setGrowthValue(0);
            appUserTree.setSowAgain(2);
            appUserTree.setCreateTime(LocalDateTime.now());
            if (temp>=60){
                byId.setEnergyValue(byId.getEnergyValue()+30);
            }
            else if (temp>=30){
                byId.setEnergyValue(byId.getEnergyValue()+10);
            }
            appUserService.updateById(byId);
            appUserTreeService.save(appUserTree);
        }else{
            if (temp>=60){
                byId.setEnergyValue(byId.getEnergyValue()+30);
            }
            else if (temp>=30){
                byId.setEnergyValue(byId.getEnergyValue()+10);
            }
            appUserService.updateById(byId);
            appUserTreeService.updateById(one);
        }
        return R.ok();
    }
    @PostMapping("/saveCourseStudyHistory")
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWalletRecordController.java
@@ -178,6 +178,7 @@
            appUserWalletRecordLambdaQueryWrapper.eq(AppUserWalletRecord::getChangeType, state-1);
        }
        appUserWalletRecordLambdaQueryWrapper.eq(AppUserWalletRecord::getAppUserId, userId);
        appUserWalletRecordLambdaQueryWrapper.ne(AppUserWalletRecord::getAmount, 0);
        appUserWalletRecordLambdaQueryWrapper.orderByDesc(BaseModel::getCreateTime);
        Page<AppUserWalletRecord> page = walletRecordService
                .page(new Page<>(pageCurr, pageSize),appUserWalletRecordLambdaQueryWrapper);
@@ -352,6 +353,25 @@
                    if (data1!=null)orderDetailVO.setRemark("疗愈购买【"+data1.getMeditationTitle()+"】");
                }
                return R.ok(orderDetailVO);
            }else if (byId.getReason().contains("退款")){
                Order data = remoteOrderService.getOrderById(byId.getOrderId()).getData();
                if (data!=null){
                    orderDetailVO.setType("后台退款");
                    orderDetailVO.setPayOrderNo(data.getRefundCode());
                    orderDetailVO.setAmount(byId.getAmount());
                    orderDetailVO.setChangeType(1);
                    orderDetailVO.setPaymentTime(data.getRefundTime());
                    switch (data.getOrderFrom()){
                        case 1:
                            Meditation data1 = remoteMeditationService.getMeditationById(data.getBusinessId()).getData();
                            if (data1!=null)orderDetailVO.setRemark("疗愈购买【"+data1.getMeditationTitle()+"】");
                            break;
                        case 2:
                            Course data2 = remoteCourseService.getCourseById(data.getBusinessId()).getData();
                            if (data2!=null)orderDetailVO.setRemark("课程购买【"+data2.getCourseTitle()+"】");
                            break;
                    }
                }
            }
        }
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java
@@ -3,11 +3,14 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinquan.common.core.constant.CacheConstants;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.utils.JuHeFuUtil;
import com.xinquan.common.core.utils.WebUtils;
import com.xinquan.common.core.utils.page.CollUtils;
import com.xinquan.common.core.utils.page.PageDTO;
@@ -15,12 +18,10 @@
import com.xinquan.common.redis.service.RedisService;
import com.xinquan.common.security.service.TokenService;
import com.xinquan.course.api.domain.Course;
import com.xinquan.meditation.api.domain.Meditation;
import com.xinquan.order.api.domain.Order;
import com.xinquan.system.api.domain.AppUserWalletRecord;
import com.xinquan.system.api.domain.*;
import com.xinquan.user.api.domain.dto.OrderListDTO;
import com.xinquan.system.api.domain.AppUser;
import com.xinquan.system.api.domain.AppUserBank;
import com.xinquan.system.api.domain.AppUserWithdraw;
import com.xinquan.system.api.model.LoginUser;
import com.xinquan.user.domain.export.WithdrawExport;
import com.xinquan.user.service.AppUserBankService;
@@ -36,16 +37,20 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -254,7 +259,7 @@
            @ApiImplicitParam(name = "bankId", value = "银行卡id", dataType = "Long", required = true),
            @ApiImplicitParam(name = "money", value = "提现金额", dataType = "String", required = true)
    })
    public R withdraw(Long bankId,String money) {
    public R withdraw(Long bankId,String money) throws Exception {
        LoginUser loginUser = tokenService.getLoginUser();
        if (loginUser==null){
@@ -265,8 +270,9 @@
        if (byId.getBalance().compareTo(new BigDecimal(money))<0){
            return R.fail("提现金额不能超过钱包余额");
        }
        AppUserBank byId1 = appUserBankService.getById(bankId);
        byId.setBalance(byId.getBalance().subtract(new BigDecimal(money)));
        appUserService.updateById(byId);
        BigDecimal bigDecimal = new BigDecimal(money);
        AppUserWithdraw appUserWithdraw = new AppUserWithdraw();
        appUserWithdraw.setAppUserId(userId);
@@ -275,11 +281,12 @@
        appUserWithdraw.setWithdrawType(1);
        appUserWithdraw.setWithdrawStatus(0);
        // todo 提现流水号
        appUserWithdraw.setSerialNo(UuidUtils.generateUuid());
        appUserWithdraw.setCode(UuidUtils.generateUuid());
        String s = UuidUtils.generateUuid();
        String replace = s.replace("-", "");
        appUserWithdraw.setCode(replace);
        appUserWithdraw.setWithdrawTime(LocalDateTime.now());
        appUserWithdraw.setCreateTime(LocalDateTime.now());
        withdrawService.save(appUserWithdraw);
        // 先扣去余额
        AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
        appUserWalletRecord.setAppUserId(userId);
@@ -287,13 +294,177 @@
        appUserWalletRecord.setReason("提现");
        appUserWalletRecord.setOrderId(appUserWithdraw.getId());
        appUserWalletRecord.setAmount(new BigDecimal(money));
        BigDecimal bigDecimal1 = new BigDecimal(money).setScale(2, RoundingMode.HALF_DOWN);
        JuHeFuUtil.updateAccount(byId.getFenzhangId(),byId1.getCardholder(),byId1.getCellPhone(),byId1.getCardNo());
        JSONObject jsonObject = JuHeFuUtil.balancePay(replace, byId.getFenzhangId(), bigDecimal1 + ""
                , "https://xq.xqzhihui.com/api/user/client/app-user-withdraw/base/callback");
        if (jsonObject.getString("error_msg")!=null){
            return R.fail(jsonObject.getString("error_msg"));
        }
        appUserService.updateById(byId);
        appUserWalletRecordService.save(appUserWalletRecord);
        withdrawService.save(appUserWithdraw);
        return R.ok();
    }
    private static final String AES_KEY = "cb0a181ac97395c6942be19315fc0727";
    public static String decrypt(String strToDecrypt) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
        } catch (Exception e) {
            System.out.println("Error while decrypting: " + e.toString());
        }
        return null;}
    @ResponseBody
    @PostMapping("/base/callback")
    public void callback(HttpServletRequest request, HttpServletResponse response) {
        try {
            System.err.println("提现到分账接收方回调================="+request);
            BufferedReader reader = request.getReader();
            String string1 = reader.toString();
            StringBuilder requestBody = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                requestBody.append(line);
            }
            System.err.println("提现回调=================全部请求体"+requestBody);
            com.alibaba.fastjson2.JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
            System.err.println("json串"+jsonObject);
            String string9 = jsonObject.getString("resCipher");
            String decrypt = decrypt(string9);
            System.err.println(decrypt);
            JSONObject jsonObject1 = JSONObject.parseObject(decrypt);
            // 系统订单号
            String string = jsonObject1.getString("order_no");
            String payId = jsonObject1.getString("pay_id");
            AppUserWithdraw one = withdrawService.lambdaQuery().eq(AppUserWithdraw::getCode, string).one();
            if (jsonObject.getString("type").equals("balancePay.succeeded")){
                if (one!=null){
                    String s = UuidUtils.generateUuid();
                    AppUser appUser = appUserService.getById(one.getAppUserId());
                    if (one.getWithdrawStatus()==1 || one.getWithdrawStatus()==2){
                        return;
                    }
                    JSONObject jsonObject2 = JuHeFuUtil.balanceWithdraw(s, one.getAmount() + "", appUser.getFenzhangId(),
                            "https://xq.xqzhihui.com/api/user/client/app-user-withdraw/base/callbackA");
                    if (jsonObject2.getString("error_msg")!=null){
                        // 调用失败
                        // 回退余额记录
                        AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
                        appUserWalletRecord.setAppUserId(one.getAppUserId());
                        appUserWalletRecord.setChangeType(1);
                        appUserWalletRecord.setReason("提现回退");
                        appUserWalletRecord.setOrderId(one.getId());
                        appUserWalletRecord.setAmount(one.getAmount());
                        appUserWalletRecordService.save(appUserWalletRecord);
                        one.setWithdrawStatus(2);
                        one.setReason(jsonObject1.getString("error_msg"));
                        withdrawService.updateById(one);
                        // 回退用户余额
                        BigDecimal add = appUser.getBalance().add(one.getAmount());
                        appUser.setBalance(add);
                        appUserService.updateById(appUser);
                        PrintWriter out = response.getWriter();
                        out.write("succeeded");
                        out.flush();
                        out.close();
                    }
                    withdrawService.updateById(one);
                }
                PrintWriter out = response.getWriter();
                out.write("succeeded");
                out.flush();
                out.close();
            }else if (jsonObject.getString("type").equals("balancePay.failed")){
                // 回退余额记录
                AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
                appUserWalletRecord.setAppUserId(one.getAppUserId());
                appUserWalletRecord.setChangeType(1);
                appUserWalletRecord.setReason("提现回退");
                appUserWalletRecord.setOrderId(one.getId());
                appUserWalletRecord.setAmount(one.getAmount());
                appUserWalletRecordService.save(appUserWalletRecord);
                one.setWithdrawStatus(2);
                one.setReason(jsonObject1.getString("error_msg"));
                withdrawService.updateById(one);
                // 回退用户余额
                AppUser appUser = appUserService.getById(one.getAppUserId());
                BigDecimal add = appUser.getBalance().add(one.getAmount());
                appUser.setBalance(add);
                appUserService.updateById(appUser);
                PrintWriter out = response.getWriter();
                out.write("succeeded");
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @ResponseBody
    @PostMapping("/base/callbackA")
    public void callbackA(HttpServletRequest request, HttpServletResponse response) {
        try {
            System.err.println("提现到银行卡回调================="+request);
            BufferedReader reader = request.getReader();
            String string1 = reader.toString();
            StringBuilder requestBody = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                requestBody.append(line);
            }
            System.err.println("提现到银行卡回调=================全部请求体"+requestBody);
            com.alibaba.fastjson2.JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
            System.err.println("json串"+jsonObject);
            String string9 = jsonObject.getString("resCipher");
            String decrypt = decrypt(string9);
            System.err.println(decrypt);
            JSONObject jsonObject1 = JSONObject.parseObject(decrypt);
            // 系统订单号
            String string = jsonObject1.getString("order_no");
            AppUserWithdraw one = withdrawService.lambdaQuery().eq(AppUserWithdraw::getCode, string).one();
            if (jsonObject.getString("type").equals("withdraw.succeeded")){
                if (one!=null){
                    System.err.println("提现成功");
                    one.setWithdrawStatus(1);
                    one.setSerialNo(jsonObject1.getString("withdraw_id"));
                    withdrawService.updateById(one);
                }
                PrintWriter out = response.getWriter();
                out.write("succeeded");
                out.flush();
                out.close();
            }else if (jsonObject.getString("type").equals("withdraw.failed")){
                // 回退余额记录
                AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
                appUserWalletRecord.setAppUserId(one.getAppUserId());
                appUserWalletRecord.setChangeType(1);
                appUserWalletRecord.setReason("提现回退");
                appUserWalletRecord.setOrderId(one.getId());
                appUserWalletRecord.setAmount(one.getAmount());
                appUserWalletRecordService.save(appUserWalletRecord);
                one.setWithdrawStatus(2);
                one.setReason(jsonObject1.getString("error_msg"));
                withdrawService.updateById(one);
                // 回退用户余额
                AppUser appUser = appUserService.getById(one.getAppUserId());
                BigDecimal add = appUser.getBalance().add(one.getAmount());
                appUser.setBalance(add);
                appUserService.updateById(appUser);
                PrintWriter out = response.getWriter();
                out.write("succeeded");
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @PostMapping("/addBank")
    @ApiOperation(value = "提现-添加银行卡", tags = {"钱包"})
    public R wallet(@RequestBody AppUserBank appUserWithdraw) {
    public R wallet(@RequestBody AppUserBank appUserWithdraw) throws Exception {
        LoginUser loginUser = tokenService.getLoginUser();
        if (loginUser==null){
            return R.tokenError("登录失效");
@@ -310,6 +481,18 @@
//            return R.fail("验证码不正确");
//        }
        appUserBankService.save(appUserWithdraw);
        // 查询是否已经开户
        AppUser byId = appUserService.getById(userId);
        if (byId.getFenzhangId()==null){
            // 开户
            long time = new Date().getTime();
            String s = RandomUtil.randomNumbers(4);
            String s1 = "FZ" + time + s;
            JuHeFuUtil.createUser(s1, appUserWithdraw.getCardholder(), "00",
                    appUserWithdraw.getIdentityCard(), appUserWithdraw.getCellPhone(), appUserWithdraw.getCardNo());
            byId.setFenzhangId(s1);
            appUserService.updateById(byId);
        }
        return R.ok();
    }
    @PostMapping("/deleteBank")
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java
@@ -23,6 +23,6 @@
    @ApiModelProperty(value = "问题二 多个tagId使用英文逗号拼接字符串", required = true)
    private String tagIds;
    @ApiModelProperty(value = "设备码", required = true)
    @ApiModelProperty(value = "设备码", required = false)
    private String device;
}
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
@@ -76,21 +76,32 @@
            Optional<AppUser> one = this.lambdaQuery()
                    .eq(AppUser::getDevice, device)
                    .isNull(AppUser::getCellPhone).oneOpt();
            if (one.isPresent()) {
                initUserTree(one.get().getId());
                this.updateById(one.get());
                return one;
            } else {
               return this.lambdaQuery()
                        .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
                        .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
                        .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
                                dto.getCellPhone())
                        .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
                                dto.getWxOpenId())
                        .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
            Optional<AppUser> appUser = this.lambdaQuery()
                    .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
                    .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
                    .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
                            dto.getCellPhone())
                    .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
                            dto.getWxOpenId())
                    .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
            // 如果不存在
            if (!appUser.isPresent()){
                if (one.isPresent()) {
                    initUserTree(one.get().getId());
                    this.updateById(one.get());
                    return one;
                } else {
                    return this.lambdaQuery()
                            .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
                            .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
                            .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
                                    dto.getCellPhone())
                            .eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
                                    dto.getWxOpenId())
                            .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
                }
            }
        }
        return this.lambdaQuery()
                .eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
@@ -115,6 +126,30 @@
     */
    @Override
    public AppUser registerAppUser(AppUserDTO appUserDTO) {
        if (StringUtils.hasLength(appUserDTO.getDevice())){
            AppUser one = this.lambdaQuery().eq(AppUser::getDevice, appUserDTO.getDevice())
                    .isNull(AppUser::getCellPhone).one();
            if (one == null){
                AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
                String format = simpleDateFormat.format(new Date());
                // 生成四位随机数字
                String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
                appUser.setCode("YH"+format+randomCode);
                this.save(appUser);
                initUserTree(appUser.getId());
                return appUser;
            }else{
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
                String format = simpleDateFormat.format(new Date());
                // 生成四位随机数字
                String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
                one.setCode("YH"+format+randomCode);
                this.updateById(one);
                initUserTree(one.getId());
                return one;
            }
        }
        AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String format = simpleDateFormat.format(new Date());
@@ -136,7 +171,7 @@
    public AppLoginUser wxLogin(AppWXLoginBody body) {
        AppLoginUser appLoginUser = new AppLoginUser();
        Optional<AppUser> optionalAppUser = this.getUserByCondition(
                AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build());
                AppUserDTO.builder().wxOpenId(body.getWxOpenId()).device(body.getDevice()).build());
        AppUser appUser = new AppUser();
        SysUser sysUser = new SysUser();
        // 存在账户,查询关联系统用户
@@ -185,6 +220,7 @@
                    String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
                    sysUser.setNickName(nickname);
                    appUser.setNickname(nickname);
                    appUser.setDevice(body.getDevice());
                    appUser.setWxName(body.getNickname());
                    appUser.setAvatar(body.getHeadImgUrl());
                    appUser.setGender(3);
@@ -227,6 +263,7 @@
                appUser.setNickname(nickname);
                appUser.setWxName(body.getNickname());
                appUser.setAvatar(body.getHeadImgUrl());
                appUser.setDevice(body.getDevice());
                appUser.setGender(3);
                appUser.setBalance(BigDecimal.ZERO);
                appUser.setSanskritFlag(DisabledEnum.NO.getCode());
@@ -256,7 +293,7 @@
    public AppLoginUser appleLogin(String appleId,String device) {
        AppLoginUser appLoginUser = new AppLoginUser();
        Optional<AppUser> optionalAppUser = this.getUserByCondition(
                AppUserDTO.builder().appleId(appleId).build());
                AppUserDTO.builder().appleId(appleId).device(device).build());
        SysUser sysUser = new SysUser();
        AppUser appUser = new AppUser();
        // 存在账户,查询关联系统用户
@@ -305,6 +342,7 @@
                    appUser.setBalance(BigDecimal.ZERO);
                    appUser.setIncome(BigDecimal.ZERO);
                    appUser.setTotalEnergyValue(0);
                    appUser.setDevice(device);
                    appUser.setRegisterTime(LocalDateTime.now());
                    appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -342,6 +380,8 @@
                appUser.setBalance(BigDecimal.ZERO);
                appUser.setIncome(BigDecimal.ZERO);
                appUser.setTotalEnergyValue(0);
                appUser.setDevice(device);
                appUser.setRegisterTime(LocalDateTime.now());
                appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -373,7 +413,7 @@
        public AppLoginUser appCaptchaLogin (AppCaptchaBody body){
            AppLoginUser appLoginUser = new AppLoginUser();
            Optional<AppUser> optionalAppUser = this.getUserByCondition(
                    AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
                    AppUserDTO.builder().device(body.getDevice()).cellPhone(body.getCellPhone()).build());
            AppUser appUser = new AppUser();
            SysUser sysUser = new SysUser();
            if (optionalAppUser.isPresent()) {
@@ -538,12 +578,14 @@
            }
        } else {
            Optional<AppUser> userOptional = getAppUserByThirdId(loginType, wxOrAppleId);
            if (loginType.equals(1)) {
                // 微信登录
                handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
            } else {
                // 苹果登录
                handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录");
            if (!userOptional.isPresent()) {
                if (loginType.equals(1)) {
                    // 微信登录
                    handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
                } else {
                    // 苹果登录
                    handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录");
                }
            }
            appUser = userOptional.get();
            appUser.setCellPhone(body.getCellPhone());
@@ -564,6 +606,7 @@
        // 更新用户信息
        this.updateById(appUser);
        AppLoginUser appLoginUser = new AppLoginUser();
        appLoginUser.setAppUserId(appUser.getId());
        appLoginUser.setBindStatus(1);
        appLoginUser.setCellPhone(body.getCellPhone());
        appLoginUser.setSysUser(sysUser);
@@ -601,41 +644,45 @@
        if (tokenService.getLoginUser()==null){
            // 获取当前登录用户
            if (org.springframework.util.StringUtils.hasLength(dto.getDevice())){
                SysUser sysUser = new SysUser();
                AppUser appUser = new AppUser();
                // 注册用户信息
                sysUser = new SysUser();
                String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
                sysUser.setNickName(nickname);
                sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
                sysUser.setUserName(dto.getDevice());
                sysUser.setUserType("01"); // app用户
                // 设置默认密码123456
                sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
                AppUser one = this.lambdaQuery().eq(AppUser::getDevice, dto.getDevice())
                        .isNull(AppUser::getCellPhone).one();
                if (one==null){
                    SysUser sysUser = new SysUser();
                    AppUser appUser = new AppUser();
                    // 注册用户信息
                    sysUser = new SysUser();
                    String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
                    sysUser.setNickName(nickname);
                    sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
                    sysUser.setUserName(nickname);
                    sysUser.setUserType("01"); // app用户
                    // 设置默认密码123456
                    sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
                R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
                        SecurityConstants.INNER);
                if (registerResult.getCode() == Constants.FAIL) {
                    throw new ServiceException(registerResult.getMsg());
                }
                SysUser sysUserRes = registerResult.getData();
                appUser = new AppUser();
                appUser.setUserId(sysUserRes.getUserId());
                appUser.setNickname(nickname);
                appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
                appUser.setBalance(BigDecimal.ZERO);
                appUser.setSanskritFlag(DisabledEnum.NO.getCode());
                appUser.setBalance(BigDecimal.ZERO);
                appUser.setIncome(BigDecimal.ZERO);
                appUser.setTotalEnergyValue(0);
                appUser.setRegisterTime(LocalDateTime.now());
                appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
                String format = simpleDateFormat.format(new Date());
                // 生成四位随机数字
                String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
                appUser.setCode("YH"+format+randomCode);
                this.save(appUser);
                    R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
                            SecurityConstants.INNER);
                    if (registerResult.getCode() == Constants.FAIL) {
                        throw new ServiceException(registerResult.getMsg());
                    }
                    SysUser sysUserRes = registerResult.getData();
                    appUser = new AppUser();
                    appUser.setUserId(sysUserRes.getUserId());
                    appUser.setNickname(nickname);
                    appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
                    appUser.setBalance(BigDecimal.ZERO);
                    appUser.setSanskritFlag(DisabledEnum.NO.getCode());
                    appUser.setBalance(BigDecimal.ZERO);
                    appUser.setIncome(BigDecimal.ZERO);
                    appUser.setTotalEnergyValue(0);
                    appUser.setRegisterTime(LocalDateTime.now());
                    appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
                    appUser.setDevice(dto.getDevice());
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
                    String format = simpleDateFormat.format(new Date());
                    // 生成四位随机数字
                    String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
                    appUser.setCode("YH"+format+randomCode);
                    this.save(appUser);
                    Long userId = appUser.getId();
                    List<AppUserQuestion> appUserQuestionList = BeanUtils.copyList(
                            dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
@@ -665,6 +712,26 @@
                                    || appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
                    appUser.setTagId(dto.getTagIds());
                    this.updateById(appUser);
                }else{
                    List<AppUserQuestion> appUserQuestionList = BeanUtils.copyList(
                            dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
                    // 查询用户已填写的答案
                    // 删除之前答案
                    appUserQuestionService.lambdaUpdate().eq(AppUserQuestion::getAppUserId,one.getId()).remove();
                    // 根据类型更新答案
                    for (AppUserQuestion appUserQuestion : appUserQuestionList) {
                        appUserQuestion.setAppUserId(one.getId());
                    }
                    appUserQuestionService.saveBatch(appUserQuestionList);
                    // 筛选答案为是和偶尔有的问题,为用户设置对应的标签
                    List<AppUserQuestion> appUserQuestionYesList = appUserQuestionList.stream()
                            .filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1")
                                    || appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
                    one.setTagId(dto.getTagIds());
                    this.updateById(one);
                }
                }
        }else{
            Long userId = tokenService.getLoginUser().getUserid();
@@ -687,8 +754,6 @@
            appUser.setTagId(dto.getTagIds());
            this.updateById(appUser);
        }
    }
    /**