瀏覽代碼

Merge branch 'dev/h5&log_20220506' into debug

songxinlu 3 年之前
父節點
當前提交
1866535d39
共有 36 個文件被更改,包括 1857 次插入94 次删除
  1. 7 1
      pom.xml
  2. 538 0
      src/main/java/com/diagbot/aop/LogAspect.java
  3. 4 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  4. 4 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  5. 2 0
      src/main/java/com/diagbot/dto/QcCasesDTO.java
  6. 45 0
      src/main/java/com/diagbot/dto/SysLoginLogDTO.java
  7. 68 0
      src/main/java/com/diagbot/dto/SysOperationLogDTO.java
  8. 8 81
      src/main/java/com/diagbot/entity/SysHospitalSet.java
  9. 91 0
      src/main/java/com/diagbot/entity/SysLoginLog.java
  10. 121 0
      src/main/java/com/diagbot/entity/SysOperationLog.java
  11. 30 0
      src/main/java/com/diagbot/facade/LogManagementFacade.java
  12. 20 0
      src/main/java/com/diagbot/facade/LoginLogFacade.java
  13. 80 0
      src/main/java/com/diagbot/facade/OperationLogFacade.java
  14. 4 0
      src/main/java/com/diagbot/facade/QcCasesEntryHospitalFacade.java
  15. 4 0
      src/main/java/com/diagbot/facade/QcCasesFacade.java
  16. 18 0
      src/main/java/com/diagbot/facade/SysHospitalSetFacade.java
  17. 2 0
      src/main/java/com/diagbot/mapper/QcCasesEntryHospitalMapper.java
  18. 3 0
      src/main/java/com/diagbot/mapper/QcCasesMapper.java
  19. 23 0
      src/main/java/com/diagbot/mapper/SysLoginLogMapper.java
  20. 23 0
      src/main/java/com/diagbot/mapper/SysOperationLogMapper.java
  21. 16 0
      src/main/java/com/diagbot/service/SysLoginLogService.java
  22. 16 0
      src/main/java/com/diagbot/service/SysOperationLogService.java
  23. 20 0
      src/main/java/com/diagbot/service/impl/SysLoginLogServiceImpl.java
  24. 20 0
      src/main/java/com/diagbot/service/impl/SysOperationLogServiceImpl.java
  25. 50 0
      src/main/java/com/diagbot/util/AddressUtils.java
  26. 179 0
      src/main/java/com/diagbot/util/HttpUtils.java
  27. 155 0
      src/main/java/com/diagbot/util/IpUtils.java
  28. 9 1
      src/main/java/com/diagbot/util/SysUserUtils.java
  29. 32 0
      src/main/java/com/diagbot/vo/SysLoginLogVO.java
  30. 50 0
      src/main/java/com/diagbot/vo/SysOperationLogVO.java
  31. 16 11
      src/main/java/com/diagbot/web/LogManagementController.java
  32. 27 0
      src/main/java/com/diagbot/web/QcTypeController.java
  33. 38 0
      src/main/resources/mapper/QcCasesEntryHospitalMapper.xml
  34. 19 0
      src/main/resources/mapper/QcCasesMapper.xml
  35. 45 0
      src/main/resources/mapper/SysLoginLogMapper.xml
  36. 70 0
      src/main/resources/mapper/SysOperationLogMapper.xml

+ 7 - 1
pom.xml

@@ -38,6 +38,7 @@
         <easypoi.version>4.2.0</easypoi.version>
         <patchca.version>1.1.2</patchca.version>
         <hutool.version>5.0.7</hutool.version>
+        <bitwalker.version>1.21</bitwalker.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>
         <docker.image.prefix>192.168.2.236:5000/diagbotcloud</docker.image.prefix>
         <registryUrl>http://192.168.2.236:5000/repository/diagbotcloud/</registryUrl>
@@ -231,7 +232,12 @@
             <version>6.2.0.jre8</version>
             <scope>runtime</scope>
         </dependency>
-
+        <!-- 解析客户端操作系统、浏览器等 -->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>${bitwalker.version}</version>
+        </dependency>
     </dependencies>
 
     <!-- 私有仓库 -->

+ 538 - 0
src/main/java/com/diagbot/aop/LogAspect.java

@@ -0,0 +1,538 @@
+package com.diagbot.aop;
+
+import com.alibaba.fastjson.JSONObject;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.diagbot.dto.QcCasesDTO;
+import com.diagbot.dto.QcCasesEntryHospitalDTO;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.dto.SysRoleDTO;
+import com.diagbot.entity.QcType;
+import com.diagbot.dto.SysUserRoleDTO;
+import com.diagbot.entity.SysHospitalSet;
+import com.diagbot.entity.SysRole;
+import com.diagbot.entity.SysUser;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.facade.LoginLogFacade;
+import com.diagbot.facade.OperationLogFacade;
+import com.diagbot.facade.SysHospitalSetFacade;
+import com.diagbot.util.AddressUtils;
+import com.diagbot.util.HttpUtils;
+import com.diagbot.util.IpUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.DeleteQcTypeVO;
+import com.diagbot.vo.QcCasesEntryUpdataVO;
+import com.diagbot.vo.QcCasesSaveListVO;
+import com.diagbot.vo.SysRoleMenuSaveVO;
+import com.diagbot.vo.SysUserBaseVO;
+import com.diagbot.vo.SysUserRoleVO;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import eu.bitwalker.useragentutils.UserAgent;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:日志记录处理
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+
+@Aspect
+@Component
+public class LogAspect {
+    @Autowired
+    LoginLogFacade loginLogFacade;
+    @Autowired
+    SysHospitalSetFacade sysHospitalSetFacade;
+    @Autowired
+    OperationLogFacade operationLogFacade;
+
+    // 操作配置织入点
+    @Pointcut("execution(public * com.diagbot.web.*.*(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.getJwt(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.getCaptcha(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.getJwtNoPass(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.getHospitalMark(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.midifyPassword(..))"
+    )
+    public void operPointCut() {
+    }
+
+    // 登录织入点
+    @Pointcut("execution(public * com.diagbot.web.SysUserController.getJwt(..))")
+    public void loginAfterReturning() {
+    }
+
+
+    /**
+     * 登录成功之后执行
+     *
+     * @param
+     */
+    @AfterReturning(pointcut = "loginAfterReturning()", returning = "jsonResult")
+    public void loginAfterReturning(JoinPoint joinPoint, Object jsonResult) {
+        loginLogHandle(joinPoint, jsonResult);
+    }
+
+    /**
+     * 操作之前执行
+     *
+     * @param
+     */
+    @Before(value = "operPointCut()")
+    public void operPointCut(JoinPoint joinPoint) {
+        operationLogHandler(joinPoint);
+    }
+
+    private void operationLogHandler(JoinPoint joinPoint) {
+        try {
+            //1.去sys_hospital_set表中拿所有需要进行操作日志记录的url
+            List<SysHospitalSet> hospitalSets = sysHospitalSetFacade
+                    .getHospitalSetByRemark(Long.parseLong(SysUserUtils.getCurrentHospitalID()), "operationLog");
+            if (ListUtil.isNotEmpty(hospitalSets)) {
+                havingOperation(hospitalSets, HttpUtils.getHttpServletRequest(), joinPoint);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void havingOperation(List<SysHospitalSet> hospitalSets, HttpServletRequest httpServletRequest, JoinPoint joinPoint) {
+        StringBuffer operationRecordBuffer = new StringBuffer();
+        //结果拼接容器
+        Map<String, Object> outMap = new HashMap<>();
+        //1.判断该请求是否需要操作日志记录
+        hospitalSets.stream().forEach(hospitalSet -> {
+            if (matchers(hospitalSet.getCode(), httpServletRequest)) {
+                operationUrlHandler(outMap, HttpUtils.getHttpServletRequest().getRequestURI(), joinPoint);
+                String operationRecord = makeOperationRecord(hospitalSet.getValue(), outMap);
+                if (!operationRecord.contains("#")) {
+                    operationRecordBuffer.append(operationRecord).append(";");
+                }
+
+                //                try {
+                //                    //由于两个对象大多结构不一样(例如:obj list),对比先不统一处理,放到case中每个方法单独处理
+                //                                        Object old = getOldOperation(HttpUtils.getHttpServletRequest().getRequestURI(), params);
+                //                                        Object[] args = joinPoint.getArgs();
+                //                                        if (args != null && args.length > 0){
+                //                                            for(int i = 0;i<args.length;i++){
+                //                                                //对比
+                //                                                comparePara(old, args[i]);
+                //                                            }
+                //
+                //                                        }
+                //                } catch (Exception e) {
+                //                    e.printStackTrace();
+                //                }
+            }
+
+        });
+        //保存操作记录
+        saveOperationLog(joinPoint, operationRecordBuffer.toString());
+    }
+
+    private void saveOperationLog(JoinPoint joinPoint, String operationRecord) {
+        try {
+            if (StringUtil.isNotBlank(operationRecord)) {
+                SysOperationLogDTO operationLog = new SysOperationLogDTO();
+                Date date = new Date();
+                operationLog.setOperationDate(date);
+                operationLog.setGmtCreate(date);
+                operationLog.setOperationId(SysUserUtils.getCurrentPrincipleID());
+                operationLog.setOperationName(SysUserUtils.getCurrentPrinciple());
+                String ip = HttpUtils.getIpAddress();
+                if (IpUtils.isIPv4LiteralAddress(ip)) {
+                    operationLog.setOperationIp(ip);
+                } else {
+                    operationLog.setRemark("[非ipv4地址]:" + ip);
+                }
+
+                // 设置方法名称
+                String className = joinPoint.getTarget().getClass().getName();
+                String methodName = joinPoint.getSignature().getName();
+                operationLog.setOperationMethod(className + "." + methodName + "()");
+                // 设置请求方式
+                operationLog.setOperationWay(HttpUtils.getHttpServletRequest().getMethod());
+                operationLog.setOperationUrl(HttpUtils.getHttpServletRequest().getRequestURI());
+                // 处理设置注解上的参数
+                try {
+                    String params = getControllerMethodDescription(joinPoint);
+                    if (StringUtils.isNotBlank(params)) {
+                        operationLog.setOperationParam(params);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                operationLog.setIsPlacefile(SysUserUtils.getIsPlacefile() == null ? "0" : SysUserUtils.getIsPlacefile());
+                operationLog.setOperationRecord(operationRecord.substring(0, operationRecord.length() - 1));
+                operationLogFacade.getBaseMapper().addOperationRecord(operationLog);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private String makeOperationRecord(String value, Map<String, Object> outMap) {
+        if (StringUtil.isBlank(value) || outMap.keySet().size() == 0) {
+            return value;
+        }
+        for (String key : outMap.keySet()) {
+            if (value.contains(key)) {
+                value = value.replaceAll(key, outMap.get(key) + "");
+            }
+        }
+        return value;
+    }
+
+    private void comparePara(Object old, Object params, Map<String, Object> outMap) {
+        try {
+            //对比新旧数据变化
+            compareTwoClass(old, params, outMap);
+            //拼接操作结果
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    public static void compareTwoClass(Object class1, Object class2, Map<String, Object> outMap) {
+        //获取对象的class
+        Class<?> clazz1 = class1.getClass();
+        Class<?> clazz2 = class2.getClass();
+        //获取对象的属性列表
+        Field[] field1 = clazz1.getDeclaredFields();
+        Field[] field2 = clazz2.getDeclaredFields();
+        List<String> fieldList1 = new ArrayList<>();
+        for (Field field : field1) {
+            fieldList1.add(field.getName());
+        }
+        for (Field field : field2) {
+            fieldList1.remove(field.getName());
+        }
+
+        //遍历属性列表field1
+        for (int i = 0; i < field1.length; i++) {
+            field1[i].setAccessible(true);
+            //遍历属性列表field2
+            for (int j = 0; j < field2.length; j++) {
+                //如果field1[i]属性名与field2[j]属性名内容相同
+                if (field1[i].getName().equals(field2[j].getName())) {
+                    field2[j].setAccessible(true);
+                    try {
+                        //如果field1[i]属性值与field2[j]属性值内容不相同
+                        if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
+                            outMap.put("#" + field1[i].getName() + "_old", field1[i].get(class1));
+                            outMap.put("#" + field1[i].getName() + "_new", field2[j].get(class2));
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    break;
+                }
+            }
+            //把old中有的属性new中没有的加入map
+            if (fieldList1.contains(field1[i].getName())) {
+                try {
+                    outMap.put("#" + field1[i].getName(), field1[i].get(class1));
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+    private static void transformValue(Map<String, Object> outMap) {
+        if (outMap.keySet().contains("#isReject_new")) {
+            if ("0".equals(outMap.get("#isReject_new").toString())) {
+                outMap.put("#isReject_new", "非单否");
+            }
+            if ("1".equals(outMap.get("#isReject_new").toString())) {
+                outMap.put("#isReject_new", "单否");
+            }
+        }
+        if (outMap.keySet().contains("#isUsed_new")) {
+            if ("0".equals(outMap.get("#isUsed_new").toString())) {
+                outMap.put("#isUsed_new", "未启用");
+            }
+            if ("1".equals(outMap.get("#isUsed_new").toString())) {
+                outMap.put("#isUsed_new", "启用");
+            }
+        }
+
+    }
+
+    //对比两个数据是否内容相同
+    public static boolean compareTwo(Object object1, Object object2) {
+
+        if (object1 == null && object2 == null) {
+            return true;
+        }
+        if (object1 == null && object2 != null) {
+            return false;
+        }
+        if (object1.equals(object2)) {
+            return true;
+        }
+        return false;
+    }
+
+    private Object getOldOperation(String requestURI, String params) {
+        switch (requestURI) {
+            case "/qc/cases/saveQcCases"://修改模块分值
+                if (StringUtil.isNotEmpty(params)) {
+                    //通过id获取模块名称以及目前分值
+                    JSONObject paramJSON = JSONObject.parseObject(params);
+                    QcCasesDTO old = operationLogFacade.getQcCasesById(paramJSON.getJSONArray("qcCasesSaveVOList")
+                            .getJSONObject(0).getString("id"));
+                    return old;
+                }
+                break;
+        }
+        return null;
+    }
+
+    private void operationUrlHandler(Map<String, Object> outMap, String requestURI, JoinPoint joinPoint) {
+        try {
+            Object[] args = joinPoint.getArgs();
+            switch (requestURI) {
+                case "/qc/cases/saveQcCases"://修改模块分值
+                    if (null != args && args.length >= 0) {
+                        //通过id获取模块名称以及目前分值
+                        if (args[0] instanceof QcCasesSaveListVO) {
+                            QcCasesSaveListVO qcCasesSaveListVO = (QcCasesSaveListVO) args[0];
+                            QcCasesDTO old = operationLogFacade.getQcCasesById(qcCasesSaveListVO.getQcCasesSaveVOList().get(0).getId() + "");
+                            compareTwoClass(old, qcCasesSaveListVO.getQcCasesSaveVOList().get(0), outMap);
+                        }
+                    }
+                    break;
+                case "/sys/user/disable"://禁用用户
+                    if (null != args && args.length >= 0) {
+                        //通过id获取用户具体信息
+                        if (args[0] instanceof SysUserBaseVO) {
+                            SysUserBaseVO sysUserBaseVO = (SysUserBaseVO) args[0];
+                            SysUser sysUser = operationLogFacade.getSysUser(sysUserBaseVO.getUserId());
+                            compareTwoClass(sysUser, sysUserBaseVO.getUserId(), outMap);
+                        }
+                    }
+                    break;
+                case "/sys/user/enable"://启用用户
+                    if (null != args && args.length >= 0) {
+                        //通过id获取用户具体信息
+                        if (args[0] instanceof SysUserBaseVO) {
+                            SysUserBaseVO sysUserBaseVO = (SysUserBaseVO) args[0];
+                            SysUser sysUser = operationLogFacade.getSysUser(sysUserBaseVO.getUserId());
+                            compareTwoClass(sysUser, sysUserBaseVO.getUserId(), outMap);
+                        }
+                    }
+                    break;
+                case "/sys/role/saveRoleMenu"://修改角色权限
+                    if (null != args && args.length >= 0) {
+                        //通过id获取角色信息
+                        if (args[0] instanceof SysRoleMenuSaveVO) {
+                            SysRoleMenuSaveVO sysRoleMenuSaveVO = (SysRoleMenuSaveVO) args[0];
+                            SysRole sysRole = operationLogFacade.getRoleMenu(sysRoleMenuSaveVO.getRoleId());
+                            compareTwoClass(sysRole, sysRoleMenuSaveVO, outMap);
+                        }
+                    }
+                    break;
+                case "/sys/user/editUserRoles"://修改用户角色
+                    if (null != args && args.length >= 0) {
+                        //通过id获取角色信息
+                        if (args[0] instanceof SysUserRoleVO) {
+                            SysUserRoleVO sysUserRoleVO = (SysUserRoleVO) args[0];
+                            SysUserRoleDTO sysUserRoleDTO = operationLogFacade.editUserRoles(sysUserRoleVO.getUserId());
+                            SysUser sysUser = operationLogFacade.getSysUser(sysUserRoleVO.getUserId());
+                            compareTwoClass(sysUser, sysUserRoleVO.getUserId(), outMap);
+                            if(ListUtil.isNotEmpty(sysUserRoleDTO.getSelRoles())){
+                                if(ListUtil.isNotEmpty(sysUserRoleVO.getRoleIds())){
+                                    List<Long> oldRoleIds = sysUserRoleDTO.getSelRoles().stream().map(SysRoleDTO::getId).collect(Collectors.toList());
+                                    List<Long> temp = new ArrayList<>(sysUserRoleVO.getRoleIds());
+                                    temp.removeAll(oldRoleIds);
+                                    if(ListUtil.isNotEmpty(temp)){//角色被改动
+                                        List<SysRole> roles = operationLogFacade.getSysUserRoles(sysUserRoleVO.getRoleIds());
+                                        outMap.put("#roles",roles.stream().map(SysRole::getName).collect(Collectors.joining(",")));
+                                    }
+                                }else {
+                                    outMap.put("#roles","空");
+                                }
+                            }else {
+                                if(ListUtil.isNotEmpty(sysUserRoleVO.getRoleIds())){//角色被改动
+                                    List<SysRole> roles = operationLogFacade.getSysUserRoles(sysUserRoleVO.getRoleIds());
+                                    outMap.put("#roles",roles.stream().map(SysRole::getName).collect(Collectors.joining(",")));
+                                }
+                            }
+                            compareTwoClass(sysUserRoleDTO, sysUserRoleVO, outMap);
+                        }
+                    }
+                    break;
+                case "/qc/casesEntryHospital/updataQcCasesEntry"://修改条目提示信息
+                    if (null != args && args.length >= 0) {
+                        //通过id获取模块名称以及目前分值
+                        if (args[0] instanceof QcCasesEntryUpdataVO) {
+                            QcCasesEntryUpdataVO qcCasesEntryUpdataVO = (QcCasesEntryUpdataVO) args[0];
+                            QcCasesEntryHospitalDTO qcCasesEntryHospitalDTO = operationLogFacade.getQcCasesEntryById(qcCasesEntryUpdataVO.getId());
+                            compareTwoClass(qcCasesEntryHospitalDTO, qcCasesEntryUpdataVO, outMap);
+                            //常规值替换
+                            transformValue(outMap);
+                        }
+                    }
+                    break;
+                case "/qc/qcType/add"://新增质控类型
+                    if (null != args && args.length >= 0) {
+                        compareTwoClass(args[0], new Object(), outMap);
+                    }
+                    break;
+                case "/qc/qcType/update"://修改质控类型
+                    if (null != args && args.length >= 0) {
+                        compareTwoClass(args[0], new Object(), outMap);
+                    }
+                    break;
+                case "/qc/qcType/copy"://复制质控类型
+                    if (null != args && args.length >= 0) {
+                        compareTwoClass(args[0], new Object(), outMap);
+                    }
+                    break;
+                case "/qc/qcType/delete":
+                    if (null != args && args.length >= 0) {
+                        if (args[0] instanceof DeleteQcTypeVO) {
+                            DeleteQcTypeVO deleteQcTypeVO = (DeleteQcTypeVO) args[0];
+                            if (ListUtil.isNotEmpty(deleteQcTypeVO.getIds())) {
+                                QcType qcType = operationLogFacade.getQCTypeById(deleteQcTypeVO.getIds().get(0));
+                                compareTwoClass(qcType, new Object(), outMap);
+                            }
+                        }
+                    }
+                    break;
+                default:
+                    break;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * @Description:获取请求的参数
+     * @Param: [joinPoint, logInformation]
+     * @return: void
+     * @Author: cy
+     * @Date: 2021/9/2
+     */
+    private String getControllerMethodDescription(JoinPoint joinPoint) {
+        Map<String, String[]> map = HttpUtils.getHttpServletRequest().getParameterMap();
+        if (MapUtils.isNotEmpty(map)) {
+            String params = JSONObject.toJSONString(map);
+            return params;
+        } else {
+            Object args = joinPoint.getArgs();
+            if (null != args) {
+                String params = argsArrayToString(joinPoint.getArgs());
+                return params;
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 参数拼装
+     *
+     * @Description:
+     * @Param: [paramsArray]
+     * @return: java.lang.String
+     * @Author: cy
+     * @Date: 2021/9/2
+     */
+    private String argsArrayToString(Object[] paramsArray) {
+        String params = "";
+        if (paramsArray != null && paramsArray.length > 0) {
+            for (int i = 0; i < paramsArray.length; i++) {
+                if (null != (paramsArray[i])) {
+                    Object jsonObj = JSONObject.toJSONString(paramsArray[i]);
+                    params += jsonObj.toString() + " ";
+                }
+            }
+        }
+        return params.trim();
+    }
+
+    public void loginLogHandle(JoinPoint joinPoint, Object jsonResult) {
+        // 返回参数
+        if (null != jsonResult) {
+            ObjectMapper objectWriter = new ObjectMapper();
+            try {
+                String strResult = objectWriter.writeValueAsString(jsonResult);
+                JSONObject JSONResult = JSONObject.parseObject(strResult);
+                SysLoginLogDTO loginLog = new SysLoginLogDTO();
+                Date date = new Date();
+                loginLog.setLoginDate(date);
+                loginLog.setGmtCreate(date);
+                String token = JSONResult.getJSONObject("data").get("accessToken").toString();
+                DecodedJWT jwt = decodedJWT(token);
+                Map<String, Claim> claims = jwt.getClaims();
+                Claim claimUID = claims.get("user_id");
+                Claim claimUName = claims.get("user_name");
+                loginLog.setLoginId(claimUID.asLong());
+                loginLog.setLoginName(claimUName.asString());
+                loginLog.setLoginIp(HttpUtils.getIpAddress() == null ? "" : HttpUtils.getIpAddress());
+                UserAgent userAgent = UserAgent.parseUserAgentString(HttpUtils.getHttpServletRequest().getHeader("User-Agent"));
+                loginLog.setLoginAddress(AddressUtils.getRealAddressByIP(loginLog.getLoginIp()));
+                // 获取客户端浏览器
+                String browser = userAgent.getBrowser().getName();
+                loginLog.setLoginBrowser(browser);
+
+                //插入登录日志
+                loginLogFacade.getBaseMapper().addLoginLog(loginLog);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static DecodedJWT decodedJWT(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt;
+        } catch (JWTDecodeException var2) {
+            var2.printStackTrace();
+            throw new CommonException(CommonErrorCode.ANALYZER_TOKEN_FAIL);
+        }
+    }
+
+
+    private boolean matchers(String url, HttpServletRequest request) {
+        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
+        if (matcher.matches(request)) {
+            return true;
+        }
+        return false;
+    }
+}
+
+

+ 4 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -298,6 +298,10 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/medDefectFeedback/**").permitAll()
                 .antMatchers("/medNewsNotice/**").permitAll()
                 .antMatchers("/h5/statistics/**").permitAll()
+                .antMatchers("/logManage/**").permitAll()
+                .antMatchers("/qc/qcType/add").permitAll()
+                .antMatchers("/qc/qcType/update").permitAll()
+                .antMatchers("/qc/qcType/copy").permitAll()
                 .antMatchers("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

+ 4 - 0
src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -375,6 +375,10 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/medDefectFeedback/*", request)
                 || matchers("/medNewsNotice/**", request)
                 || matchers("/h5/statistics/**", request)
+                || matchers("/logManage/**", request)
+                || matchers("/qc/qcType/add", request)
+                || matchers("/qc/qcType/update", request)
+                || matchers("/qc/qcType/copy", request)
                 || matchers("/", request)) {
             return true;
         }

+ 2 - 0
src/main/java/com/diagbot/dto/QcCasesDTO.java

@@ -2,6 +2,7 @@ package com.diagbot.dto;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -14,6 +15,7 @@ import java.util.Date;
  */
 @Getter
 @Setter
+@ToString
 public class QcCasesDTO {
     /**
      * 主键

+ 45 - 0
src/main/java/com/diagbot/dto/SysLoginLogDTO.java

@@ -0,0 +1,45 @@
+package com.diagbot.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口出参")
+public class SysLoginLogDTO implements Serializable {
+
+    private static final long serialVersionUID = 6123084820573676056L;
+
+
+    @ApiModelProperty(value = "登录用户ID")
+    private Long loginId;
+
+    @ApiModelProperty(value = "登录用户名")
+    private String loginName;
+
+    @ApiModelProperty(value = "登录日期")
+    private Date loginDate;
+
+    @ApiModelProperty(value = "登录ip")
+    private String loginIp;
+
+    @ApiModelProperty(value = "地区")
+    private String loginAddress;
+
+    @ApiModelProperty(value = "浏览器")
+    private String loginBrowser;
+
+    @ApiModelProperty(value = "创建日期")
+    private Date GmtCreate;
+}

+ 68 - 0
src/main/java/com/diagbot/dto/SysOperationLogDTO.java

@@ -0,0 +1,68 @@
+package com.diagbot.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口出参")
+public class SysOperationLogDTO implements Serializable {
+
+    private static final long serialVersionUID = -2781154978311006059L;
+
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "操作人用户ID")
+    private String operationId;
+
+    @ApiModelProperty(value = "操作人用户名")
+    private String operationName;
+
+    @ApiModelProperty(value = "操作日期")
+    private Date operationDate;
+
+    @ApiModelProperty(value = "操作记录")
+    private String operationRecord;
+
+    @ApiModelProperty(value = "ip地址")
+    private String operationIp;
+
+    @ApiModelProperty(value = "操作地址")
+    private String operationAddress;
+
+    @ApiModelProperty(value = "操作方法")
+    private String operationMethod;
+
+    @ApiModelProperty(value = "操作请求方式")
+    private String operationWay;
+
+    @ApiModelProperty(value = "操作url")
+    private String operationUrl;
+
+    @ApiModelProperty(value = "操作参数")
+    private String operationParam;
+
+    @ApiModelProperty(value = "返回参数")
+    private String jsonResult;
+
+    @ApiModelProperty(value = "记录创建时间")
+    private Date gmtCreate;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "是否归档(0:未归档,1:已归档)")
+    private String isPlacefile;
+}

+ 8 - 81
src/main/java/com/diagbot/entity/SysHospitalSet.java

@@ -2,8 +2,11 @@ package com.diagbot.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
@@ -13,6 +16,8 @@ import java.io.Serializable;
  * @author zhoutg
  * @since 2020-07-06
  */
+@Getter
+@Setter
 public class SysHospitalSet implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -31,12 +36,12 @@ public class SysHospitalSet implements Serializable {
     /**
      * 记录创建时间
      */
-    private LocalDateTime gmtCreate;
+    private Date gmtCreate;
 
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 创建人,0表示无创建人值
@@ -70,84 +75,6 @@ public class SysHospitalSet implements Serializable {
      */
     private String remark;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-    public String getIsDeleted() {
-        return isDeleted;
-    }
-
-    public void setIsDeleted(String isDeleted) {
-        this.isDeleted = isDeleted;
-    }
-    public LocalDateTime getGmtCreate() {
-        return gmtCreate;
-    }
-
-    public void setGmtCreate(LocalDateTime gmtCreate) {
-        this.gmtCreate = gmtCreate;
-    }
-    public LocalDateTime getGmtModified() {
-        return gmtModified;
-    }
-
-    public void setGmtModified(LocalDateTime gmtModified) {
-        this.gmtModified = gmtModified;
-    }
-    public String getCreator() {
-        return creator;
-    }
-
-    public void setCreator(String creator) {
-        this.creator = creator;
-    }
-    public String getModifier() {
-        return modifier;
-    }
-
-    public void setModifier(String modifier) {
-        this.modifier = modifier;
-    }
-    public Long getHospitalId() {
-        return hospitalId;
-    }
-
-    public void setHospitalId(Long hospitalId) {
-        this.hospitalId = hospitalId;
-    }
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
     @Override
     public String toString() {
         return "SysHospitalSet{" +

+ 91 - 0
src/main/java/com/diagbot/entity/SysLoginLog.java

@@ -0,0 +1,91 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统登录日志表
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Getter
+@Setter
+public class SysLoginLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 登录用户ID
+     */
+    private Long loginId;
+
+    /**
+     * 登录用户名
+     */
+    private String loginName;
+
+    /**
+     * 登录日期
+     */
+    private Date loginDate;
+
+    /**
+     * 登录ip
+     */
+    private Long loginIp;
+
+    /**
+     * 登录ip地址
+     */
+    private String loginAddress;
+
+    /**
+     * 浏览器
+     */
+    private String loginBrowser;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 121 - 0
src/main/java/com/diagbot/entity/SysOperationLog.java

@@ -0,0 +1,121 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统操作日志表
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Getter
+@Setter
+public class SysOperationLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 操作人用户ID
+     */
+    private Long operationId;
+
+    /**
+     * 操作人用户名
+     */
+    private String operationName;
+
+    /**
+     * 操作日期
+     */
+    private Date operationDate;
+
+    /**
+     * 操作记录
+     */
+    private String operationRecord;
+
+    /**
+     * ip地址
+     */
+    private Long operationIp;
+
+    /**
+     * 操作地址
+     */
+    private String operationAddress;
+
+    /**
+     * 操作方法
+     */
+    private String operationMethod;
+
+    /**
+     * 操作请求方式
+     */
+    private String operationWay;
+
+    /**
+     * 操作url
+     */
+    private String operationUrl;
+
+    /**
+     * 操作参数
+     */
+    private String operationParam;
+
+    /**
+     * 返回参数
+     */
+    private String jsonResult;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 30 - 0
src/main/java/com/diagbot/facade/LogManagementFacade.java

@@ -1,5 +1,11 @@
 package com.diagbot.facade;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.vo.SysLoginLogVO;
+import com.diagbot.vo.SysOperationLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -9,4 +15,28 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class LogManagementFacade {
+    @Autowired
+    private LoginLogFacade loginLogFacade;
+    @Autowired
+    private OperationLogFacade operationLogFacade;
+
+    /**
+     *查看登录日志
+     *
+     * @param sysLoginLogVO
+     * @Return com.baomidou.mybatisplus.core.metadata.IPage<com.diagbot.dto.SysLoginLogDTO>
+     */
+    public IPage<SysLoginLogDTO> getLoginLog(SysLoginLogVO sysLoginLogVO) {
+        return loginLogFacade.getLoginLog(sysLoginLogVO);
+    }
+
+    /**
+     *查看操作日志
+     *
+     * @param sysOperationLogVO
+     * @Return com.baomidou.mybatisplus.core.metadata.IPage<com.diagbot.dto.SysOperationLogDTO>
+     */
+    public IPage<SysOperationLogDTO> getOperationLog(SysOperationLogVO sysOperationLogVO) {
+        return operationLogFacade.getOperationLog(sysOperationLogVO);
+    }
 }

+ 20 - 0
src/main/java/com/diagbot/facade/LoginLogFacade.java

@@ -0,0 +1,20 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.service.impl.SysLoginLogServiceImpl;
+import com.diagbot.vo.SysLoginLogVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:登录日志处理类
+ * @author: songxl
+ * @time: 2022/5/9 14:33
+ */
+@Component
+public class LoginLogFacade extends SysLoginLogServiceImpl {
+
+    public IPage<SysLoginLogDTO> getLoginLog(SysLoginLogVO sysLoginLogVO) {
+        return this.getBaseMapper().getLoginLog(sysLoginLogVO);
+    }
+}

+ 80 - 0
src/main/java/com/diagbot/facade/OperationLogFacade.java

@@ -0,0 +1,80 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcCasesDTO;
+import com.diagbot.dto.QcCasesEntryHospitalDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.entity.QcType;
+import com.diagbot.dto.SysUserRoleDTO;
+import com.diagbot.entity.SysRole;
+import com.diagbot.entity.SysUser;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.impl.SysOperationLogServiceImpl;
+import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.SysOperationLogVO;
+import com.diagbot.vo.SysUserBaseVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * @Description:操作日志处理类
+ * @author: songxl
+ * @time: 2022/5/10 9:49
+ */
+@Component
+public class OperationLogFacade extends SysOperationLogServiceImpl {
+    @Autowired
+    QcCasesFacade qcCasesFacade;
+    @Autowired
+    QcCasesEntryHospitalFacade qcCasesEntryHospitalFacade;
+    @Autowired
+    QcTypeFacade qcTypeFacade;
+
+    @Autowired
+    SysUserFacade sysUserFacade;
+
+    @Autowired
+    SysRoleFacade sysRoleFacade;
+
+    public IPage<SysOperationLogDTO> getOperationLog(SysOperationLogVO sysOperationLogVO) {
+        return this.getBaseMapper().getOperationLog(sysOperationLogVO);
+    }
+
+    public QcCasesDTO getQcCasesById(String id) {
+        return qcCasesFacade.getQcCasesById(id, SysUserUtils.getCurrentHospitalID());
+    }
+
+    public SysUser getSysUser(Long id) {
+        return sysUserFacade.getBaseMapper().selectOne(new QueryWrapper<SysUser>()
+                .eq("id",id)
+                .eq("is_deleted", IsDeleteEnum.N.getKey()));
+    }
+
+    public SysRole getRoleMenu(Long roleId) {
+        return sysRoleFacade.getBaseMapper().selectOne(new QueryWrapper<SysRole>()
+                .eq("id",roleId)
+                .eq("is_deleted", IsDeleteEnum.N.getKey()));
+    }
+
+    public SysUserRoleDTO editUserRoles(Long userId) {
+        SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
+        sysUserBaseVO.setUserId(userId);
+        return sysUserFacade.getUserRoles(sysUserBaseVO);
+    }
+
+    public QcCasesEntryHospitalDTO getQcCasesEntryById(Long id) {
+        return qcCasesEntryHospitalFacade.getQcCasesEntryById(id);
+    }
+
+    public QcType getQCTypeById(Object id) {
+        return qcTypeFacade.getOne(new QueryWrapper<QcType>().eq("id",id));
+    }
+
+    public List<SysRole> getSysUserRoles(List<Long> roleIds) {
+        return sysRoleFacade.list(new QueryWrapper<SysRole>().in("id",roleIds).eq("is_deleted", IsDeleteEnum.N.getKey()));
+    }
+}

+ 4 - 0
src/main/java/com/diagbot/facade/QcCasesEntryHospitalFacade.java

@@ -95,4 +95,8 @@ public class QcCasesEntryHospitalFacade extends QcCasesEntryHospitalServiceImpl
         List<QcCasesEntryFindDTO> data = this.findQcCasesEntryAll(qcCasesEntryFindVO);
         return data;
     }
+
+    public QcCasesEntryHospitalDTO getQcCasesEntryById(Long id) {
+        return this.getBaseMapper().getQcCasesEntryById(id,SysUserUtils.getIsPlacefile(),SysUserUtils.getCurrentHospitalID());
+    }
 }

+ 4 - 0
src/main/java/com/diagbot/facade/QcCasesFacade.java

@@ -85,4 +85,8 @@ public class QcCasesFacade extends QcCasesServiceImpl {
         dataNew = BeanUtil.listCopyTo(data, QcCasesAllDTO.class);
         return dataNew;
     }
+
+    public QcCasesDTO getQcCasesById(String id, String currentHospitalID) {
+        return this.getBaseMapper().getQcCasesById(id,currentHospitalID);
+    }
 }

+ 18 - 0
src/main/java/com/diagbot/facade/SysHospitalSetFacade.java

@@ -5,8 +5,11 @@ import com.diagbot.entity.SysHospitalSet;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.service.impl.SysHospitalSetServiceImpl;
 import com.diagbot.util.StringUtil;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * @Description:
  * @author: gaodm
@@ -44,4 +47,19 @@ public class SysHospitalSetFacade extends SysHospitalSetServiceImpl {
         }
         return res;
     }
+
+    /**
+     *获取remark相同的一些列配置
+     *
+     * @param hospitalId
+     * @param remark
+     * @Return java.util.List<com.diagbot.entity.SysHospitalSet>
+     */
+    @Cacheable(value = "cache", key = "'operationLog:hospId_'+#hospitalId")
+    public List<SysHospitalSet> getHospitalSetByRemark(Long hospitalId, String remark) {
+        return this.list(new QueryWrapper<SysHospitalSet>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", hospitalId)
+                .eq("remark", remark));
+    }
 }

+ 2 - 0
src/main/java/com/diagbot/mapper/QcCasesEntryHospitalMapper.java

@@ -23,4 +23,6 @@ public interface QcCasesEntryHospitalMapper extends BaseMapper<QcCasesEntryHospi
     IPage<List<QcCasesEntryHospitalDTO>> getQcCasesEntryAlls(QcCasesEntryHospitalVO qcCasesEntryHospitalVO);
 
     List<QcCasesEntryFindDTO> findQcCasesEntryAll(QcCasesEntryFindVO qcCasesEntryFindVO);
+
+    QcCasesEntryHospitalDTO getQcCasesEntryById(Long id, String isPlacefile, String hospitalId);
 }

+ 3 - 0
src/main/java/com/diagbot/mapper/QcCasesMapper.java

@@ -5,6 +5,7 @@ import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcCasesDTO;
 import com.diagbot.entity.QcCases;
 import com.diagbot.vo.QcCasesQueryVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -25,4 +26,6 @@ public interface QcCasesMapper extends BaseMapper<QcCases> {
      * @return
      */
     List<NumDTO> entryGroupByCase();
+
+    QcCasesDTO getQcCasesById(@Param("id") String id, @Param("hospitalId")String hospitalId);
 }

+ 23 - 0
src/main/java/com/diagbot/mapper/SysLoginLogMapper.java

@@ -0,0 +1,23 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.entity.SysLoginLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.SysLoginLogVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 系统登录日志表 Mapper 接口
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysLoginLogMapper extends BaseMapper<SysLoginLog> {
+
+    IPage<SysLoginLogDTO> getLoginLog(@Param("sysLoginLogVO") SysLoginLogVO sysLoginLogVO);
+
+    void addLoginLog(SysLoginLogDTO loginLog);
+}

+ 23 - 0
src/main/java/com/diagbot/mapper/SysOperationLogMapper.java

@@ -0,0 +1,23 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.entity.SysOperationLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.SysOperationLogVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 系统操作日志表 Mapper 接口
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysOperationLogMapper extends BaseMapper<SysOperationLog> {
+
+    IPage<SysOperationLogDTO> getOperationLog(@Param("sysOperationLogVO") SysOperationLogVO sysOperationLogVO);
+
+    void addOperationRecord(SysOperationLogDTO operationLog);
+}

+ 16 - 0
src/main/java/com/diagbot/service/SysLoginLogService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.SysLoginLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统登录日志表 服务类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysLoginLogService extends IService<SysLoginLog> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/SysOperationLogService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.SysOperationLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统操作日志表 服务类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysOperationLogService extends IService<SysOperationLog> {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/SysLoginLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.SysLoginLog;
+import com.diagbot.mapper.SysLoginLogMapper;
+import com.diagbot.service.SysLoginLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统登录日志表 服务实现类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Service
+public class SysLoginLogServiceImpl extends ServiceImpl<SysLoginLogMapper, SysLoginLog> implements SysLoginLogService {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/SysOperationLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.SysOperationLog;
+import com.diagbot.mapper.SysOperationLogMapper;
+import com.diagbot.service.SysOperationLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统操作日志表 服务实现类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Service
+public class SysOperationLogServiceImpl extends ServiceImpl<SysOperationLogMapper, SysOperationLog> implements SysOperationLogService {
+
+}

+ 50 - 0
src/main/java/com/diagbot/util/AddressUtils.java

@@ -0,0 +1,50 @@
+package com.diagbot.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description:获取地址类
+ * @Author: cy
+ * @time: 2021/9/5 16:59
+ */
+
+public class AddressUtils {
+    private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
+
+    // IP地址查询
+    public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
+
+    // 未知地址
+    public static final String UNKNOWN = "未知地址";
+
+    public static String getRealAddressByIP(String ip) {
+        String address = UNKNOWN;
+        if(StringUtils.isBlank(ip)){
+            return UNKNOWN;
+        }
+        // 内网不查询
+        if (IpUtils.internalIp(ip)) {
+            return "内网IP";
+        }
+        try {
+            String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip + "&json=true");
+            if (StringUtil.isNotBlank(rspStr)) {
+                log.error("获取地理位置异常 {}", ip);
+                return UNKNOWN;
+            }
+            JSONObject obj = JSONObject.parseObject(rspStr);
+            String region = obj.getString("pro");
+            String city = obj.getString("city");
+            return String.format("%s %s", region, city);
+        } catch (Exception e) {
+            log.error("获取地理位置异常 {}", e);
+        }
+
+        return address;
+    }
+}
+
+

+ 179 - 0
src/main/java/com/diagbot/util/HttpUtils.java

@@ -0,0 +1,179 @@
+package com.diagbot.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Description: http请求功能工具类
+ * @author: gaodm
+ * @time: 2018/8/3 17:45
+ */
+@Slf4j
+public class HttpUtils {
+
+    /**
+     * 获取当前请求的HttpServletRequest实例
+     *
+     * @return
+     */
+    public static HttpServletRequest getHttpServletRequest() {
+        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+    }
+
+    /**
+     * 获取当前请求的请求头Map实例
+     *
+     * @return
+     */
+    public static Map<String, String> getHeaders() {
+        return getHeaders(getHttpServletRequest());
+    }
+
+    /**
+     * 获取当前请求的请求头Map实例中,键为key的值
+     *
+     * @param key
+     * @return
+     */
+    public static String getHeader(String key) {
+        return getHttpServletRequest().getHeader(key);
+    }
+
+    /**
+     * 获取当前请求的请求客户端的真实ip地址
+     *
+     * @return
+     */
+    public static String getIpAddress() {
+        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
+        return getIpAddress(getHttpServletRequest());
+    }
+
+    /**
+     * 根据HttpServletRequest获取请求头Map实例
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getHeaders(HttpServletRequest request) {
+        Map<String, String> map = new LinkedHashMap<>();
+        Enumeration<String> enumeration = request.getHeaderNames();
+        while (enumeration.hasMoreElements()) {
+            String key = enumeration.nextElement();
+            String value = request.getHeader(key);
+            map.put(key, value);
+        }
+        return map;
+    }
+
+    /**
+     * 根据HttpServletRequest获取请求客户端的真实ip地址
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddress(HttpServletRequest request) {
+        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_CLIENT_IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("X-Real-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+        } else if (ip.length() > 15) {
+            String[] ips = ip.split(",");
+            for (int index = 0; index < ips.length; index++) {
+                String strIp = (String) ips[index];
+                if (!("unknown".equalsIgnoreCase(strIp))) {
+                    ip = strIp;
+                    break;
+                }
+            }
+        }
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url   发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try {
+            String urlNameString = url;
+            log.debug("sendPost - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            log.debug("recv - {}", result);
+        } catch (ConnectException e) {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        } catch (SocketTimeoutException e) {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        } catch (IOException e) {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        } catch (Exception e) {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+}

+ 155 - 0
src/main/java/com/diagbot/util/IpUtils.java

@@ -0,0 +1,155 @@
+package com.diagbot.util;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @Description:获取IP方法
+ * @Author: cy
+ * @time: 2021/9/5 17:00
+ */
+
+public class IpUtils {
+
+    private static final int INADDR4SZ = 4;
+    private static final int INADDR16SZ = 16;
+    private static final int INT16SZ = 2;
+
+    public static String getIpAddr(HttpServletRequest request) {
+        if (request == null) {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Forwarded-For");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Real-IP");
+        }
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+
+    public static boolean internalIp(String ip) {
+        byte[] addr = textToNumericFormatV4(ip);
+        return internalIp(addr) || "127.0.0.1".equals(ip);
+    }
+
+    private static boolean internalIp(byte[] addr) {
+        if (null == addr || addr.length < 2) {
+            return true;
+        }
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0) {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4) {
+                    return true;
+                }
+            case SECTION_5:
+                switch (b1) {
+                    case SECTION_6:
+                        return true;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 将IPv4地址转换成字节
+     *
+     * @param src IPv4地址
+     * @return byte 字节
+     */
+    public static byte[] textToNumericFormatV4(String src)
+    {
+        byte[] res = new byte[INADDR4SZ];
+
+        long tmpValue = 0;
+        int currByte = 0;
+        boolean newOctet = true;
+
+        int len = src.length();
+        if (len == 0 || len > 15) {
+            return null;
+        }
+
+        for (int i = 0; i < len; i++) {
+            char c = src.charAt(i);
+            if (c == '.') {
+                if (newOctet || tmpValue < 0 || tmpValue > 0xff || currByte == 3) {
+                    return null;
+                }
+                res[currByte++] = (byte) (tmpValue & 0xff);
+                tmpValue = 0;
+                newOctet = true;
+            } else {
+                int digit = Character.digit(c, 10);
+                if (digit < 0) {
+                    return null;
+                }
+                tmpValue *= 10;
+                tmpValue += digit;
+                newOctet = false;
+            }
+        }
+        if (newOctet || tmpValue < 0 || tmpValue >= (1L << ((4 - currByte) * 8))) {
+            return null;
+        }
+        switch (currByte) {
+            case 0:
+                res[0] = (byte) ((tmpValue >> 24) & 0xff);
+            case 1:
+                res[1] = (byte) ((tmpValue >> 16) & 0xff);
+            case 2:
+                res[2] = (byte) ((tmpValue >>  8) & 0xff);
+            case 3:
+                res[3] = (byte) ((tmpValue >>  0) & 0xff);
+        }
+        return res;
+    }
+
+    public static String getHostIp() {
+        try {
+            return InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+        }
+        return "127.0.0.1";
+    }
+
+    public static String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+        }
+        return "未知";
+    }
+
+    public static boolean isIPv4LiteralAddress(String src) {
+        return textToNumericFormatV4(src) != null;
+    }
+
+}

+ 9 - 1
src/main/java/com/diagbot/util/SysUserUtils.java

@@ -114,5 +114,13 @@ public class SysUserUtils {
         }
         return hasRole;
     }
-
+    /**
+     * 获取当前请求的用户的当前系统id字符串
+     *
+     * @return
+     */
+    public static String getIsPlacefile() {
+        String currentSoftwareIdStr = HttpUtils.getHeader("isPlacefile");
+        return StringUtil.isNotBlank(currentSoftwareIdStr) && currentSoftwareIdStr.matches("[0-9]+") ? currentSoftwareIdStr : null;
+    }
 }

+ 32 - 0
src/main/java/com/diagbot/vo/SysLoginLogVO.java

@@ -0,0 +1,32 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口入参")
+public class SysLoginLogVO extends Page implements Serializable {
+
+    private static final long serialVersionUID = -7393452900176171499L;
+
+    @ApiModelProperty(value = "登录用户名")
+    private String loginName;
+
+
+    @ApiModelProperty(value = "ip地址")
+    private String loginIp;
+
+}

+ 50 - 0
src/main/java/com/diagbot/vo/SysOperationLogVO.java

@@ -0,0 +1,50 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("操作日志列表页-接口入参")
+public class SysOperationLogVO extends Page implements Serializable {
+
+    private static final long serialVersionUID = -6958100906151636839L;
+
+    /**
+     * 操作用户
+     */
+    @ApiModelProperty(value = "操作用户")
+    String operationName;
+    /**
+     * 操作开始时间
+     */
+    @ApiModelProperty(value = "操作开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    String startDate;
+
+    /**
+     * 操作结束时间
+     */
+    @ApiModelProperty(value = "操作结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    String endDate;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    @ApiModelProperty(value = "是否归档(0:未归档,1:已归档)")
+    private String isPlacefile = "0";
+
+}

+ 16 - 11
src/main/java/com/diagbot/web/LogManagementController.java

@@ -1,7 +1,12 @@
 package com.diagbot.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
 import com.diagbot.facade.LogManagementFacade;
+import com.diagbot.vo.SysLoginLogVO;
+import com.diagbot.vo.SysOperationLogVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,17 +29,17 @@ public class LogManagementController {
     private LogManagementFacade logManagementFacade;
 
 
-//    @ApiOperation(value = "查看登录日志[by:songxl]")
-//    @PostMapping("/loginLogPage")
-//    public RespDTO<IPage<LoginLogDTO>> loginLogPage(@RequestBody GetLoginLogVO getLoginLogVO) {
-//        return RespDTO.onSuc(logManagementFacade.getLoginLog(getLoginLogVO));
-//    }
-//
-//    @ApiOperation(value = "查看操作日志[by:songxl]")
-//    @PostMapping("/operationLogPage")
-//    public RespDTO<IPage<OperationLogDTO>> operationLogPage(@RequestBody GetOperationLogVO getOperationLogVO) {
-//        return RespDTO.onSuc(logManagementFacade.getOperationLog(getOperationLogVO));
-//    }
+    @ApiOperation(value = "查看登录日志[by:songxl]")
+    @PostMapping("/loginLogPage")
+    public RespDTO<IPage<SysLoginLogDTO>> loginLogPage(@RequestBody SysLoginLogVO sysLoginLogVO) {
+        return RespDTO.onSuc(logManagementFacade.getLoginLog(sysLoginLogVO));
+    }
+
+    @ApiOperation(value = "查看操作日志[by:songxl]")
+    @PostMapping("/operationLogPage")
+    public RespDTO<IPage<SysOperationLogDTO>> operationLogPage(@RequestBody SysOperationLogVO sysOperationLogVO) {
+        return RespDTO.onSuc(logManagementFacade.getOperationLog(sysOperationLogVO));
+    }
 
 
 }

+ 27 - 0
src/main/java/com/diagbot/web/QcTypeController.java

@@ -54,6 +54,33 @@ public class QcTypeController {
         qcTypeFacade.saveOrUpdate(qcTypeSaveVO);
         return RespDTO.onSuc(true);
     }
+    @ApiOperation(value = "质控类型-新增[by:gaodm]",
+            notes = "")
+    @PostMapping("/add")
+    @SysLogger("add")
+    @Transactional
+    public RespDTO<Boolean> add(@RequestBody QcTypeSaveVO qcTypeSaveVO) {
+        qcTypeFacade.saveOrUpdate(qcTypeSaveVO);
+        return RespDTO.onSuc(true);
+    }
+    @ApiOperation(value = "质控类型-更新[by:gaodm]",
+            notes = "")
+    @PostMapping("/update")
+    @SysLogger("update")
+    @Transactional
+    public RespDTO<Boolean> update(@RequestBody QcTypeSaveVO qcTypeSaveVO) {
+        qcTypeFacade.saveOrUpdate(qcTypeSaveVO);
+        return RespDTO.onSuc(true);
+    }
+    @ApiOperation(value = "质控类型-复制[by:gaodm]",
+            notes = "")
+    @PostMapping("/copy")
+    @SysLogger("copy")
+    @Transactional
+    public RespDTO<Boolean> copy(@RequestBody QcTypeSaveVO qcTypeSaveVO) {
+        qcTypeFacade.saveOrUpdate(qcTypeSaveVO);
+        return RespDTO.onSuc(true);
+    }
 
     @ApiOperation(value = "分页列表[by:gaodm]",
             notes = "    // 名称\n" +

+ 38 - 0
src/main/resources/mapper/QcCasesEntryHospitalMapper.xml

@@ -137,4 +137,42 @@
         </if>
         )
     </select>
+    <select id="getQcCasesEntryById" resultType="com.diagbot.dto.QcCasesEntryHospitalDTO">
+        select
+        b.id as id,
+        a.cases_id as casesId,
+        a.cases_name As casesName,
+        a.name as name,
+        b.msg As msg,
+        <choose>
+            <when test='isPlacefile == "0"'>
+                b.score_run AS score,
+            </when>
+            <otherwise>
+                b.score AS score,
+            </otherwise>
+        </choose>
+        <choose>
+            <when test='isPlacefile == "0"'>
+                b.is_used_run AS isUsed,
+            </when>
+            <otherwise>
+                b.is_used AS isUsed,
+            </otherwise>
+        </choose>
+        b.is_reject As isReject,
+        a.rule_type
+        from
+        qc_cases_entry a
+        join qc_cases_entry_hospital b
+        on a.id = b.cases_entry_id
+        where a.is_deleted = "N"
+        AND b.is_deleted = "N"
+        <if test="hospitalId != null and hospitalId != ''">
+            AND b.hospital_id = #{hospitalId}
+        </if>
+        <if test="id != null">
+            AND b.id = #{id}
+        </if>
+    </select>
 </mapper>

+ 19 - 0
src/main/resources/mapper/QcCasesMapper.xml

@@ -50,4 +50,23 @@
         a.id,
         a.`name`
     </select>
+    <select id="getQcCasesById" resultType="com.diagbot.dto.QcCasesDTO">
+        SELECT
+        qch.*,
+        qc.`name` AS NAME,
+        qc.prefix AS prefix
+        FROM
+        `qc_cases_hospital` qch,
+        qc_cases qc
+        WHERE
+        qch.cases_id = qc.id
+        AND qch.is_deleted = 'N'
+        AND qc.is_deleted = 'N'
+        <if test="id != null and id != ''">
+            and qch.id = #{id}
+        </if>
+        <if test="hospitalId != null and hospitalId != ''">
+            and qch.hospital_id = #{hospitalId}
+        </if>
+    </select>
 </mapper>

+ 45 - 0
src/main/resources/mapper/SysLoginLogMapper.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SysLoginLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SysLoginLog">
+        <id column="id" property="id" />
+        <result column="login_id" property="loginId" />
+        <result column="login_name" property="loginName" />
+        <result column="login_date" property="loginDate" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_address" property="loginAddress" />
+        <result column="login_browser" property="loginBrowser" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="remark" property="remark" />
+    </resultMap>
+    <insert id="addLoginLog">
+        insert into sys_login_log(login_id,login_name,login_date,login_ip,login_address,login_browser,gmt_create)
+        values (#{loginId},#{loginName},#{loginDate},INET_ATON(#{loginIp}),#{loginAddress},#{loginBrowser},#{gmtCreate})
+    </insert>
+    <select id="getLoginLog" resultType="com.diagbot.dto.SysLoginLogDTO">
+        select
+        a.login_id as loginId,
+        a.login_name as loginName,
+        a.login_date as loginDate,
+        INET_NTOA(a.login_ip) as loginIp,
+        a.login_address as loginAddress,
+        a.login_browser as loginBrowser
+        from sys_login_log a
+        where
+        1 = 1
+        <if test="sysLoginLogVO.loginName != null and sysLoginLogVO.loginName != ''">
+            AND a.login_name like CONCAT('%',#{sysLoginLogVO.loginName},'%')
+        </if>
+        <if test="sysLoginLogVO.loginIp != null and sysLoginLogVO.loginIp != ''">
+            AND INET_NTOA(a.login_ip) like CONCAT('%',#{sysLoginLogVO.loginIp},'%')
+        </if>
+        order by a.login_date desc
+    </select>
+
+</mapper>

+ 70 - 0
src/main/resources/mapper/SysOperationLogMapper.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SysOperationLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SysOperationLog">
+        <id column="id" property="id" />
+        <result column="operation_id" property="operationId" />
+        <result column="operation_name" property="operationName" />
+        <result column="operation_date" property="operationDate" />
+        <result column="operation_record" property="operationRecord" />
+        <result column="operation_ip" property="operationIp" />
+        <result column="operation_address" property="operationAddress" />
+        <result column="operation_method" property="operationMethod" />
+        <result column="operation_way" property="operationWay" />
+        <result column="operation_url" property="operationUrl" />
+        <result column="operation_param" property="operationParam" />
+        <result column="json_result" property="jsonResult" />
+        <result column="is_placefile" property="isPlacefile" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="remark" property="remark" />
+    </resultMap>
+    <insert id="addOperationRecord">
+        insert into
+        sys_operation_log(operation_id,operation_name,operation_date,operation_ip,operation_address,operation_method,operation_way,operation_url,operation_param,json_result,gmt_create,remark,operation_record,is_placefile)
+        values (#{operationId},#{operationName},#{operationDate},
+        <choose>
+            <when test="operationIp != null || operationIp = !''">
+                INET_ATON(#{operationIp}),
+            </when>
+            <otherwise>#{operationIp}),</otherwise>
+        </choose>
+        #{operationAddress},#{operationMethod},#{operationWay},#{operationUrl},#{operationParam},#{jsonResult},#{gmtCreate},#{remark},#{operationRecord},#{isPlacefile})
+    </insert>
+    <select id="getOperationLog" resultType="com.diagbot.dto.SysOperationLogDTO">
+        SELECT
+        a.id,
+        a.operation_id AS operationId,
+        a.operation_name AS operationName,
+        a.operation_date AS operationDate,
+        a.operation_method AS operationMethod,
+        a.operation_way AS operationWay,
+        a.operation_url AS operationUrl,
+        a.operation_param AS operationParam,
+        INET_NTOA(a.operation_ip) AS operationIp,
+        a.operation_address AS operationAddress,
+        a.is_placefile AS isPlacefile,
+        a.json_result AS jsonResult
+        FROM
+        sys_operation_log a
+        where
+        1 = 1
+        <if test="sysOperationLogVO.operationName != null and sysOperationLogVO.operationName != ''">
+            AND a.operation_name like CONCAT('%',#{sysOperationLogVO.operationName},'%')
+        </if>
+        <if test="sysOperationLogVO.isPlacefile != null and sysOperationLogVO.isPlacefile != ''">
+            AND a.is_placefile = #{sysOperationLogVO.isPlacefile}
+        </if>
+        <if test="sysOperationLogVO.startDate != null and sysOperationLogVO.endDate != null">
+            <![CDATA[ AND a.operation_date >= #{sysOperationLogVO.startDate}]]>
+            <![CDATA[ AND a.operation_date <= #{sysOperationLogVO.endDate}]]>
+        </if>
+        order by a.operation_date desc
+    </select>
+
+</mapper>