人员,工资卡,合同优化修改

This commit is contained in:
方亮 2025-08-16 12:39:30 +08:00
parent 1d69b537d6
commit f9d6ed23d6
16 changed files with 830 additions and 19 deletions

View File

@ -0,0 +1,134 @@
package com.bonus.bmw.controller;
import com.bonus.bmw.domain.vo.BmWorkerAtt;
import com.bonus.bmw.service.BmWorkerAttService;
import com.bonus.bmw.service.BmWorkerAttService;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType;
import com.bonus.common.security.annotation.InnerAuth;
import com.bonus.common.security.annotation.RequiresPermissionsOrInnerAuth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 考勤统计
*
* @author fly
*/
@RestController
@RequestMapping("/workerLight")
public class BmWorkerAttController extends BaseController {
/**
* 服务对象
*/
@Autowired
private BmWorkerAttService service;
/**
* 查询列表-分公司
* @param o
* @return
* , requiresPermissions = @RequiresPermissions("system:workerLight:list")
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false))
@GetMapping("/getSubComAttList")
@SysLog(title = "考勤统计", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->考勤统计", details = "分公司考勤统计")
public TableDataInfo getSubComAttList(BmWorkerAtt o) {
try {
startPage();
List<BmWorkerAtt> list = service.getSubComAttList(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
/**
* 查询列表-工程
* @param o
* @return
* , requiresPermissions = @RequiresPermissions("system:workerLight:list")
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false))
@GetMapping("/getProAttList")
@SysLog(title = "工程考勤统计", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->考勤统计", details = "工程考勤统计")
public TableDataInfo getProAttList(BmWorkerAtt o) {
try {
startPage();
List<BmWorkerAtt> list = service.getProAttList(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
/**
* 班组考勤统计-工程
* @param o
* @return
* , requiresPermissions = @RequiresPermissions("system:workerLight:list")
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false))
@GetMapping("/getTeamAttList")
@SysLog(title = "班组考勤统计", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->考勤统计", details = "班组考勤统计")
public TableDataInfo getTeamAttList(BmWorkerAtt o) {
try {
startPage();
List<BmWorkerAtt> list = service.getTeamAttList(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
/**
* 查询列表-班组下人员列表
* @param o
* @return
* , requiresPermissions = @RequiresPermissions("system:workerLight:list")
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false))
@GetMapping("/getWorkerAttList")
@SysLog(title = "班组人员考勤统计", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->考勤统计", details = "班组人员考勤统计")
public TableDataInfo getWorkerAttList(BmWorkerAtt o) {
try {
startPage();
List<BmWorkerAtt> list = service.getWorkerAttList(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
/**
* 考勤统计列表-人员考勤明细
* @param o
* @return
* , requiresPermissions = @RequiresPermissions("system:workerLight:list")
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false))
@GetMapping("/getWorkerAttListById")
@SysLog(title = "单人人员考勤统计", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->考勤统计", details = "单人人员考勤统计")
public TableDataInfo getWorkerAttListById(BmWorkerAtt o) {
try {
startPage();
List<BmWorkerAtt> list = service.getWorkerAttListById(o);
return getDataTable(list);
} catch (Exception e) {
logger.error(e.toString(), e);
}
return getDataTableError(new ArrayList<>());
}
}

View File

@ -4,6 +4,7 @@ import com.bonus.bmw.domain.dto.FileBasicMsgDto;
import com.bonus.bmw.domain.dto.WebFileDto;
import com.bonus.bmw.domain.vo.BmWorkerContract;
import com.bonus.bmw.domain.vo.BmWorkerWageCard;
import com.bonus.bmw.domain.vo.PmWorker;
import com.bonus.bmw.service.BmWorkerWageCardService;
import com.bonus.common.core.utils.json.FastJsonHelper;
import com.bonus.common.core.utils.poi.ExcelUtil;
@ -57,11 +58,27 @@ public class BmWorkerWageCardController extends BaseController {
return getDataTableError(new ArrayList<>());
}
//, requiresPermissions = @RequiresPermissions("system:wageCard:edit")
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth)
@PostMapping("/select/{id}")
@SysLog(title = "工资卡管理", businessType = OperaType.QUERY, logType = 0, module = "施工人员->红绿灯管理->工资卡管理", details = "查看工资卡")
public AjaxResult select(@PathVariable("id") Integer id) {
try {
AjaxResult ajax = AjaxResult.success();
BmWorkerWageCard worker = service.selectByPrimaryKey(id);
ajax.put("data", worker);
return ajax;
} catch (Exception e) {
logger.error(e.toString(), e);
}
return error("系统异常,请联系管理员");
}
//, requiresPermissions = @RequiresPermissions("system:wageCard:edit")
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth)
@PostMapping("/edit")
@SysLog(title = "工资卡管理", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->红绿灯管理->工资卡管理", details = "修改工资卡")
public AjaxResult edit(@RequestParam(value = "files") MultipartFile[] files, @RequestParam(value = "fileMsg") String fileMsg, @RequestParam(value = "params")String params) {
public AjaxResult edit(@RequestParam(value = "files",required = false) MultipartFile[] files, @RequestParam(value = "fileMsg",required = false) String fileMsg, @RequestParam(value = "params")String params) {
try {
List<WebFileDto> listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class);
BmWorkerWageCard o = FastJsonHelper.jsonStrToBean(params, BmWorkerWageCard.class);

View File

@ -107,7 +107,7 @@ public class PmWorkerController extends BaseController {
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth)
@PostMapping("/edit")
@SysLog(title = "人员入场管理", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "修改人员入场")
public AjaxResult edit(@RequestParam(value = "files") MultipartFile[] files,@RequestParam(value = "fileMsg") String fileMsg, @RequestParam(value = "params")String params) {
public AjaxResult edit(@RequestParam(value = "files",required = false) MultipartFile[] files,@RequestParam(value = "fileMsg",required = false) String fileMsg, @RequestParam(value = "params")String params) {
try {
List<WebFileDto> listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class);
// 验证对应关系

View File

@ -0,0 +1,158 @@
package com.bonus.bmw.domain.vo;
import lombok.Data;
/**
* 所有在场人员实时信息表-离场就删除
*/
@Data
public class BmWorkerAtt {
/**
* 工程
*/
private String proName;
/**
* 工程id
*/
private Integer proId;
/**
* 班组
*/
private String teamName;
/**
* 班组id
*/
private Integer teamId;
/**
* 分包
*/
private String subName;
/**
* 分包id
*/
private Integer subId;
/**
* 工种
*/
private String postName;
/**
* 工种id
*/
private Integer postId;
/**
* 分公司
*/
private String subComName;
/**
* 分公司id
*/
private String subComId;
/**
* 姓名
*/
private String name;
/**
* 身份证号
*/
private String idNumber;
/**
* 在建工程数量
*/
private Integer buildProNum;
/**
* 完工工程数量
*/
private Integer completedProNum;
/**
* 筹建工程数量
*/
private Integer preProNum;
/**
* 分包数量
*/
private Integer subNum;
/**
* 班组数
*/
private Integer teamNum;
/**
* 在场人员数量
*/
private Integer einNum;
/**
* 考勤人数
*/
private Integer attNum;
/**
* 黄灯数量
*/
private String yellowNum;
/**
* 绿灯数量
*/
private String greenNum;
/**
* 日期
*/
private String currentDay;
/**
* 考勤时间
*/
private String startDate;
/**
* 考勤时间
*/
private String endDate;
private Integer workerId;
private Integer notAttNum;
/**
* 入场时间
*/
private String einDay;
/**
* 考勤日期
*/
private String attDay;
/**
* 考勤状态
*/
private Integer isAtt;
/**
* 是否补卡
*/
private String isRepair;
/**
* 设备名称
*/
private String deviceName;
/**
* 考勤时间
*/
private String attTime;
}

View File

@ -81,4 +81,14 @@ public class BmWorkerWageCard {
* 工资卡照片
*/
private List<UploadFileVo> files;
/**
* 是否上传 0未上传 1已上传
*/
private String isUpload;
/**
* 照片id
*/
private String delIds;
}

View File

@ -1,8 +1,10 @@
package com.bonus.bmw.domain.vo;
import java.util.Date;
import java.util.List;
import com.bonus.common.core.annotation.Excel;
import com.bonus.system.api.model.UploadFileVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@ -179,4 +181,10 @@ public class PmWorker {
* 离职时间间隔
*/
private String daysSinceExit;
/**
* 人脸照片
*/
private List<UploadFileVo> files;
}

View File

@ -0,0 +1,39 @@
package com.bonus.bmw.mapper;
import com.bonus.bmw.domain.vo.BmWorkerAtt;
import com.bonus.bmw.domain.vo.BmWorkerLight;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface BmWorkerAttMapper {
List<BmWorkerAtt> getSubComAttList(BmWorkerAtt o);
List<BmWorkerAtt> getProAttList(BmWorkerAtt o);
List<BmWorkerAtt> getWorkerAttList(BmWorkerAtt o);
List<BmWorkerAtt> getTeamAttList(BmWorkerAtt o);
/**
* 根据查询区间获取人员最新基础信息班组分包等
* @param o
* @return
*/
List<BmWorkerAtt> getWorkerEinMsgListByDateRange(BmWorkerAtt o);
/**
* 根据查询区间获取人员考勤天数
* @param o
* @return
*/
List<BmWorkerAtt> getWorkerAttDayNumByDateRange(BmWorkerAtt o);
/**
* 根据查询区间获取单个人员考勤记录
* @param o
* @return
*/
List<BmWorkerAtt> getWorkerAttListById(BmWorkerAtt o);
}

View File

@ -51,4 +51,12 @@ public interface BmWorkerWageCardMapper {
int selectWageCardAndContract(Integer id);
void updateEinMsgByWorkerId(@Param("workerId") Integer id,@Param("lightStatus") Integer lightStatus,@Param("lightDate") String lightDate);
/**
* select by primary key
*
* @param id primary key
* @return object by id
*/
BmWorkerWageCard selectByPrimaryKey(Integer id);
}

View File

@ -0,0 +1,43 @@
package com.bonus.bmw.service;
import com.bonus.bmw.domain.vo.BmWorkerAtt;
import java.util.List;
public interface BmWorkerAttService {
/**
* 分公司考勤统计
* @param o
* @return
*/
List<BmWorkerAtt> getSubComAttList(BmWorkerAtt o);
/**
* 工程考勤统计
* @param o
* @return
*/
List<BmWorkerAtt> getProAttList(BmWorkerAtt o);
/**
* 人员考勤统计
* @param o
* @return
*/
List<BmWorkerAtt> getWorkerAttList(BmWorkerAtt o);
/**
* 班组考勤统计
* @param o
* @return
*/
List<BmWorkerAtt> getTeamAttList(BmWorkerAtt o);
/**
* 单人人员考勤统计
* @param o
* @return
*/
List<BmWorkerAtt> getWorkerAttListById(BmWorkerAtt o);
}

View File

@ -2,6 +2,7 @@ package com.bonus.bmw.service;
import com.bonus.bmw.domain.dto.WebFileDto;
import com.bonus.bmw.domain.vo.BmWorkerWageCard;
import com.bonus.bmw.domain.vo.PmWorker;
import com.bonus.common.core.web.domain.AjaxResult;
import java.util.List;
@ -56,5 +57,12 @@ public interface BmWorkerWageCardService {
* @return
*/
AjaxResult lookFileByPrimaryKey(Integer id);
/**
* 查询工资卡信息
* @param id
* @return
*/
BmWorkerWageCard selectByPrimaryKey(Integer id);
}

View File

@ -0,0 +1,134 @@
package com.bonus.bmw.service.impl;
import com.bonus.bmw.domain.vo.BmWorkerAtt;
import com.bonus.bmw.mapper.BmWorkerAttMapper;
import com.bonus.bmw.mapper.BmWorkerAttMapper;
import com.bonus.bmw.service.BmWorkerAttService;
import com.bonus.bmw.service.BmWorkerAttService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class BmWorkerAttServiceImpl implements BmWorkerAttService {
@Autowired
private BmWorkerAttMapper mapper;
/**
* 分公司考勤统计
* @param o
* @return
*/
@Override
public List<BmWorkerAtt> getSubComAttList(BmWorkerAtt o) {
return mapper.getSubComAttList(o);
}
@Override
public List<BmWorkerAtt> getProAttList(BmWorkerAtt o) {
return mapper.getProAttList(o);
}
@Override
public List<BmWorkerAtt> getTeamAttList(BmWorkerAtt o) {
return mapper.getTeamAttList(o);
}
@Override
public List<BmWorkerAtt> getWorkerAttListById(BmWorkerAtt o) {
List<BmWorkerAtt> list = mapper.getWorkerAttListById(o);
// 如果列表为空给它一个空的列表
if (list == null) {
list = new ArrayList<>();
}
// 如果没有指定日期范围则直接返回原始列表
if (o.getStartDate() == null || o.getEndDate() == null) {
return list;
}
LocalDate startDate = LocalDate.parse(o.getStartDate());
LocalDate endDate = LocalDate.parse(o.getEndDate());
// 生成日期范围内的所有日期 (Java 8 兼容方式)
List<LocalDate> dateRange = new ArrayList<>();
LocalDate currentDate = startDate;
while (!currentDate.isAfter(endDate)) {
dateRange.add(currentDate);
currentDate = currentDate.plusDays(1);
}
// 补全缺失的日期
Map<LocalDate, BmWorkerAtt> existingDataMap = list.stream()
.filter(item -> item.getEinDay() != null)
.collect(Collectors.toMap(
item -> LocalDate.parse(item.getEinDay()),
item -> item,
(existing, replacement) -> existing
));
// List<BmWorkerAtt> finalList = list;
return dateRange.stream()
.map(date -> {
if (existingDataMap.containsKey(date)) {
return existingDataMap.get(date);
} else {
// 创建缺失日期的默认数据
BmWorkerAtt defaultAtt = new BmWorkerAtt();
// 复制必要字段
// if (!finalList.isEmpty()) {
// BmWorkerAtt source = finalList.get(0);
// defaultAtt.setWorkerId(source.getWorkerId());
// }
defaultAtt.setEinDay(date.toString());
defaultAtt.setIsAtt(3);
return defaultAtt;
}
})
.sorted((a, b) -> b.getEinDay().compareTo(a.getEinDay())) // 倒序排序
.collect(Collectors.toList());
}
/**
* 人员考勤统计
* @param o
* @return
*/
@Override
public List<BmWorkerAtt> getWorkerAttList(BmWorkerAtt o) {
//1.查询 工程 班组 时间区间 姓名 身份证号码
//根据区间产讯处最新的人员基础数据
List<BmWorkerAtt> list = mapper.getWorkerEinMsgListByDateRange(o);
//查询考勤天数 根据 时间区间 工程 班组 查询
List<BmWorkerAtt> listAtt = mapper.getWorkerAttDayNumByDateRange(o);
// 1. 安全地将 listAtt 转为 Map<workerId, attNum>
Map<Integer, Integer> attNumMap = listAtt.stream()
.filter(Objects::nonNull) // 过滤 null 对象
.filter(item -> item.getWorkerId() != null) // 确保 workerId 不为 null
.collect(Collectors.toMap(
BmWorkerAtt::getWorkerId, // key: workerId
BmWorkerAtt::getAttNum, // value: attNum
(existing, replacement) -> replacement // 如果 key 重复使用新的值后者
));
long daysBetween = getDaysBetween(o.getStartDate(), o.getEndDate());
// 2. 遍历 list根据 workerId 填充 attNum
list.forEach(item -> {
Integer attNum = attNumMap.get(item.getWorkerId());
item.setAttNum(attNum != null ? attNum : 0); // 未匹配上则设为 0
item.setNotAttNum((int) (daysBetween - item.getAttNum()));
});
return list;
}
public static long getDaysBetween(String startDateStr, String endDateStr) {
LocalDate start = LocalDate.parse(startDateStr);
LocalDate end = LocalDate.parse(endDateStr);
// 计算两个日期之间的天数差包含边界
return ChronoUnit.DAYS.between(start, end) + 1;
}
}

View File

@ -102,7 +102,12 @@ public class BmWorkerContractServiceImpl implements BmWorkerContractService{
@Override
public BmWorkerContract selectContractListByWorkerIdAndValid(BmWorkerContract o) {
return mapper.selectContractListByWorkerIdAndValid(o);
BmWorkerContract workerContract = mapper.selectContractListByWorkerIdAndValid(o);
if(workerContract != null){
List<UploadFileVo> contractFile = fileUploadUtils.getFileList("", workerContract.getId().toString(), Constants.FILE_UPLOAD_CONTRACT, "");
workerContract.setFiles(contractFile);
}
return workerContract;
}
@Override

View File

@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
import com.bonus.bmw.domain.dto.FileBasicMsgDto;
import com.bonus.bmw.domain.dto.WebFileDto;
import com.bonus.bmw.domain.vo.BmWorkerWageCard;
import com.bonus.bmw.domain.vo.PmWorker;
import com.bonus.bmw.mapper.BmWorkerWageCardMapper;
import com.bonus.bmw.service.BmWorkerWageCardService;
import com.bonus.common.core.constant.Constants;
@ -39,9 +40,14 @@ public class BmWorkerWageCardServiceImpl implements BmWorkerWageCardService {
public int updateByPrimaryKey(BmWorkerWageCard record, List<WebFileDto> listFile) {
//存在则删除后新增不存在则新增
if(record.getId() != null){
log.info("存在则删除后新增,不存在则新增");
//删除工资卡图片 删除minio文件
fileUploadUtils.delFileListById("", record.getId().toString(), Constants.FILE_UPLOAD_WAGE_CARD,"");
if(record.getDelIds() != null){
//修改时删除部分图片
String[] split = record.getDelIds().split(",");
for (String s : split) {
fileUploadUtils.delFileListById(s,"",Constants.FILE_UPLOAD_WAGE_CARD, "");
}
}
if(!listFile.isEmpty()){
//组装数据
MultipartFile[] workerFiles = new MultipartFile[listFile.size()];
String[] type = new String[listFile.size()];
@ -50,6 +56,7 @@ public class BmWorkerWageCardServiceImpl implements BmWorkerWageCardService {
type[i] = listFile.get(i).getType();
}
List<UploadFileVo> uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WAGE_CARD, record.getId().toString(), type,"", "");
}
updateByPrimaryKeySelective(record);
return 1;
}else{
@ -97,7 +104,11 @@ public class BmWorkerWageCardServiceImpl implements BmWorkerWageCardService {
@Override
public BmWorkerWageCard selectWageCardByWorkerId(BmWorkerWageCard o) {
return mapper.selectWageCardByWorkerId(o);
BmWorkerWageCard bmWorkerWageCard = mapper.selectWageCardByWorkerId(o);
if(bmWorkerWageCard != null){
bmWorkerWageCard.setFiles(fileUploadUtils.getFileList("", bmWorkerWageCard.getId().toString(), Constants.FILE_UPLOAD_WAGE_CARD, ""));
}
return bmWorkerWageCard;
}
/**
@ -136,6 +147,16 @@ public class BmWorkerWageCardServiceImpl implements BmWorkerWageCardService {
return AjaxResult.success(contractFile);
}
@Override
public BmWorkerWageCard selectByPrimaryKey(Integer id) {
BmWorkerWageCard wageCard= mapper.selectByPrimaryKey(id);
if(wageCard != null){
List<UploadFileVo> contractFile = fileUploadUtils.getFileList("", wageCard.getId().toString(), Constants.FILE_UPLOAD_WAGE_CARD, "");
wageCard.setFiles(contractFile);
}
return wageCard;
}
private int selectWageCardAndContract(Integer id) {
return mapper.selectWageCardAndContract(id);
}

View File

@ -58,7 +58,7 @@ public class PmWorkerServiceImpl implements PmWorkerService{
record.setCreateUser(SecurityUtils.getUsername());
int insert = mapper.insert(record);
if(insert > 0){
List<WebFileDto> collect = fileMsg.stream().filter(data -> "人脸".equals(data.getName())).collect(Collectors.toList());
List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList());
//组装数据
MultipartFile[] workerFiles = new MultipartFile[collect.size()];
String[] type = new String[collect.size()];
@ -98,13 +98,13 @@ public class PmWorkerServiceImpl implements PmWorkerService{
if(bmWorkerWageCard != null && StringUtil.isNotEmpty(bmWorkerWageCard.getBankCardCode())){
bmWorkerWageCard.setCreateUser(SecurityUtils.getUsername());
bmWorkerWageCard.setWorkerId(record.getId());
List<WebFileDto> collect = fileMsg.stream().filter(data -> "工资卡".equals(data.getName())).collect(Collectors.toList());
List<WebFileDto> collect = fileMsg.stream().filter(data -> "wageCard".equals(data.getName())).collect(Collectors.toList());
wageCardService.updateByPrimaryKey(bmWorkerWageCard,collect);
}
if(bmWorkerContract != null && StringUtil.isNotEmpty(bmWorkerContract.getContractCode())){
bmWorkerContract.setCreateUser(SecurityUtils.getUsername());
bmWorkerContract.setWorkerId(record.getId());
List<WebFileDto> collect = fileMsg.stream().filter(data -> "合同".equals(data.getName())).collect(Collectors.toList());
List<WebFileDto> collect = fileMsg.stream().filter(data -> "contract".equals(data.getName())).collect(Collectors.toList());
contractService.updateByPrimaryKey(bmWorkerContract,collect);
record.setContractId(bmWorkerContract.getId());
}
@ -114,6 +114,9 @@ public class PmWorkerServiceImpl implements PmWorkerService{
public PmWorker selectByPrimaryKey(Integer id) {
//人员数据
PmWorker worker = mapper.selectByPrimaryKey(id);
if(worker != null){
worker.setFiles(fileUploadUtils.getFileList("", worker.getId().toString(), Constants.FILE_UPLOAD_WORKER, ""));
}
//查询工资卡 数据
BmWorkerWageCard wageCard = new BmWorkerWageCard();
wageCard.setWorkerId(id);
@ -140,6 +143,20 @@ public class PmWorkerServiceImpl implements PmWorkerService{
//更新基础数据
record.setUpdateUser(SecurityUtils.getUsername());
int update = mapper.updateByPrimaryKey(record);
//人脸照片是否修改
List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList());
if(!collect.isEmpty()){
String s = fileUploadUtils.delFileListById("", record.getId().toString(), Constants.FILE_UPLOAD_WORKER, "");
//组装数据
MultipartFile[] workerFiles = new MultipartFile[collect.size()];
String[] type = new String[collect.size()];
for (int i = 0; i < collect.size(); i++) {
workerFiles[i] = collect.get(i).getFile();
type[i] = collect.get(i).getType();
}
//人脸的数据添加
List<UploadFileVo> uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", "");
}
//更新入场记录最新记录标识 再入场清除最新标识
mapper.updateEinRecordLast(record.getId());
//已经入过场了

View File

@ -0,0 +1,189 @@
<?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.bonus.bmw.mapper.BmWorkerAttMapper">
<resultMap id="BaseResultMap" type="com.bonus.bmw.domain.vo.BmWorkerAtt">
<result column="sub_company_name" property="subComName" />
<result column="sub_com_id" property="subComId" />
<result column="pro_name" property="proName" />
<result column="pro_id" property="proId" />
<result column="team_name" property="teamName" />
<result column="team_id" property="teamId" />
<result column="sub_name" property="subName" />
<result column="worker_id" property="workerId" />
<result column="name" property="name" />
<result column="id_number" property="idNumber" />
<result column="buildProNum" property="buildProNum" />
<result column="preProNum" property="preProNum" />
<result column="completedProNum" property="completedProNum" />
<result column="subNum" property="subNum" />
<result column="teamNum" property="teamNum" />
<result column="einNum" property="einNum" />
<result column="attNum" property="attNum" />
<result column="ein_day" property="einDay" />
<result column="att_day" property="attDay" />
<result column="is_att" property="isAtt" />
<result column="is_repair" property="isRepair" />
<result column="device_name" property="deviceName" />
<result column="att_time" property="attTime" />
</resultMap>
<select id="getSubComAttList" resultMap="BaseResultMap">
SELECT
psc.id AS sub_com_id,
psc.sub_company_name,
COUNT(IF(pp.pro_status = '在建', 1, NULL)) AS buildProNum,
COUNT(IF(pp.pro_status = '筹建', 1, NULL)) AS preProNum,
COUNT(IF(pp.pro_status = '完工', 1, NULL)) AS completedProNum,
COUNT(DISTINCT bsc.sub_id) AS subNum,
COUNT(DISTINCT bstc.team_id) AS teamNum,
COUNT(DISTINCT bwem.worker_id) AS einNum,
COUNT(DISTINCT bap.worker_id) AS attNum
FROM
pm_sub_company psc
LEFT JOIN pm_project pp ON psc.id = pp.sub_com_id
AND pp.is_active = 1
LEFT JOIN bm_sub_contract bsc ON bsc.pro_id = pp.id
AND bsc.is_active = 1
LEFT JOIN pm_sub_team_contract bstc ON bstc.sub_id = bsc.sub_id
AND bsc.pro_id = bstc.pro_id
AND bstc.is_active = 1
LEFT JOIN bm_worker_ein_msg bwem ON pp.id = bwem.pro_id
LEFT JOIN bm_att_person bap ON bap.pro_id = pp.id AND bap.att_day = #{currentDay}
WHERE
psc.is_active = 1
GROUP BY
psc.id
</select>
<select id="getProAttList" resultMap="BaseResultMap">
SELECT
pp.id as pro_id,
pp.pro_name,
ps.sub_name,
pst.id as team_id,
pst.team_name,
COUNT(DISTINCT bwem.worker_id) AS einNum,
COUNT(DISTINCT bap.worker_id) AS attNum
FROM
pm_project pp
LEFT JOIN bm_sub_contract bsc ON bsc.pro_id = pp.id
AND bsc.is_active = 1
LEFT JOIN pm_sub ps ON ps.id = bsc.sub_id
LEFT JOIN pm_sub_team_contract bstc ON bstc.sub_id = bsc.sub_id
AND bsc.pro_id = bstc.pro_id
AND bstc.is_active = 1
LEFT JOIN pm_sub_team pst ON pst.id = bstc.team_id
LEFT JOIN bm_worker_ein_msg bwem ON pp.id = bwem.pro_id
LEFT JOIN bm_att_person bap ON bap.pro_id = pp.id AND bap.att_day = #{currentDay}
WHERE
pp.id = #{proId}
AND pp.is_active = 1
GROUP BY
bstc.id
</select>
<select id="getTeamAttList" resultMap="BaseResultMap">
SELECT
pp.id as pro_id,
pp.pro_name,
ps.sub_name,
pst.id as team_id,
pst.team_name,
COUNT(DISTINCT bwem.worker_id) AS einNum,
COUNT(DISTINCT bap.worker_id) AS attNum
FROM
pm_project pp
LEFT JOIN bm_sub_contract bsc ON bsc.pro_id = pp.id
AND bsc.is_active = 1
LEFT JOIN pm_sub ps ON ps.id = bsc.sub_id
LEFT JOIN pm_sub_team_contract bstc ON bstc.sub_id = bsc.sub_id
AND bsc.pro_id = bstc.pro_id
AND bstc.is_active = 1
LEFT JOIN pm_sub_team pst ON pst.id = bstc.team_id
LEFT JOIN bm_worker_ein_msg bwem ON pp.id = bwem.pro_id
LEFT JOIN bm_att_person bap ON bap.pro_id = pp.id AND bap.att_day = #{currentDay}
WHERE
pp.id = #{proId}
AND pp.is_active = 1
GROUP BY
bstc.id
</select>
<select id="getWorkerEinMsgListByDateRange" resultMap="BaseResultMap">
SELECT
bwedr.worker_id,
bwedr.id_number,
bwedr.name,
bwedr.pro_id,
bwedr.team_id,
bwedr.sub_id
FROM bm_worker_ein_day_record bwedr
INNER JOIN (
-- 子查询:找出每个 worker_id 在 2025-08-01 至 2025-08-11 区间内的最后在场日期
SELECT
worker_id,
MAX(ein_day) AS max_current_day
FROM bm_worker_ein_day_record
WHERE ein_day &gt;= #{startDate}
AND ein_day &lt;= #{endDate}
and pro_id = #{proId}
and team_id = #{teamId}
GROUP BY worker_id
) latest ON bwedr.worker_id = latest.worker_id
AND bwedr.ein_day = latest.max_current_day
<where>
<if test="name != null and name != ''">
and bwedr.name = #{name}
</if>
<if test="idNumber != null and idNumber != ''">
and bwedr.id_number = #{idNumber}
</if>
</where>
ORDER BY bwedr.worker_id
</select>
<select id="getWorkerAttDayNumByDateRange" resultMap="BaseResultMap">
SELECT
a.worker_id,
COUNT(*) AS attNum
FROM
bm_att_person a
INNER JOIN bm_worker_ein_day_record e ON a.worker_id = e.worker_id
AND a.att_day = e.ein_day
WHERE
a.att_day &gt;= #{startDate}
AND a.att_day &lt;= #{endDate}
GROUP BY
a.worker_id
</select>
<select id="getWorkerAttListById" resultMap="BaseResultMap">
SELECT
bwedr.worker_id,
bwedr.pro_name,
bwedr.ein_day,
bap.att_day,
bap.att_time,
bap.dev_name as device_name,
bap.is_repair,
IF(bap.att_day is null,0,1) is_att
FROM
bm_worker_ein_day_record bwedr
LEFT JOIN bm_att_person bap ON bwedr.worker_id = bap.worker_id
AND bap.att_day = bwedr.ein_day
WHERE
bwedr.ein_day &gt;= #{startDate}
AND bwedr.ein_day &lt;= #{endDate}
<if test="teamId != null and teamId != ''">
and bwedr.team_id = #{teamId}
</if>
<if test="proId != null and proId != ''">
and bwedr.pro_id = #{proId}
</if>
GROUP BY
bwedr.worker_id
</select>
</mapper>

View File

@ -13,6 +13,7 @@
<result column="phone" property="phone" />
<result column="name" property="name" />
<result column="id_number" property="idNumber" />
<result column="is_upload" property="isUpload" />
</resultMap>
<sql id="Base_Column_List">
id, worker_id, bank_card_code, bank_name, bank_branch_name, create_user, update_user
@ -38,7 +39,8 @@
bwwc.bank_card_code,
bwwc.bank_name,
bwwc.bank_branch_name,
bwwc.update_time
bwwc.update_time,
if(bwwc.id is not null, 1, 0) AS is_upload
FROM
pm_worker pw
LEFT JOIN `bm_worker_wage_card` bwwc ON pw.id = bwwc.worker_id
@ -60,6 +62,12 @@
<if test="workerId != null and workerId != ''">
AND bwwc.worker_id LIKE CONCAT('%', #{workerId}, '%')
</if>
<if test=' isUpload == 1'>
AND bwwc.id is not null
</if>
<if test=' isUpload == 0'>
AND bwwc.id is null
</if>
</select>
<select id="selectWageCardByWorkerId" resultMap="BaseResultMap">
@ -125,4 +133,16 @@
set light_status = #{lightStatus},yellow_date = #{lightDate}
where worker_id = #{workerId}
</update>
<select id="selectByPrimaryKey" resultMap="BaseResultMap">
SELECT
bwwc.id,
bwwc.bank_card_code,
bwwc.bank_name,
bwwc.bank_branch_name
FROM
`bm_worker_wage_card` bwwc
WHERE
bwwc.id = #{id}
</select>
</mapper>