教育训练处考试制证系统后端
zf
2024-02-19 1936cef71ca4ef95d52c951b4af5948c7885b893
考试申报
已修改15个文件
已添加15个文件
1031 ■■■■■ 文件已修改
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/ExamApplyController.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/ExamSiteController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TrainingInstitutionController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/entity/ExamApply.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/entity/TrainingInstitution.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/mapper/ExamApplyMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/mapper/TrainingInstitutionMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/addForm/ExamApplyAddForm.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/modForm/ExamApplyModForm.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/modForm/TrainingInstitutionModForm.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/query/ExamApplyQuery.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/query/TrainingInstitutionQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/vo/ExamApplyVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/ExamApplyService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/ExamSiteService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/TrainingInstitutionService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/ExamApplyServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/ExamSiteServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/TrainingInstitutionServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/noncoalmine/ExamApplyMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/resources/mapper/noncoalmine/TrainingInstitutionMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SysDistrictVo.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/TrainingInstitutionVo.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserInstitution.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserInstitutionMapper.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserInstitutionMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/ExamApplyController.java
对比新文件
@@ -0,0 +1,100 @@
package com.gkhy.exam.noncoalmine.controller;
import com.gkhy.exam.noncoalmine.entity.ExamApply;
import com.gkhy.exam.noncoalmine.model.addForm.ExamApplyAddForm;
import com.gkhy.exam.noncoalmine.model.modForm.ExamApplyModForm;
import com.gkhy.exam.noncoalmine.model.modForm.ExamSiteModForm;
import com.gkhy.exam.noncoalmine.model.query.ExamApplyQuery;
import com.gkhy.exam.noncoalmine.service.ExamApplyService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "考试申报接口")
@RequestMapping("exam/apply")
@RestController
public class ExamApplyController extends BaseController {
    /**
     * 服务对象
     */
    @Autowired
    private ExamApplyService examApplyService;
    /**
     * 分页查询所有数据
     *
     * @param query 查询实体
     * @return 所有数据
     */
    @ApiOperation(value = "分页查询列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageNum", dataTypeClass = String.class,value = "页码",required = true),
            @ApiImplicitParam(name = "pageSize", dataTypeClass = String.class,value = "页数",required = true),
            /*@ApiImplicitParam(name = "isCm", dataTypeClass = Byte.class,value = "是否是煤矿 1是,0非"),
            @ApiImplicitParam(name = "districtId", dataTypeClass = Long.class,value = "区域id"),
            @ApiImplicitParam(name = "examStartTime", dataTypeClass = Date.class,value = "考试开始时间 yyyy-MM-dd"),
            @ApiImplicitParam(name = "examEndTime", dataTypeClass = Date.class,value = "考试开始时间 yyyy-MM-dd"),*/
    })
    @GetMapping("page/list")
    public TableDataInfo listByPage(ExamApplyQuery query) {
        startPage();
        return getDataTable(this.examApplyService.listByPage(query));
    }
    /**
     * 通过主键查询单条数据
     *
     * @param applyId 主键
     * @return 单条数据
     */
    @ApiOperation(value = "通过主键查询单条数据")
    @GetMapping("get/{applyId}")
    public AjaxResult selectOne(@PathVariable Long applyId) {
        return success(this.examApplyService.getById(applyId));
    }
    /**
     * 新增数据
     *
     * @param addForm 实体对象
     * @return 新增结果
     */
    @ApiOperation(value = "新增数据")
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody ExamApplyAddForm addForm) {
        return toAjax(this.examApplyService.add(addForm));
    }
    /**
     * 修改数据
     *
     * @param modForm 实体对象
     * @return 修改结果
     */
    @ApiOperation(value = "修改数据")
    @PostMapping("/mod")
    public AjaxResult mod(@Validated @RequestBody ExamApplyModForm modForm) {
        return toAjax(this.examApplyService.mod(modForm));
    }
    /**
     * 删除数据
     *
     * @param applyIds 主键结合
     * @return 删除结果
     */
    @ApiOperation(value = "删除数据")
    @DeleteMapping("/del/batch/{applyIds}")
    public AjaxResult delBatch(@PathVariable("applyIds") List<Long> applyIds) {
        this.examApplyService.delBatch(applyIds);
        return success();
    }
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/ExamSiteController.java
@@ -97,5 +97,16 @@
        this.examSiteService.delBatch(siteIds);
        return success();
    }
    /**
     * 根据机构查询下拉
     */
    @ApiOperation(value = "根据机构查询下拉考点")
    @GetMapping("select/{institutionId}")
    public AjaxResult getSiteByInstitutionId(@PathVariable Long institutionId) {
        return success(this.examSiteService.getSiteByInstitutionId(institutionId));
    }
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TrainingInstitutionController.java
@@ -6,6 +6,7 @@
import com.gkhy.exam.noncoalmine.service.TrainingInstitutionService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -103,7 +104,16 @@
    @ApiOperation(value = "选择列表")
    @GetMapping("select")
    public AjaxResult selectList(TrainingInstitutionQuery query){
        return success(this.trainingInstitutionService.listByPage(query));
        return success(this.trainingInstitutionService.select(query));
    }
    /**
     * 选择列表-根据角色身份
     */
    @ApiOperation(value = "选择列表-根据角色身份")
    @GetMapping("selectByPermission")
    public AjaxResult selectByPermissionList(TrainingInstitutionQuery query){
        return success(this.trainingInstitutionService.selectByPermissionList(query));
    }
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/entity/ExamApply.java
对比新文件
@@ -0,0 +1,81 @@
package com.gkhy.exam.noncoalmine.entity;
import java.time.LocalDateTime;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import java.io.Serializable;
/**
 * (ExamApply)表实体类
 *
 * @author makejava
 * @since 2024-02-04 13:36:51
 */
@Data
public class ExamApply{
    @TableId(type = IdType.AUTO)
    private Long applyId;
    //考试计划批次全称
    private String examName;
    //机构
    private Long institutionId;
    //考点
    private Long siteId;
    //考试人数
    private Integer examNum;
    //是否为煤矿:0为非,1是
    private Byte isCm;
    //考试开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examStartTime;
    //考试结束时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examEndTime;
    //补考开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitStartTime;
    //补考结束时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitEndTime;
    //实操开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationStartTime;
    //实操结束时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationEndTime;
    //考点联系人
    private String siteContacts;
    //考点联系人电话
    private String siteContactsPhone;
    //机构联系人
    private String institutionContacts;
    //机构联系人电话
    private String institutionContactsPhone;
    private Integer delFlag;
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/entity/TrainingInstitution.java
@@ -13,16 +13,11 @@
import java.io.Serializable;
/**
 * (TrainingInstitution)表实体类
 *
 * @author makejava
 * @since 2023-09-13 16:12:31
 */
@Data
public class TrainingInstitution {
    @TableId(type = IdType.AUTO)
    private String institutionId;
    private Long institutionId;
    //机构名称
    private String institutionName;
    //地区id
exam-system/src/main/java/com/gkhy/exam/noncoalmine/mapper/ExamApplyMapper.java
对比新文件
@@ -0,0 +1,25 @@
package com.gkhy.exam.noncoalmine.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gkhy.exam.noncoalmine.entity.ExamApply;
import com.gkhy.exam.noncoalmine.model.query.ExamApplyQuery;
import com.gkhy.exam.noncoalmine.model.vo.ExamApplyVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * (ExamApply)表数据库访问层
 *
 * @author makejava
 * @since 2024-02-04 13:36:49
 */
@Repository
@Mapper
public interface ExamApplyMapper extends BaseMapper<ExamApply> {
    List<ExamApplyVO> listByPage(@Param("query") ExamApplyQuery query);
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/mapper/TrainingInstitutionMapper.java
@@ -21,5 +21,9 @@
public interface TrainingInstitutionMapper extends BaseMapper<TrainingInstitution> {
    List<TrainingInstitutionVO> listByPage(@Param("query") TrainingInstitutionQuery query);
    List<TrainingInstitutionVO> selectAll(@Param("query") TrainingInstitutionQuery query);
    List<TrainingInstitutionVO> getUserInstitutions(@Param("query") TrainingInstitutionQuery query);
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/addForm/ExamApplyAddForm.java
对比新文件
@@ -0,0 +1,86 @@
package com.gkhy.exam.noncoalmine.model.addForm;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
 * @email 1603559716@qq.com
 * @author: zf
 * @date: 2024/2/4
 * @time: 14:39
 */
@ApiModel
@Data
public class ExamApplyAddForm {
    @ApiModelProperty(value = "考试批次全称",required = true)
    @NotEmpty(message = "请填写考试批次全称")
    private String examName;
    @ApiModelProperty(value = "机构id",required = true)
    @NotNull(message = "请选择机构")
    private Long institutionId;
    @ApiModelProperty(value = "考试点id",required = true)
    @NotNull(message = "请选择考试点")
    private Long siteId;
    @ApiModelProperty(value = "考试人数",required = true)
    @NotNull(message = "请填写考试人数")
    private Integer examNum;
    //是否为煤矿:0为非,1是
    @ApiModelProperty(value = "是否为煤矿",required = true,notes = "0为非,1是")
    @NotNull(message = "请选择是否为煤矿")
    private Byte isCm;
    @ApiModelProperty(value = "考试开始时间")
    @NotNull(message = "请选择考试开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examStartTime;
    @ApiModelProperty(value = "考试结束时间")
    @NotNull(message = "请选择考试结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examEndTime;
    @ApiModelProperty(value = "补考开始时间")
    @NotNull(message = "请选择补考开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitStartTime;
    @ApiModelProperty(value = "补考结束时间")
    @NotNull(message = "请选择补考结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitEndTime;
    @ApiModelProperty(value = "实操开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationStartTime;
    @ApiModelProperty(value = "实操结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationEndTime;
    @ApiModelProperty(value = "考点联系人")
    @NotEmpty(message = "请输入考点联系人")
    private String siteContacts;
    @ApiModelProperty(value = "考点联系人电话")
    @NotEmpty(message = "请输入考点联系人电话")
    private String siteContactsPhone;
    @ApiModelProperty(value = "机构联系人")
    @NotEmpty(message = "请输入机构联系人")
    private String institutionContacts;
    @ApiModelProperty(value = "机构联系人电话")
    @NotEmpty(message = "请输入机构联系人电话")
    private String institutionContactsPhone;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/modForm/ExamApplyModForm.java
对比新文件
@@ -0,0 +1,90 @@
package com.gkhy.exam.noncoalmine.model.modForm;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
 * @email 1603559716@qq.com
 * @author: zf
 * @date: 2024/2/4
 * @time: 14:57
 */
@ApiModel
@Data
public class ExamApplyModForm {
    @NotNull(message = "请选择考试申报id")
    private Long applyId;
    @ApiModelProperty(value = "考试批次全称",required = true)
    @NotEmpty(message = "请填写考试批次全称")
    private String examName;
    @ApiModelProperty(value = "机构id",required = true)
    @NotNull(message = "请选择机构")
    private Long institutionId;
    @ApiModelProperty(value = "考试点id",required = true)
    @NotNull(message = "请选择考试点")
    private Long siteId;
    @ApiModelProperty(value = "考试人数",required = true)
    @NotNull(message = "请填写考试人数")
    private Integer examNum;
    //是否为煤矿:0为非,1是
    @ApiModelProperty(value = "是否为煤矿",required = true,notes = "0为非,1是")
    @NotNull(message = "请选择是否为煤矿")
    private Byte isCm;
    @ApiModelProperty(value = "考试开始时间")
    @NotNull(message = "请选择考试开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examStartTime;
    @ApiModelProperty(value = "考试结束时间")
    @NotNull(message = "请选择考试结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examEndTime;
    @ApiModelProperty(value = "补考开始时间")
    @NotNull(message = "请选择补考开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitStartTime;
    @ApiModelProperty(value = "补考结束时间")
    @NotNull(message = "请选择补考结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitEndTime;
    @ApiModelProperty(value = "实操开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationStartTime;
    @ApiModelProperty(value = "实操结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationEndTime;
    @ApiModelProperty(value = "考点联系人")
    @NotEmpty(message = "请输入考点联系人")
    private String siteContacts;
    @ApiModelProperty(value = "考点联系人电话")
    @NotEmpty(message = "请输入考点联系人电话")
    private String siteContactsPhone;
    @ApiModelProperty(value = "机构联系人")
    @NotEmpty(message = "请输入机构联系人")
    private String institutionContacts;
    @ApiModelProperty(value = "机构联系人电话")
    @NotEmpty(message = "请输入机构联系人电话")
    private String institutionContactsPhone;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/modForm/TrainingInstitutionModForm.java
@@ -16,7 +16,7 @@
public class TrainingInstitutionModForm {
    @ApiModelProperty(value = "机构主键",required = true)
    @NotNull(message = "机构主键不可为空")
    private String institutionId;
    private Long institutionId;
    //机构名称
    @ApiModelProperty(value = "机构名称",required = true)
    @NotEmpty(message = "请输入机构名称")
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/query/ExamApplyQuery.java
对比新文件
@@ -0,0 +1,29 @@
package com.gkhy.exam.noncoalmine.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * @email 1603559716@qq.com
 * @author: zf
 * @date: 2024/2/4
 * @time: 13:43
 */
@ApiModel
@Data
public class ExamApplyQuery {
    @ApiModelProperty(value = "区域id")
    private Long districtId;
    @ApiModelProperty(value = "是否是煤矿 1是,0非")
    private Byte isCm;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date examStartTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date examEndTime;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/query/TrainingInstitutionQuery.java
@@ -23,4 +23,6 @@
    //区划编码
    @ApiModelProperty(value = "区划编码")
    private String districtCode;
    private Long userId;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/model/vo/ExamApplyVO.java
对比新文件
@@ -0,0 +1,64 @@
package com.gkhy.exam.noncoalmine.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
 * @email 1603559716@qq.com
 * @author: zf
 * @date: 2024/2/4
 * @time: 13:47
 */
@Data
public class ExamApplyVO {
    private Long applyId;
    private String examName;
    private Long institutionId;
    private String institutionName;
    private Long siteId;
    private String siteName;
    private String districtName;
    private Integer examNum;
    //是否为煤矿:0为非,1是
    private Byte isCm;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date examEndTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date resitEndTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationEndTime;
    private String siteContacts;
    private String siteContactsPhone;
    private String institutionContacts;
    private String institutionContactsPhone;
    private Integer delFlag;
    private Date createTime;
    private Date updateTime;
    private String createBy;
    private String updateBy;
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/ExamApplyService.java
对比新文件
@@ -0,0 +1,21 @@
package com.gkhy.exam.noncoalmine.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gkhy.exam.noncoalmine.entity.ExamApply;
import com.gkhy.exam.noncoalmine.model.addForm.ExamApplyAddForm;
import com.gkhy.exam.noncoalmine.model.modForm.ExamApplyModForm;
import com.gkhy.exam.noncoalmine.model.query.ExamApplyQuery;
import com.gkhy.exam.noncoalmine.model.vo.ExamApplyVO;
import java.util.List;
public interface ExamApplyService extends IService<ExamApply> {
    List<ExamApplyVO> listByPage(ExamApplyQuery query);
    void delBatch(List<Long> applyIds);
    int add(ExamApplyAddForm addForm);
    int mod(ExamApplyModForm modForm);
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/ExamSiteService.java
@@ -24,5 +24,7 @@
    int mod(ExamSiteModForm modForm);
    void delBatch(List<Long> siteIds);
    List<ExamSite> getSiteByInstitutionId(Long institutionId);
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/TrainingInstitutionService.java
@@ -6,6 +6,7 @@
import com.gkhy.exam.noncoalmine.model.modForm.TrainingInstitutionModForm;
import com.gkhy.exam.noncoalmine.model.query.TrainingInstitutionQuery;
import com.gkhy.exam.noncoalmine.model.vo.TrainingInstitutionVO;
import com.ruoyi.common.core.domain.model.LoginUser;
import java.util.List;
@@ -24,5 +25,9 @@
    int add(TrainingInstitutionAddForm addForm);
    void delBatch(List<Long> institutionIds);
    List<TrainingInstitutionVO> selectByPermissionList(TrainingInstitutionQuery query);
    List<TrainingInstitutionVO> select(TrainingInstitutionQuery query);
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/ExamApplyServiceImpl.java
对比新文件
@@ -0,0 +1,53 @@
package com.gkhy.exam.noncoalmine.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.noncoalmine.entity.ExamApply;
import com.gkhy.exam.noncoalmine.entity.ExamSite;
import com.gkhy.exam.noncoalmine.mapper.ExamApplyMapper;
import com.gkhy.exam.noncoalmine.model.addForm.ExamApplyAddForm;
import com.gkhy.exam.noncoalmine.model.modForm.ExamApplyModForm;
import com.gkhy.exam.noncoalmine.model.query.ExamApplyQuery;
import com.gkhy.exam.noncoalmine.model.vo.ExamApplyVO;
import com.gkhy.exam.noncoalmine.service.ExamApplyService;
import com.ruoyi.common.utils.bean.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @email 1603559716@qq.com
 * @author: zf
 * @date: 2024/2/4
 * @time: 13:40
 */
@Service("examApplyService")
public class ExamApplyServiceImpl extends ServiceImpl<ExamApplyMapper, ExamApply> implements ExamApplyService {
    @Override
    public List<ExamApplyVO> listByPage(ExamApplyQuery query) {
        return baseMapper.listByPage(query);
    }
    @Override
    public void delBatch(List<Long> applyIds) {
        UpdateWrapper<ExamApply> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("apply_id",applyIds)
                .set("del_flag",(byte)2);
        this.update(updateWrapper);
    }
    @Override
    public int add(ExamApplyAddForm addForm) {
        ExamApply examApply = new ExamApply();
        BeanUtils.copyProperties(addForm,examApply);
        examApply.setDelFlag(0);
        return baseMapper.insert(examApply);
    }
    @Override
    public int mod(ExamApplyModForm modForm) {
        ExamApply examApply = new ExamApply();
        BeanUtils.copyProperties(modForm,examApply);
        return baseMapper.updateById(examApply);
    }
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/ExamSiteServiceImpl.java
@@ -1,5 +1,6 @@
package com.gkhy.exam.noncoalmine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.noncoalmine.entity.ExamSite;
@@ -94,5 +95,11 @@
                .set("del_flag",(byte)2);
        this.update(updateWrapper);
    }
    @Override
    public List<ExamSite> getSiteByInstitutionId(Long institutionId) {
        List<ExamSite> examSites = baseMapper.selectList(new LambdaQueryWrapper<ExamSite>().eq(ExamSite::getDelFlag, (byte) 0).eq(ExamSite::getInstitutionId, institutionId));
        return examSites;
    }
}
exam-system/src/main/java/com/gkhy/exam/noncoalmine/service/impl/TrainingInstitutionServiceImpl.java
@@ -1,5 +1,6 @@
package com.gkhy.exam.noncoalmine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.noncoalmine.entity.TrainingInstitution;
@@ -11,6 +12,7 @@
import com.gkhy.exam.noncoalmine.model.vo.TrainingInstitutionVO;
import com.gkhy.exam.noncoalmine.service.TrainingInstitutionService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysDistrict;
@@ -19,15 +21,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * (TrainingInstitution)表服务实现类
 *
 * @author makejava
 * @since 2023-09-13 16:12:31
 */
@Service("trainingInstitutionService")
public class TrainingInstitutionServiceImpl extends ServiceImpl<TrainingInstitutionMapper, TrainingInstitution> implements TrainingInstitutionService {
    @Autowired
@@ -80,5 +78,26 @@
        this.update(updateWrapper);
    }
    @Override
    public List<TrainingInstitutionVO> selectByPermissionList(TrainingInstitutionQuery query) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        List<TrainingInstitutionVO> institutionVOList = new ArrayList<>();
        Set<String> permissions = loginUser.getPermissions();
        if(permissions.contains("admin") || permissions.contains("common")){
            //管理员
            institutionVOList = trainingInstitutionMapper.selectAll(query);
        }else {
            query.setUserId(loginUser.getUserId());
            institutionVOList = trainingInstitutionMapper.getUserInstitutions(query);
        }
        return institutionVOList;
    }
    @Override
    public List<TrainingInstitutionVO> select(TrainingInstitutionQuery query) {
        return trainingInstitutionMapper.selectAll(query);
    }
}
exam-system/src/main/resources/mapper/noncoalmine/ExamApplyMapper.xml
对比新文件
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gkhy.exam.noncoalmine.mapper.ExamApplyMapper">
    <select id="listByPage" resultType="com.gkhy.exam.noncoalmine.model.vo.ExamApplyVO">
        SELECT
        ea.*,
        t.institution_name,
        es.site_name,
        d.NAME AS districtName
        FROM
        exam_apply ea
        LEFT JOIN training_institution t ON t.institution_id = ea.institution_id
        LEFT JOIN sys_district d ON d.id = t.district_id
        LEFT JOIN exam_site es ON es.site_id = ea.site_id
        WHERE
        ea.del_flag = 0
        <if test="query.districtId != null">
            and d.district_id = #{query.districtId}
        </if>
        <if test="query.examStartTime != null"><!-- 开始时间检索 -->
            and date_format(ea.exam_start_time,'%y-%m-%d') &gt;= date_format(#{query.examStartTime},'%y-%m-%d')
        </if>
        <if test="query.examEndTime != null"><!-- 结束时间检索 -->
            and date_format(ea.exam_end_time,'%y-%m-%d') &lt;= date_format(#{query.examEndTime},'%y-%m-%d')
        </if>
        order by ea.create_time desc
    </select>
</mapper>
exam-system/src/main/resources/mapper/noncoalmine/TrainingInstitutionMapper.xml
@@ -24,4 +24,39 @@
        order by t.create_time desc
    </select>
    <select id="selectAll" resultType="com.gkhy.exam.noncoalmine.model.vo.TrainingInstitutionVO">
        SELECT
        t.*,
        d.name as districtName
        FROM
        training_institution t
        LEFT JOIN sys_district d ON d.id = t.district_id
        WHERE
         t.del_flag = 0
        <if test="query.institutionName != null and query.institutionName != ''">
            and t.institution_name like concat('%', #{query.institutionName}, '%')
        </if>
        <if test="query.isCm != null">
            AND t.is_cm = #{query.isCm}
        </if>
        order by t.is_cm asc
    </select>
    <select id="getUserInstitutions" resultType="com.gkhy.exam.noncoalmine.model.vo.TrainingInstitutionVO">
        SELECT
            t.*,
            d.NAME AS districtName
        FROM
            sys_user_institution ui
                LEFT JOIN training_institution t ON ui.institution_id = t.institution_id
                LEFT JOIN sys_district d ON d.id = t.district_id
        WHERE
            ui.user_id = #{query.userId}
        <if test="query.institutionName != null and query.institutionName != ''">
            and t.institution_name like concat('%', #{query.institutionName}, '%')
        </if>
        order by t.create_time desc
    </select>
</mapper>
ruoyi-admin/src/main/resources/application-dev.yml
@@ -24,9 +24,9 @@
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://121.239.169.30:33306/swspkmas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: gkhynew
                password: 123456
                url: jdbc:mysql://localhost:3306/swspkmas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: root
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -3,6 +3,9 @@
import java.util.Date;
import java.util.List;
import javax.validation.constraints.*;
import com.ruoyi.common.core.domain.model.SysDistrictVo;
import com.ruoyi.common.core.domain.model.TrainingInstitutionVo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
@@ -28,7 +31,9 @@
    /** 部门ID */
    @Excel(name = "部门编号", type = Type.IMPORT)
    private Long deptId;
    /**
     * 区域
     */
    private Long districtId;
    private String unit;
@@ -92,6 +97,19 @@
    /** 角色ID */
    private Long roleId;
    /**
     * 身份证
     */
    private String  idCard;
    /***
     * 机构ids
     */
    private Long[] institutionIds;
    private SysDistrictVo district;
    private List<TrainingInstitutionVo> institutions;
    public SysUser()
    {
@@ -317,6 +335,38 @@
        this.unit = unit;
    }
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
    public SysDistrictVo getDistrict() {
        return district;
    }
    public void setDistrict(SysDistrictVo district) {
        this.district = district;
    }
    public Long[] getInstitutionIds() {
        return institutionIds;
    }
    public void setInstitutionIds(Long[] institutionIds) {
        this.institutionIds = institutionIds;
    }
    public List<TrainingInstitutionVo> getInstitutions() {
        return institutions;
    }
    public void setInstitutions(List<TrainingInstitutionVo> institutions) {
        this.institutions = institutions;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SysDistrictVo.java
对比新文件
@@ -0,0 +1,54 @@
package com.ruoyi.common.core.domain.model;
public class SysDistrictVo {
    private Long districtId;
    private String districtCode;
    private String districtName;
    private String parentcode;
    private Byte districtType;
    public Long getDistrictId() {
        return districtId;
    }
    public void setDistrictId(Long districtId) {
        this.districtId = districtId;
    }
    public String getDistrictCode() {
        return districtCode;
    }
    public void setDistrictCode(String districtCode) {
        this.districtCode = districtCode;
    }
    public String getDistrictName() {
        return districtName;
    }
    public void setDistrictName(String districtName) {
        this.districtName = districtName;
    }
    public String getParentcode() {
        return parentcode;
    }
    public void setParentcode(String parentcode) {
        this.parentcode = parentcode;
    }
    public Byte getDistrictType() {
        return districtType;
    }
    public void setDistrictType(Byte districtType) {
        this.districtType = districtType;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/TrainingInstitutionVo.java
对比新文件
@@ -0,0 +1,33 @@
package com.ruoyi.common.core.domain.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class TrainingInstitutionVo {
    private Long institutionId;
    //机构名称
    private String institutionName;
    //地区id
    private Long districtId;
    //地址
    private String address;
    //负责人
    private String header;
    //负责人电话
    private String hphone;
    //联系人
    private String contact;
    //联系人电话
    private String cphone;
    //是否为煤矿:0为非,1是
    private Byte isCm;
    //备注
    private String remark;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserInstitution.java
对比新文件
@@ -0,0 +1,10 @@
package com.ruoyi.system.domain;
import lombok.Data;
@Data
public class SysUserInstitution {
    private Long userId;
    private Long institutionId;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserInstitutionMapper.java
对比新文件
@@ -0,0 +1,45 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.SysUserInstitution;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysUserInstitutionMapper {
    /**
     * 通过用户ID删除用户和机构关联
     *
     * @param userId 用户ID
     * @return 结果
     */
    public int deleteUserInstitutionByUserId(Long userId);
    /**
     * 批量删除用户和机构关联
     *
     * @param userIds 需要删除的数据ID
     * @return 结果
     */
    public int deleteUserInstitution(Long[] userIds);
    /**
     * 批量新增用户机构信息
     *
     * @param userInstitutionList 用户机构列表
     * @return 结果
     */
    public int batchUserInstitution(List<SysUserInstitution> userInstitutionList);
    /**
     * 删除用户和机构关联信息
     *
     * @param userInstitution 用户和机构关联信息
     * @return 结果
     */
    public int deleteUserInstitution(SysUserInstitution userInstitution);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -4,6 +4,9 @@
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Validator;
import com.ruoyi.system.domain.SysUserInstitution;
import com.ruoyi.system.mapper.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,11 +25,6 @@
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.domain.SysUserPost;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysPostMapper;
import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.mapper.SysUserPostMapper;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
@@ -60,6 +58,9 @@
    @Autowired
    protected Validator validator;
    @Autowired
    private SysUserInstitutionMapper institutionMapper;
    /**
     * 根据条件分页查询用户列表
@@ -259,11 +260,14 @@
        // 新增用户信息
        int rows = userMapper.insertUser(user);
        // 新增用户岗位关联
        insertUserPost(user);
        //insertUserPost(user);
        // 新增用户与角色管理
        insertUserRole(user);
        //用户关联机构
        insertUserInstitution(user.getUserId(), user.getInstitutionIds());
        return rows;
    }
    /**
     * 注册用户信息
@@ -293,9 +297,12 @@
        // 新增用户与角色管理
        insertUserRole(user);
        // 删除用户与岗位关联
        userPostMapper.deleteUserPostByUserId(userId);
       /* userPostMapper.deleteUserPostByUserId(userId);
        // 新增用户与岗位管理
        insertUserPost(user);
        insertUserPost(user);*/
        //删除机构
        institutionMapper.deleteUserInstitutionByUserId(userId);
        insertUserInstitution(user.getUserId(), user.getInstitutionIds());
        return userMapper.updateUser(user);
    }
@@ -432,6 +439,29 @@
    }
    /**
     * 新增用户机构信息
     *
     * @param userId 用户ID
     * @param institutionIds 机构组
     */
    public void insertUserInstitution(Long userId, Long[] institutionIds)
    {
        if (StringUtils.isNotEmpty(institutionIds))
        {
            // 新增用户与角色管理
            List<SysUserInstitution> list = new ArrayList<SysUserInstitution>(institutionIds.length);
            for (Long institutionId : institutionIds)
            {
                SysUserInstitution ui = new SysUserInstitution();
                ui.setUserId(userId);
                ui.setInstitutionId(institutionId);
                list.add(ui);
            }
            institutionMapper.batchUserInstitution(list);
        }
    }
    /**
     * 通过用户ID删除用户
     * 
     * @param userId 用户ID
@@ -466,7 +496,9 @@
        // 删除用户与角色关联
        userRoleMapper.deleteUserRole(userIds);
        // 删除用户与岗位关联
        userPostMapper.deleteUserPost(userIds);
        //userPostMapper.deleteUserPost(userIds);
        //删除机构
        institutionMapper.deleteUserInstitution(userIds);
        return userMapper.deleteUserByIds(userIds);
    }
ruoyi-system/src/main/resources/mapper/system/SysUserInstitutionMapper.xml
对比新文件
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserInstitutionMapper">
    <resultMap type="SysUserInstitution" id="SysUserInstitutionResult">
        <result property="userId"     column="user_id"      />
        <result property="institutionId"     column="institution_id"      />
    </resultMap>
    <delete id="deleteUserInstitutionByUserId" parameterType="Long">
        delete from sys_user_institution where user_id=#{userId}
    </delete>
    <delete id="deleteUserInstitution" parameterType="Long">
         delete from sys_user_institution where user_id in
         <foreach collection="array" item="userId" open="(" separator="," close=")">
             #{userId}
        </foreach>
     </delete>
    <insert id="batchUserInstitution">
        insert into sys_user_institution(user_id, institution_id) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.userId},#{item.institutionId})
        </foreach>
    </insert>
    <delete id="deleteUserInstitution" parameterType="SysUserInstitution">
        delete from sys_user_institution where user_id=#{userId} and institution_id=#{institutionId}
    </delete>
</mapper>
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -25,8 +25,11 @@
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="remark"       column="remark"       />
        <result property="idCard"       column="id_card" />
        <association property="dept"    javaType="SysDept"         resultMap="deptResult" />
        <association property="district" javaType="SysDistrictVo"  resultMap="DistrictResult"/>
        <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
        <collection  property="institutions"   javaType="java.util.List"  resultMap="InstitutionResult" />
    </resultMap>
    
    <resultMap id="deptResult" type="SysDept">
@@ -47,20 +50,41 @@
        <result property="dataScope"    column="data_scope"     />
        <result property="status"       column="role_status"    />
    </resultMap>
    <resultMap id="DistrictResult" type="SysDistrictVo">
        <id     property="districtId"       column="district_id"        />
        <result property="districtCode"     column="district_code"      />
        <result property="districtName"      column="district_name"       />
        <result property="parentcode"     column="parentcode"      />
        <result property="districtType"    column="district_type"     />
    </resultMap>
    <resultMap id="InstitutionResult" type="TrainingInstitutionVo">
        <id     property="institutionId"       column="institution_id"        />
        <result property="institutionName"       column="institution_name" />
    </resultMap>
    
    <sql id="selectUserVo">
        select u.user_id, u.dept_id, u.district_id,u.unit,u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
        select u.user_id, u.dept_id, u.district_id,u.unit,u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, u.id_card,
        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,
        di.name as district_name,
        ti.institution_id, ti.institution_name
        from sys_user u
            left join sys_dept d on u.dept_id = d.dept_id
            left join sys_user_role ur on u.user_id = ur.user_id
            left join sys_role r on r.role_id = ur.role_id
            left join sys_district di on di.id = u.district_id
            left join sys_user_institution ui on u.user_id = ui.user_id
            left join training_institution ti on ui.institution_id = ti.institution_id
    </sql>
    
    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
        select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
        select u.user_id, u.dept_id, u.district_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader, u.id_card, ti.institution_id, ti.institution_name, di.name as district_name from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
        left join sys_district di on di.id = u.district_id
        left join sys_user_institution ui on u.user_id = ui.user_id
        left join training_institution ti on ui.institution_id = ti.institution_id
        where u.del_flag = '0'
        <if test="userId != null and userId != 0">
            AND u.user_id = #{userId}
@@ -88,11 +112,13 @@
    </select>
    
    <select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        select distinct u.user_id, u.dept_id, u.district_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time, u.id_card, di.name as district_name
        from sys_user u
             left join sys_dept d on u.dept_id = d.dept_id
             left join sys_user_role ur on u.user_id = ur.user_id
             left join sys_role r on r.role_id = ur.role_id
             left join sys_district di on di.id = u.district_id
        where u.del_flag = '0' and r.role_id = #{roleId}
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
@@ -105,12 +131,13 @@
    </select>
    
    <select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        select distinct u.user_id, u.dept_id, u.district_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time, u.id_card, di.name as district_name
        from sys_user u
             left join sys_dept d on u.dept_id = d.dept_id
             left join sys_user_role ur on u.user_id = ur.user_id
             left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
             left join sys_district di on di.id = u.district_id
        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
        and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and ur.role_id = #{roleId})
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
@@ -158,6 +185,8 @@
             <if test="status != null and status != ''">status,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="remark != null and remark != ''">remark,</if>
            <if test="idCard != null and idCard != ''">id_card,</if>
            <if test="districtId != null and districtId != 0">district_id,</if>
             create_time
         )values(
             <if test="userId != null and userId != ''">#{userId},</if>
@@ -172,6 +201,8 @@
             <if test="status != null and status != ''">#{status},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
            <if test="idCard != null and idCard != ''">#{idCard},</if>
            <if test="districtId != null and districtId != 0">#{districtId},</if>
             sysdate()
         )
    </insert>
@@ -192,6 +223,8 @@
             <if test="loginDate != null">login_date = #{loginDate},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="remark != null">remark = #{remark},</if>
            <if test="idCard != null and idCard != ''">id_card = #{idCard},</if>
            <if test="districtId != null and districtId != 0">district_id = #{districtId},</if>
             update_time = sysdate()
         </set>
         where user_id = #{userId}