|
@@ -4,23 +4,29 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qmth.sop.business.bean.dto.DateFormDto;
|
|
|
+import com.qmth.sop.business.bean.dto.SopCrmInfo;
|
|
|
+import com.qmth.sop.business.bean.params.DingSaveParam;
|
|
|
import com.qmth.sop.business.bean.result.*;
|
|
|
import com.qmth.sop.business.entity.TBDing;
|
|
|
+import com.qmth.sop.business.entity.TBUserArchives;
|
|
|
import com.qmth.sop.business.entity.TFFlowApprove;
|
|
|
import com.qmth.sop.business.mapper.TBDingMapper;
|
|
|
-import com.qmth.sop.business.service.TBDingService;
|
|
|
+import com.qmth.sop.business.service.*;
|
|
|
import com.qmth.sop.common.contant.SystemConstant;
|
|
|
import com.qmth.sop.common.enums.*;
|
|
|
import com.qmth.sop.common.util.DateDisposeUtils;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
/**
|
|
|
* 考勤打卡表 服务实现.
|
|
@@ -33,6 +39,14 @@ import java.util.stream.Collectors;
|
|
|
*/
|
|
|
@Service
|
|
|
public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> implements TBDingService {
|
|
|
+ @Resource
|
|
|
+ private SysRoleService sysRoleService;
|
|
|
+ @Resource
|
|
|
+ private TBCrmService tbCrmService;
|
|
|
+ @Resource
|
|
|
+ private TBUserArchivesService tbUserArchivesService;
|
|
|
+ @Resource
|
|
|
+ private SysDingDateService sysDingDateService;
|
|
|
|
|
|
@Override
|
|
|
public DingElementResult findDingElements(String sopNo, Long userId) {
|
|
@@ -184,6 +198,112 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
|
|
|
return dingStatisticResult;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void dingSave(DingSaveParam dingSaveParam, Long userId) {
|
|
|
+ String sopNo = dingSaveParam.getSopNo();
|
|
|
+ Long signTime = dingSaveParam.getSignTime();
|
|
|
+ DingDateTypeEnum dateType = sysDingDateService.getDingDateType(DateDisposeUtils.timestampToLocalDate(signTime));
|
|
|
+
|
|
|
+ InOutTypeEnum signType = dingSaveParam.getSignType();
|
|
|
+ String signAddress = dingSaveParam.getSignAddress();
|
|
|
+ Boolean facePass = dingSaveParam.getFacePass();
|
|
|
+ String axisX = dingSaveParam.getAxisX();
|
|
|
+ String axisY = dingSaveParam.getAxisY();
|
|
|
+
|
|
|
+ TBUserArchives tbUserArchives = tbUserArchivesService.findByUserId(userId);
|
|
|
+ Long userArchivesId = tbUserArchives.getId();
|
|
|
+
|
|
|
+ SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
|
|
|
+ String crmNo = sopCrmInfo.getCrmNo();
|
|
|
+ Long serviceId = sopCrmInfo.getServiceUnitId();
|
|
|
+ Long flowId = sopCrmInfo.getFlowId();
|
|
|
+ RoleTypeEnum roleType = sysRoleService.findRoleTypeByUserCrm(userId, crmNo);
|
|
|
+
|
|
|
+ String signDate = DateFormatUtils.format(signTime, SystemConstant.DEFAULT_DATE_DAY_PATTERN);
|
|
|
+ String currentDayStr = DateFormatUtils.format(System.currentTimeMillis(), SystemConstant.DEFAULT_DATE_DAY_PATTERN);
|
|
|
+ if (currentDayStr.equals(signDate)) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("打卡失败,时间异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<TBDing> tbDingList = this.list(new QueryWrapper<TBDing>().lambda()
|
|
|
+ .eq(TBDing::getSopNo, sopNo)
|
|
|
+ .eq(TBDing::getUserId, userId)
|
|
|
+ .eq(TBDing::getSignDate, signDate));
|
|
|
+
|
|
|
+ // TODO: 2023/9/5 其他的sopNo集合
|
|
|
+ List<String> otherSopNoList = new ArrayList<>();
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(tbDingList)) {
|
|
|
+ // 没有这天的打卡记录 - 新增打卡记录
|
|
|
+ TBDing tbDing = new TBDing();
|
|
|
+ tbDing.setSopNo(sopNo);
|
|
|
+ tbDing.setDingSopNo(sopNo);
|
|
|
+ tbDing.setCrmNo(crmNo);
|
|
|
+ tbDing.setServiceId(serviceId);
|
|
|
+ tbDing.setUserArchivesId(userArchivesId);
|
|
|
+ tbDing.setRoleType(roleType);
|
|
|
+ tbDing.setUserId(userId);
|
|
|
+ tbDing.setFlowId(flowId);
|
|
|
+ tbDing.setSignDate(signDate);
|
|
|
+ tbDing.setDateType(dateType);
|
|
|
+ switch (signType) {
|
|
|
+ case IN: // 签到打卡
|
|
|
+ tbDing.setSignInTime(signTime);
|
|
|
+ tbDing.setSignInAddress(signAddress);
|
|
|
+ tbDing.setAxisInX(axisX);
|
|
|
+ tbDing.setAxisInY(axisY);
|
|
|
+ tbDing.setFaceInPass(facePass);
|
|
|
+ break;
|
|
|
+ case OUT: // 签退打卡
|
|
|
+ tbDing.setSignOutTime(signTime);
|
|
|
+ tbDing.setSignOutAddress(signAddress);
|
|
|
+ tbDing.setAxisOutX(axisX);
|
|
|
+ tbDing.setAxisOutY(axisY);
|
|
|
+ tbDing.setFaceOutPass(facePass);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ List<TBDing> willAddDingList = otherSopNoList.stream().flatMap(e -> {
|
|
|
+ TBDing cell = new TBDing();
|
|
|
+ BeanUtils.copyProperties(tbDing, cell);
|
|
|
+ cell.setSopNo(e);
|
|
|
+ return Stream.of(cell);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ this.saveBatch(willAddDingList);
|
|
|
+ } else {
|
|
|
+ // 有这天的打卡记录 - 签退打卡或更新打卡
|
|
|
+ if (tbDingList.size() > 1) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception(String.format("用户id为[%s],sop单号为[%s],在[%s]的打卡记录异常", userId, sopNo, signDate));
|
|
|
+ }
|
|
|
+ // 此人当天的所有sop打卡记录
|
|
|
+ List<TBDing> recordList = this.list(new QueryWrapper<TBDing>().lambda()
|
|
|
+ .eq(TBDing::getDingSopNo, sopNo)
|
|
|
+ .eq(TBDing::getUserId, userId)
|
|
|
+ .eq(TBDing::getSignDate, signDate));
|
|
|
+
|
|
|
+ switch (signType) {
|
|
|
+ case IN: // 签到打卡
|
|
|
+ recordList = recordList.stream().peek(e -> {
|
|
|
+ e.setSignInTime(signTime);
|
|
|
+ e.setSignInAddress(signAddress);
|
|
|
+ e.setAxisInX(axisX);
|
|
|
+ e.setAxisInY(axisY);
|
|
|
+ e.setFaceInPass(facePass);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ break;
|
|
|
+ case OUT: // 签退打卡
|
|
|
+ recordList = recordList.stream().peek(e -> {
|
|
|
+ e.setSignOutTime(signTime);
|
|
|
+ e.setSignOutAddress(signAddress);
|
|
|
+ e.setAxisOutX(axisX);
|
|
|
+ e.setAxisOutY(axisY);
|
|
|
+ e.setFaceOutPass(facePass);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ this.updateBatchById(recordList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 查询列表
|
|
|
*
|