Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev' into dev

大数据与最优化研究所 před 1 rokem
rodič
revize
65091da0e8
24 změnil soubory, kde provedl 373 přidání a 29 odebrání
  1. 10 0
      src/main/java/com/xjrsoft/common/page/ConventPage.java
  2. 0 1
      src/main/java/com/xjrsoft/common/utils/QrCodeUtil.java
  3. 4 0
      src/main/java/com/xjrsoft/common/utils/RedisUtil.java
  4. 40 0
      src/main/java/com/xjrsoft/module/concat/controller/ConcatController.java
  5. 23 0
      src/main/java/com/xjrsoft/module/concat/dto/ConcatTreeDto.java
  6. 21 0
      src/main/java/com/xjrsoft/module/concat/service/IXjrUserService.java
  7. 54 0
      src/main/java/com/xjrsoft/module/concat/service/impl/XjrUserServiceImpl.java
  8. 32 0
      src/main/java/com/xjrsoft/module/concat/vo/ConcatTreeVo.java
  9. 3 2
      src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java
  10. 42 2
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  11. 19 0
      src/main/java/com/xjrsoft/module/student/dto/QRLoginDto.java
  12. 1 2
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXssfdetailServiceImpl.java
  13. 50 3
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java
  14. 36 11
      src/main/java/com/xjrsoft/module/system/controller/LoginController.java
  15. 2 2
      src/main/java/com/xjrsoft/module/system/dto/LoginQRCodeDto.java
  16. 6 3
      src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java
  17. 1 1
      src/main/java/com/xjrsoft/module/system/vo/LoginCheckQRCodeVo.java
  18. 10 0
      src/main/java/com/xjrsoft/module/teacher/mapper/XjrUserMapper.java
  19. 1 0
      src/main/resources/application-dev.yml
  20. 1 0
      src/main/resources/application-pre.yml
  21. 2 0
      src/main/resources/application-prod.yml
  22. 1 1
      src/main/resources/mapper/student/BaseStudentGraduateMapper.xml
  23. 13 0
      src/main/resources/mapper/teacher/XjrUserMapper.xml
  24. 1 1
      src/main/resources/sqlScript/20240311_sql.sql

+ 10 - 0
src/main/java/com/xjrsoft/common/page/ConventPage.java

@@ -37,6 +37,16 @@ public class ConventPage {
         return page;
     }
 
+    /**
+     * 自定义排序方法
+     * @param input
+     * @return
+     * @param <T>
+     */
+    public static <T> IPage<T> getPageCustomOrder(@NotNull PageInput input) {
+        return new Page<>(input.getLimit(), input.getSize());
+    }
+
 
     /**
      * 根据查询出来得分页 转换为 pageoutput

+ 0 - 1
src/main/java/com/xjrsoft/common/utils/QrCodeUtil.java

@@ -10,7 +10,6 @@ import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 import java.util.HashMap;
 

+ 4 - 0
src/main/java/com/xjrsoft/common/utils/RedisUtil.java

@@ -52,6 +52,10 @@ public class RedisUtil {
         set(key, value, NOT_EXPIRE);
     }
 
+    public void setStrValue(String key, String value) {
+        valueOperations.set(key, value);
+    }
+
 
     public <T> T get(String key, Class<T> clazz, long expire) {
         String value = valueOperations.get(key);

+ 40 - 0
src/main/java/com/xjrsoft/module/concat/controller/ConcatController.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.module.concat.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.TreeUtil;
+import com.xjrsoft.module.concat.dto.ConcatTreeDto;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.concat.vo.ConcatTreeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+* @title: 通讯录
+* @Author dzx
+* @Date: 2024年3月25日
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/concat" + "/concat")
+@Api(value = "/concat"  + "/concat",tags = "通讯录")
+@AllArgsConstructor
+public class ConcatController {
+    private final IXjrUserService xjrUserService;
+
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value="教师通讯录")
+    @SaCheckPermission("room:detail")
+    public RT<List<ConcatTreeVo>> list(ConcatTreeDto dto) throws Exception {
+        List<ConcatTreeVo> concatList = xjrUserService.getConcatList(dto);
+        List<ConcatTreeVo> treeVoList = TreeUtil.build(concatList);
+        return RT.ok(treeVoList);
+    }
+}

+ 23 - 0
src/main/java/com/xjrsoft/module/concat/dto/ConcatTreeDto.java

@@ -0,0 +1,23 @@
+package com.xjrsoft.module.concat.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 通讯信息
+* @Author dzx
+* @Date: 2024年3月25日
+* @Version 1.0
+*/
+@Data
+public class ConcatTreeDto extends PageInput {
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("电话")
+    private String mobile;
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/concat/service/IXjrUserService.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.concat.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.concat.dto.ConcatTreeDto;
+import com.xjrsoft.module.concat.vo.ConcatTreeVo;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+
+import java.util.List;
+
+/**
+* @title: 班级荣誉
+* @Author szs
+* @Date: 2023-12-06
+* @Version 1.0
+*/
+
+public interface IXjrUserService extends MPJBaseService<XjrUser> {
+
+
+    List<ConcatTreeVo> getConcatList(ConcatTreeDto dto);
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/concat/service/impl/XjrUserServiceImpl.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.concat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.module.concat.dto.ConcatTreeDto;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.concat.vo.ConcatTreeVo;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.mapper.DepartmentMapper;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @Author dzx
+* @Date: 2024-02-03
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class XjrUserServiceImpl extends MPJBaseServiceImpl<XjrUserMapper, XjrUser> implements IXjrUserService {
+    private final XjrUserMapper xjrUserMapper;
+    private final DepartmentMapper departmentMapper;
+
+    @Override
+    public List<ConcatTreeVo> getConcatList(ConcatTreeDto dto) {
+        List<ConcatTreeVo> voList = new ArrayList<>();
+
+        List<ConcatTreeVo> teacherDeptInfo = xjrUserMapper.getTeacherDeptInfo(dto);
+        departmentMapper.selectList(
+            new QueryWrapper<Department>().lambda()
+            .eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ).forEach((node) -> {
+            voList.add(new ConcatTreeVo(){{
+                setId(node.getId());
+                setName(node.getName());
+            }});
+        });
+        for (ConcatTreeVo concatTreeVo : teacherDeptInfo) {
+            voList.add(new ConcatTreeVo(){{
+                setId(concatTreeVo.getId());
+                setName(concatTreeVo.getName());
+                setParentId(concatTreeVo.getParentId());
+                setMobile(concatTreeVo.getMobile());
+            }});
+        }
+        return voList;
+    }
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/concat/vo/ConcatTreeVo.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.concat.vo;
+
+import com.xjrsoft.common.model.tree.ITreeNode;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author dzx
+ * @date 2024/1/29
+ */
+@Data
+public class ConcatTreeVo implements ITreeNode<ConcatTreeVo, Long>, Serializable {
+
+    @ApiModelProperty("名字")
+    private String name;
+
+    @ApiModelProperty("电话")
+    private String mobile;
+
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("disabled")
+    private Long parentId;
+
+    @ApiModelProperty("children")
+    private List<ConcatTreeVo> children;
+
+}

+ 3 - 2
src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java

@@ -11,6 +11,7 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.sql.Timestamp;
+import java.time.LocalDate;
 
 /**
  * @title: AddUserDto
@@ -57,7 +58,7 @@ public class AddUserDto implements Serializable {
     @Pattern(regexp = "1[3-9][0-9]\\d{8}",message = "手机号格式不正确!")
     private String mobile;
 
-    @NotNull(message = "角色不能为空!")
+    //@NotNull(message = "角色不能为空!")
     @ApiModelProperty(value = "角色Id",required = true)
     private Long roleId;
 
@@ -97,6 +98,6 @@ public class AddUserDto implements Serializable {
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("生日")
-    private Timestamp birthDate;
+    private LocalDate birthDate;
 
 }

+ 42 - 2
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -5,8 +5,10 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
@@ -15,6 +17,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseGradeService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
@@ -42,7 +45,9 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 @RestController
 @RequestMapping("/student" + "/studentmanager")
@@ -97,15 +102,50 @@ public class StudentManagerController {
     @ApiOperation(value = "学生年纪班级树")
     @SaCheckPermission("studentmanager:detail")
     public RT<List<BaseStudentTreeVo>> tree() {
+        List<String> roleList = StpUtil.getRoleList();
+
+        long teacherId = StpUtil.getLoginIdAsLong();
+        List<BaseClass> classList = baseClassService.list(
+            new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
         List<BaseStudentTreeVo> voList = new ArrayList<>();
-        baseGradeService.list().forEach((node) -> {
+
+        List<BaseGrade> gradeList = baseGradeService.list(
+            new QueryWrapper<BaseGrade>().lambda().eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
+            Set<Long> gradeSet = new HashSet<>();
+            for (BaseClass baseClass : classList) {
+                if(baseClass.getTeacherId().equals(teacherId)){
+                    gradeSet.add(baseClass.getGradeId());
+                    voList.add(new BaseStudentTreeVo(){{
+                        setId(baseClass.getId());
+                        setName(baseClass.getName());
+                        setParentId(baseClass.getGradeId());
+                    }});
+                }
+            }
+            gradeList.forEach((node) -> {
+                if(gradeSet.contains(node.getId())){
+                    voList.add(new BaseStudentTreeVo(){{
+                        setId(node.getId());
+                        setName(node.getName());
+                    }});
+                }
+            });
+
+            List<BaseStudentTreeVo> treeVoList = TreeUtil.build(voList);
+
+            return RT.ok(treeVoList);
+        }
+        gradeList.forEach((node) -> {
             voList.add(new BaseStudentTreeVo(){{
                 setId(node.getId());
                 setName(node.getName());
             }});
         });
 
-        baseClassService.list().forEach((node)->{
+        classList.forEach((node)->{
             voList.add(new BaseStudentTreeVo(){{
                 setId(node.getId());
                 setName(node.getName());

+ 19 - 0
src/main/java/com/xjrsoft/module/student/dto/QRLoginDto.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 学生职务设置分页查询入参
+* @Author dzx
+* @Date: 2023-11-13
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class QRLoginDto {
+    @ApiModelProperty("loginCode")
+    private String loginCode;
+}

+ 1 - 2
src/main/java/com/xjrsoft/module/student/service/impl/PbVXssfdetailServiceImpl.java

@@ -87,8 +87,7 @@ public class PbVXssfdetailServiceImpl extends MPJBaseServiceImpl<PbVXssfdetailMa
 
         BigDecimal cashSurplus = new BigDecimal("0");
         for (PbVXsxxsfytb pbVXsxxsfytb : pbVXsxxsfytbList){
-            cashSurplus = cashSurplus.add(pbVXsxxsfytb.getFactrecarmny());
-            cashSurplus = cashSurplus.subtract(pbVXsxxsfytb.getFactar());
+            cashSurplus = cashSurplus.add(pbVXsxxsfytb.getQfje());
         }
 
         personalPortraitPersonalInfoVo.setCashSurplus(cashSurplus);

+ 50 - 3
src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -64,7 +65,7 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
 
         // 统计总消费金额
         BigDecimal totalConsumption = pbVXsxxsfytbPersonalList.stream()
-                .map(p -> p.getFactrecarmny().add(p.getArrearagemny()))
+                .map(p -> p.getFactrecarmny().add((p.getArrearagemny()==null?BigDecimal.ZERO:p.getArrearagemny())))
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
 
         // 按学期分组并处理数据
@@ -134,8 +135,54 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
                 .selectAs(BaseSemester::getName, PbVXsxxsfytbPageVo::getBaseSemesterCn)
                 .select(PbVXsxxsfytb.class, x -> VoToColumnUtil.fieldsToColumns(PbVXsxxsfytbPageVo.class).contains(x.getProperty()))
                 ;
-
-        return this.selectJoinListPage(ConventPage.getPage(dto), PbVXsxxsfytbPageVo.class, pbVXsxxsfytbMPJLambdaWrapper);
+        if(StrUtil.isNotEmpty(dto.getField()) && StrUtil.isNotEmpty(dto.getOrder())){
+            if("ascend".equals(dto.getOrder())){
+                if("baseSemesterCn".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(BaseSemester::getName);
+                }else if("feeobjname".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getFeeobjname);
+                }else if("personalid".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getPersonalid);
+                }else if("sex".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getSex);
+                }else if("feeitemname".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getFeeitemname);
+                }else if("factar".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getFactar);
+                }else if("ktje".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getQfje);
+                }else if("refundmny".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getRefundmny);
+                }else if("qfje".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getQfje);
+                }else if("factrecarmny".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getQfje);
+                }
+            }else if("descend".equals(dto.getOrder())){
+                if("baseSemesterCn".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(BaseSemester::getName);
+                }else if("feeobjname".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getFeeobjname);
+                }else if("personalid".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getPersonalid);
+                }else if("sex".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getSex);
+                }else if("feeitemname".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getFeeitemname);
+                }else if("factar".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getFactar);
+                }else if("ktje".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getQfje);
+                }else if("refundmny".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getRefundmny);
+                }else if("qfje".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByAsc(PbVXsxxsfytb::getQfje);
+                }else if("factrecarmny".equals(dto.getField())){
+                    pbVXsxxsfytbMPJLambdaWrapper.orderByDesc(PbVXsxxsfytb::getQfje);
+                }
+            }
+        }
+        return this.selectJoinListPage(ConventPage.getPageCustomOrder(dto), PbVXsxxsfytbPageVo.class, pbVXsxxsfytbMPJLambdaWrapper);
     }
 
     @Override

+ 36 - 11
src/main/java/com/xjrsoft/module/system/controller/LoginController.java

@@ -21,6 +21,7 @@ import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.config.KeyCloakConfig;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.student.dto.QRLoginDto;
 import com.xjrsoft.module.system.dto.CaptchaDto;
 import com.xjrsoft.module.system.dto.CreateAuthorizeUrlDto;
 import com.xjrsoft.module.system.dto.CreateTokenDto;
@@ -96,9 +97,14 @@ public class LoginController {
 
     @GetMapping(value = "/loginQRCode")
     @ApiOperation(value="登录-二维码")
-    @SaCheckPermission("wfstudenttextbookclaim:detail")
-    public RT<LoginQRCodeVo> qrcode() throws Exception {
-        String url = commonPropertiesConfig.getDomainApp() + "/system/QR-code-login?";
+    @SaCheckPermission("login:detail")
+    public RT<LoginQRCodeVo> qrcode() {
+        long loginCode = IdUtil.getSnowflakeNextId();
+        String url = commonPropertiesConfig.getDomainApp() + "pages/login/qrCodeLogin/index?loginCode="+loginCode;
+        String active = SpringUtil.getActiveProfile();
+        if(!"prod".equals(active)){
+            url = "http://yxh-web.ngrok.yingcaibx.com/app/#/pages/login/qrCodeLogin/index?loginCode="+loginCode;
+        }
         int width = 200;
         int height = 200;
         int margin = 1;
@@ -107,7 +113,8 @@ public class LoginController {
             String base64 = QrCodeUtil.createBase64(url, width, height, margin);
             LoginQRCodeVo loginQRCodeVo = new LoginQRCodeVo();
             loginQRCodeVo.setImgBase64(base64);
-            long loginCode = IdUtil.getSnowflakeNextId();
+
+            redisUtil.set(loginCode + "time", System.currentTimeMillis());
             loginQRCodeVo.setLoginCode(loginCode + "");
             return RT.ok(loginQRCodeVo);
         } catch (Exception e) {
@@ -118,21 +125,39 @@ public class LoginController {
     @PostMapping("/QR-code-login")
     @ApiOperation(value = "二维码登录", notes = "code")
     @XjrLog(value = "二维码登录")
-    public R loginQRCode(@RequestBody @Valid LoginQRCodeDto dto) throws Exception {
-        return R.ok(loginService.loginQRCode(dto));
+    public RT<String> loginQRCode(@RequestBody LoginQRCodeDto dto) throws Exception {
+//        Long timestamp = redisUtil.get(dto.getLoginCode() + "time", Long.class);
+//        long timeMillis = System.currentTimeMillis();
+//        if(timeMillis - timestamp > 300000){
+//            return RT.error("二维码失效,请刷新重试");
+//        }
+        Boolean b = loginService.loginQRCode(dto);
+        if(b){
+            return RT.ok("登录成功");
+        }
+
+        return RT.ok("登录失败,未能绑定微信公众号");
     }
 
     @PostMapping("/check-QR-code-login")
     @ApiOperation(value = "验证是否登录成功", notes = "验证是否登录成功")
     @XjrLog(value = "验证是否登录成功")
-    public RT<LoginCheckQRCodeVo> checkLoginQRCode(@RequestBody @Valid String loginCode) {
-        String token = redisUtil.get(loginCode);
+    public RT<LoginCheckQRCodeVo> checkLoginQRCode(@RequestBody @Valid QRLoginDto dto) {
+        Long timestamp = redisUtil.get(dto.getLoginCode() + "time", Long.class);
+        if(timestamp == null){
+            timestamp = System.currentTimeMillis();
+        }
+        long timeMillis = System.currentTimeMillis();
         LoginCheckQRCodeVo loginCheckQRCodeVo = new LoginCheckQRCodeVo();
-        loginCheckQRCodeVo.setToken(token);
-        loginCheckQRCodeVo.setStatus(0);
-        if(StrUtil.isEmpty(token)){
+        if(timeMillis - timestamp > 300000){
             loginCheckQRCodeVo.setStatus(1);
+            return RT.ok(loginCheckQRCodeVo);
         }
+
+        String token = redisUtil.get(dto.getLoginCode());
+
+        loginCheckQRCodeVo.setToken(token);
+        loginCheckQRCodeVo.setStatus(0);
         return RT.ok(loginCheckQRCodeVo);
     }
 

+ 2 - 2
src/main/java/com/xjrsoft/module/system/dto/LoginQRCodeDto.java

@@ -7,9 +7,9 @@ import javax.validation.constraints.NotBlank;
 
 @Data
 public class LoginQRCodeDto {
-    @ApiModelProperty("openId")
+    @ApiModelProperty("code")
     @NotBlank(message = "openId不能为空!")
-    private String openId;
+    private String code;
 
     @ApiModelProperty("loginCode")
     @NotBlank(message = "loginCode不能为空!")

+ 6 - 3
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -204,17 +204,20 @@ public class LoginServiceImpl implements ILoginService {
                 throw new MyException("登录人数超过授权人数,无法登录,请联系管理员!");
             }
         }
-
+        WeChatUserInfo mpOpenid = weChatUtil.getMpOpenid(dto.getCode());
+        if(mpOpenid == null || (mpOpenid != null && StrUtil.isEmpty(mpOpenid.getUnionid()))){
+            throw new MyException("未绑定微信公众号,无法扫码登录");
+        }
         User loginUser = userService.getOne(
             Wrappers.lambdaQuery(User.class)
-            .eq(User::getOpenId, dto.getOpenId())
+            .eq(User::getUnionId, mpOpenid.getUnionid())
         );
 
         if (loginUser == null) {
             throw new MyException("未能查询到您的用户信息");
         }
         LoginVo pc = getLoginInfo(loginUser, "PC");
-        redisUtil.set(dto.getLoginCode(), pc.getToken(), 5 * 60);
+        redisUtil.setStrValue(dto.getLoginCode(), pc.getToken());
         return Boolean.TRUE;
     }
 

+ 1 - 1
src/main/java/com/xjrsoft/module/system/vo/LoginCheckQRCodeVo.java

@@ -13,7 +13,7 @@ public class LoginCheckQRCodeVo {
     @ApiModelProperty("token")
     private String token;
 
-    @ApiModelProperty("状态(0:未失效 1:失效)")
+    @ApiModelProperty("状态(0:未失效 1:失效 2:未能绑定微信公众号)")
     private Integer status;
 
 }

+ 10 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/XjrUserMapper.java

@@ -1,8 +1,11 @@
 package com.xjrsoft.module.teacher.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.concat.dto.ConcatTreeDto;
+import com.xjrsoft.module.concat.vo.ConcatTreeVo;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -21,4 +24,11 @@ public interface XjrUserMapper extends MPJBaseMapper<XjrUser> {
      * @return
      */
     List<Long> getUserIdByClassId(Long classId);
+
+    /**
+     * 查询教师的姓名、电话和部门id
+     * @param dto
+     * @return
+     */
+    List<ConcatTreeVo> getTeacherDeptInfo(@Param("dto") ConcatTreeDto dto);
 }

+ 1 - 0
src/main/resources/application-dev.yml

@@ -110,6 +110,7 @@ xjrsoft:
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
       - /system/loginQRCode
+      - /system/QR-code-login
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 1 - 0
src/main/resources/application-pre.yml

@@ -94,6 +94,7 @@ xjrsoft:
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
       - /system/loginQRCode
+      - /system/QR-code-login
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 2 - 0
src/main/resources/application-prod.yml

@@ -40,6 +40,7 @@ mqtt:
   server: tcp://219.153.208.35:1880
   qos: 1
 
+
 xjrsoft:
   oss:
     #enabled: true
@@ -89,6 +90,7 @@ xjrsoft:
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
       - /system/loginQRCode
+      - /system/QR-code-login
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 1 - 1
src/main/resources/mapper/student/BaseStudentGraduateMapper.xml

@@ -45,7 +45,7 @@
             and t3.stduy_status = #{dto.stduyStatus}
         </if>
         <if test="dto.rollModality != null and dto.rollModality != ''">
-            and t3.roll_modality = #{dto.rollModality}
+            and t3.learn_status = #{dto.rollModality}
         </if>
         <if test="dto.name != null and dto.name != ''">
             and t2.name like concat('%',#{dto.name}, '%')

+ 13 - 0
src/main/resources/mapper/teacher/XjrUserMapper.xml

@@ -12,4 +12,17 @@
         WHERE t.delete_mark = 0 and t1.class_id = #{classId}
         order by t.id;
     </select>
+
+    <select id="getTeacherDeptInfo" parameterType="com.xjrsoft.module.concat.dto.ConcatTreeDto" resultType="com.xjrsoft.module.concat.vo.ConcatTreeVo">
+        SELECT t1.id, t1.name,t1.mobile,t2.dept_id as parent_id FROM xjr_user t1
+        INNER JOIN xjr_user_dept_relation t2 ON t1.id = t2.user_id
+        INNER JOIN base_teacher t3 ON t1.id = t3.user_id
+        WHERE t1.delete_mark = 0
+        <if test="dto.name != null and dto.name != ''">
+            and t1.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.mobile != null and dto.mobile != ''">
+            and t1.mobile like concat('%', #{dto.mobile}, '%')
+        </if>
+    </select>
 </mapper>

+ 1 - 1
src/main/resources/sqlScript/20240311_sql.sql

@@ -55,7 +55,7 @@ CREATE TABLE `pb_semester_config` (
 ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='攀宝学期对应';
 
 
-ALTER TABLE `tl`.`pb_v_xsxxsfytb`   
+ALTER TABLE `pb_v_xsxxsfytb`   
   ADD INDEX (`Studentcode`),
   ADD INDEX (`qfje`);