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<DutyRecordMapper, DutyRecord> 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<DutyRecord> dutyRecordNumberGenerator;
|
private WorkstationMapper workstationMapper;
|
private UnsubmitDutyRecordConfig unsubmitDutyRecordConfig;
|
private final BackUtils backUtils;
|
private SegmentationTaskRecordMapper segmentationTaskRecordMapper;
|
|
@Override
|
public IPage getDutyRecordPage(Page page, QueryWrapper<DutyRecordDTO> 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<Staff> 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.<Computation>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<DutyRecord> wrapper = Wrappers.<DutyRecord>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<PersonBoardDTO> getPersonByDutyRecordId(Long id) {
|
return personBoardMapper.getPersonByDutyRecordId(id);
|
}
|
|
@Override
|
public List<PersonBoardDTO> getPersonByDutyRecordIdList(List<Long> idList) {
|
return personBoardMapper.getPersonByDutyRecordIdList(idList);
|
}
|
|
@Override
|
public List<ProductOutputDTO> getOutputByDutyRecordId(Long id) {
|
return productOutputMapper.getOutputByDutyRecordId(id);
|
}
|
|
@Override
|
public List<ProductOutputDTO> getOutputByDutyRecordIdList(List<Long> idList) {
|
List<ProductOutputDTO> result = productOutputMapper.getOutputByDutyRecordIdList(idList);
|
List<ProductOutputDTO> 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<DutyRecordDTO> 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.<PersonBoard>query().lambda().eq(PersonBoard::getDutyRecordId, id));
|
artificialInformationMapper.delete(Wrappers.<ArtificialInformation>query().lambda().eq(ArtificialInformation::getDutyRecordId, id));
|
} catch (Exception e) {
|
throw new RuntimeException("上班记录删除失败");
|
}
|
return true;
|
}
|
|
@Override
|
public List<DutyRecordData> exportList(QueryWrapper<DutyRecordDTO> gen) {
|
return baseMapper.exportList(gen);
|
}
|
|
@Override
|
public List<PersonBoardData> exportPersonBoard(QueryWrapper<DutyRecordDTO> gen) {
|
return baseMapper.exportPersonBoard(gen);
|
}
|
|
@Override
|
public IPage getArtificialRecord(Page page, QueryWrapper<DutyRecordDTO> gen) {
|
return baseMapper.getArtificialRecord(page, gen);
|
}
|
|
@Override
|
public List<AttendanceData> exportAttendance(QueryWrapper<DutyRecordDTO> gen) {
|
return baseMapper.exportAttendance(gen);
|
}
|
|
@Override
|
public void refreshPendingById(Long dutyRecordId) {
|
if (dutyRecordId != null) {
|
baseMapper.refreshPendingById(dutyRecordId);
|
}
|
}
|
|
@Override
|
public List<Workstation> getWorkstationList(String workCenter) {
|
List<Workstation> workstationList = workstationMapper.selectList(Wrappers.<Workstation>query().lambda()
|
.eq(Workstation::getWorkCenter, workCenter)
|
.orderByAsc(Workstation::getWorkstationNo));
|
return workstationList;
|
}
|
|
@Override
|
public List<DutyRecordDTO> getUnsubmitWorkstationList(String workCenter) {
|
List<DutyRecordDTO> recordDTOList = baseMapper.selectUnsubmitWorkstation(workCenter);
|
return recordDTOList;
|
}
|
|
@Override
|
public List<DutyRecordDTO> batchSave(DutyRecordDTO dutyRecordDTO) {
|
ZttUser user = SecurityUtils.getUser();
|
List<DutyRecordDTO> result = new ArrayList<>();
|
// 找出工作站
|
Workstation workstation = workstationMapper.selectById(dutyRecordDTO.getWorkstationId());
|
// 找出该工作站的工作重心关联的所有工作站
|
//List<Workstation> workstationList = workstationMapper.selectList(Wrappers.<Workstation>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<DutyRecord> wrapper = Wrappers.<DutyRecord>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<Staff> 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<ShiftWageData> exportShiftWage(QueryWrapper<DutyRecordDTO> gen){
|
return baseMapper.exportShiftWage(gen);
|
}
|
|
@Override
|
public List<ProductOutputDTO> getStaffProductionWage(Long dutyRecordId){
|
return productOutputMapper.getStaffProductionWage(dutyRecordId);
|
}
|
|
@Override
|
public boolean sendUnsubmitMsg() {
|
//统计所有未提交班次记录
|
Integer unsubmitRecordCount = baseMapper
|
.selectCount(Wrappers.<DutyRecord>lambdaQuery().eq(DutyRecord::getIsSubmit, false));
|
//每条消息最多发送100条记录,计算发送多少条消息
|
int page = unsubmitRecordCount / 100 + (unsubmitRecordCount % 100 == 0 ? 0 : 1);
|
List<DutyRecordDTO> dutyRecordDTOList = null;
|
Long startIndex = 0L;
|
for(int i=0;i<page;i++){
|
dutyRecordDTOList = baseMapper.selectUnsubmitRecord(startIndex);
|
startIndex = startIndex + 100;
|
StringBuilder msgBuilder = new StringBuilder();
|
msgBuilder.append("MES消息提醒:").append("\n").append("您好,目前有如下机台未提交班次记录,请及时提交:").append("\n");
|
for (DutyRecordDTO dutyRecordDTO:dutyRecordDTOList) {
|
msgBuilder.append("班次:").append(dutyRecordDTO.getDutyNo()).append(" ")
|
.append("工作站:").append(dutyRecordDTO.getWorkstationName()).append("\n");
|
}
|
WxCpUtils.informWebHook(unsubmitDutyRecordConfig.getDutyRecordWebhook(), msgBuilder.toString(),null);
|
}
|
|
return true;
|
}
|
|
@Override
|
public boolean batchSubmit(List<Long> ids) {
|
List<DutyRecord> 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<DutyRecordDTO> dutyRecordDTOList) {
|
List<DutyRecord> dutyRecordList = new ArrayList<>();
|
for (DutyRecordDTO dutyRecordDTO:dutyRecordDTOList) {
|
DutyRecord dutyRecord = new DutyRecord();
|
BeanUtils.copyProperties(dutyRecordDTO,dutyRecord);
|
dutyRecordList.add(dutyRecord);
|
}
|
this.updateBatchById(dutyRecordList);
|
return true;
|
}
|
}
|