Browse Source

Merge branch 'pre'

dzx 8 months ago
parent
commit
543ba2808a
26 changed files with 780 additions and 3 deletions
  1. 60 0
      src/main/java/com/xjrsoft/common/utils/CredentialNumberUtil.java
  2. 54 0
      src/main/java/com/xjrsoft/module/base/controller/BaseGradeController.java
  3. 53 0
      src/main/java/com/xjrsoft/module/base/controller/BaseMajorSetController.java
  4. 46 0
      src/main/java/com/xjrsoft/module/base/controller/BaseSystemConfigController.java
  5. 24 0
      src/main/java/com/xjrsoft/module/base/dto/BaseGradePageDto.java
  6. 21 0
      src/main/java/com/xjrsoft/module/base/dto/BaseMajorSetPageDto.java
  7. 38 0
      src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java
  8. 19 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java
  9. 16 0
      src/main/java/com/xjrsoft/module/base/service/IBaseSystemConfigService.java
  10. 20 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseSystemConfigServiceImpl.java
  11. 50 0
      src/main/java/com/xjrsoft/module/base/vo/BaseGradeVo.java
  12. 50 0
      src/main/java/com/xjrsoft/module/base/vo/BaseMajorSetVo.java
  13. 32 0
      src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java
  14. 158 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.java
  15. 2 0
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  16. 3 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  17. 2 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentSchoolRollService.java
  18. 3 1
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java
  19. 5 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  20. 95 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java
  21. 11 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentSompleInfoVo.java
  22. 7 0
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  23. 2 0
      src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailListDto.java
  24. 5 0
      src/main/resources/application-dev.yml
  25. 3 1
      src/main/resources/mapper/organization/UserMapper.xml
  26. 1 1
      src/main/resources/mapper/student/PbVXsxxsfytbMapper.xml

+ 60 - 0
src/main/java/com/xjrsoft/common/utils/CredentialNumberUtil.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.common.utils;
+
+import com.xjrsoft.common.exception.MyException;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 身份证号相关处理
+ * @author dzx
+ * @date 2025/4/1
+ */
+public class CredentialNumberUtil {
+
+    /**
+     * 根据身份证号获取出生日期
+     * @param idCardNumber 身份证号
+     * @return 出生日期
+     */
+    public static LocalDate getBirthDate(String idCardNumber){
+        // 获取出生日期前6位,即yyyyMM
+        String birthdayString = idCardNumber.substring(6, 14);
+
+        // 将字符串解析为LocalDate对象
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        try {
+            LocalDate parse = LocalDate.parse(birthdayString, formatter);
+            return parse;
+        }catch (Exception e){
+            throw new MyException("身份证号填写错误,无法提取出生日期");
+        }
+    }
+
+    /**
+     * 根据身份证号判断性别
+     * @param idCard 身份证号码
+     * @return "男" 或 "女"
+     * @throws IllegalArgumentException 如果身份证号长度不正确
+     */
+    public static String getGenderByIdCard(String idCard) {
+        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
+            throw new IllegalArgumentException("身份证号长度不正确");
+        }
+
+        // 15位身份证号:最后一位是性别位
+        // 18位身份证号:第17位是性别位
+        char genderChar;
+        if (idCard.length() == 15) {
+            genderChar = idCard.charAt(14);
+        } else {
+            genderChar = idCard.charAt(16);
+        }
+
+        // 将字符转换为数字
+        int genderNum = Character.getNumericValue(genderChar);
+
+        // 奇数男性,偶数女性
+        return genderNum % 2 == 1 ? "男" : "女";
+    }
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseGradeController.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.dto.BaseGradePageDto;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.service.IBaseGradeService;
+import com.xjrsoft.module.base.vo.BaseGradeVo;
+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 javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025年3月31日
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseGrade")
+@Api(value = "/baseGrade", tags = "年级管理")
+@AllArgsConstructor
+public class BaseGradeController {
+    private final IBaseGradeService gradeService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "年级列表")
+    @SaCheckPermission("basegrade:detail")
+    @XjrLog(value = "年级列表")
+    public RT<List<BaseGradeVo>> noTokenList(@Valid BaseGradePageDto dto) {
+        List<BaseGrade> list = gradeService.list(
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseGrade::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(BaseGrade::getStatus, dto.getStatus())
+                        .like(StrUtil.isNotEmpty(dto.getName()), BaseGrade::getName, dto.getName())
+                        .like(StrUtil.isNotEmpty(dto.getTitle()), BaseGrade::getTitle, dto.getTitle())
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseGradeVo.class));
+    }
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseMajorSetController.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.dto.BaseMajorSetPageDto;
+import com.xjrsoft.module.base.entity.BaseMajorSet;
+import com.xjrsoft.module.base.service.IBaseMajorSetService;
+import com.xjrsoft.module.base.vo.BaseMajorSetVo;
+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 javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025年3月31日
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseMajorSet")
+@Api(value = "/baseMajorSet", tags = "专业管理")
+@AllArgsConstructor
+public class BaseMajorSetController {
+    private final IBaseMajorSetService majorSetService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "专业列表")
+    @SaCheckPermission("basemajorset:detail")
+    @XjrLog(value = "专业列表")
+    public RT<List<BaseMajorSetVo>> noTokenList(@Valid BaseMajorSetPageDto dto) {
+        List<BaseMajorSet> list = majorSetService.list(
+                new QueryWrapper<BaseMajorSet>().lambda()
+                        .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseMajorSet::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .like(StrUtil.isNotEmpty(dto.getName()), BaseMajorSet::getName, dto.getName())
+                        .like(StrUtil.isNotEmpty(dto.getCode()), BaseMajorSet::getCode, dto.getCode())
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseMajorSetVo.class));
+    }
+}

+ 46 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseSystemConfigController.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import com.xjrsoft.module.base.service.IBaseSystemConfigService;
+import com.xjrsoft.module.base.vo.BaseSystemConfigVo;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025年3月31日
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseSystemConfig")
+@Api(value = "/baseSystemConfig", tags = "系统参数配置")
+@AllArgsConstructor
+public class BaseSystemConfigController {
+    private final IBaseSystemConfigService systemConfigService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "获取系统配置")
+    @SaCheckPermission("baseSystemConfig:detail")
+    @XjrLog(value = "年级列表")
+    public RT<List<BaseSystemConfigVo>> noTokenList(@RequestParam String code) {
+        List<BaseSystemConfig> list = systemConfigService.list(
+                new QueryWrapper<BaseSystemConfig>().lambda()
+                        .eq(BaseSystemConfig::getCode, code)
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseSystemConfigVo.class));
+    }
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseGradePageDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2025年3月31日
+ */
+@Data
+public class BaseGradePageDto extends PageInput {
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status = 1;
+
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseMajorSetPageDto.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2025年3月31日
+ */
+@Data
+public class BaseMajorSetPageDto extends PageInput {
+
+    @ApiModelProperty("专业方向名称")
+    private String name;
+
+    @ApiModelProperty("专业方向代码")
+    private String code;
+
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 2025年4月1日
+ */
+@Data
+@TableName("base_system_config")
+@ApiModel(value = "base_system_config", description = "系统参数配置")
+public class BaseSystemConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("编号")
+    private String code;
+
+    @ApiModelProperty("值")
+    private String value;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 2025年4月1日
+ */
+@Mapper
+public interface BaseSystemConfigMapper extends MPJBaseMapper<BaseSystemConfig> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseSystemConfigService.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 2025年4月1日
+ */
+public interface IBaseSystemConfigService extends IService<BaseSystemConfig> {
+
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseSystemConfigServiceImpl.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.base.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import com.xjrsoft.module.base.mapper.BaseSystemConfigMapper;
+import com.xjrsoft.module.base.service.IBaseSystemConfigService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 2025年4月1日
+ */
+@Service
+public class BaseSystemConfigServiceImpl extends ServiceImpl<BaseSystemConfigMapper, BaseSystemConfig> implements IBaseSystemConfigService {
+
+}

+ 50 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseGradeVo.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 年级
+ * @Author dzx
+ * @Date: 2025年3月31日
+ * @Version 1.0
+ */
+@Data
+public class BaseGradeVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status;
+
+}

+ 50 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseMajorSetVo.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 年级
+ * @Author dzx
+ * @Date: 2025年3月31日
+ * @Version 1.0
+ */
+@Data
+public class BaseMajorSetVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 系统参数配置
+ * @Author dzx
+ * @Date: 2025年4月1日
+ * @Version 1.0
+ */
+@Data
+public class BaseSystemConfigVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("编号")
+    private String code;
+
+    @ApiModelProperty("值")
+    private String value;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 158 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.java

@@ -0,0 +1,158 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.db.Entity;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.StudentTypeEnum;
+import com.xjrsoft.common.enums.WorkflowApproveType;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.mapper.UserMapper;
+import com.xjrsoft.module.student.dto.AddBaseStudentContactDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentFamilyDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentFamilyMemberDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentSchoolRollDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentSubsidizeDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IBaseStudentService;
+import com.xjrsoft.module.student.service.IStudentManagerService;
+import com.xjrsoft.module.workflow.entity.WorkflowRecord;
+import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
+import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.apache.commons.lang.StringUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 学生复读流程规则
+ */
+@Component("wf_student_repeat_study_node")
+public class WfStudentRepeatStudyNode extends NodeComponent {
+
+    @Autowired
+    private IStudentManagerService studentService;
+
+    @Autowired
+    private IWorkflowExecuteService workflowExecuteService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private IBaseStudentSchoolRollService schoolRollService;
+
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params, "id");
+        Long formId = Convert.toLong(value);
+        Object processInstanceId = params.get("processInstanceId");
+        if (processInstanceId == null) {
+            return;
+        }
+        String processInstanceIdStr = Convert.toStr(processInstanceId);
+        if (formId != null && StringUtils.isNotEmpty(processInstanceIdStr)) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        Optional<HistoricProcessInstance> historicProcessInstanceOptional = workflowExecuteService.getHistoricProcessInstance(processInstanceId.toString());
+
+                        if (historicProcessInstanceOptional.isEmpty()) {
+                            return;
+                        }
+                        HistoricProcessInstance historicProcessInstance = historicProcessInstanceOptional.get();
+                        if (historicProcessInstance.getState().equals(HistoricProcessInstance.STATE_COMPLETED)) {
+                            String tableName = "wf_student_repeat_study";
+                            Entity where = Entity.create(tableName);
+                            where.set("id", formId);
+                            Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(tableName, where);
+                            int isOriginal = Integer.parseInt(objectMap.get("is_original").toString());
+
+                            String credentialNumber = objectMap.get("credential_number").toString();
+
+                            User user = userMapper.selectOne(
+                                    new MPJLambdaWrapper<User>()
+                                            .disableLogicDel()
+                                            .select(User::getId)
+                                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                                            .eq(User::getCredentialNumber, credentialNumber)
+                            );
+
+                            if(isOriginal == 0 && user == null){
+                                AddBaseStudentUserDto baseStudentUser = new AddBaseStudentUserDto();
+                                baseStudentUser.setName(objectMap.get("name").toString());
+                                baseStudentUser.setCredentialType("ZZLS10007");
+                                baseStudentUser.setCredentialNumber(objectMap.get("credential_number").toString());
+                                baseStudentUser.setMobile(objectMap.get("mobile").toString());
+                                baseStudentUser.setUserName(objectMap.get("credential_number").toString());
+
+                                List<AddBaseStudentSchoolRollDto> baseStudentSchoolRollList = new ArrayList<>();
+                                AddBaseStudentSchoolRollDto rollDto = new AddBaseStudentSchoolRollDto();
+                                rollDto.setStduyStatus(objectMap.get("stduy_status").toString());
+                                rollDto.setStduyStatus(ArchivesStatusEnum.FB2901.getCode());
+                                rollDto.setMajorSetId(Long.parseLong(objectMap.get("major_set_id").toString()));
+                                rollDto.setStudentType(StudentTypeEnum.FB2801.getCode());
+                                rollDto.setClassId(Long.parseLong(objectMap.get("class_id").toString()));
+                                rollDto.setGradeId(Long.parseLong(objectMap.get("grade_id").toString()));
+                                baseStudentSchoolRollList.add(rollDto);
+                                baseStudentUser.setBaseStudentSchoolRollList(baseStudentSchoolRollList);
+
+                                List<AddBaseStudentDto> baseStudentList = new ArrayList<>();
+                                AddBaseStudentDto studentDto = new AddBaseStudentDto();
+                                studentDto.setIsMigrateChildren(0);
+                                studentDto.setStudentId(baseStudentUser.getCredentialNumber());
+                                studentDto.setIsFloatingPopulation(0);
+                                baseStudentList.add(studentDto);
+                                baseStudentUser.setBaseStudentList(baseStudentList);
+
+                                List<AddBaseStudentContactDto> baseStudentContactList = new ArrayList<>();
+                                baseStudentContactList.add(new AddBaseStudentContactDto());
+                                baseStudentUser.setBaseStudentContactList(baseStudentContactList);
+
+                                List<AddBaseStudentFamilyDto> baseStudentFamilyList = new ArrayList<>();
+                                baseStudentFamilyList.add(new AddBaseStudentFamilyDto());
+                                baseStudentUser.setBaseStudentFamilyList(baseStudentFamilyList);
+
+                                List<AddBaseStudentFamilyMemberDto> baseStudentFamilyMemberList = new ArrayList<>();
+                                baseStudentFamilyMemberList.add(new AddBaseStudentFamilyMemberDto());
+                                baseStudentUser.setBaseStudentFamilyMemberList(baseStudentFamilyMemberList);
+
+                                List<AddBaseStudentSubsidizeDto> baseStudentSubsidizeList = new ArrayList<>();
+                                baseStudentUser.setBaseStudentSubsidizeList(baseStudentSubsidizeList);
+
+                                studentService.add(baseStudentUser);
+                            }else{
+                                schoolRollService.activateStudent(user.getId());
+                                schoolRollService.updateStudentClassGradeMajorStduyStatus(
+                                        Long.parseLong(objectMap.get("class_id").toString()),
+                                        Long.parseLong(objectMap.get("grade_id").toString()),
+                                        Long.parseLong(objectMap.get("major_set_id").toString()),
+                                        objectMap.get("stduy_status").toString(),
+                                        user.getId()
+                                );
+                            }
+                        }
+                    });
+                }
+            });
+        }
+    }
+}

+ 2 - 0
src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java

@@ -733,6 +733,8 @@ public class DataUtil {
             entity.set("jianyue_id", asJsonObject.get("id").getAsString());
             entity.set("key_info", keyInfo);
             entity.set("course_receive_msg_id", courseReceiveMsgId);
+            entity.set("start_time", asJsonObject.get("startTime").getAsString());
+            entity.set("end_time", asJsonObject.get("endTime").getAsString());
             entityList.add(entity);
         }
         if (!entityList.isEmpty()) {

+ 3 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java

@@ -53,6 +53,9 @@ public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSc
     @Update("UPDATE base_student_school_roll SET class_id = #{classId} where user_id = #{userId}")
     Boolean updateStudentClass(Long classId, Long userId);
 
+    @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId},gradeId=#{gradeId},stduy_status=#{stduyStatus} where user_id = #{userId}")
+    Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
+
 
     String getClassNameByUserId(@Param("userId") Long userId);
 

+ 2 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseStudentSchoolRollService.java

@@ -50,6 +50,8 @@ public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStuden
     Boolean updateStudentClass(Long classId, Long userId);
 
     Boolean updateStudentClass(Long classId, Long majorSetId, Long userId);
+    Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
+
 
     List<BaseStudentSompleInfoVo> getInfosByParam(BaseStudentSimpleInfoDto dto);
 

+ 3 - 1
src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java

@@ -9,7 +9,7 @@ import com.xjrsoft.module.student.vo.StudentPersonalInfoVo;
 import java.util.List;
 
 /**
- * @title: 奖学金申请
+ * @title: 学生基本信息
  * @Author dzx
  * @Date: 2023-11-23
  * @Version 1.0
@@ -21,4 +21,6 @@ public interface IBaseStudentService extends MPJBaseService<BaseStudent> {
     List<BaseStudentUserPageVo> getStudentList(BaseStudentUserPageDto dto);
 
     void changeIsNormal(String archivesStatus, Integer isNormal);
+
+    Boolean createStudent(String name, String credentialNumber, String mobile, String stduyStatus, Long classId, Long majorId);
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -242,6 +242,11 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
         return baseStudentSchoolRollMapper.updateStudentClass1(classId, majorSetId, userId);
     }
 
+    @Override
+    public Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId) {
+        return this.baseMapper.updateStudentClassGradeMajorStduyStatus(classId, gradeId, majorSetId, stduyStatus, userId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateStudentClass(Long classId, Long userId) {

+ 95 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java

@@ -1,17 +1,32 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.StpUtil;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.common.utils.CredentialNumberUtil;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.mapper.UserMapper;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.mapper.BaseStudentMapper;
+import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.StudentPersonalInfoVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -24,6 +39,9 @@ import java.util.List;
 @AllArgsConstructor
 public class BaseStudentServiceImpl extends MPJBaseServiceImpl<BaseStudentMapper, BaseStudent> implements IBaseStudentService {
     private final BaseStudentMapper studentMapper;
+    private final UserMapper userMapper;
+    private final BaseStudentSchoolRollMapper schoolRollMapper;
+    private final CommonPropertiesConfig propertiesConfig;
 
     @Override
     public StudentPersonalInfoVo getPersonalInfo(Long userId) {
@@ -47,4 +65,81 @@ public class BaseStudentServiceImpl extends MPJBaseServiceImpl<BaseStudentMapper
             baseMapper.updateById(baseTeacher);
         }
     }
+
+    /**
+     * 创建学生
+     * @param name 姓名
+     * @param credentialNumber 身份证号
+     * @param mobile 手机号
+     * @param stduyStatus 就读方式
+     * @param classId 班级id
+     * @param majorId 专业方向id
+     */
+    @Override
+    @Transactional
+    public Boolean createStudent(String name, String credentialNumber, String mobile, String stduyStatus, Long classId, Long majorId) {
+        User user = userMapper.selectOne(
+                new MPJLambdaWrapper<User>()
+                        .disableLogicDel()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                        .eq(User::getCredentialNumber, credentialNumber)
+        );
+        LocalDate birthDate = CredentialNumberUtil.getBirthDate(credentialNumber);
+        if(user != null){
+            user.setDeleteMark(DeleteMark.NODELETE.getCode());
+            user.setEnabledMark(EnabledMark.ENABLED.getCode());
+            user.setName(name);
+            user.setBirthDate(birthDate.atStartOfDay());
+            user.setMobile(mobile);
+            userMapper.updateById(user);
+
+            BaseStudent student = this.getOne(
+                    new MPJLambdaWrapper<BaseStudent>()
+                            .disableLogicDel()
+                            .select(BaseStudent::getId)
+                            .select(BaseStudent.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudent.class).contains(x.getProperty()))
+                            .eq(BaseStudent::getUserId, user.getId())
+            );
+            student.setDeleteMark(DeleteMark.NODELETE.getCode());
+            student.setEnabledMark(EnabledMark.ENABLED.getCode());
+            student.setIsNormal(1);
+            this.updateById(student);
+
+            BaseStudentSchoolRoll schoolRoll = schoolRollMapper.selectOne(
+                    new MPJLambdaWrapper<BaseStudentSchoolRoll>()
+                            .disableLogicDel()
+                            .select(BaseStudentSchoolRoll::getId)
+                            .select(BaseStudentSchoolRoll.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentSchoolRoll.class).contains(x.getProperty()))
+                            .eq(BaseStudentSchoolRoll::getUserId, user.getId())
+            );
+            schoolRoll.setDeleteMark(DeleteMark.NODELETE.getCode());
+            schoolRoll.setEnabledMark(EnabledMark.ENABLED.getCode());
+            schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+            schoolRoll.setStduyStatus(stduyStatus);
+            schoolRoll.setClassId(classId);
+            schoolRoll.setMajorSetId(majorId);
+            schoolRoll.setModifyUserId(StpUtil.getLoginIdAsLong());
+            schoolRoll.setModifyDate(LocalDateTime.now());
+            schoolRollMapper.updateById(schoolRoll);
+        }else{
+            String gender = CredentialNumberUtil.getGenderByIdCard(credentialNumber);
+
+            user = new User() {{
+                setName(name);
+                setCreateDate(LocalDateTime.now());
+                setDeleteMark(DeleteMark.NODELETE.getCode());
+                setEnabledMark(EnabledMark.ENABLED.getCode());
+                setBirthDate(birthDate.atStartOfDay());
+                setMobile(mobile);
+                setCredentialNumber(credentialNumber);
+                setCredentialType("ZZLS10007");
+                setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+                setGender(GenderDictionaryEnum.getCode(gender));
+                setIsChangePassword(1);
+            }};
+            userMapper.insert(user);
+        }
+        return true;
+    }
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentSompleInfoVo.java

@@ -67,4 +67,15 @@ public class BaseStudentSompleInfoVo {
     @ContentStyle(dataFormat = 49)
     @ApiModelProperty("教师名称")
     private String classroomName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学籍状态")
+    private String archivesStatus;
+
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("年级名称")
+    private String gradeName;
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java

@@ -64,6 +64,13 @@ public class DictionarydetailController {
             }
         }
 
+        if (StrUtil.isNotEmpty(dto.getItemCode())) {
+            DictionaryItem dictionaryItem = dictionaryitemService.getOne(Wrappers.lambdaQuery(DictionaryItem.class).eq(DictionaryItem::getCode, dto.getItemCode()));
+            if (dictionaryItem != null) {
+                queryWrapper.eq(DictionaryDetail::getItemId, dictionaryItem.getId());
+            }
+        }
+
         queryWrapper.eq(ObjectUtil.isNotEmpty(dto.getItemId()) && dto.getItemId() != 0, DictionaryDetail::getItemId, dto.getItemId());
         queryWrapper.select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetailListVo.class).contains(x.getProperty()));
         queryWrapper.orderByAsc(DictionaryDetail::getSortCode);

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

@@ -19,4 +19,6 @@ public class DictionaryDetailListDto {
     private Long itemId;
 
     private String pCode;
+
+    private String itemCode;
 }

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

@@ -116,6 +116,11 @@ xjrsoft:
       - /system/findUserByCode
       - /system/imgcaptcha-answer
       - /student/basestudentinfo/studentinfoByKeyWord
+      - /workflow/execute/new-launch
+      - /system/dictionary-detail
+      - /workflow/execute/start-process-info
+      - /baseGrade/list
+      - /baseSystemConfig/list
     approval-time: 300 # 审核超时时间 目前设为5分钟
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>

+ 3 - 1
src/main/resources/mapper/organization/UserMapper.xml

@@ -28,13 +28,15 @@
         SELECT t1.id, t1.name as student_name, t1.enabled_mark, t1.credential_number, t4.name AS class_name,t1.mobile,
         (SELECT name FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t1.id ORDER BY create_date ASC LIMIT 0,1) as parent_name,
         (SELECT mobile FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t1.id ORDER BY create_date ASC LIMIT 0,1) as parent_mobile,
-        t1.gender,t4.id as class_id, t4.teacher_id,t6.name as teacher_name,t6.user_name as teacher_user_name,t6.mobile as teacher_mobile,t5.name as classroom_name
+        t1.gender,t4.id as class_id, t4.teacher_id,t6.name as teacher_name,t6.user_name as teacher_user_name,t6.mobile as teacher_mobile,t5.name as classroom_name,
+        t3.archives_status,t7.id as grade_id,t7.name as grade_name
         FROM xjr_user t1
         INNER JOIN base_student t2 ON t1.id = t2.user_id
         INNER JOIN base_student_school_roll t3 ON t1.id = t3.user_id
         INNER JOIN base_class t4 ON t4.id = t3.class_id
         left join base_classroom t5 on t4.classroom_id = t5.id
         left join xjr_user t6 on t4.teacher_id = t6.id
+        left join base_grade t7 on t4.grade_id = t7.id
         WHERE t1.delete_mark = 0
         <if test="dto.keyword != null and dto.keyword != ''">
             AND (t1.name like concat('%', #{dto.keyword}, '%') OR t1.credential_number like concat('%', #{dto.keyword}, '%'))

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

@@ -24,7 +24,7 @@
         AND beltcode = #{dto.beltcode} and feeitemcode in (103042766003001, 999010604, 999010603)
     </select>
     <select id="getSpecnameCount" parameterType="com.xjrsoft.module.student.dto.EnrollmentStatisticsInfoDto" resultType="com.xjrsoft.module.student.vo.PbVXsxxsfytbSpecnameCountVo">
-        SELECT specname,COUNT(DISTINCT(Studentcode)) as student_count FROM pb_v_xsxxsfytb WHERE jfzt = '已缴费' AND enteryear = #{dto.year} GROUP BY specname
+        SELECT specname,COUNT(DISTINCT(personalid)) AS student_count FROM pb_cse_feeobjupdate WHERE paymnystate = '已缴费' AND enteryear = #{dto.year} GROUP BY specname
     </select>
     <select id="getStudentFeeInfo" parameterType="com.xjrsoft.module.student.dto.BaseStudentInfoDetailDto" resultType="com.xjrsoft.module.student.vo.PbVXsxxsfytbFeeitemVo">
         SELECT replace(IFNULL((SELECT jfzt FROM pb_v_xsxxsfytb WHERE Studentcode = #{dto.credentialNumber} AND feeitemcode LIKE '999010604%' AND beltcode = #{dto.beltcode}),'欠费'),'未缴费','欠费') AS jxf,