Browse Source

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

phoenix 1 year ago
parent
commit
334b58dbbb
19 changed files with 318 additions and 139 deletions
  1. 1 1
      src/main/java/com/xjrsoft/module/oa/utils/SendMessageUtil.java
  2. 25 37
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  3. 1 2
      src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java
  4. 18 0
      src/main/java/com/xjrsoft/module/organization/dto/LoginResetPasswordDto.java
  5. 0 3
      src/main/java/com/xjrsoft/module/organization/dto/UpdatePasswordDto.java
  6. 0 1
      src/main/java/com/xjrsoft/module/organization/dto/UpdateUserDto.java
  7. 3 0
      src/main/java/com/xjrsoft/module/organization/entity/User.java
  8. 17 3
      src/main/java/com/xjrsoft/module/organization/service/IUserService.java
  9. 58 20
      src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java
  10. 28 17
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentScholarshipApplicantController.java
  11. 22 0
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentScholarshipApplicantPageDto.java
  12. 2 2
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentScholarshipApplicant.java
  13. 10 13
      src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java
  14. 4 0
      src/main/java/com/xjrsoft/module/system/vo/LoginVo.java
  15. 13 0
      src/main/java/com/xjrsoft/module/workflow/listener/TaskDelegate.java
  16. 33 33
      src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
  17. 1 1
      src/main/resources/application-dev.yml
  18. 1 1
      src/main/resources/application-prod.yml
  19. 81 5
      src/main/resources/sqlScript/20231120_sql.sql

+ 1 - 1
src/main/java/com/xjrsoft/module/oa/utils/SendMessageUtil.java

@@ -96,7 +96,7 @@ public class SendMessageUtil {
                 }});
                 // 事项名称
                 data.put("thing2", new JSONObject() {{
-                    put("value", String.format("《%s》发起了《%s》,待审批!", param.getStartUserName(), param.getSchemaName()));
+                    put("value", name);
                 }});
                 // 申请人
                 data.put("thing6", new JSONObject() {{

+ 25 - 37
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -17,6 +17,7 @@ import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.sms.SmsCtcc;
@@ -24,17 +25,7 @@ import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.base.service.IBaseClassService;
-import com.xjrsoft.module.organization.dto.AddUserDto;
-import com.xjrsoft.module.organization.dto.BindOpenidDto;
-import com.xjrsoft.module.organization.dto.RegisterDto;
-import com.xjrsoft.module.organization.dto.ResetPasswordDto;
-import com.xjrsoft.module.organization.dto.UpdateInfoDto;
-import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
-import com.xjrsoft.module.organization.dto.UpdateUserDto;
-import com.xjrsoft.module.organization.dto.UserPageDto;
-import com.xjrsoft.module.organization.dto.UserStudentAddDto;
-import com.xjrsoft.module.organization.dto.UserStudentBindDto;
-import com.xjrsoft.module.organization.dto.UserStudentDeleteDto;
+import com.xjrsoft.module.organization.dto.*;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.Post;
 import com.xjrsoft.module.organization.entity.Role;
@@ -203,10 +194,8 @@ public class UserController {
         return R.ok(userVo);
     }
 
-
     @PostMapping
     @ApiOperation(value = "新增用户")
-
     public R add(@Valid @RequestBody AddUserDto dto) {
         if (!OrganizationUtil.validatePassword(dto.getPassword())) {
             return R.error("密码必须包含大写字母、小写字母、数字和特殊字符,长度8~16位");
@@ -300,24 +289,32 @@ public class UserController {
 
     @PutMapping("/update/password")
     @ApiOperation(value = "当前登录用户修改本人密码")
-    public R updatePassword(@RequestBody @Valid UpdatePasswordDto dto) {
+    public RT<Boolean> updatePassword(@RequestBody @Valid UpdatePasswordDto dto) {
+        if (!OrganizationUtil.validatePassword(dto.getNewPassword())) {
+            return RT.error("密码必须包含大写字母、小写字母、数字和特殊字符,长度8~16位");
+        }
         User user = userService.getById(StpUtil.getLoginIdAsLong());
-//        if (!StrUtil.equals(SaSecureUtil.md5BySalt(dto.getOldPassword(), GlobalConstant.SECRET_KEY), user.getPassword())) {
-//            return R.error("当前密码填写错误!");
-//        }
+
         if (!BCrypt.checkpw(dto.getOldPassword(), user.getPassword())) {
-            return R.error("当前密码填写错误!");
+            return RT.error("当前密码填写错误!");
         }
         if (!StrUtil.equals(dto.getNewPassword(), dto.getConfirmPassword())) {
-            return R.error("2次密码输入不一致!");
+            return RT.error("2次密码输入不一致!");
         }
+        return RT.ok(userService.updatePassword(dto));
+    }
 
-        User updateUser = new User();
-        updateUser.setId(StpUtil.getLoginIdAsLong());
-//        updateUser.setPassword(SaSecureUtil.md5BySalt(dto.getNewPassword(), GlobalConstant.SECRET_KEY));
-        updateUser.setPassword(BCrypt.hashpw(dto.getNewPassword(), BCrypt.gensalt()));
-
-        return R.ok(userService.updateById(updateUser));
+    @PutMapping("/login/reset-password")
+    @ApiOperation(value = "登录后修改密码")
+    public RT<Boolean> loginResetPassword(@RequestBody @Valid LoginResetPasswordDto dto) {
+        if (!OrganizationUtil.validatePassword(dto.getNewPassword())) {
+            return RT.error("密码必须包含大写字母、小写字母、数字和特殊字符,长度8~16位");
+        }
+        if (!StrUtil.equals(dto.getNewPassword(), dto.getConfirmPassword())) {
+            return RT.error("2次密码输入不一致!");
+        }
+        UpdatePasswordDto pd = BeanUtil.toBean(dto, UpdatePasswordDto.class);
+        return RT.ok(userService.updatePassword(pd));
     }
 
     @PostMapping("/update/avatar")
@@ -385,17 +382,8 @@ public class UserController {
 
     @PutMapping("/reset-password")
     @ApiOperation(value = "重置密码")
-    public R resetPassword(@RequestBody ResetPasswordDto dto) {
-        User user = new User();
-        user.setId(dto.getId());
-//        user.setPassword(DigestUtil.md5Hex(propertiesConfig.getDefaultPassword()));
-//        user.setPassword(SaSecureUtil.md5BySalt(propertiesConfig.getDefaultPassword(), GlobalConstant.SECRET_KEY));
-        user.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
-        CompletableFuture.runAsync(() -> {
-            List<User> list = userService.list();
-            redisUtil.set(GlobalConstant.USER_CACHE_KEY, list);
-        });
-        return R.ok(userService.updateById(user));
+    public RT<Boolean> resetPassword(@RequestBody ResetPasswordDto dto) {
+        return RT.ok(userService.resetPassword(dto));
     }
 
     @PostMapping("/bind-openid")
@@ -444,7 +432,7 @@ public class UserController {
             return R.error("验证码不正确!");
         }
         // 赋值家长角色
-        dto.setPostId(RoleEnum.PARENT.getCode());
+        dto.setRoleId(RoleEnum.PARENT.getCode());
         return R.ok(userService.add(dto));
     }
 

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

@@ -61,7 +61,7 @@ public class AddUserDto implements Serializable {
 
 //    @NotNull(message = "角色不能为空!")
     @ApiModelProperty("角色Id")
-    private Long postId;
+    private Long roleId;
 
     @ApiModelProperty("头像")
     private String avatar;
@@ -88,7 +88,6 @@ public class AddUserDto implements Serializable {
     @Length(max = 255,message = "备注字符不能超过60字符!")
     private String remark;
 
-    @NotNull(message = "部门不能为空!")
     @ApiModelProperty("部门id")
     private String departmentIds;
 

+ 18 - 0
src/main/java/com/xjrsoft/module/organization/dto/LoginResetPasswordDto.java

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.organization.dto;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class LoginResetPasswordDto implements Serializable {
+    @NotNull
+    @Length(min = 6,max = 32,message = "新密码长度不得小于6个字符,不得大于32个字符!")
+    private String newPassword;
+
+    @NotNull
+    @Length(min = 6,max = 32,message = "确认密码长度不得小于6个字符,不得大于32个字符!")
+    private String confirmPassword;
+}

+ 0 - 3
src/main/java/com/xjrsoft/module/organization/dto/UpdatePasswordDto.java

@@ -27,8 +27,5 @@ public class UpdatePasswordDto implements Serializable {
     @NotNull
     @Length(min = 6,max = 32,message = "确认密码长度不得小于6个字符,不得大于32个字符!")
     private String confirmPassword;
-
-
-
 }
 

+ 0 - 1
src/main/java/com/xjrsoft/module/organization/dto/UpdateUserDto.java

@@ -82,7 +82,6 @@ public class UpdateUserDto implements Serializable {
     @Length(max = 255,message = "备注字符不能超过255字符!")
     private String remark;
 
-    @NotNull(message = "部门不能为空!")
     @ApiModelProperty("部门id")
     private String departmentIds;
 

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/entity/User.java

@@ -103,5 +103,8 @@ public class User extends AuditEntity implements Serializable {
     @ApiModelProperty("qq号码")
     private String qqNumber;
 
+    @ApiModelProperty("是否需要修改密码(1:需要 0:不需要)")
+    private Integer isChangePassword;
+
     private LocalDateTime birthDate;
 }

+ 17 - 3
src/main/java/com/xjrsoft/module/organization/service/IUserService.java

@@ -2,14 +2,14 @@ package com.xjrsoft.module.organization.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.module.organization.dto.AddUserDto;
-import com.xjrsoft.module.organization.dto.UpdateUserDto;
-import com.xjrsoft.module.organization.dto.WeChatPageDto;
+import com.xjrsoft.module.organization.dto.*;
 import com.xjrsoft.module.organization.entity.User;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xjrsoft.module.organization.vo.UserInfoVo;
 import com.xjrsoft.module.organization.vo.WeChatPageVO;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -28,6 +28,20 @@ public interface IUserService extends MPJBaseService<User> {
 
     boolean deleteBatch(List<Long> ids);
 
+    /**
+     * 修改密码
+     * @param dto
+     * @return
+     */
+    boolean updatePassword(UpdatePasswordDto dto);
+
+    /**
+     * 重置密码
+     * @param dto
+     * @return
+     */
+    boolean resetPassword(ResetPasswordDto dto);
+
     /**
      * 批量获取用户信息
      *

+ 58 - 20
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.organization.service.impl;
 
 import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.secure.SaSecureUtil;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
@@ -19,9 +20,8 @@ import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.organization.dto.AddUserDto;
-import com.xjrsoft.module.organization.dto.UpdateUserDto;
-import com.xjrsoft.module.organization.dto.WeChatPageDto;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.organization.dto.*;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.entity.UserPostRelation;
@@ -70,6 +70,8 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
 
     private final RedisUtil redisUtil;
 
+    private final CommonPropertiesConfig propertiesConfig;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean add(AddUserDto dto) {
@@ -77,17 +79,29 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         if (count > 0) {
             throw new MyException("用户名称或编码已存在");
         }
+        count = count(Wrappers.<User>query().lambda().eq(User::getMobile, dto.getMobile()));
+        if (count > 0) {
+            throw new MyException("手机号码已存在");
+        }
         User user = BeanUtil.toBean(dto, User.class);
 
         //密码加密加盐存储到数据库
         user.setPassword(BCrypt.hashpw(dto.getPassword(), BCrypt.gensalt()));
         save(user);
 
+        // 添加角色
+        if (dto.getRoleId() != null) {
+            UserRoleRelation userRoleRelation = new UserRoleRelation();
+            userRoleRelation.setUserId(user.getId());
+            userRoleRelation.setRoleId(dto.getRoleId());
+            userRoleRelationMapper.insert(userRoleRelation);
+        }
+
         List<UserDeptRelation> userDeptRelationList = new ArrayList<>();
-        if (StrUtil.isNotBlank(dto.getDepartmentIds())){
+        if (StrUtil.isNotBlank(dto.getDepartmentIds())) {
             String allDeptIdStr = StrUtil.join(StringPool.COMMA, dto.getDepartmentIds());
             List<Long> departmentIds = Arrays.stream(allDeptIdStr.split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-            if (CollectionUtil.isNotEmpty(departmentIds)){
+            if (CollectionUtil.isNotEmpty(departmentIds)) {
                 for (Long deptId : departmentIds) {
                     //将用户所选部门保存到关联表中
                     UserDeptRelation userDeptRelation = new UserDeptRelation();
@@ -96,7 +110,7 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
                     userDeptRelationList.add(userDeptRelation);
                 }
             }
-          userDeptRelationService.saveBatch(userDeptRelationList);
+            userDeptRelationService.saveBatch(userDeptRelationList);
         }
 
         CompletableFuture.runAsync(() -> {
@@ -126,12 +140,12 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         updateById(user);
 
         //先删除再新增
-        userDeptRelationService.remove(Wrappers.<UserDeptRelation>query().lambda().eq(UserDeptRelation::getUserId,user.getId()));
+        userDeptRelationService.remove(Wrappers.<UserDeptRelation>query().lambda().eq(UserDeptRelation::getUserId, user.getId()));
         List<UserDeptRelation> userDeptRelationList = new ArrayList<>();
-        if (StrUtil.isNotBlank(dto.getDepartmentIds())){
+        if (StrUtil.isNotBlank(dto.getDepartmentIds())) {
             String allDeptIdStr = StrUtil.join(StringPool.COMMA, dto.getDepartmentIds());
             List<Long> departmentIds = Arrays.stream(allDeptIdStr.split(StringPool.COMMA)).map(Convert::toLong).collect(Collectors.toList());
-            if (CollectionUtil.isNotEmpty(departmentIds)){
+            if (CollectionUtil.isNotEmpty(departmentIds)) {
                 for (Long deptId : departmentIds) {
                     //将用户所选部门保存到关联表中
                     UserDeptRelation userDeptRelation = new UserDeptRelation();
@@ -160,24 +174,21 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         //删除时需要同时删除用户部门关联表和用户角色关联表和用户岗位关系表数据。
         this.removeBatchByIds(ids);
         //根据用户ids去缓存中查询到对应的三个表的数据
-        List<UserDeptRelation> userDeptRelationList = redisUtil.get(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, new TypeReference<List<UserDeptRelation>>() {
-        });
-        List<UserPostRelation> userPostRelationList = redisUtil.get(GlobalConstant.USER_POST_RELATION_CACHE_KEY, new TypeReference<List<UserPostRelation>>() {
-        });
-        List<UserRoleRelation> userRoleRelationList = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {
-        });
+        List<UserDeptRelation> userDeptRelationList = redisUtil.get(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, new TypeReference<List<UserDeptRelation>>() {});
+        List<UserPostRelation> userPostRelationList = redisUtil.get(GlobalConstant.USER_POST_RELATION_CACHE_KEY, new TypeReference<List<UserPostRelation>>() {});
+        List<UserRoleRelation> userRoleRelationList = redisUtil.get(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, new TypeReference<List<UserRoleRelation>>() {});
         //拿用户ids进行过滤,如果存在,就删除
         List<Long> deptRelationIds = userDeptRelationList.stream().filter(u -> ids.contains(u.getUserId())).map(UserDeptRelation::getId).collect(Collectors.toList());
         List<Long> postRelationIds = userPostRelationList.stream().filter(u -> ids.contains(u.getUserId())).map(UserPostRelation::getId).collect(Collectors.toList());
         List<Long> roleRelationIds = userRoleRelationList.stream().filter(u -> ids.contains(u.getUserId())).map(UserRoleRelation::getId).collect(Collectors.toList());
         //调用三个表的删除
-        if(CollectionUtil.isNotEmpty(deptRelationIds)){
+        if (CollectionUtil.isNotEmpty(deptRelationIds)) {
             userDeptRelationMapper.deleteBatchIds(deptRelationIds);
         }
-        if(CollectionUtil.isNotEmpty(postRelationIds)) {
+        if (CollectionUtil.isNotEmpty(postRelationIds)) {
             userPostRelationMapper.deleteBatchIds(postRelationIds);
         }
-        if(CollectionUtil.isNotEmpty(roleRelationIds)) {
+        if (CollectionUtil.isNotEmpty(roleRelationIds)) {
             userRoleRelationMapper.deleteBatchIds(roleRelationIds);
         }
         //更新缓存
@@ -197,6 +208,33 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         return Boolean.TRUE;
     }
 
+    @Override
+    public boolean updatePassword(UpdatePasswordDto dto) {
+
+        User updateUser = new User();
+        updateUser.setId(StpUtil.getLoginIdAsLong());
+        updateUser.setPassword(BCrypt.hashpw(dto.getNewPassword(), BCrypt.gensalt()));
+        updateUser.setIsChangePassword(0);
+
+        return updateById(updateUser);
+
+    }
+
+    @Override
+    public boolean resetPassword(ResetPasswordDto dto) {
+        User user = new User();
+        user.setId(dto.getId());
+        user.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+        user.setIsChangePassword(1);
+
+        CompletableFuture.runAsync(() -> {
+            List<User> list = list();
+            redisUtil.set(GlobalConstant.USER_CACHE_KEY, list);
+        });
+
+        return updateById(user);
+    }
+
     @Override
     public List<UserInfoVo> getUsersInfo(String ids) {
 
@@ -215,8 +253,8 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
     @Override
     public PageOutput<WeChatPageVO> getPage(WeChatPageDto dto) {
         LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
-         queryWrapper.like(StrUtil.isNotBlank(dto.getKeyword()),User::getName,dto.getKeyword())
-                 .select(User.class,x -> VoToColumnUtil.fieldsToColumns(WeChatPageVO.class).contains(x.getProperty()));
+        queryWrapper.like(StrUtil.isNotBlank(dto.getKeyword()), User::getName, dto.getKeyword())
+                .select(User.class, x -> VoToColumnUtil.fieldsToColumns(WeChatPageVO.class).contains(x.getProperty()));
         IPage<User> page = userMapper.selectPage(ConventPage.getPage(dto), queryWrapper);
         List<User> records = page.getRecords();
         for (User record : records) {

+ 28 - 17
src/main/java/com/xjrsoft/module/student/controller/BaseStudentScholarshipApplicantController.java

@@ -1,34 +1,37 @@
 package com.xjrsoft.module.student.controller;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.xjrsoft.common.constant.GlobalConstant;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.student.dto.AddBaseStudentScholarshipApplicantDto;
-import com.xjrsoft.module.student.dto.UpdateBaseStudentScholarshipApplicantDto;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-
 import com.xjrsoft.module.student.dto.BaseStudentScholarshipApplicantPageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentScholarshipApplicantDto;
 import com.xjrsoft.module.student.entity.BaseStudentScholarshipApplicant;
+import com.xjrsoft.module.student.entity.BaseStudentScholarshipCategory;
 import com.xjrsoft.module.student.service.IBaseStudentScholarshipApplicantService;
 import com.xjrsoft.module.student.vo.BaseStudentScholarshipApplicantPageVo;
-
 import com.xjrsoft.module.student.vo.BaseStudentScholarshipApplicantVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
 import java.util.List;
 
 /**
@@ -50,12 +53,20 @@ public class BaseStudentScholarshipApplicantController {
     @ApiOperation(value="奖学金申请列表(分页)")
     @SaCheckPermission("basestudentscholarshipapplicant:detail")
     public RT<PageOutput<BaseStudentScholarshipApplicantPageVo>> page(@Valid BaseStudentScholarshipApplicantPageDto dto){
-
-        LambdaQueryWrapper<BaseStudentScholarshipApplicant> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper
-                    .orderByDesc(BaseStudentScholarshipApplicant::getId)
-                .select(BaseStudentScholarshipApplicant.class,x -> VoToColumnUtil.fieldsToColumns(BaseStudentScholarshipApplicantPageVo.class).contains(x.getProperty()));
-        IPage<BaseStudentScholarshipApplicant> page = baseStudentScholarshipApplicantService.page(ConventPage.getPage(dto), queryWrapper);
+        IPage<BaseStudentScholarshipApplicantPageVo> page = baseStudentScholarshipApplicantService.selectJoinListPage(ConventPage.getPage(dto), BaseStudentScholarshipApplicantPageVo.class,
+        MPJWrappers.<BaseStudentScholarshipApplicant>lambdaJoin()
+                .like(StrUtil.isNotEmpty(dto.getName()), BaseStudentScholarshipApplicant::getName, dto.getName())
+                .eq(ObjectUtil.isNotNull(dto.getSemesterId()), BaseStudentScholarshipCategory::getBaseSemesterId, dto.getSemesterId())
+                .eq(ObjectUtil.isNotNull(dto.getReleaseStatus()), BaseStudentScholarshipApplicant::getReleaseStatus, dto.getReleaseStatus())
+                .eq(BaseStudentScholarshipApplicant::getStatus, 1)
+                .between(ObjectUtil.isNotNull(dto.getStartDate()) && ObjectUtil.isNotNull(dto.getEndDate()), BaseStudentScholarshipApplicant::getAwardDate,dto.getStartDate(),dto.getEndDate())
+                .eq(BaseStudentScholarshipApplicant::getBaseStudentScholarshipCategoryId,dto.getBaseStudentScholarshipCategoryId())
+                .orderByAsc(BaseStudentScholarshipApplicant::getSortCode)
+                .selectAs(BaseSemester::getName, BaseStudentScholarshipApplicantPageVo::getSemesterName)
+                .select(BaseStudentScholarshipApplicant.class,x -> VoToColumnUtil.fieldsToColumns(BaseStudentScholarshipApplicantPageVo.class).contains(x.getProperty()))
+                .innerJoin(BaseStudentScholarshipCategory.class, BaseStudentScholarshipCategory::getId, BaseStudentScholarshipApplicant::getBaseStudentScholarshipCategoryId)
+                .leftJoin(BaseSemester.class, BaseSemester::getId, BaseStudentScholarshipApplicant::getBaseSemesterId)
+        );
         PageOutput<BaseStudentScholarshipApplicantPageVo> pageOutput = ConventPage.getPageOutput(page, BaseStudentScholarshipApplicantPageVo.class);
         return RT.ok(pageOutput);
     }

+ 22 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentScholarshipApplicantPageDto.java

@@ -1,11 +1,13 @@
 package com.xjrsoft.module.student.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotNull;
 import java.time.LocalTime;
 import java.time.LocalDateTime;
 import java.math.BigDecimal;
@@ -22,5 +24,25 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = false)
 public class BaseStudentScholarshipApplicantPageDto extends PageInput {
 
+    @NotNull(message = "奖学金类别id不能为空!")
+    @ApiModelProperty("奖学金类别id")
+    private Long baseStudentScholarshipCategoryId;
+
+    @ApiModelProperty("发放状态(1:已发放 0:未发放)")
+    private Integer releaseStatus;
+
+    @ApiModelProperty("学期id")
+    private Long semesterId;
+
+    @ApiModelProperty("学生姓名")
+    private String name;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("发放日期-开始")
+    private String startDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("发放日期-结束")
+    private String endDate;
 
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/student/entity/BaseStudentScholarshipApplicant.java

@@ -91,8 +91,8 @@ public class BaseStudentScholarshipApplicant implements Serializable {
     /**
     * 学期名称
     */
-    @ApiModelProperty("学期名称")
-    private String semesterName;
+    @ApiModelProperty("学期Id")
+    private String baseSemesterId;
     /**
     * 入学名称
     */

+ 10 - 13
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -78,9 +78,6 @@ public class LoginServiceImpl implements ILoginService {
 
     private final UserRoleRelationMapper userRoleRelationMapper;
 
-    @Autowired
-    private CommonPropertiesConfig commonPropertiesConfig;
-
     @Override
     public LoginVo login(LoginDto dto) throws Exception {
         if (licenseConfig.getEnabled()) {
@@ -106,12 +103,12 @@ public class LoginServiceImpl implements ILoginService {
         String decryptData = RSAUtil.decrypt(dto.getPassword());
         dto.setPassword(decryptData);
 
-        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(User::getUserName, dto.getUserName());
-        User loginUser = userService.getOne(queryWrapper);
-//        if (loginUser == null || !StrUtil.equals(loginUser.getPassword(), SaSecureUtil.md5BySalt(dto.getPassword(), GlobalConstant.SECRET_KEY))) {
-//            throw new MyException("账号或密码不正确");
-//        }
+        User loginUser = userService.getOne(
+                Wrappers.lambdaQuery(User.class)
+                        .eq(User::getUserName, dto.getUserName())
+                        .or()
+                        .eq(User::getMobile, dto.getUserName()));
+
         if (loginUser == null || !BCrypt.checkpw(dto.getPassword(), loginUser.getPassword())) {
             throw new MyException("账号或密码不正确");
         }
@@ -151,7 +148,7 @@ public class LoginServiceImpl implements ILoginService {
         String[] ids = weChatUtil.getMpOpenid(dto.getCode());
         if (ids == null) throw new MyException("code无效");
         if (StrUtil.isEmpty(ids[1])) {
-            throw new MyException("无法获取Uid"+ids[0]+"-"+ids[1]);
+            throw new MyException("无法获取Uid" + ids[0] + "-" + ids[1]);
         }
         List<User> userList = userService.list(Wrappers.lambdaQuery(User.class).eq(User::getUnionId, ids[1]));
         if (userList == null || userList.isEmpty()) throw new MyException("code无效");
@@ -207,6 +204,7 @@ public class LoginServiceImpl implements ILoginService {
                 .select(UserRoleRelation::getRoleId)
                 .eq(UserRoleRelation::getUserId, StpUtil.getLoginIdAsLong()));
         result.setUserType(roleMatching(relations));
+        result.setIsChangePassword(loginUser.getIsChangePassword());
 
         SaSession tokenSession = StpUtil.getTokenSession();
 
@@ -279,12 +277,11 @@ public class LoginServiceImpl implements ILoginService {
     public CreateTokenVo createToken(CreateTokenDto dto) {
         CreateTokenVo vo = new CreateTokenVo();
 
-        if(dto.getExpire() == -1){
+        if (dto.getExpire() == -1) {
             String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, Integer.MAX_VALUE);
             vo.setToken(token);
             return vo;
-        }
-        else {
+        } else {
             String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, dto.getExpire());
             vo.setToken(token);
             return vo;

+ 4 - 0
src/main/java/com/xjrsoft/module/system/vo/LoginVo.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.system.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +20,9 @@ public class LoginVo {
      */
     private Long userType;
 
+    @ApiModelProperty("是否需要修改密码(1:需要 0:不需要)")
+    private Integer isChangePassword;
+
     /**
      * 跳转地址
      */

+ 13 - 0
src/main/java/com/xjrsoft/module/workflow/listener/TaskDelegate.java

@@ -302,6 +302,19 @@ public class TaskDelegate implements TaskListener {
         Long recordId = addProcessRecord(delegateTask, schemaId, "【" + approveName + "】" + "准备审批");
         //设置用户传阅人
         initCirculatedUser(delegateTask, variableMaps, workflowSchemaConfig, userTaskConfig, recordId);
+        //通知推送
+        NoticePolicyParam param = new NoticePolicyParam();
+        param.setNoticeUserIds(approveUserIds);
+        param.setTaskId(delegateTask.getId());
+        param.setTaskName(delegateTask.getName());
+        param.setProcessId(delegateTask.getProcessInstanceId());
+        param.setTaskName(delegateTask.getName());
+        param.setSchemaId(MapUtil.get(variableMaps, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
+        param.setSchemaName(MapUtil.get(variableMaps, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
+        param.setStartUserName(MapUtil.get(variableMaps, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
+
+        param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
+        WorkFlowUtil.sendApproveNoticePolicy(param, String.format("《%s》发起了《%s》,待审批!", param.getStartUserName(), param.getSchemaName()));
         //默认所有任务不需要指定审批人  如果需要指定审批人 会在 launch  和 approve 接口 处理。
 
     }

+ 33 - 33
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -4416,23 +4416,23 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 }
 
                 //记录一下需要发送消息(不需要指定审批人的)的任务id
-                if (variableInstanceOptional.isPresent()) {
-
-                    List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstanceOptional.get().getValue()).split(StringPool.COMMA));
-
-                    NoticePolicyParam param = new NoticePolicyParam();
-                    param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-                    param.setTaskId(task.getId());
-                    param.setTaskName(task.getName());
-                    param.setProcessId(task.getProcessInstanceId());
-                    param.setTaskName(task.getName());
-                    param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-                    param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-                    param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-
-                    param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
-                    WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
-                }
+//                if (variableInstanceOptional.isPresent()) {
+//
+//                    List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstanceOptional.get().getValue()).split(StringPool.COMMA));
+//
+//                    NoticePolicyParam param = new NoticePolicyParam();
+//                    param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
+//                    param.setTaskId(task.getId());
+//                    param.setTaskName(task.getName());
+//                    param.setProcessId(task.getProcessInstanceId());
+//                    param.setTaskName(task.getName());
+//                    param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
+//                    param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
+//                    param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
+//
+//                    param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
+//                    WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
+//                }
 
             }
 
@@ -4528,22 +4528,22 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             }
             //如果审批人变量不为空  并且不需要指定审批人 就发送消息
-            if (variableInstance != null) {
-                List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstance.getValue()).split(StringPool.COMMA));
-
-                NoticePolicyParam param = new NoticePolicyParam();
-                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
-                param.setTaskId(task.getId());
-                param.setTaskName(task.getName());
-                param.setProcessId(task.getProcessInstanceId());
-                param.setTaskName(task.getName());
-                param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
-                param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
-                param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
-                param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
-                WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
-
-            }
+//            if (variableInstance != null) {
+//                List<String> approveIds = ListUtil.toList(Convert.toStr(variableInstance.getValue()).split(StringPool.COMMA));
+//
+//                NoticePolicyParam param = new NoticePolicyParam();
+//                param.setNoticeUserIds(Convert.toList(Long.class, approveIds));
+//                param.setTaskId(task.getId());
+//                param.setTaskName(task.getName());
+//                param.setProcessId(task.getProcessInstanceId());
+//                param.setTaskName(task.getName());
+//                param.setSchemaId(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_ID_KEY, Long.class));
+//                param.setSchemaName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_SCHEMA_NAME_KEY, String.class));
+//                param.setStartUserName(MapUtil.get(variableMap, WorkflowConstant.PROCESS_START_USER_NAME_KEY, String.class));
+//                param.setNoticePolicyConfigs(userTaskConfig.getNoticePolicyConfigs());
+//                WorkFlowUtil.sendApproveNoticePolicy(param, task.getName());
+//
+//            }
 
 
             return voList;

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

@@ -60,7 +60,7 @@ xjrsoft:
   common:
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
-    default-password: "000000" #默认密码(用户重置密码后为该密码)
+    default-password: "cqtlzjzx2023" #默认密码(用户重置密码后为该密码)
 #    domain-api: https://test.tl.web.yingcaibx.com/api #api域名地址
 #    domain-web: https://test.tl.web.yingcaibx.com #web域名地址
     domain-api: http://127.0.0.1:9000/api #api域名地址

+ 1 - 1
src/main/resources/application-prod.yml

@@ -60,7 +60,7 @@ xjrsoft:
   common:
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
-    default-password: "000000" #默认密码(用户重置密码后为该密码)
+    default-password: "cqtlzjzx2023" #默认密码(用户重置密码后为该密码)
     domain-api: https://zhxy.cqtlzjzx.com/api #api域名地址
     domain-web: https://zhxy.cqtlzjzx.com #web域名地址
     white-list:

+ 81 - 5
src/main/resources/sqlScript/20231120_sql.sql

@@ -15,9 +15,9 @@ CREATE TABLE base_student_scholarship_category
     `enabled_mark` INT NOT NULL COMMENT '有效标志',
     `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
     `name` VARCHAR(200) NOT NULL COMMENT '名称',
-    `scholarship_source` int NOT NULL DEFAULT 0 COMMENT '奖学金来源(xjr_dictionary_item[scholarship_source])',
+    `scholarship_source` varchar(20) NOT NULL DEFAULT 0 COMMENT '奖学金来源(xjr_dictionary_item[scholarship_source])',
     `base_semester_id` bigint NULL DEFAULT NULL COMMENT '学期ID(base_semester)',
-    `total_score` double NOT NULL DEFAULT 0 COMMENT '总金额',
+    `total_amount` double NOT NULL DEFAULT 0 COMMENT '总金额',
     `scholarship_level` int NOT NULL DEFAULT 0 COMMENT '奖学金等级 0=无等级',
     `remark` VARCHAR(1000) COMMENT '备注',
     PRIMARY KEY (`id`)
@@ -39,7 +39,7 @@ CREATE TABLE base_student_scholarship_level
     `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
     `base_student_scholarship_category_id` bigint NULL DEFAULT NULL COMMENT '奖学金类别ID(base_student_scholarship_category)',
     `level` int NOT NULL DEFAULT 0 COMMENT '奖学金等级 0=无等级',
-    `score` double NOT NULL DEFAULT 0 COMMENT '金额',
+    `amount` double NOT NULL DEFAULT 0 COMMENT '金额',
     PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '奖学金级别';
 
@@ -59,8 +59,9 @@ CREATE TABLE base_student_scholarship_applicant
     `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
     `base_student_scholarship_category_id` bigint NULL DEFAULT NULL COMMENT '奖学金类别ID(base_student_scholarship_category)',
     `applicant_user_id` BIGINT NULL DEFAULT NULL COMMENT '申请人',
-    `semester_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '学期名称',
-    `grade_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '入学名称',
+    `base_semester_id` bigint NULL DEFAULT NULL COMMENT '学期ID(base_semester)',
+    `scholarship_level` int NOT NULL DEFAULT 0 COMMENT '奖学金等级 0=无等级',
+    `grade_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '年级名称',
     `class_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '班级名称',
     `name` VARCHAR(200) NULL DEFAULT NULL COMMENT '姓名',
     `student_id` VARCHAR(200) NULL DEFAULT NULL COMMENT '学号',
@@ -77,6 +78,81 @@ CREATE TABLE base_student_scholarship_applicant
 ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '奖学金申请';
 -- ------------------------------------------------------------------奖学金管理--------------------------------------------------------------------
 
+-- ------------------------------------------------------------------用户--------------------------------------------------------------------
+ALTER TABLE xjr_user ADD COLUMN `is_change_password` INT NOT NULL default 0 DEFAULT 1 COMMENT '是否需要修改密码(1:需要 0:不需要)' AFTER credential_type;
+-- ------------------------------------------------------------------用户--------------------------------------------------------------------
+
+-- ------------------------------------------------------------------助学金管理--------------------------------------------------------------------
+-- ----------------------------
+-- 助学金项目
+-- ----------------------------
+DROP TABLE IF EXISTS base_student_bursaries_project;
+CREATE TABLE base_student_bursaries_project
+(
+    id BIGINT NOT NULL COMMENT '主键编号',
+    `create_user_id` BIGINT NULL DEFAULT NULL COMMENT '创建人',
+    `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间',
+    `modify_user_id` BIGINT NULL DEFAULT NULL COMMENT '修改人',
+    `modify_date` datetime NULL DEFAULT NULL COMMENT '修改时间',
+    `delete_mark` INT NOT NULL COMMENT '删除标记',
+    `enabled_mark` INT NOT NULL COMMENT '有效标志',
+    `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
+    `name` VARCHAR(200) NOT NULL COMMENT '名称',
+    `bursaries_type` varchar(20) NOT NULL DEFAULT 0 COMMENT '助学金类型(xjr_dictionary_item[bursaries_type])',
+    `base_semester_id` bigint NULL DEFAULT NULL COMMENT '学期ID(base_semester)',
+    `total_amount` double NOT NULL DEFAULT 0 COMMENT '总金额',
+    `start_time` date NULL DEFAULT NULL COMMENT '开始时间',
+    `end_time` date NULL DEFAULT NULL COMMENT '结束时间',
+    `remark` VARCHAR(1000) NULL DEFAULT NULL COMMENT '备注',
+    PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '助学金项目';
+
+-- ----------------------------
+-- 助学金申请
+-- ----------------------------
+DROP TABLE IF EXISTS base_student_bursaries_applicant;
+CREATE TABLE base_student_bursaries_applicant
+(
+    id BIGINT NOT NULL COMMENT '主键编号',
+    `create_user_id` bigint NULL DEFAULT NULL COMMENT '创建人',
+    `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间',
+    `modify_user_id` bigint NULL DEFAULT NULL COMMENT '修改人',
+    `modify_date` datetime NULL DEFAULT NULL COMMENT '修改时间',
+    `delete_mark` INT NOT NULL COMMENT '删除标记',
+    `enabled_mark` INT NOT NULL COMMENT '有效标志',
+    `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
+    `base_student_bursaries_project_id` bigint NULL DEFAULT NULL COMMENT '助学金项目ID(base_student_bursaries_project)',
+    `applicant_user_id` bigint NULL DEFAULT NULL COMMENT '申请人',
+    `base_semester_id` bigint NULL DEFAULT NULL COMMENT '学期ID(base_semester)',
+    `class_id` bigint NULL DEFAULT NULL COMMENT '班级编号',
+    `file_id` bigint NULL DEFAULT NULL COMMENT '文件ID(xjr_file)',
+    `status` INT NOT NULL default 0 COMMENT '状态(1:结束 0:未结束)',
+    PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '助学金申请';
+
+-- ----------------------------
+-- 助学金申请学生信息
+-- ----------------------------
+DROP TABLE IF EXISTS base_student_bursaries_student;
+CREATE TABLE base_student_bursaries_student
+(
+    id BIGINT NOT NULL COMMENT '主键编号',
+    `base_student_bursaries_applicant_id` bigint NULL DEFAULT NULL COMMENT '助学金申请ID(base_student_bursaries_applicant)',
+    `user_id`  BIGINT NULL DEFAULT NULL COMMENT'学生id',
+    `grade_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '年级名称',
+    `class_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '班级名称',
+    `name` VARCHAR(200) NULL DEFAULT NULL COMMENT '姓名',
+    `student_id` VARCHAR(200) NULL DEFAULT NULL COMMENT '学号',
+    `gender_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '性别',
+    `enroll_type_cn` VARCHAR(200) NULL DEFAULT NULL COMMENT '招生类型名称',
+    `major_name` VARCHAR(200) NULL DEFAULT NULL COMMENT '在读专业',
+    `bank_type` VARCHAR(20) NULL DEFAULT NULL COMMENT '收款银行(xjr_dictionary_item[bank_type])',
+    `bank_no` VARCHAR(200) NULL DEFAULT NULL COMMENT '银行卡号',
+    `applicant_amount` double NOT NULL DEFAULT 0 COMMENT '申请金额',
+    PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '助学金申请学生信息';
+-- ------------------------------------------------------------------助学金管理--------------------------------------------------------------------
+