Browse Source

add:考勤打卡

caozixuan 1 year ago
parent
commit
3ceac81dc0

+ 82 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/SopCrmInfo.java

@@ -0,0 +1,82 @@
+package com.qmth.sop.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 签到派单信息
+ * @Author: CaoZixuan
+ * @Date: 2023-09-05
+ */
+public class SopCrmInfo {
+    @ApiModelProperty("sop单号")
+    private String sopNo;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("流程id")
+    private Long flowId;
+
+    @ApiModelProperty("派单号")
+    private String crmNo;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("服务单元id")
+    private Long serviceUnitId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("区域协调人id")
+    private Long regionCoordinatorId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("区域经理id")
+    private Long regionManagerId;
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
+    public Long getServiceUnitId() {
+        return serviceUnitId;
+    }
+
+    public void setServiceUnitId(Long serviceUnitId) {
+        this.serviceUnitId = serviceUnitId;
+    }
+
+    public Long getRegionCoordinatorId() {
+        return regionCoordinatorId;
+    }
+
+    public void setRegionCoordinatorId(Long regionCoordinatorId) {
+        this.regionCoordinatorId = regionCoordinatorId;
+    }
+
+    public Long getRegionManagerId() {
+        return regionManagerId;
+    }
+
+    public void setRegionManagerId(Long regionManagerId) {
+        this.regionManagerId = regionManagerId;
+    }
+}

+ 103 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSaveParam.java

@@ -0,0 +1,103 @@
+package com.qmth.sop.business.bean.params;
+
+import com.qmth.sop.common.enums.InOutTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 打卡参数
+ * @Author: CaoZixuan
+ * @Date: 2023-09-05
+ */
+public class DingSaveParam {
+    @ApiModelProperty("sop号")
+    @NotNull(message = "缺少sop号")
+    @NotBlank(message = "缺少sop号")
+    private String sopNo;
+
+    @ApiModelProperty("签到时间")
+    @NotNull(message = "缺少签到时间")
+    @Range(min = 1L, message = "缺少签到时间")
+    private Long signTime;
+
+    @ApiModelProperty("签到类型")
+    @NotNull(message = "缺少签到类型")
+    private InOutTypeEnum signType;
+
+    @ApiModelProperty("签到地址")
+    @NotNull(message = "缺少签到地址")
+    @NotBlank(message = "缺少签到地址")
+    private String signAddress;
+
+    @ApiModelProperty("人脸识别通过?")
+    private Boolean facePass;
+
+    @ApiModelProperty("x坐标")
+    @NotNull(message = "缺少x坐标")
+    @NotBlank(message = "缺少x坐标")
+    private String axisX;
+
+    @ApiModelProperty("y坐标")
+    @NotNull(message = "缺少y坐标")
+    @NotBlank(message = "缺少y坐标")
+    private String axisY;
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Long getSignTime() {
+        return signTime;
+    }
+
+    public void setSignTime(Long signTime) {
+        this.signTime = signTime;
+    }
+
+    public InOutTypeEnum getSignType() {
+        return signType;
+    }
+
+    public void setSignType(InOutTypeEnum signType) {
+        this.signType = signType;
+    }
+
+    public String getSignAddress() {
+        return signAddress;
+    }
+
+    public void setSignAddress(String signAddress) {
+        this.signAddress = signAddress;
+    }
+
+    public Boolean getFacePass() {
+        return facePass;
+    }
+
+    public void setFacePass(Boolean facePass) {
+        this.facePass = facePass;
+    }
+
+    public String getAxisX() {
+        return axisX;
+    }
+
+    public void setAxisX(String axisX) {
+        this.axisX = axisX;
+    }
+
+    public String getAxisY() {
+        return axisY;
+    }
+
+    public void setAxisY(String axisY) {
+        this.axisY = axisY;
+    }
+}

+ 10 - 10
sop-business/src/main/java/com/qmth/sop/business/entity/TBDing.java

@@ -74,7 +74,7 @@ public class TBDing extends BaseEntity implements Serializable {
     private String axisInY;
 
     @ApiModelProperty(value = "人脸识别是否通过,0:未通过,1:通过")
-    private Boolean faceInError;
+    private Boolean faceInPass;
 
     @ApiModelProperty(value = "签退时间")
     private Long signOutTime;
@@ -89,7 +89,7 @@ public class TBDing extends BaseEntity implements Serializable {
     private String axisOutY;
 
     @ApiModelProperty(value = "人脸识别是否通过,0:未通过,1:通过")
-    private Boolean faceOutError;
+    private Boolean faceOutPass;
 
     public String getSopNo() {
         return sopNo;
@@ -211,12 +211,12 @@ public class TBDing extends BaseEntity implements Serializable {
         this.axisInY = axisInY;
     }
 
-    public Boolean getFaceInError() {
-        return faceInError;
+    public Boolean getFaceInPass() {
+        return faceInPass;
     }
 
-    public void setFaceInError(Boolean faceInError) {
-        this.faceInError = faceInError;
+    public void setFaceInPass(Boolean faceInPass) {
+        this.faceInPass = faceInPass;
     }
 
     public Long getSignOutTime() {
@@ -251,11 +251,11 @@ public class TBDing extends BaseEntity implements Serializable {
         this.axisOutY = axisOutY;
     }
 
-    public Boolean getFaceOutError() {
-        return faceOutError;
+    public Boolean getFaceOutPass() {
+        return faceOutPass;
     }
 
-    public void setFaceOutError(Boolean faceOutError) {
-        this.faceOutError = faceOutError;
+    public void setFaceOutPass(Boolean faceOutPass) {
+        this.faceOutPass = faceOutPass;
     }
 }

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBCrmMapper.java

@@ -3,6 +3,7 @@ package com.qmth.sop.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.result.CrmProjectResult;
 import com.qmth.sop.business.bean.result.CrmServiceResult;
 import com.qmth.sop.business.bean.result.SysLogResult;
@@ -86,4 +87,12 @@ public interface TBCrmMapper extends BaseMapper<TBCrm> {
      * @return 派单项目结果
      */
     List<CrmProjectResult> findCrmProjectBySopNo(@Param("sopNo") String sopNo);
+
+    /**
+     * 根据sopNo查询派单信息
+     *
+     * @param sopNo sop号
+     * @return sop派单信息
+     */
+    List<SopCrmInfo> findSopCrmInfoBySopNo(@Param("sopNo") String sopNo);
 }

+ 1 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java

@@ -2,6 +2,7 @@ package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.entity.TBDing;
 import com.qmth.sop.business.entity.TFFlowApprove;

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/service/SysRoleService.java

@@ -64,4 +64,13 @@ public interface SysRoleService extends IService<SysRole> {
      * @return 角色
      */
     RoleResult findRoleInfoByArchivesType(RoleTypeEnum roleTypeEnum);
+
+    /**
+     * 查询用户在某派单中执行的工程师
+     *
+     * @param userId 用户id
+     * @param crmNo  派单号
+     * @return 角色
+     */
+    RoleTypeEnum findRoleTypeByUserCrm(Long userId, String crmNo);
 }

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmService.java

@@ -2,6 +2,7 @@ package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.params.ServiceScopeParam;
 import com.qmth.sop.business.bean.result.CrmProjectResult;
 import com.qmth.sop.business.bean.result.CrmServiceResult;
@@ -124,4 +125,12 @@ public interface TBCrmService extends IService<TBCrm> {
      * @return 项目派单信息
      */
     CrmProjectResult findCrmProjectBySopNo(String sopNo);
+
+    /**
+     * 根据sop单号查询签到中派单信息
+     *
+     * @param sopNo sop单号
+     * @return 签到中派单信息
+     */
+    SopCrmInfo findSopCrmInfoBySop(String sopNo);
 }

+ 12 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java

@@ -3,6 +3,8 @@ package com.qmth.sop.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 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.common.enums.DingResultEnum;
@@ -42,6 +44,14 @@ public interface TBDingService extends IService<TBDing> {
      */
     DingStatisticResult findDingStatistic(Long serviceUnitId, String sopNo, Long userArchivesId);
 
+    /**
+     * 保存打卡记录
+     *
+     * @param dingSaveParam 打卡记录保存参数
+     * @param userId        当前请求用户id
+     */
+    void dingSave(DingSaveParam dingSaveParam, Long userId);
+
 
     /**
      * 查询列表
@@ -68,4 +78,6 @@ public interface TBDingService extends IService<TBDing> {
      * @return 应签到日期
      */
     DateFormDto buildSignDateFormBySop(String sopNo);
+
+
 }

+ 1 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBUserArchivesAllocationService.java

@@ -8,6 +8,7 @@ import com.qmth.sop.business.bean.result.CrmArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
 import com.qmth.sop.business.entity.TBUserArchivesAllocation;
+import com.qmth.sop.common.enums.RoleTypeEnum;
 
 import java.util.List;
 

+ 25 - 8
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysRoleServiceImpl.java

@@ -8,15 +8,9 @@ import com.qmth.sop.business.bean.dto.RoleDto;
 import com.qmth.sop.business.bean.params.SysRolePrivilegeParam;
 import com.qmth.sop.business.bean.result.RoleResult;
 import com.qmth.sop.business.cache.CommonCacheService;
-import com.qmth.sop.business.entity.SysRole;
-import com.qmth.sop.business.entity.SysRolePrivilege;
-import com.qmth.sop.business.entity.SysUser;
-import com.qmth.sop.business.entity.SysUserRole;
+import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.SysRoleMapper;
-import com.qmth.sop.business.service.SysRolePrivilegeService;
-import com.qmth.sop.business.service.SysRoleService;
-import com.qmth.sop.business.service.SysUserRoleService;
-import com.qmth.sop.business.service.SysUserService;
+import com.qmth.sop.business.service.*;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.FieldUniqueEnum;
 import com.qmth.sop.common.enums.RoleTypeEnum;
@@ -58,6 +52,12 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     @Resource
     SysUserService sysUserService;
 
+    @Resource
+    TBUserArchivesService tbUserArchivesService;
+
+    @Resource
+    TBUserArchivesAllocationService tbUserArchivesAllocationService;
+
     /**
      * 根据userId查询角色
      *
@@ -182,4 +182,21 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         }
         return result;
     }
+
+    @Override
+    public RoleTypeEnum findRoleTypeByUserCrm(Long userId, String crmNo) {
+        RoleTypeEnum result = null;
+        List<TBUserArchivesAllocation> tbUserArchivesAllocationList = tbUserArchivesAllocationService.list(new QueryWrapper<TBUserArchivesAllocation>().lambda()
+                .eq(TBUserArchivesAllocation::getUserId, userId)
+                .eq(TBUserArchivesAllocation::getCrmNo, crmNo));
+        if (!CollectionUtils.isEmpty(tbUserArchivesAllocationList)) {
+            TBUserArchivesAllocation tbUserArchivesAllocation = tbUserArchivesAllocationList.get(0);
+            Long roleId = tbUserArchivesAllocation.getRoleId();
+            SysRole role = this.getById(roleId);
+            if (Objects.nonNull(role)) {
+                result = role.getType();
+            }
+        }
+        return result;
+    }
 }

+ 14 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.dto.UserArchivesDto;
 import com.qmth.sop.business.bean.params.ServiceScopeParam;
 import com.qmth.sop.business.bean.result.*;
@@ -262,4 +263,17 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
         }
         return result;
     }
+
+
+    @Override
+    public SopCrmInfo findSopCrmInfoBySop(String sopNo) {
+        // TODO: 2023/9/5 大区经理关联方式有问题
+        List<SopCrmInfo> sopCrmInfoList = this.baseMapper.findSopCrmInfoBySopNo(sopNo);
+        if (CollectionUtils.isEmpty(sopCrmInfoList)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("未找到sop单号为[%s]的派单信息", sopNo));
+        } else if (sopCrmInfoList.size() > 1) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("sop单号为[%s]的派单信息异常", sopNo));
+        }
+        return sopCrmInfoList.get(0);
+    }
 }

+ 121 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -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);
+        }
+    }
+
     /**
      * 查询列表
      *

+ 5 - 0
sop-business/src/main/resources/db/log/caozixuan_update_log.sql

@@ -225,3 +225,8 @@ ALTER TABLE t_b_device_in_out
 ALTER TABLE t_b_ding
     ADD COLUMN ding_sop_no VARCHAR(100) NOT NULL COMMENT '实际打卡对应的sop单号' AFTER sop_no,
     CHANGE COLUMN sop_no sop_no VARCHAR(100) NOT NULL COMMENT 'sop单号';
+
+ALTER TABLE t_b_ding
+    CHANGE COLUMN face_in_error face_in_pass TINYINT NULL DEFAULT NULL COMMENT '人脸识别是否通过,0:未通过,1:通过' ,
+    CHANGE COLUMN face_out_error face_out_pass TINYINT NULL DEFAULT NULL COMMENT '人脸识别是否通过,0:未通过,1:通过' ;
+

+ 22 - 0
sop-business/src/main/resources/mapper/TBCrmMapper.xml

@@ -218,4 +218,26 @@
             </if>
         </where>
     </select>
+    <select id="findSopCrmInfoBySopNo" resultType="com.qmth.sop.business.bean.dto.SopCrmInfo">
+        SELECT
+            tfcfe.code AS sopNo,
+            tfcfe.flow_id AS flowId,
+            tbc.crm_no AS crmNo,
+            tbs.id AS serviceUnitId,
+            tbc.region_coordinator_id AS regionCoordinatorId,
+            tbsr.lead_id AS regionManagerId
+        FROM
+            t_f_custom_flow_entity tfcfe
+                LEFT JOIN
+            t_b_crm tbc ON tfcfe.crm_no = tbc.crm_no
+                LEFT JOIN
+            t_b_service tbs ON tbc.service_id = tbs.id
+                LEFT JOIN
+            t_b_service_region tbsr ON tbsr.service_id = tbs.id
+        <where>
+            <if test="sopNo != null and sopNo != ''">
+                AND tfcfe.code = #{sopNo}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 13 - 0
sop-common/src/main/java/com/qmth/sop/common/util/DateDisposeUtils.java

@@ -7,6 +7,9 @@ import java.lang.management.ManagementFactory;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -228,4 +231,14 @@ public class DateDisposeUtils extends DateUtils {
 
         return days;
     }
+
+    /**
+     * 时间戳(毫秒级)转换成localDate
+     *
+     * @param time 时间戳(毫秒级)
+     * @return localDate
+     */
+    public static LocalDate timestampToLocalDate(Long time) {
+        return Instant.ofEpochMilli(time).atZone(ZoneOffset.ofHours(8)).toLocalDate();
+    }
 }