package com.chinaztt.mes.production.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.chinaztt.mes.basic.entity.Shift; import com.chinaztt.mes.basic.entity.Staff; import com.chinaztt.mes.basic.entity.Workstation; import com.chinaztt.mes.basic.mapper.JoinCrewStaffMapper; import com.chinaztt.mes.basic.mapper.ShiftMapper; import com.chinaztt.mes.basic.mapper.WorkstationMapper; import com.chinaztt.mes.common.numgen.NumberGenerator; import com.chinaztt.mes.common.util.WxCpUtils; import com.chinaztt.mes.production.config.UnsubmitDutyRecordConfig; import com.chinaztt.mes.production.dto.DutyRecordDTO; import com.chinaztt.mes.production.dto.PersonBoardDTO; import com.chinaztt.mes.production.dto.ProductOutputDTO; import com.chinaztt.mes.production.entity.ArtificialInformation; import com.chinaztt.mes.production.entity.Computation; import com.chinaztt.mes.production.entity.DutyRecord; import com.chinaztt.mes.production.entity.PersonBoard; import com.chinaztt.mes.production.excel.*; import com.chinaztt.mes.production.mapper.*; import com.chinaztt.mes.production.service.DutyRecordService; import com.chinaztt.mes.production.util.BackUtils; import com.chinaztt.ztt.common.data.datascope.DataScope; import com.chinaztt.ztt.common.security.service.ZttUser; import com.chinaztt.ztt.common.security.util.SecurityUtils; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; /** * 上班记录 * * @author cxf * @date 2021-01-20 09:11:25 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class DutyRecordServiceImpl extends ServiceImpl implements DutyRecordService { private static final DateTimeFormatter FORMATTER_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter FORMATTER_MONTH = DateTimeFormatter.ofPattern("yyyy-MM"); private ShiftMapper shiftMapper; private PersonBoardMapper personBoardMapper; private ProductOutputMapper productOutputMapper; private ArtificialInformationMapper artificialInformationMapper; private JoinCrewStaffMapper joinCrewStaffMapper; private ComputationMapper computationMapper; private NumberGenerator dutyRecordNumberGenerator; private WorkstationMapper workstationMapper; private UnsubmitDutyRecordConfig unsubmitDutyRecordConfig; private final BackUtils backUtils; private SegmentationTaskRecordMapper segmentationTaskRecordMapper; @Override public IPage getDutyRecordPage(Page page, QueryWrapper gen) { return baseMapper.getDutyRecordPage(page, gen, new DataScope()); } @Override public DutyRecordDTO saveDto(DutyRecordDTO dutyRecordDTO) { dutyRecordDTO.setId(null); ZttUser user = SecurityUtils.getUser(); dutyRecordDTO.setDeptId(user.getDeptId()); dutyRecordDTO.setIsConfirm(false); dutyRecordDTO.setIsSubmit(false); checkDutyMonth(dutyRecordDTO); // 1.保存主表 Workstation workstation = workstationMapper.selectById(dutyRecordDTO.getWorkstationId()); dutyRecordDTO.setWorkCenter(workstation.getWorkCenter()); baseMapper.insert(dutyRecordDTO); // 2.保存默认班组人员 if (dutyRecordDTO.getCrewId() != null) { List staffs = joinCrewStaffMapper.selectStaffByCrewId(dutyRecordDTO.getCrewId()); for (Staff staff : staffs) { PersonBoard personBoard = new PersonBoard(); personBoard.setWorkTime(LocalDateTime.now()); personBoard.setStaffId(staff.getId()); personBoard.setWorkstationId(dutyRecordDTO.getWorkstationId()); personBoard.setDutyRecordId(dutyRecordDTO.getId()); personBoardMapper.insert(personBoard); } } return getDtoById(dutyRecordDTO.getId()); } @Override public boolean updateById(DutyRecord dutyRecord) { checkDutyMonth(dutyRecord); DutyRecord record = this.getById(dutyRecord.getId()); Workstation workstation = workstationMapper.selectById(record.getWorkstationId()); dutyRecord.setWorkCenter(workstation.getWorkCenter()); // 如果是退回,需要删除对应的工资计算结果;刷新待处理字段 if (dutyRecord.getIsConfirm() != null && dutyRecord.getIsConfirm() == false) { computationMapper.delete(Wrappers.lambdaQuery().eq(Computation::getDutyRecordId, dutyRecord.getId())); baseMapper.refreshPendingById(dutyRecord.getId()); } return SqlHelper.retBool(baseMapper.updateById(dutyRecord)); } private void checkDutyMonth(DutyRecord dutyRecord) { LocalDateTime dutyDate = dutyRecord.getDutyDate(); if (dutyDate == null) { return; } LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(DutyRecord::getWorkstationId, dutyRecord.getWorkstationId()) .eq(DutyRecord::getShiftId, dutyRecord.getShiftId()).eq(DutyRecord::getNowDutyDate, FORMATTER_DATE.format(dutyDate)); if (dutyRecord.getId() != null) { wrapper = wrapper.ne(DutyRecord::getId, dutyRecord.getId()); } else { dutyRecord.setDutyNo(dutyRecordNumberGenerator.generateNumberWithPrefix(DutyRecord.DIGIT, DutyRecord.PREFIX, DutyRecord::getDutyNo)); } DutyRecord dutyRecordSame = baseMapper.selectOne(wrapper); if (dutyRecordSame != null) { throw new RuntimeException("该班次与" + dutyRecordSame.getDutyNo() + "重复"); } dutyRecord.setNowDutyDate(FORMATTER_DATE.format(dutyDate)); // 计算该班次属于那个统计月度 if (dutyDate.getDayOfMonth() >= DutyRecord.START_DATE) { dutyDate = dutyDate.plusMonths(1); } dutyRecord.setDutyMonth(FORMATTER_MONTH.format(dutyDate)); // 是否夜班 Shift shift = shiftMapper.selectById(dutyRecord.getShiftId()); if (shift != null) { dutyRecord.setIsNight(shift.getIsNight()); } } @Override public List getPersonByDutyRecordId(Long id) { return personBoardMapper.getPersonByDutyRecordId(id); } @Override public List getPersonByDutyRecordIdList(List idList) { return personBoardMapper.getPersonByDutyRecordIdList(idList); } @Override public List getOutputByDutyRecordId(Long id) { return productOutputMapper.getOutputByDutyRecordId(id); } @Override public List getOutputByDutyRecordIdList(List idList) { List result = productOutputMapper.getOutputByDutyRecordIdList(idList); List segmentationOutputList = segmentationTaskRecordMapper.getOutputListByDutyRecordId(idList); if (CollectionUtil.isNotEmpty(segmentationOutputList)) { result.addAll(segmentationOutputList); } return result; } @Override public DutyRecordDTO getDutyRecordByWorkstationId(Long id) { return baseMapper.getDutyRecordByWorkstationId(id); } @Override public List getOperatingRecord(Long id) { return baseMapper.getOperatingRecord(id); } @Override public DutyRecordDTO getDtoById(Long id) { DutyRecordDTO dutyRecordDTO = baseMapper.getDtoById(id); // 暂时人员不要带出 /*dutyRecordDTO.setPersonList(personBoardMapper.getPersonByDutyRecordId(id));*/ return dutyRecordDTO; } @Override public boolean deleteById(Long id) { try { baseMapper.deleteById(id); personBoardMapper.delete(Wrappers.query().lambda().eq(PersonBoard::getDutyRecordId, id)); artificialInformationMapper.delete(Wrappers.query().lambda().eq(ArtificialInformation::getDutyRecordId, id)); } catch (Exception e) { throw new RuntimeException("上班记录删除失败"); } return true; } @Override public List exportList(QueryWrapper gen) { return baseMapper.exportList(gen); } @Override public List exportPersonBoard(QueryWrapper gen) { return baseMapper.exportPersonBoard(gen); } @Override public IPage getArtificialRecord(Page page, QueryWrapper gen) { return baseMapper.getArtificialRecord(page, gen); } @Override public List exportAttendance(QueryWrapper gen) { return baseMapper.exportAttendance(gen); } @Override public void refreshPendingById(Long dutyRecordId) { if (dutyRecordId != null) { baseMapper.refreshPendingById(dutyRecordId); } } @Override public List getWorkstationList(String workCenter) { List workstationList = workstationMapper.selectList(Wrappers.query().lambda() .eq(Workstation::getWorkCenter, workCenter) .orderByAsc(Workstation::getWorkstationNo)); return workstationList; } @Override public List getUnsubmitWorkstationList(String workCenter) { List recordDTOList = baseMapper.selectUnsubmitWorkstation(workCenter); return recordDTOList; } @Override public List batchSave(DutyRecordDTO dutyRecordDTO) { ZttUser user = SecurityUtils.getUser(); List result = new ArrayList<>(); // 找出工作站 Workstation workstation = workstationMapper.selectById(dutyRecordDTO.getWorkstationId()); // 找出该工作站的工作重心关联的所有工作站 //List workstationList = workstationMapper.selectList(Wrappers.query().lambda().eq(Workstation::getWorkCenter, workstation.getWorkCenter())); // 循环创建班次记录 for (Long workstationId : dutyRecordDTO.getWorkstationIdList()) { DutyRecordDTO newRecord = new DutyRecordDTO(); BeanUtils.copyProperties(dutyRecordDTO, newRecord); newRecord.setId(null); newRecord.setDeptId(user.getDeptId()); newRecord.setIsConfirm(false); newRecord.setIsSubmit(false); newRecord.setWorkstationId(workstationId); LocalDateTime dutyDate = newRecord.getDutyDate(); if (dutyDate != null) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(DutyRecord::getWorkstationId, newRecord.getWorkstationId()) .eq(DutyRecord::getShiftId, newRecord.getShiftId()).eq(DutyRecord::getNowDutyDate, FORMATTER_DATE.format(dutyDate)); if (newRecord.getId() != null) { wrapper = wrapper.ne(DutyRecord::getId, newRecord.getId()); } else { newRecord.setDutyNo(dutyRecordNumberGenerator.generateNumberWithPrefix(DutyRecord.DIGIT, DutyRecord.PREFIX, DutyRecord::getDutyNo)); } DutyRecord dutyRecordSame = baseMapper.selectOne(wrapper); if (dutyRecordSame != null) { continue; } newRecord.setNowDutyDate(FORMATTER_DATE.format(dutyDate)); // 计算该班次属于那个统计月度 if (dutyDate.getDayOfMonth() >= DutyRecord.START_DATE) { dutyDate = dutyDate.plusMonths(1); } newRecord.setDutyMonth(FORMATTER_MONTH.format(dutyDate)); // 是否夜班 Shift shift = shiftMapper.selectById(newRecord.getShiftId()); if (shift != null) { newRecord.setIsNight(shift.getIsNight()); } } // 1.保存主表 newRecord.setWorkCenter(workstation.getWorkCenter()); baseMapper.insert(newRecord); // 2.保存默认班组人员 if (newRecord.getCrewId() != null) { List staffs = joinCrewStaffMapper.selectStaffByCrewId(newRecord.getCrewId()); for (Staff staff : staffs) { PersonBoard personBoard = new PersonBoard(); personBoard.setWorkTime(LocalDateTime.now()); personBoard.setStaffId(staff.getId()); personBoard.setWorkstationId(newRecord.getWorkstationId()); personBoard.setDutyRecordId(newRecord.getId()); personBoardMapper.insert(personBoard); } } Workstation update = new Workstation(); update.setId(newRecord.getWorkstationId()); update.setDutyRecordId(newRecord.getId()); workstationMapper.updateById(update); result.add(newRecord); } return result; } @Override public List exportShiftWage(QueryWrapper gen){ return baseMapper.exportShiftWage(gen); } @Override public List getStaffProductionWage(Long dutyRecordId){ return productOutputMapper.getStaffProductionWage(dutyRecordId); } @Override public boolean sendUnsubmitMsg() { //统计所有未提交班次记录 Integer unsubmitRecordCount = baseMapper .selectCount(Wrappers.lambdaQuery().eq(DutyRecord::getIsSubmit, false)); //每条消息最多发送100条记录,计算发送多少条消息 int page = unsubmitRecordCount / 100 + (unsubmitRecordCount % 100 == 0 ? 0 : 1); List dutyRecordDTOList = null; Long startIndex = 0L; for(int i=0;i ids) { List dutyRecordList = new ArrayList<>(); for (Long id:ids) { DutyRecord dutyRecord = new DutyRecord(); dutyRecord.setId(id); dutyRecord.setIsSubmit(true); dutyRecordList.add(dutyRecord); } boolean result = updateBatchById(dutyRecordList); dutyRecordList.stream().forEach(a-> backUtils.backDutyRecordById(a.getId(),"提交")); return result; } @Override public boolean updateBatch(List dutyRecordDTOList) { List dutyRecordList = new ArrayList<>(); for (DutyRecordDTO dutyRecordDTO:dutyRecordDTOList) { DutyRecord dutyRecord = new DutyRecord(); BeanUtils.copyProperties(dutyRecordDTO,dutyRecord); dutyRecordList.add(dutyRecord); } this.updateBatchById(dutyRecordList); return true; } }