Merge remote-tracking branch 'origin/cc_20230520_partner' into cc_20230520_partner

# Conflicts:
#	coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewPlanMapper.java
#	coolstore-partner-dao/src/main/resources/mapper/HyPartnerInterviewPlanMapper.xml
This commit is contained in:
俞扬
2023-06-17 18:19:17 +08:00
43 changed files with 580 additions and 223 deletions

View File

@@ -1,15 +1,26 @@
package com.cool.store.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.cool.store.constants.CommonConstants;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.response.ResponseResult;
import com.cool.store.response.error.ErrorResponse;
import com.cool.store.utils.UUIDUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhangchenbiao
* @FileName: CustomExceptionHandler
@@ -21,24 +32,41 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
public class CustomExceptionHandler {
@ExceptionHandler(value = ServiceException.class)
public ResponseEntity<ErrorResponse> handleCustomException(ServiceException e) {
public void handleCustomException(ServiceException e, HttpServletResponse httpServletResponse) {
log.error(e.getMessage(), e);
ErrorResponse errorResponse = new ErrorResponse(e.getErrorCode(), e.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
ResponseResult responseResult = new ResponseResult(e.getErrorCode(), e.getMessage());
responseResult(httpServletResponse, responseResult);
}
@ExceptionHandler(value = ApiException.class)
public ResponseEntity<ErrorResponse> handleCustomException(ApiException e) {
public void handleCustomException(ApiException e, HttpServletResponse httpServletResponse) {
log.error(e.getMessage(), e);
ErrorResponse errorResponse = new ErrorResponse(e.getErrorCode(), e.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
ResponseResult responseResult = new ResponseResult(e.getErrorCode(), e.getMessage());
responseResult(httpServletResponse, responseResult);
}
@ExceptionHandler(value = Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception e) {
public void handleException(Exception e, HttpServletResponse httpServletResponse) {
log.error(e.getMessage(), e);
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
ResponseResult responseResult = new ResponseResult(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
responseResult(httpServletResponse, responseResult);
}
private void responseResult(HttpServletResponse response, ResponseResult result) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "application/json;charset=UTF-8");
String requestId = MDC.get(CommonConstants.REQUEST_ID);
if(StringUtils.isBlank(requestId)){
requestId = UUIDUtils.get32UUID();
}
result.setRequestId(requestId);
result.setData(null);
try {
response.getWriter().write(JSONObject.toJSONString(result, SerializerFeature.WriteNullStringAsEmpty));
} catch (IOException ex) {
log.error(ex.getMessage(),ex);
}
}
}

View File

@@ -125,6 +125,28 @@ public class ISVHttpRequest {
return null;
}
/**
* 获取部门详情
* @param deptId
* @return
*/
public SysDepartmentDTO getDepartmentDetail(String deptId){
String url = isvDomain + "/corp/getDepartmentDetail";
HashMap requestMap = new HashMap();
requestMap.put("deptId", deptId);
ResultDTO responseEntity = null;
try {
responseEntity = httpRestTemplateService.getForObject(url, ResultDTO.class, requestMap);
log.info("url:{}, response:{}", url, JSONObject.toJSONString(responseEntity));
if(Objects.nonNull(responseEntity.getData()) && responseEntity.isSuccess()){
return JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getData()), SysDepartmentDTO.class);
}
} catch (Exception e) {
log.info("调用isv出错{}", e);
}
return null;
}
public AuthScopeDTO getAuthScope(){
String url = isvDomain + "/corp/getAuthScope";
HashMap requestMap = new HashMap();

View File

@@ -45,10 +45,9 @@ public class RocketMqLogAspect {
Object[] args = joinPoint.getArgs();
Message message = (Message)args[0];
String traceId = message.getMsgID() + Constants.TOPIC_PARTITION_SEPARATOR + message.getReconsumeTimes();
Map<String, String> context = MDC.getCopyOfContextMap();
if(Objects.isNull(context)){
MDC.put(CommonConstants.REQUEST_ID, traceId);
}
String requestId = message.getUserProperties(CommonConstants.REQUEST_ID);
MDC.put(CommonConstants.REQUEST_ID, requestId);
MDC.put(CommonConstants.MESSAGE_ID, traceId);
} catch (IllegalArgumentException e) {
log.info("MDC mqBeforeLog", e);
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.service;
import com.cool.store.dto.partner.DescribePhoneNumberDTO;
import com.cool.store.enums.IDCardSideEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.vo.cuser.IdentityCardInfoVO;
@@ -24,6 +25,6 @@ public interface AliyunService {
* @param faceImageUrl
* @return
*/
IdentityCardInfoVO getIdentityCardInfo(String faceImageUrl) throws ApiException;
IdentityCardInfoVO getIdentityCardInfo(String faceImageUrl, IDCardSideEnum sideEnum) throws ApiException;
}

View File

@@ -22,4 +22,8 @@ public interface HyPartnerBaseInfoService {
Boolean submitPartnerBaseInfo(PartnerBaseInfoRequest request);
PartnerBaseInfoVO queryPartnerBaseInfo(String partnerId, Long lineId);
Long getLineIdByIdCard(String idCard);
}

View File

@@ -104,5 +104,7 @@ public interface HyPartnerLineInfoService {
*/
PageInfo<PublicSeaLineListVo> publicSeaLineList(String userId,LineRequest lineRequest);
PartnerLineBaseInfoVO getPartnerLinBaseInfo(String partnerId);
}

View File

@@ -25,6 +25,6 @@ public interface PartnerInterviewService {
/**
* 获取通知函详情
*/
PartnerPassLetterDetailVO passLetterDetail(String interviewId);
PartnerPassLetterDetailVO passLetterDetail(String interviewPlanId);
}

View File

@@ -9,6 +9,7 @@ import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.cool.store.dto.partner.DescribePhoneNumberDTO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.IDCardSideEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.service.AliyunService;
@@ -23,6 +24,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.Optional;
/**
@@ -61,7 +63,7 @@ public class AliyunServiceImpl implements AliyunService {
}
@Override
public IdentityCardInfoVO getIdentityCardInfo(String faceImageUrl) throws ApiException {
public IdentityCardInfoVO getIdentityCardInfo(String faceImageUrl, IDCardSideEnum sideEnum) throws ApiException {
//todo zcb ak sk替换
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
.setAccessKeyId("LTAI5t9RaXvABZbHvoXjDFJ1")
@@ -74,23 +76,26 @@ public class AliyunServiceImpl implements AliyunService {
InputStream inputStream = url.openConnection().getInputStream();
com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest recognizeIdentityCardAdvanceRequest = new com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest()
.setImageURLObject(inputStream)
.setSide("face");
.setSide(sideEnum.getCode());
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
RecognizeIdentityCardResponse idCardResponse = client.recognizeIdentityCardAdvance(recognizeIdentityCardAdvanceRequest, runtime);
log.info("身份证解析结果:{}", JSONObject.toJSONString(idCardResponse));
RecognizeIdentityCardResponseBody.RecognizeIdentityCardResponseBodyDataFrontResult frontResult = Optional.ofNullable(idCardResponse).map(o -> o.getBody()).map(o -> o.data).map(o -> o.frontResult).orElse(null);
String username = frontResult.name;
String liveAddress = frontResult.address;
String birthdate = frontResult.birthDate;
if(StringUtils.isNotBlank(birthdate)){
birthdate = convertDate(birthdate, "yyyyMMdd");
if(Objects.nonNull(frontResult)){
String username = frontResult.name;
String liveAddress = frontResult.address;
String birthdate = frontResult.birthDate;
if(StringUtils.isNotBlank(birthdate)){
birthdate = convertDate(birthdate, "yyyyMMdd");
}
String sex = frontResult.gender;
String idCard = frontResult.IDNumber;
String nation = frontResult.nationality;
IdentityCardInfoVO result = new IdentityCardInfoVO(username, liveAddress, birthdate, sex, idCard, nation);
log.info("身份证解析:{}", JSONObject.toJSONString(result));
return result;
}
String sex = frontResult.gender;
String idCard = frontResult.IDNumber;
String nation = frontResult.nationality;
IdentityCardInfoVO result = new IdentityCardInfoVO(username, liveAddress, birthdate, sex, idCard, nation);
log.info("身份证解析:{}", JSONObject.toJSONString(result));
return result;
return null;
} catch (com.aliyun.tea.TeaException e) {
log.error("身份证解析报错TeaException{}", e);
throw new ApiException(e.getMessage());

View File

@@ -1,5 +1,6 @@
package com.cool.store.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.*;
@@ -9,6 +10,8 @@ import com.cool.store.dto.dept.DepartmentEventDTO;
import com.cool.store.dto.enterprise.*;
import com.cool.store.entity.*;
import com.cool.store.enums.DataSourceEnum;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest;
import com.cool.store.service.EnterpriseSyncService;
import com.google.common.collect.ArrayListMultimap;
@@ -209,16 +212,61 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
@Override
public void deptUpdateEvent(DepartmentEventDTO param) {
SysDepartmentDTO departmentDetail = isvHttpRequest.getDepartmentDetail(param.getDepartmentId());
if(Objects.isNull(departmentDetail)){
return;
}
log.info("部门变更:{}", JSONObject.toJSONString(param));
switch (parseValue(param.getEventType())){
case DEPARTMENT_CREATED:
RegionDO parentRegionInfo = regionDAO.getRegionInfoByRegionId(departmentDetail.getParentId());
if(Objects.isNull(parentRegionInfo)){
throw new ServiceException(ErrorCodeEnum.PARENT_NODE_NOT_EXIST);
}
Multimap<String, String> leaderDeptMap = ArrayListMultimap.create();
RegionDO region = SysDepartmentDTO.convertRegionDO(departmentDetail, leaderDeptMap, parentRegionInfo);
regionDAO.batchInsertOrUpdate(Arrays.asList(region));
dealUserLeaderDept(leaderDeptMap);
break;
case DEPARTMENT_UPDATED:
if(param.getIsChangeParent()){
syncAll();
return;
}
Multimap<String, String> updateLeaderDeptMap = ArrayListMultimap.create();
RegionDO updateRegion = SysDepartmentDTO.convertRegionDO(departmentDetail, updateLeaderDeptMap);
regionDAO.batchInsertOrUpdate(Arrays.asList(updateRegion));
dealUserLeaderDept(updateLeaderDeptMap);
break;
case DEPARTMENT_DELETED:
syncAll();
break;
default:
return;
}
}
public void dealUserLeaderDept(Multimap<String, String> leaderDeptMap){
if(leaderDeptMap.isEmpty()){
return;
}
List<String> userIds = leaderDeptMap.keys().stream().collect(Collectors.toList());
List<EnterpriseUserDO> userList = enterpriseUserDAO.getUserInfoByUserIds(userIds);
for (EnterpriseUserDO enterpriseUser : userList) {
List<String> deptIds = leaderDeptMap.get(enterpriseUser.getUserId()).stream().collect(Collectors.toList());
String leaderDeptIds = enterpriseUser.getLeaderDeptIds();
if(StringUtils.isNotBlank(leaderDeptIds)){
List<String> existDeptIds = JSONObject.parseArray(leaderDeptIds).stream().map(String::valueOf).collect(Collectors.toList());
//取并集
existDeptIds.addAll(deptIds);
List<String> allDeptIds = existDeptIds.stream().distinct().collect(Collectors.toList());
enterpriseUser.setLeaderDeptIds(JSONObject.toJSONString(allDeptIds));
}else{
enterpriseUser.setLeaderDeptIds(JSONObject.toJSONString(deptIds));
}
enterpriseUser.setIsLeader(Boolean.TRUE);
}
enterpriseUserDAO.batchInsertOrUpdate(userList);
}
}

View File

@@ -67,6 +67,11 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService {
return baseInfoVO;
}
@Override
public Long getLineIdByIdCard(String idCard) {
return hyPartnerBaseInfoDAO.getLineIdByIdCard(idCard);
}
private void fillBaseInfo(HyPartnerBaseInfoDO baseInfoDO, PartnerBaseInfoRequest request) {
baseInfoDO.setPartnerId(request.getPartnerId());
baseInfoDO.setPartnerLineId(request.getPartnerLineId());

View File

@@ -1,7 +1,9 @@
package com.cool.store.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.RedisConstant;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyPartnerLineInfoDAO;
import com.cool.store.dao.HyPartnerUserInfoDAO;
@@ -17,19 +19,21 @@ import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.request.CloseFollowRequest;
import com.cool.store.request.LineRequest;
import com.cool.store.service.EnterpriseUserService;
import com.cool.store.service.HyPartnerLineInfoService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.RedisUtilPool;
import com.cool.store.utils.StringUtil;
import com.cool.store.vo.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -49,6 +53,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
EnterpriseUserDAO enterpriseUserDAO;
@Resource
UserRegionMappingDAO userRegionMappingDAO;
@Resource
private RedisUtilPool redisUtilPool;
@Override
public StageCountVO selectStagePendingCount(String userId) {
@@ -291,6 +297,18 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
return publicSeaLineList;
}
@Override
public PartnerLineBaseInfoVO getPartnerLinBaseInfo(String partnerId) {
PartnerLineBaseInfoVO lineBaseInfoVO = new PartnerLineBaseInfoVO();
// todo wxp 需要加条件
HyPartnerLineInfoDO lineInfoDO = hyPartnerLineInfoDAO.getByPartnerId(partnerId);
BeanUtil.copyProperties(lineInfoDO, lineBaseInfoVO);
String coolingPeriodFirstLoginCacheKey = MessageFormat.format(RedisConstant.COOLINGPERIOD_FIRSTLOGIN_KEY, partnerId);
String value = redisUtilPool.getString(coolingPeriodFirstLoginCacheKey);
lineBaseInfoVO.setCoolDownFirstLoginFlag(StringUtils.isNotBlank(value));
return lineBaseInfoVO;
}
/**
* convertPartnerBlackListDTOToVo
* @param partnerBlackListDTO

View File

@@ -16,6 +16,7 @@ import com.cool.store.request.ModifyInterviewTimeReq;
import com.cool.store.service.InterviewService;
import com.cool.store.utils.TRTCUtils;
import com.cool.store.vo.EnterInterviewVO;
import com.cool.store.vo.EnterpriseUserBaseInfoVO;
import com.cool.store.vo.interview.InterviewVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -57,7 +58,15 @@ public class InterviewServiceImpl implements InterviewService {
@Override
public InterviewVO getInterviewInfo(String interviewId) {
return hyPartnerInterviewPlanMapper.getInterviewInfo(interviewId);
InterviewVO vo = hyPartnerInterviewPlanMapper.getInterviewInfo(interviewId);
//查询面试官和记录人信息
EnterpriseUserBaseInfoVO interviewerInfo = hyPartnerInterviewPlanMapper.getEnterpriseUserBaseInfo(vo.getInterviewerId());
vo.setInterviewerName(interviewerInfo.getName());
vo.setInterviewerMobile(interviewerInfo.getMobile());
EnterpriseUserBaseInfoVO recorderInfo = hyPartnerInterviewPlanMapper.getEnterpriseUserBaseInfo(vo.getRecorderId());
vo.setRecorderName(recorderInfo.getName());
vo.setRecorderMobile(recorderInfo.getMobile());
return vo;
}
@Override
@@ -125,15 +134,15 @@ public class InterviewServiceImpl implements InterviewService {
public EnterInterviewVO enterInterviewRoom(EnterInterviewDto dto) {
try {
//1. 将面试状态改为 --> 2已开始
interviewMapper.updateInterviewStatus(dto.getInterviewId(), 2);
interviewMapper.updateInterviewStatus(dto.getInterviewPlanId(), 2);
//3. 修改面试实际开始时间,以第一个人进来的时间为准,后续不再修改
interviewMapper.updateActualStartTime(dto.getInterviewId(), DateUtil.now());
interviewMapper.updateActualStartTime(dto.getInterviewPlanId(), DateUtil.now());
//4. 修改加盟商或面试官进入面试时间
interviewMapper.updateEnterTime(dto.getInterviewId(), dto.getUserType(), DateUtil.now());
interviewMapper.updateEnterTime(dto.getInterviewPlanId(), dto.getUserType(), DateUtil.now());
//5. 加盟商如果进入了,就修改面试计划表 is_partner_interview 字段
interviewMapper.updateWhetherPartnerEnter(dto.getInterviewId());
interviewMapper.updateWhetherPartnerEnter(dto.getInterviewPlanId());
//6. 查询对应的面试官id、姓名及加盟商姓名
EnterInterviewVO vo = interviewMapper.getInterviewerByInterviewId(dto.getInterviewId());
EnterInterviewVO vo = interviewMapper.getInterviewerByInterviewPlanId(dto.getInterviewPlanId());
//生成 userSign
String userSig = TRTCUtils.genUserSig(sdkAppId, key, dto.getUserId());
vo.setUserSign(userSig);

View File

@@ -9,6 +9,7 @@ import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.oss.OSSServer;
import com.cool.store.service.PartnerInterviewService;
import com.cool.store.utils.PDFUtils;
import com.cool.store.utils.PassLetterUtils;
import com.cool.store.utils.TRTCUtils;
import com.cool.store.vo.EnterInterviewVO;
@@ -21,6 +22,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.*;
import static com.cool.store.utils.PDFUtils.pdf2Img;
@Service
public class PartnerInterviewServiceImpl implements PartnerInterviewService {
@@ -59,15 +62,15 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
public EnterInterviewVO enterInterviewRoom(EnterInterviewDto dto) {
try {
//1. 将面试状态改为 --> 2已开始
interviewMapper.updateInterviewStatus(dto.getInterviewId(), 2);
interviewMapper.updateInterviewStatus(dto.getInterviewPlanId(), 2);
//3. 修改面试实际开始时间,以第一个人进来的时间为准,后续不再修改
interviewMapper.updateActualStartTime(dto.getInterviewId(), DateUtil.now());
interviewMapper.updateActualStartTime(dto.getInterviewPlanId(), DateUtil.now());
//4. 修改加盟商或面试官进入面试时间
interviewMapper.updateEnterTime(dto.getInterviewId(), dto.getUserType(), DateUtil.now());
interviewMapper.updateEnterTime(dto.getInterviewPlanId(), dto.getUserType(), DateUtil.now());
//5. 加盟商如果进入了,就修改面试计划表 is_partner_interview 字段
interviewMapper.updateWhetherPartnerEnter(dto.getInterviewId());
interviewMapper.updateWhetherPartnerEnter(dto.getInterviewPlanId());
//6. 查询对应的面试官id、姓名及加盟商姓名
EnterInterviewVO vo = interviewMapper.getInterviewerByInterviewId(dto.getInterviewId());
EnterInterviewVO vo = interviewMapper.getInterviewerByInterviewPlanId(dto.getInterviewPlanId());
//生成 userSign
String userSig = TRTCUtils.genUserSig(sdkAppId, key, dto.getUserId());
vo.setUserSign(userSig);
@@ -79,11 +82,10 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
/**
* 获取通知函详情
* TODO 暂时将生成通过函文件的功能放在这里方便测试和联调,审批通过的回调方法完成后应该放到该方法中
*/
@Override
public PartnerPassLetterDetailVO passLetterDetail(String interviewId) {
PartnerPassLetterDetailVO vo = interviewMapper.getPassLetterDetail(interviewId);
public PartnerPassLetterDetailVO passLetterDetail(String interviewPlanId) {
PartnerPassLetterDetailVO vo = interviewMapper.getPassLetterDetail(interviewPlanId);
//解析意向开店区域为市级行政区
String verifyCity = vo.getVerifyCity();
String[] split = verifyCity.split("/");
@@ -97,33 +99,48 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
} else {
System.out.println("wrong");
}
// TODO 调用生成通过函和修改数据库数据的方法
String passCode = genPassLetterAndUpdateDB(vo, interviewId);
verifyCity = vo.getVerifyCity();
// 调用生成通过函和修改数据库数据的方法
String passCode = genPassLetterAndUpdateDB(vo, interviewPlanId);
//再查一次 vo
vo = interviewMapper.getPassLetterDetail(interviewId);
vo = interviewMapper.getPassLetterDetail(interviewPlanId);
//有效期为审批通过次日起第 60 天的 23:59:59由此倒推 createTime
DateTime expiryDate = DateUtil.parseDate(vo.getExpiryDate());
DateTime createTime = DateUtil.offsetDay(expiryDate, -60);
vo.setCreateTime(DateUtil.format(createTime, "yyyy-MM-dd"));
vo.setVerifyCity((verifyCity));
return vo;
}
/**
* TODO 暂时将生成 passLetter 并上传 OSS 和修改数据库对应信息的方法放在这里,实际应该在 800 的回调方法中
* 生成通知函上传 OSS 和修改数据库相应数据
* @return passCode
*/
private String genPassLetterAndUpdateDB(PartnerPassLetterDetailVO passLetterDetail, String interviewId) {
//已经有 passCode 的话就不要再生成了,默认上游全部数据都正确
if (ObjectUtil.isEmpty(passLetterDetail.getPassCode())) {
DateTime createTime = DateUtil.date();
String code = passLetterDetail.getPassCode() == null ? PassLetterUtils.genPassCode(createTime) : passLetterDetail.getPassCode();
ByteArrayOutputStream outputStream = PassLetterUtils.genPassLetter(passLetterDetail.getPartnerName(), code, passLetterDetail.getVerifyCity(), createTime);
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
String passFileUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".pdf");
//计算有效期截至日期
DateTime expiryDate = DateUtil.offsetDay(createTime, 60);
String expiryDateStr = DateUtil.format(expiryDate, "yyyy-MM-dd") + " 23:59:59";
interviewMapper.updatePassLetterInfo(code, passFileUrl, expiryDateStr, interviewId);
//已经有文件 URL 的话就不要再生成了,默认上游全部数据都正确
if (ObjectUtil.isEmpty(passLetterDetail.getPassPdfUrl()) || ObjectUtil.isEmpty(passLetterDetail.getPassImageUrl())) {
try {
DateTime createTime = DateUtil.date();
String code = passLetterDetail.getPassCode() == null ? PassLetterUtils.genPassCode(createTime) : passLetterDetail.getPassCode();
//生成的 pdf 通过函内存输出流
ByteArrayOutputStream pdfOut = PassLetterUtils.genPassLetter(passLetterDetail.getPartnerName(), code, passLetterDetail.getVerifyCity(), createTime);
//生成的 pdf 通过函内存输入流
ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfOut.toByteArray());
String passPdfUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".pdf");
//转换为图片
inputStream.reset();
ByteArrayOutputStream imageOut = PDFUtils.pdf2Img(inputStream, 2.0f);
inputStream = new ByteArrayInputStream(imageOut.toByteArray());
//上传 OSS
String passImageUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".png");
//计算有效期截止日期
DateTime expiryDate = DateUtil.offsetDay(createTime, 60);
String expiryDateStr = DateUtil.format(expiryDate, "yyyy-MM-dd") + " 23:59:59";
interviewMapper.updatePassLetterInfo(code, passPdfUrl, passImageUrl, expiryDateStr, interviewId);
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return passLetterDetail.getPassCode();
}