liujc 1 year ago
parent
commit
7165fde0c5

+ 12 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java

@@ -51,6 +51,18 @@ public class SysUserContractRecordController extends BaseController {
         return HttpResponseResult.succeed(sysUserContractRecordService.checkContractSign(user.getId(), SysUserType.TEACHER, contractType));
     }
 
+
+    @ApiOperation("判断用户是否签署协议")
+    @GetMapping(value = "/checkContractSignV2", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<String> checkContractSignV2(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 结算", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        return HttpResponseResult.succeed(sysUserContractRecordService.checkContractSignV2(user.getId(), SysUserType.TEACHER, contractType));
+    }
+
     @ApiOperation("查看协议-获取协议模板")
     @GetMapping(value = "/queryLatestContractTemplate")
     public HttpResponseResult<ContractTemplate> queryLatestContractTemplate(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 结算", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {

+ 2 - 4
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/MusicTheoryController.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.cms.dal.entity.SysNewsType;
 import com.yonge.cooleshow.cms.dto.SysNewsTypeDto;
 import com.yonge.cooleshow.cms.dto.search.MusicTheorySearch;
 import com.yonge.cooleshow.cms.service.SysNewsTypeService;
+import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
@@ -17,9 +18,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.Date;
 
-import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
-import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
-
 /**
  * Description
  *
@@ -29,7 +27,7 @@ import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
 @RestController
 @RequestMapping("music/theory")
 @Api(tags = "乐理管理")
-public class MusicTheoryController {
+public class MusicTheoryController extends BaseController {
 
     @Autowired
     private SysNewsTypeService newsTypeService;

+ 167 - 2
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/exception/GlobalExceptionHandler.java

@@ -1,9 +1,13 @@
 package com.yonge.cooleshow.mall.common.exception;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
-import com.yonge.cooleshow.mall.common.api.IErrorCode;
 import com.yonge.toolset.base.exception.BizException;
-import org.springframework.http.HttpStatus;
+import com.yonge.toolset.utils.http.HttpUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.springframework.validation.BindException;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.FieldError;
@@ -11,11 +15,27 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URLEncoder;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * 全局异常处理
  * Created by macro on 2020/2/27.
  */
+@Slf4j
 @ControllerAdvice
 public class GlobalExceptionHandler {
 
@@ -39,6 +59,10 @@ public class GlobalExceptionHandler {
                 message = fieldError.getField()+fieldError.getDefaultMessage();
             }
         }
+
+        // 发送机器人消息
+        sendDingTalkRobotNotify(e);
+
         return CommonResult.validateFailed(message);
     }
 
@@ -53,6 +77,10 @@ public class GlobalExceptionHandler {
                 message = fieldError.getField()+fieldError.getDefaultMessage();
             }
         }
+
+        // 发送机器人消息
+        sendDingTalkRobotNotify(e);
+
         return CommonResult.validateFailed(message);
     }
 
@@ -62,4 +90,141 @@ public class GlobalExceptionHandler {
     public CommonResult handleBizException(BizException e) {
         return  CommonResult.failed(e.getMessage());
     }
+
+
+
+    /**
+     * 获取异常信息
+     * @param ex Throwable
+     * @return Throwable
+     */
+    private static Throwable getThrowable(Throwable ex) {
+        return Optional.ofNullable(ExceptionUtils.getRootCause(ex)).orElse(ex);
+    }
+
+    /**
+     * 机器人发送消息
+     * @param e Throwable
+     */
+    private void sendDingTalkRobotNotify(Throwable e) {
+        try {
+
+            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (Objects.nonNull(attributes)) {
+
+                // 机器人通知消息
+                String robotMessage = getRobotRequestLog(attributes.getRequest());
+
+                Map<String, Object> paramMap = new HashMap<>(2);
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("content", "系统繁忙请及时处理: " + robotMessage + "   " + getThrowable(e));
+                paramMap.put("text", jsonObject.toJSONString());
+                paramMap.put("msgtype", "text");
+                Map<String, String> headers = new HashMap<>(1);
+                headers.put("Content-Type", "application/json");
+                HttpUtil.postForHttps(dingTalkRobotsSecurityParam(), JSON.toJSONString(paramMap), headers);
+
+            }
+        } catch (Exception exception) {
+            log.error("sendDingTalkRobotNotify Error", exception);
+        }
+    }
+
+    /**
+     * 打印异常请求日志
+     * @param request HttpServletRequest
+     * @return String
+     */
+    private String getRobotRequestLog(HttpServletRequest request){
+
+        if (Objects.isNull(request)) {
+            log.warn("getRobotRequestLog request is null");
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+        // 打印请求日志或执行其他逻辑
+        sb.append("Request URI: ").append(request.getRequestURI());
+
+        // 请求参数
+        Map<String, String> requestParams = getRequestParameters(request);
+        if (!requestParams.isEmpty()) {
+            sb.append(", Request Parameters: ").append(requestParams);
+        }
+
+        // 请求头
+        Map<String, String> requestHeaders = getRequestHeaders(request);
+        if (!requestHeaders.isEmpty()) {
+            sb.append(", Request Headers: ").append(requestHeaders);
+        }
+
+        // 请求消息体
+        String requestBody = getRequestBody(request);
+        if (!requestBody.isEmpty()) {
+            sb.append(", Request JSON: ").append(requestBody);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 请求参数
+     * @param request HttpServletRequest
+     * @return Map<String, String>
+     */
+    private Map<String, String> getRequestParameters(HttpServletRequest request) {
+        Map<String, String> params = new HashMap<>();
+        request.getParameterMap().forEach((name, values) -> {
+            if (values.length > 0) {
+                params.put(name, values[0]);
+            }
+        });
+        return params;
+    }
+
+    /**
+     * 请求头
+     * @param request HttpServletRequest
+     * @return Map<String, String>
+     */
+    private Map<String, String> getRequestHeaders(HttpServletRequest request) {
+        Enumeration<String> headerNames = request.getHeaderNames();
+        Map<String, String> headers = new HashMap<>();
+        while (headerNames.hasMoreElements()) {
+            String headerName = headerNames.nextElement();
+            String headerValue = request.getHeader(headerName);
+            headers.put(headerName, headerValue);
+        }
+        return headers;
+    }
+
+    /**
+     * 请求消息体
+     * @param request HttpServletRequest
+     * @return String
+     */
+    private String getRequestBody(HttpServletRequest request) {
+        StringBuilder requestBody = new StringBuilder();
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+        } catch (IOException e) {
+            log.error("robot getRequestBody body: {}", e.getMessage());
+        }
+        return requestBody.toString();
+    }
+
+    public String dingTalkRobotsSecurityParam() throws Exception {
+        Long timestamp = System.currentTimeMillis();
+        String secret = "SEC7371152e58a066b358afd9e9cfaad2aee4b46471218f1aeef88d43a401d8e2f2";
+        String stringToSign = timestamp + "\n" + secret;
+        Mac mac = Mac.getInstance("HmacSHA256");
+        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
+        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
+        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
+        StringBuffer sb = new StringBuffer("https://oapi.dingtalk.com/robot/send?access_token=324dc48b8af4fc21223a5b8fd5d8daa611e106f2711d91abe1d73bce8c5c86b2&timestamp=");
+        sb.append(timestamp).append("&sign=").append(sign);
+        return sb.toString();
+    }
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysUserContractRecordDao.java

@@ -46,5 +46,7 @@ public interface SysUserContractRecordDao extends BaseMapper<SysUserContractReco
                                 @Param("errMsg") String errMsg);
 
 
+    SysUserContractRecord checkContractSignV2(@Param("userId") Long userId, @Param("userType") String userType, @Param("contractSource") String contractSource, @Param("contractType") String contractType);
+
 }
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysUserContractRecord.java

@@ -43,7 +43,7 @@ public class SysUserContractRecord implements Serializable {
     private String contractNo;
 
     @TableField("status_")
-    @ApiModelProperty(value = "签署状态 DONG 签署中 SUCCESS 签署完成 FAILED 签署失败")
+    @ApiModelProperty(value = "签署状态 NOT_SIGN 未签署  DONG 签署中 SUCCESS 签署完成 FAILED 签署失败")
     private String status;
 
     @TableField("err_msg_")

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserContractRecordService.java

@@ -48,5 +48,7 @@ public interface SysUserContractRecordService extends IService<SysUserContractRe
     SysUserContractRecord queryLatestContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType);
 
     HttpResponseResult<Boolean> sign(ContractTemplateTypeEnum contractType, SysUserType userType, SysUser user);
+
+    String checkContractSignV2(Long userId, SysUserType sysUserType, ContractTemplateTypeEnum contractType);
 }
 

+ 2 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -22,19 +22,11 @@ import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumRefMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
-import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -58,7 +50,6 @@ import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.parameters.P;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -379,7 +370,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 // 自动注册创建用户
                 com.yonge.cooleshow.biz.dal.entity.SysUser user = new com.yonge.cooleshow.biz.dal.entity.SysUser();
                 user.setUsername(info.getUsername());
-                user.setAvatar("https://daya.ks3-cn-beijing.ksyun.com/202203/T1WgJaE.png");
+                user.setAvatar("https://oss.dayaedu.com/daya/202203/T1WgJaE.png");
                 user.setPhone(info.getMobile());
                 user.setLockFlag(0);
                 user.setGender(info.getGender());

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserContractRecordServiceImpl.java

@@ -109,5 +109,15 @@ public class SysUserContractRecordServiceImpl extends ServiceImpl<SysUserContrac
         return HttpResponseResult.succeed(true);
     }
 
+    @Override
+    public String checkContractSignV2(Long userId, SysUserType sysUserType, ContractTemplateTypeEnum contractType) {
+        SysUserContractRecord sysUserContractRecord = getDao().checkContractSignV2(userId, sysUserType.getCode(), contractType.getSource().getCode(), contractType.getCode());
+        if (sysUserContractRecord == null || sysUserContractRecord.getStatus().equals("FAILED")) {
+            return "NOT_SIGN";
+        }
+        return sysUserContractRecord.getStatus();
+
+    }
+
 }
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserMusicStarServiceImpl.java

@@ -231,6 +231,6 @@ public class UserMusicStarServiceImpl extends ServiceImpl<UserMusicStarMapper, U
         if (CollectionUtils.isEmpty(list)) {
             return new HashMap<>();
         }
-        return list.stream().collect(Collectors.toMap(UserMusicStar::getUserMusicId, o->true));
+        return list.stream().collect(Collectors.toMap(UserMusicStar::getUserMusicId, o->true, (k1, k2) -> k1));
     }
 }

+ 17 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserContractRecordMapper.xml

@@ -106,4 +106,21 @@
         left join sys_user_contract_record t on b.id_ = t.contract_id_ and t.status_ in ('SUCCESS','DONG ')
         where t.user_id_ = #{userId} and t.user_type_ = #{userType}
     </select>
+
+    <select id="checkContractSignV2" resultType="com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord">
+        select
+            <include refid="baseColumns"/>
+        from (
+        select
+        source_,type_,MAX(version_) as version_
+        from contract_template
+        where status_ = 1 and source_ = #{contractSource} and type_ = #{contractType}
+        group by source_,type_
+        ) a
+        left join contract_template b on a.source_ = b.source_ and a.type_ = b.type_ and a.version_ = b.version_
+        left join sys_user_contract_record t on b.id_ = t.contract_id_
+        where t.user_id_ = #{userId} and t.user_type_ = #{userType}
+        order by  t.id_ desc
+        limit 1
+    </select>
 </mapper>