实现信息处理、信息报送、值班信息功能

master
YIN 2025-11-28 19:56:56 +08:00
parent 869cd744db
commit 5f921807c3
31 changed files with 1077 additions and 50 deletions

View File

@ -32,8 +32,13 @@ public class LoginUser implements Serializable {
*/
private Long userId;
/**
* ID
* ID
*/
private String workDeptId;
/**
* ID
*/
private String deptId;
@ -43,7 +48,11 @@ public class LoginUser implements Serializable {
private String deptCategory;
/**
*
*
*/
private String workDeptName;
/**
*
*/
private String deptName;

View File

@ -35,6 +35,8 @@ public class LoginHelper {
public static final String TENANT_KEY = "tenantId";
public static final String USER_KEY = "userId";
public static final String USER_NAME_KEY = "userName";
public static final String WORK_DEPT_KEY = "workDeptId";
public static final String WORK_DEPT_NAME_KEY = "workDeptName";
public static final String DEPT_KEY = "deptId";
public static final String DEPT_NAME_KEY = "deptName";
public static final String DEPT_CATEGORY_KEY = "deptCategory";
@ -53,6 +55,8 @@ public class LoginHelper {
model.setExtra(TENANT_KEY, loginUser.getTenantId())
.setExtra(USER_KEY, loginUser.getUserId())
.setExtra(USER_NAME_KEY, loginUser.getUsername())
.setExtra(WORK_DEPT_KEY, loginUser.getWorkDeptId())
.setExtra(WORK_DEPT_NAME_KEY, loginUser.getWorkDeptName())
.setExtra(DEPT_KEY, loginUser.getDeptId())
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
@ -110,6 +114,19 @@ public class LoginHelper {
return Convert.toStr(getExtra(TENANT_KEY));
}
/**
* ID
*/
public static String getWorkDeptId() {
return getExtra(WORK_DEPT_KEY).toString();
}
/**
*
*/
public static String getWorkDeptName() {
return Convert.toStr(getExtra(WORK_DEPT_NAME_KEY));
}
/**
* ID
*/

View File

@ -0,0 +1,105 @@
package org.dromara.biz.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.biz.domain.vo.BizDutyVo;
import org.dromara.biz.domain.bo.BizDutyBo;
import org.dromara.biz.service.IBizDutyService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
*
* @author ruansee
* @date 2025-11-27
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/biz/duty")
public class BizDutyController extends BaseController {
private final IBizDutyService bizDutyService;
/**
*
*/
@SaCheckPermission("biz:duty:list")
@GetMapping("/list")
public TableDataInfo<BizDutyVo> list(BizDutyBo bo, PageQuery pageQuery) {
return bizDutyService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("biz:duty:export")
@Log(title = "值班信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BizDutyBo bo, HttpServletResponse response) {
List<BizDutyVo> list = bizDutyService.queryList(bo);
ExcelUtil.exportExcel(list, "值班信息", BizDutyVo.class, response);
}
/**
*
*
* @param id
*/
@SaCheckPermission("biz:duty:query")
@GetMapping("/{id}")
public R<BizDutyVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bizDutyService.queryById(id));
}
/**
*
*/
@SaCheckPermission("biz:duty:add")
@Log(title = "值班信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BizDutyBo bo) {
return toAjax(bizDutyService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("biz:duty:edit")
@Log(title = "值班信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BizDutyBo bo) {
return toAjax(bizDutyService.updateByBo(bo));
}
/**
*
*
* @param ids
*/
@SaCheckPermission("biz:duty:remove")
@Log(title = "值班信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bizDutyService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -2,12 +2,14 @@ package org.dromara.biz.controller;
import java.util.Date;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.Helper;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
@ -48,6 +50,26 @@ public class BizReportInfoController extends BaseController {
return bizReportInfoService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("biz:reportInfo:list")
@GetMapping("/xxcl/list")
public TableDataInfo<BizReportInfoVo> xxcllist(BizReportInfoBo bo, PageQuery pageQuery) {
bo.setOldTable("xxcl");
return bizReportInfoService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("biz:reportInfo:list")
@GetMapping("/xxbs/list")
public TableDataInfo<BizReportInfoVo> xxbslist(BizReportInfoBo bo, PageQuery pageQuery) {
bo.setOldTable("xxbs");
return bizReportInfoService.queryPageList(bo, pageQuery);
}
/**
*
*/
@ -68,7 +90,12 @@ public class BizReportInfoController extends BaseController {
@GetMapping("/{id}")
public R<BizReportInfoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bizReportInfoService.queryById(id));
BizReportInfoVo info = bizReportInfoService.queryById(id);
if (Helper.FInt(info.getOldId())>0 && !Helper.NStr(info.getUrl()).equals("")){
info.setPdfUrl("/showFile?filePath="+Helper.NStr(info.getUrl()));
}
return R.ok(info);
}
/**

View File

@ -98,11 +98,8 @@ public class BizReportReceiverController extends BaseController {
@Log(title = "报送记录签收", businessType = BusinessType.UPDATE)
@PostMapping("/sign")
public R<Void> sign(@Validated(EditGroup.class) @RequestBody BizReportReceiverBo bo) {
bo.setIsSign(1L);
bo.setSignUserId(LoginHelper.getUserId());
bo.setSignUserName(LoginHelper.getLoginUser().getNickname());
bo.setSignTime(new Date());
return toAjax(bizReportReceiverService.updateByBo(bo));
return toAjax(bizReportReceiverService.sign(bo));
}
/**

View File

@ -0,0 +1,115 @@
package org.dromara.biz.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* biz_duty
*
* @author ruansee
* @date 2025-11-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("biz_duty")
public class BizDuty extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date dutyDate;
/**
* ID
*/
private String deptId;
/**
*
*/
private String deptName;
/**
* ID
*/
private Long leaderId;
/**
*
*/
private String leaderName;
/**
* ID
*/
private Long monitorId;
/**
*
*/
private String monitorName;
/**
* ID
*/
private String watchkeeperIds;
/**
*
*/
private String watchkeeperNames;
/**
*
*/
private Date startTime;
/**
*
*/
private Date endTime;
/**
*
*/
private String level;
/**
*
*/
private String dutyLog;
/**
*
*/
private String status;
/**
* ID
*/
private Long createUserId;
/**
*
*/
private String remark;
private Date createTime;
}

View File

@ -13,7 +13,7 @@ import java.io.Serial;
* biz_report_receiver
*
* @author ruansee
* @date 2025-11-21
* @date 2025-11-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ -47,7 +47,7 @@ public class BizReportReceiver extends BaseEntity {
/**
*
*/
private Long isSign;
private Boolean isSign;
/**
*
@ -64,5 +64,24 @@ public class BizReportReceiver extends BaseEntity {
*/
private String signUserName;
/**
* ID
*/
private Long oldId;
/**
* ID
*/
private String oldUserId;
/**
* ID
*/
private Long oldReportId;
/**
*
*/
private Boolean isFeedback;
}

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.util.Date;
/**
* biz_report_reply
@ -57,5 +58,6 @@ public class BizReportReply extends BaseEntity {
*/
private String fileName;
private Date createTime;
}

View File

@ -0,0 +1,113 @@
package org.dromara.biz.domain.bo;
import org.dromara.biz.domain.BizDuty;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* biz_duty
*
* @author ruansee
* @date 2025-11-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BizDuty.class, reverseConvertGenerate = false)
public class BizDutyBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "ID不能为空", groups = { EditGroup.class })
private Long id;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date dutyDate;
/**
* ID
*/
private String deptId;
/**
*
*/
private String deptName;
/**
* ID
*/
private Long leaderId;
/**
*
*/
private String leaderName;
/**
* ID
*/
private Long monitorId;
/**
*
*/
private String monitorName;
/**
* ID
*/
private String watchkeeperIds;
/**
*
*/
private String watchkeeperNames;
/**
*
*/
private Date startTime;
/**
*
*/
private Date endTime;
/**
*
*/
private String level;
/**
*
*/
private String dutyLog;
/**
*
*/
private String status;
/**
* ID
*/
private Long createUserId;
/**
*
*/
private String remark;
}

View File

@ -15,7 +15,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
* biz_report_receiver
*
* @author ruansee
* @date 2025-11-21
* @date 2025-11-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ -46,7 +46,7 @@ public class BizReportReceiverBo extends BaseEntity {
/**
*
*/
private Long isSign;
private Boolean isSign;
/**
*
@ -63,5 +63,25 @@ public class BizReportReceiverBo extends BaseEntity {
*/
private String signUserName;
/**
* ID
*/
private Long oldId;
/**
* ID
*/
private String oldUserId;
/**
* ID
*/
private Long oldReportId;
/**
*
*/
private Boolean isFeedback;
}

View File

@ -0,0 +1,157 @@
package org.dromara.biz.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.biz.domain.BizDuty;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.system.domain.SysUser;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* biz_duty
*
* @author ruansee
* @date 2025-11-27
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BizDuty.class)
public class BizDutyVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
*
*/
@ExcelProperty(value = "值班日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date dutyDate;
/**
* ID
*/
@ExcelProperty(value = "值班单位ID")
private String deptId;
/**
*
*/
@ExcelProperty(value = "值班单位")
private String deptName;
/**
* ID
*/
@ExcelProperty(value = "局领导ID")
private Long leaderId;
/**
*
*/
@ExcelProperty(value = "局领导名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "leaderId")
private String leaderName;
/**
*
*/
private SysUser leader;
/**
* ID
*/
@ExcelProperty(value = "值班长ID")
private Long monitorId;
/**
*
*/
@ExcelProperty(value = "值班长名称")
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "monitorId")
private String monitorName;
/**
*
*/
private SysUser monitor;
/**
* ID
*/
@ExcelProperty(value = "值班人员ID")
private String watchkeeperIds;
/**
*
*/
@ExcelProperty(value = "值班人员姓名")
private String watchkeeperNames;
/**
*
*/
private List<SysUser> watchkeeperList;
/**
*
*/
@ExcelProperty(value = "值班开始时间")
private Date startTime;
/**
*
*/
@ExcelProperty(value = "值班结束时间")
private Date endTime;
/**
*
*/
@ExcelProperty(value = "勤务等级")
private String level;
/**
*
*/
@ExcelProperty(value = "值班日志")
private String dutyLog;
/**
*
*/
@ExcelProperty(value = "值班状态")
private String status;
/**
* ID
*/
@ExcelProperty(value = "创建用户ID")
private Long createUserId;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -181,4 +181,6 @@ public class BizReportInfoVo implements Serializable {
* ID
*/
private String[] receiverDeptIds;
private String pdfUrl;
}

View File

@ -20,7 +20,7 @@ import java.util.Date;
* biz_report_receiver
*
* @author ruansee
* @date 2025-11-21
* @date 2025-11-28
*/
@Data
@ExcelIgnoreUnannotated
@ -58,7 +58,7 @@ public class BizReportReceiverVo implements Serializable {
*
*/
@ExcelProperty(value = "是否签收")
private Long isSign;
private Boolean isSign;
/**
*
@ -78,5 +78,29 @@ public class BizReportReceiverVo implements Serializable {
@ExcelProperty(value = "签收用户名称")
private String signUserName;
/**
* ID
*/
@ExcelProperty(value = "旧系统ID")
private Long oldId;
/**
* ID
*/
@ExcelProperty(value = "旧系统用户ID")
private String oldUserId;
/**
* ID
*/
@ExcelProperty(value = "旧系统报送ID")
private Long oldReportId;
/**
*
*/
@ExcelProperty(value = "是否反馈")
private Boolean isFeedback;
}

View File

@ -7,6 +7,7 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.vo.SysUserVo;
import java.io.Serial;
import java.io.Serializable;
@ -70,5 +71,14 @@ public class BizReportReplyVo implements Serializable {
@ExcelProperty(value = "附件名称")
private String fileName;
/**
*
*/
private SysUserVo user;
private Date createTime;
private String userName;
private String nickName;
private String avatar;
private String deptName;
private String deptCategory;
}

View File

@ -0,0 +1,15 @@
package org.dromara.biz.mapper;
import org.dromara.biz.domain.BizDuty;
import org.dromara.biz.domain.vo.BizDutyVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author ruansee
* @date 2025-11-27
*/
public interface BizDutyMapper extends BaseMapperPlus<BizDuty, BizDutyVo> {
}

View File

@ -18,12 +18,12 @@ import java.util.List;
*/
public interface BizReportInfoMapper extends BaseMapperPlus<BizReportInfo, BizReportInfoVo> {
@Select("select i.*, c.title as categoryTitle from biz_report_info i left join biz_category c on i.category_id = c.id where i.id = ${id}")
@Select("select * from v_report_info v where id = ${id}")
BizReportInfoVo selectBizReportInfoVoById(@Param("id") Long id);
@Select("select i.*, c.title as categoryTitle from biz_report_info i left join biz_category c on i.category_id = c.id ${ew.getCustomSqlSegment}")
@Select("select * from v_report_info v ${ew.getCustomSqlSegment}")
List<BizReportInfoVo> selectBizReportInfoVoList(@Param("ew") Wrapper<BizReportInfo> queryWrapper);
@Select("select i.*, c.title as categoryTitle from biz_report_info i left join biz_category c on i.category_id = c.id ${ew.getCustomSqlSegment}")
@Select("select * from v_report_info v ${ew.getCustomSqlSegment}")
Page<BizReportInfoVo> selectBizReportInfoVoPage(@Param("page") Page<BizReportInfo> page, @Param("ew") Wrapper<BizReportInfo> queryWrapper);
}

View File

@ -1,6 +1,12 @@
package org.dromara.biz.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.biz.domain.BizReportInfo;
import org.dromara.biz.domain.BizReportReply;
import org.dromara.biz.domain.vo.BizReportInfoVo;
import org.dromara.biz.domain.vo.BizReportReplyVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@ -12,4 +18,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/
public interface BizReportReplyMapper extends BaseMapperPlus<BizReportReply, BizReportReplyVo> {
@Select("select * from v_report_reply v ${ew.getCustomSqlSegment}")
Page<BizReportReplyVo> selectBizReportReplyVoPage(@Param("page") Page<BizReportReply> page, @Param("ew") Wrapper<BizReportReply> queryWrapper);
}

View File

@ -0,0 +1,68 @@
package org.dromara.biz.service;
import org.dromara.biz.domain.vo.BizDutyVo;
import org.dromara.biz.domain.bo.BizDutyBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author ruansee
* @date 2025-11-27
*/
public interface IBizDutyService {
/**
*
*
* @param id
* @return
*/
BizDutyVo queryById(Long id);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<BizDutyVo> queryPageList(BizDutyBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<BizDutyVo> queryList(BizDutyBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(BizDutyBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(BizDutyBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -65,4 +65,12 @@ public interface IBizReportReceiverService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
*
*
* @param bo
* @return
*/
Boolean sign(BizReportReceiverBo bo);
}

View File

@ -0,0 +1,188 @@
package org.dromara.biz.service.impl;
import org.dromara.biz.domain.BizReportInfo;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.service.DeptService;
import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.Helper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.mapper.SysUserMapper;
import org.springframework.stereotype.Service;
import org.dromara.biz.domain.bo.BizDutyBo;
import org.dromara.biz.domain.vo.BizDutyVo;
import org.dromara.biz.domain.BizDuty;
import org.dromara.biz.mapper.BizDutyMapper;
import org.dromara.biz.service.IBizDutyService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
*
* @author ruansee
* @date 2025-11-27
*/
@RequiredArgsConstructor
@Service
public class BizDutyServiceImpl implements IBizDutyService {
private final BizDutyMapper baseMapper;
private final UserService userService;
private final DeptService deptService;
private final SysUserMapper userMapper;
/**
*
*
* @param id
* @return
*/
@Override
public BizDutyVo queryById(Long id){
BizDutyVo duty = baseMapper.selectVoById(id);
duty.setLeader(userMapper.selectById(duty.getLeaderId()));
duty.setMonitor(userMapper.selectById(duty.getMonitorId()));
duty.setWatchkeeperList(userMapper.selectByIds(convertIds(duty.getWatchkeeperIds())));
return duty;
}
List<Long> convertIds(String ids){
List<Long> result = new ArrayList<>();
String[] arr = ids.split(",");
for (String id :
arr) {
result.add(Helper.FLong(id));
}
return result;
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<BizDutyVo> queryPageList(BizDutyBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BizDuty> lqw = buildQueryWrapper(bo);
Page<BizDutyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<BizDutyVo> queryList(BizDutyBo bo) {
LambdaQueryWrapper<BizDuty> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BizDuty> buildQueryWrapper(BizDutyBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BizDuty> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BizDuty::getCreateTime);
lqw.eq(bo.getDutyDate() != null, BizDuty::getDutyDate, bo.getDutyDate());
lqw.between(params.get("beginDutyDate") != null && params.get("endDutyDate") != null,
BizDuty::getDutyDate ,params.get("beginDutyDate"), params.get("endDutyDate"));
lqw.eq(StringUtils.isNotBlank(bo.getDeptId()), BizDuty::getDeptId, bo.getDeptId());
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), BizDuty::getDeptName, bo.getDeptName());
lqw.eq(bo.getLeaderId() != null, BizDuty::getLeaderId, bo.getLeaderId());
lqw.like(StringUtils.isNotBlank(bo.getLeaderName()), BizDuty::getLeaderName, bo.getLeaderName());
lqw.eq(bo.getMonitorId() != null, BizDuty::getMonitorId, bo.getMonitorId());
lqw.like(StringUtils.isNotBlank(bo.getMonitorName()), BizDuty::getMonitorName, bo.getMonitorName());
lqw.eq(StringUtils.isNotBlank(bo.getWatchkeeperIds()), BizDuty::getWatchkeeperIds, bo.getWatchkeeperIds());
lqw.like(StringUtils.isNotBlank(bo.getWatchkeeperNames()), BizDuty::getWatchkeeperNames, bo.getWatchkeeperNames());
lqw.eq(bo.getStartTime() != null, BizDuty::getStartTime, bo.getStartTime());
lqw.eq(bo.getEndTime() != null, BizDuty::getEndTime, bo.getEndTime());
lqw.eq(StringUtils.isNotBlank(bo.getLevel()), BizDuty::getLevel, bo.getLevel());
lqw.eq(StringUtils.isNotBlank(bo.getDutyLog()), BizDuty::getDutyLog, bo.getDutyLog());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BizDuty::getStatus, bo.getStatus());
lqw.eq(bo.getCreateUserId() != null, BizDuty::getCreateUserId, bo.getCreateUserId());
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(BizDutyBo bo) {
BizDuty add = MapstructUtils.convert(bo, BizDuty.class);
LoginUser user = LoginHelper.getLoginUser();
add.setDeptId(user.getDeptId());
add.setCreateUserId(user.getUserId());
add.setLeaderName(userService.selectNicknameById(add.getLeaderId()));
add.setMonitorName(userService.selectNicknameById(add.getMonitorId()));
add.setWatchkeeperNames(userService.selectNicknameByIds(add.getWatchkeeperIds()));
add.setDeptName(user.getDeptName());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(BizDutyBo bo) {
BizDuty update = MapstructUtils.convert(bo, BizDuty.class);
update.setLeaderName(userService.selectNicknameById(update.getLeaderId()));
update.setMonitorName(userService.selectNicknameById(update.getMonitorId()));
update.setWatchkeeperNames(userService.selectNicknameByIds(update.getWatchkeeperIds()));
// update.setDeptName(deptService.selectDeptNameByIds(update.getDeptId()));
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(BizDuty entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -5,6 +5,7 @@ import org.dromara.biz.domain.BizReportReceiver;
import org.dromara.biz.domain.vo.BizReportReceiverVo;
import org.dromara.biz.mapper.BizReportFileMapper;
import org.dromara.biz.mapper.BizReportReceiverMapper;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.Helper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.mapper.SysDeptMapper;
import org.springframework.stereotype.Service;
import org.dromara.biz.domain.bo.BizReportInfoBo;
@ -101,11 +103,12 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BizReportInfo> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BizReportInfo::getReportTime);
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), BizReportInfo::getTitle, bo.getTitle());
lqw.like(StringUtils.isNotBlank(bo.getTitle()), BizReportInfo::getTitle, bo.getTitle());
lqw.eq(bo.getCategoryId() != null, BizReportInfo::getCategoryId, bo.getCategoryId());
lqw.eq(StringUtils.isNotBlank(bo.getChao()), BizReportInfo::getChao, bo.getChao());
lqw.eq(StringUtils.isNotBlank(bo.getLdps()), BizReportInfo::getLdps, bo.getLdps());
lqw.eq(StringUtils.isNotBlank(bo.getQh()), BizReportInfo::getQh, bo.getQh());
lqw.eq(StringUtils.isNotBlank(bo.getOldTable()), BizReportInfo::getOldTable, bo.getOldTable());
lqw.eq(StringUtils.isNotBlank(bo.getOldType()), BizReportInfo::getOldType, bo.getOldType());
lqw.eq(bo.getOldId() != null, BizReportInfo::getOldId, bo.getOldId());
lqw.eq(StringUtils.isNotBlank(bo.getUrl()), BizReportInfo::getUrl, bo.getUrl());
@ -121,6 +124,20 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
lqw.like(StringUtils.isNotBlank(bo.getReportDeptName()), BizReportInfo::getReportDeptName, bo.getReportDeptName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BizReportInfo::getStatus, bo.getStatus());
lqw.eq(bo.getUpdateUserId() != null, BizReportInfo::getUpdateUserId, bo.getUpdateUserId());
String table = Helper.NStr(bo.getOldTable());
LoginUser user = LoginHelper.getLoginUser();
if (table.equals("xxcl")){
lqw.and(w-> {
// w.eq(user.getDeptId()!=null, BizReportInfo::getReportDeptId, user.getDeptId());
w.likeRight(BizReportInfo::getReportDeptId, Helper.PrefixDeptid(user.getDeptId()));
w.or(ww->{
ww.exists("select id from biz_report_receiver where dept_id = '"+ Helper.NStr(user.getDeptId()) +" and report_id = v.id '");
});
});
} else if (table.equals("xxbs")){
lqw.likeRight(BizReportInfo::getReportDeptId, Helper.PrefixDeptid(user.getDeptId()));
}
return lqw;
}
@ -139,7 +156,7 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
bo.setId(add.getId());
// 插入接收单位表
if(bo.getReceiverDeptIds().length>0){
if(bo.getReceiverDeptIds()!=null && bo.getReceiverDeptIds().length>0){
for (String deptId : bo.getReceiverDeptIds()) {
BizReportReceiver receiver = new BizReportReceiver();
receiver.setReportId(bo.getId());
@ -150,7 +167,7 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
}
// 插入附件表
if (bo.getFiles().size()>0){
if (bo.getFiles()!=null && bo.getFiles().size()>0){
for (BizReportFile file : bo.getFiles()) {
file.setReportId(bo.getId());
fileMapper.insert(file);
@ -177,18 +194,20 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
if (flag){
// 插入接收单位表
List<String> dbDeptIds = new ArrayList<>();
if (bo.getReceiverDepts().size()>0) {
for (BizReportReceiver receiver : bo.getReceiverDepts()) {
if (!Arrays.asList(bo.getReceiverDeptIds()).contains(receiver.getDeptId()))
receiverMapper.deleteById(receiver.getId());
dbDeptIds.add(receiver.getDeptId());
if (bo.getReceiverDepts()!=null) {
if (bo.getReceiverDepts().size() > 0) {
for (BizReportReceiver receiver : bo.getReceiverDepts()) {
if (!Arrays.asList(bo.getReceiverDeptIds()).contains(receiver.getDeptId()))
receiverMapper.deleteById(receiver.getId());
dbDeptIds.add(receiver.getDeptId());
}
} else {
LambdaQueryWrapper<BizReportReceiver> lqw = Wrappers.lambdaQuery();
lqw.eq(BizReportReceiver::getReportId, bo.getId());
receiverMapper.delete(lqw);
}
}else{
LambdaQueryWrapper<BizReportReceiver> lqw = Wrappers.lambdaQuery();
lqw.eq(BizReportReceiver::getReportId, bo.getId());
receiverMapper.delete(lqw);
}
if(bo.getReceiverDeptIds().length>0){
if(bo.getReceiverDeptIds()!=null && bo.getReceiverDeptIds().length>0){
for (String deptId : bo.getReceiverDeptIds()) {
if (dbDeptIds.contains(deptId)) continue;
else {
@ -202,7 +221,7 @@ public class BizReportInfoServiceImpl implements IBizReportInfoService {
}
// 插入附件表
if (bo.getFiles().size()>0){
if (bo.getFiles()!=null && bo.getFiles().size()>0){
for (BizReportFile file : bo.getFiles()) {
if (Helper.FInt(file.getId())>0) continue;

View File

@ -1,5 +1,7 @@
package org.dromara.biz.service.impl;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.Helper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -8,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;
import org.dromara.biz.domain.bo.BizReportReceiverBo;
import org.dromara.biz.domain.vo.BizReportReceiverVo;
@ -15,6 +18,7 @@ import org.dromara.biz.domain.BizReportReceiver;
import org.dromara.biz.mapper.BizReportReceiverMapper;
import org.dromara.biz.service.IBizReportReceiverService;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@ -23,7 +27,7 @@ import java.util.Collection;
* Service
*
* @author ruansee
* @date 2025-11-21
* @date 2025-11-28
*/
@RequiredArgsConstructor
@Service
@ -73,12 +77,17 @@ public class BizReportReceiverServiceImpl implements IBizReportReceiverService {
LambdaQueryWrapper<BizReportReceiver> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(BizReportReceiver::getId);
lqw.eq(bo.getReportId() != null, BizReportReceiver::getReportId, bo.getReportId());
lqw.eq(bo.getDeptId() != null, BizReportReceiver::getDeptId, bo.getDeptId());
lqw.eq(StringUtils.isNotBlank(bo.getDeptId()), BizReportReceiver::getDeptId, bo.getDeptId());
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), BizReportReceiver::getDeptName, bo.getDeptName());
lqw.eq(bo.getIsSign() != null, BizReportReceiver::getIsSign, bo.getIsSign());
lqw.eq(bo.getSignTime() != null, BizReportReceiver::getSignTime, bo.getSignTime());
lqw.between(params.get("beginSignTime") != null && params.get("endSignTime") != null,
BizReportReceiver::getSignTime ,params.get("beginSignTime"), params.get("endSignTime"));
lqw.eq(bo.getSignUserId() != null, BizReportReceiver::getSignUserId, bo.getSignUserId());
lqw.like(StringUtils.isNotBlank(bo.getSignUserName()), BizReportReceiver::getSignUserName, bo.getSignUserName());
lqw.eq(bo.getOldId() != null, BizReportReceiver::getOldId, bo.getOldId());
lqw.eq(StringUtils.isNotBlank(bo.getOldUserId()), BizReportReceiver::getOldUserId, bo.getOldUserId());
lqw.eq(bo.getOldReportId() != null, BizReportReceiver::getOldReportId, bo.getOldReportId());
lqw.eq(bo.getIsFeedback() != null, BizReportReceiver::getIsFeedback, bo.getIsFeedback());
return lqw;
}
@ -133,4 +142,33 @@ public class BizReportReceiverServiceImpl implements IBizReportReceiverService {
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean sign(BizReportReceiverBo bo) {
LoginUser user = LoginHelper.getLoginUser();
if (Helper.FInt(bo.getId()) == 0){
BizReportReceiverBo sbo = new BizReportReceiverBo();
sbo.setReportId(bo.getReportId());
sbo.setDeptId(user.getDeptId());
LambdaQueryWrapper<BizReportReceiver> lqw = buildQueryWrapper(sbo);
List<BizReportReceiverVo> list = baseMapper.selectVoList(lqw);
if (list!=null && list.size()>0){
BizReportReceiverVo vo = list.get(0);
bo.setId(vo.getId());
} else return false;
}
bo.setIsSign(true);
bo.setSignUserId(user.getUserId());
bo.setSignUserName(user.getNickname());
bo.setSignTime(new Date());
BizReportReceiver update = MapstructUtils.convert(bo, BizReportReceiver.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
}

View File

@ -1,5 +1,10 @@
package org.dromara.biz.service.impl;
import org.dromara.biz.domain.BizReportReceiver;
import org.dromara.biz.domain.bo.BizReportReceiverBo;
import org.dromara.biz.domain.vo.BizReportReceiverVo;
import org.dromara.biz.mapper.BizReportReceiverMapper;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -8,6 +13,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;
import org.dromara.biz.domain.bo.BizReportReplyBo;
import org.dromara.biz.domain.vo.BizReportReplyVo;
@ -30,6 +36,7 @@ import java.util.Collection;
public class BizReportReplyServiceImpl implements IBizReportReplyService {
private final BizReportReplyMapper baseMapper;
private final BizReportReceiverMapper receiverMapper;
/**
*
@ -52,7 +59,7 @@ public class BizReportReplyServiceImpl implements IBizReportReplyService {
@Override
public TableDataInfo<BizReportReplyVo> queryPageList(BizReportReplyBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BizReportReply> lqw = buildQueryWrapper(bo);
Page<BizReportReplyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Page<BizReportReplyVo> result = baseMapper.selectBizReportReplyVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@ -71,7 +78,7 @@ public class BizReportReplyServiceImpl implements IBizReportReplyService {
private LambdaQueryWrapper<BizReportReply> buildQueryWrapper(BizReportReplyBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BizReportReply> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(BizReportReply::getId);
lqw.orderByDesc(BizReportReply::getId);
lqw.eq(bo.getReportId() != null, BizReportReply::getReportId, bo.getReportId());
lqw.eq(StringUtils.isNotBlank(bo.getContent()), BizReportReply::getContent, bo.getContent());
lqw.eq(bo.getUserId() != null, BizReportReply::getUserId, bo.getUserId());
@ -89,11 +96,26 @@ public class BizReportReplyServiceImpl implements IBizReportReplyService {
*/
@Override
public Boolean insertByBo(BizReportReplyBo bo) {
LoginUser user = LoginHelper.getLoginUser();
BizReportReply add = MapstructUtils.convert(bo, BizReportReply.class);
add.setUserId(user.getUserId());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
LambdaQueryWrapper<BizReportReceiver> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(BizReportReceiver::getId);
lqw.eq(bo.getReportId() != null, BizReportReceiver::getReportId, bo.getReportId());
lqw.eq(BizReportReceiver::getDeptId, user.getDeptId());
List<BizReportReceiverVo> list = receiverMapper.selectVoList(lqw);
if (list!=null && list.size()>0){
BizReportReceiverVo vo = list.get(0);
BizReportReceiver sbo = new BizReportReceiver();
sbo.setId(vo.getId());
sbo.setIsFeedback(true);
receiverMapper.updateById(sbo);
}
}
return flag;
}

View File

@ -28,7 +28,11 @@ public class SysUser extends TenantEntity {
private Long userId;
/**
* ID
* ID
*/
private String workDeptId;
/**
* ID
*/
private String deptId;
@ -52,6 +56,10 @@ public class SysUser extends TenantEntity {
*/
private String email;
/**
*
*/
private String telephone;
/**
*
*/

View File

@ -30,7 +30,11 @@ public class SysUserBo extends BaseEntity {
private Long userId;
/**
* ID
* ID
*/
private String workDeptId;
/**
* ID
*/
private String deptId;

View File

@ -82,9 +82,14 @@ public class SysUserExportVo implements Serializable {
private Date loginDate;
/**
*
*
*/
@ExcelProperty(value = "部门名称")
@ExcelProperty(value = "所属部门名称")
private String workDeptName;
/**
*
*/
@ExcelProperty(value = "管理部门名称")
private String deptName;
/**

View File

@ -32,7 +32,12 @@ public class SysUserImportVo implements Serializable {
/**
* ID
*/
@ExcelProperty(value = "部门编号")
@ExcelProperty(value = "所属部门编号")
private String workDeptId;
/**
* ID
*/
@ExcelProperty(value = "管理部门编号")
private String deptId;
/**

View File

@ -39,7 +39,11 @@ public class SysUserVo implements Serializable {
private String tenantId;
/**
* ID
* ID
*/
private String workDeptId;
/**
* ID
*/
private String deptId;
@ -113,6 +117,11 @@ public class SysUserVo implements Serializable {
*/
private Date createTime;
/**
*
*/
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "workDeptId")
private String workDeptName;
/**
*
*/

View File

@ -84,7 +84,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
.between(params.get("beginTime") != null && params.get("endTime") != null,
"u.create_time", params.get("beginTime"), params.get("endTime"))
.and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
.and(ObjectUtil.isNotNull(user.getWorkDeptId()), w -> {
List<SysDept> deptList = deptMapper.selectListByParentId(user.getWorkDeptId());
List<String> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
ids.add(user.getWorkDeptId());
w.in("u.work_dept_id", ids);
}).and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
List<SysDept> deptList = deptMapper.selectListByParentId(user.getDeptId());
List<String> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
ids.add(user.getDeptId());

View File

@ -0,0 +1,7 @@
<?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="org.dromara.biz.mapper.BizDutyMapper">
</mapper>

View File

@ -17,7 +17,7 @@
${ew.getSqlSelect}
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.user_id, u.work_dept_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
</if>
from sys_user u
@ -30,7 +30,7 @@
${ew.getSqlSelect}
</if>
<if test="ew.getSqlSelect == null">
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.user_id, u.work_dept_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
</if>
from sys_user u
@ -38,17 +38,18 @@
</select>
<select id="selectUserExportList" resultMap="SysUserExportResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
select u.user_id, u.work_dept_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, u1.user_name as leaderName
d.dept_name, d.leader, wd.dept_name work_dept_name, u1.user_name as leaderName
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_dept wd on u.work_dept_id = wd.dept_id
left join sys_user u1 on u1.user_id = d.leader
${ew.getCustomSqlSegment}
</select>
<select id="selectAllocatedList" 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.work_dept_id, u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
@ -57,7 +58,7 @@
</select>
<select id="selectUnallocatedList" 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.work_dept_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id