加盟商资格面试代码字段修改及PDF转图片部分完成

This commit is contained in:
pserimal
2023-06-16 15:41:22 +08:00
parent d80c70deb7
commit 1836a50a3e
13 changed files with 135 additions and 67 deletions

View File

@@ -98,6 +98,12 @@
<artifactId>openpdf</artifactId>
<version>1.3.30</version>
</dependency>
<!-- PDFBox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
</dependencies>
</project>

View File

@@ -5,10 +5,13 @@ import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.*;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;
import java.io.OutputStream;
import java.awt.image.BufferedImage;
import java.io.*;
/**
* 使用 OpenPDF 封装的 pdf 工具类
@@ -120,7 +123,42 @@ public class PDFUtils {
throw new RuntimeException(ex);
}
}
}
/**
* PDF 转图片
* @param inputStream pdf 输入流
* @param dpi
*/
public static ByteArrayOutputStream pdf2Img(InputStream inputStream, float dpi) {
PDDocument document = null;
ByteArrayOutputStream outputStream = null;
try {
// 加载pdf文档
FileInputStream fileInputStream = new FileInputStream("passLetter.pdf");
document = PDDocument.load(fileInputStream);
// PDF文档渲染对象
PDFRenderer renderer = new PDFRenderer(document);
int pageCount = document.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
/*
* renderImage(i,1.9f)
* i: 指定页对象下标,从0开始,0即第一页
* 1.9f:DPI值(Dots Per Inch),官方描述比例因子,其中 1 = 72 DPI
*/
BufferedImage image = renderer.renderImage(i, dpi);
outputStream = new ByteArrayOutputStream();
FileOutputStream fileOutputStream = new FileOutputStream("pdf2img.png");
ImageIO.write(image, "PNG", outputStream);
byte[] byteArray = outputStream.toByteArray();
fileOutputStream.write(byteArray);
fileOutputStream.close();
return outputStream;
}
}catch (Exception e){
e.printStackTrace();
}
return outputStream;
}
}

View File

@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
@@ -49,7 +50,8 @@ public class PassLetterUtils {
return outputStream;
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
}
finally {
try {
document.close();
outputStream.close();
@@ -73,8 +75,10 @@ public class PassLetterUtils {
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
PdfReader pdfReader = new PdfReader(inputStream);
PDFUtils.putParagraphAbsolutely(pdfReader, outputStream, x, y, content, 20, new Color(255, 82,25));
} catch (IOException e) {
String fontFamillyPath = PassLetterUtils.class.getResource("/static/simsun.ttc").getPath();
BaseFont font = BaseFont.createFont(fontFamillyPath + ",0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
PDFUtils.putParagraphAbsolutely(pdfReader, outputStream, x, y, content, font, 20, 1, new Color(255, 82,25));
} catch (Exception e) {
throw new RuntimeException(e);
}
}

View File

@@ -37,13 +37,13 @@ public interface HyPartnerInterviewMapper {
* 修改面试状态
* 预约状态 0 待预约;1待面试;2已开始;3待审核;4审批中;5审批通过;6拒绝
*/
int updateInterviewStatus(@Param("interviewId") String interviewId, @Param("status") Integer status);
int updateInterviewStatus(@Param("interviewPlanId") String interviewPlanId, @Param("status") Integer status);
/**
* 修改面试实际开始时间
* @param dateTime "yyyy-MM-dd HH:mm:ss"
*/
int updateActualStartTime(@Param("interviewId") String interviewId, @Param("dateTime") String dateTime);
int updateActualStartTime(@Param("interviewPlanId") String interviewPlanId, @Param("dateTime") String dateTime);
/**
* 修改加盟商或面试官进入面试时间
@@ -51,27 +51,27 @@ public interface HyPartnerInterviewMapper {
* @param dateTime "yyyy-MM-dd HH:mm:ss"
* @return
*/
int updateEnterTime(@Param("interviewId") String interviewId, @Param("userType") Integer userType, @Param("dateTime") String dateTime);
int updateEnterTime(@Param("interviewPlanId") String interviewPlanId, @Param("userType") Integer userType, @Param("dateTime") String dateTime);
/**
* 将加盟商是否参会修改为参会
* 0未参加1参加
*/
int updateWhetherPartnerEnter(@Param("interviewId") String interviewId);
int updateWhetherPartnerEnter(@Param("interviewPlanId") String interviewPlanId);
/**
* 根据会议 id 查询面试官 id
*/
EnterInterviewVO getInterviewerByInterviewId(@Param("interviewId") String interviewId);
EnterInterviewVO getInterviewerByInterviewPlanId(@Param("interviewPlanId") String interviewPlanId);
/**
* 获取通知函详情
*/
PartnerPassLetterDetailVO getPassLetterDetail(@Param("interviewId") String interviewId);
PartnerPassLetterDetailVO getPassLetterDetail(@Param("interviewPlanId") String interviewPlanId);
/**
* 生成通过函 pdf 后修改
*/
int updatePassLetterInfo(@Param("passCode") String passCode, @Param("passFileUrl") String passFileUrl, @Param("expiryDate") String expiryDate, @Param("interviewId") String interviewId);
int updatePassLetterInfo(@Param("passCode") String passCode, @Param("passPdfUrl") String passPdfUrl, @Param("passImageUrl") String passImageUrl, @Param("expiryDate") String expiryDate, @Param("interviewId") String interviewId);
}

View File

@@ -27,7 +27,7 @@
</resultMap>
<resultMap id="PartnerInterviewInfoVO" type="com.cool.store.vo.PartnerInterviewInfoVO">
<id column="interviewId" property="interviewId"/>
<id column="interviewId" property="interviewPlanId"/>
<result column="partnerId" property="partnerId"/>
<result column="interviewerId" property="interviewerId"/>
<association property="partnerName" column="partnerId" select="queryPartnerName" javaType="string"/>
@@ -255,7 +255,7 @@
<!-- 根据加盟商id查询面试信息 -->
<select id="queryByPartnerId" resultMap="PartnerInterviewInfoVO">
SELECT t1.id interviewId, `status`, start_time, end_time, room_id, t1.partner_id partnerId, t1.interviewer interviewerId
SELECT t1.id interviewId, t1.id interview_id, t1.interview_plan_id, `status`, start_time, end_time, room_id, t1.partner_id partnerId, t1.interviewer interviewerId
FROM hy_partner_interview t1
LEFT JOIN hy_partner_interview_plan t2 ON t1.interview_plan_id = t2.id
WHERE t1.partner_id = #{partnerId}
@@ -276,18 +276,14 @@
<update id="updateInterviewStatus">
UPDATE hy_partner_interview
SET `status` = #{status}
WHERE id = #{interviewId}
WHERE interview_plan_id = #{interviewPlanId}
</update>
<!-- 修改面试实际开始时间 -->
<update id="updateActualStartTime">
UPDATE hy_partner_interview_plan
SET actual_start_time = IF(actual_start_time IS NULL, #{dateTime}, actual_start_time)
WHERE id = (
SELECT interview_plan_id
FROM hy_partner_interview
WHERE id = #{interviewId}
)
WHERE id = #{interviewPlanId}
</update>
<!-- 修改面试官或加盟商入会时间 -->
@@ -301,32 +297,28 @@
partner_enter_time = IF(partner_enter_time IS NULL, #{dateTime}, partner_enter_time)
</if>
</set>
WHERE id = 1
WHERE interview_plan_id = #{interviewPlanId}
</update>
<!-- 修改加盟商参会状态为参加 -->
<update id="updateWhetherPartnerEnter">
UPDATE hy_partner_interview_plan
SET is_partner_interview = 1
WHERE id = (
SELECT interview_plan_id
FROM hy_partner_interview
WHERE id = #{interviewId}
)
WHERE id = #{interviewPlanId}
</update>
<!-- 根据会议 id 获取面试官 id -->
<select id="getInterviewerByInterviewId" resultMap="partnerEnterInterviewVO">
<select id="getInterviewerByInterviewPlanId" resultMap="partnerEnterInterviewVO">
SELECT interviewer, interviewer interviewer_id, partner_id
FROM hy_partner_interview
WHERE id = #{interviewId}
WHERE interview_plan_id = #{interviewPlanId}
</select>
<!-- 获取通知函详情 -->
<select id="getPassLetterDetail" resultMap="passLetterDetail">
SELECT auth_code, pass_code, pass_file_url, expiry_date, partner_id
SELECT auth_code, pass_code, pass_pdf_url, pass_image_url, expiry_date, partner_id
FROM hy_partner_interview
WHERE id = #{interviewId}
WHERE interview_plan_id = #{interviewPlanId}
</select>
<!-- 获取意向开店区域 -->
<select id="getVerifyCity" resultType="string">
@@ -346,8 +338,11 @@
<if test="passCode != null and passCode != ''">
pass_code = #{passCode},
</if>
<if test="passFileUrl != null and passFileUrl != ''">
pass_file_url = #{passFileUrl},
<if test="passPdfUrl != null and passPdfUrl != ''">
pass_pdf_url = #{passPdfUrl},
</if>
<if test="passImageUrl != null and passImageUrl != ''">
pass_image_url = #{passImageUrl},
</if>
<if test="expiryDate != null and expiryDate != ''">
expiry_date = #{expiryDate}

View File

@@ -6,8 +6,8 @@ import lombok.Data;
@Data
public class EnterInterviewDto {
@ApiModelProperty(value = "会议id", required = true)
private String interviewId;
@ApiModelProperty(value = "会议计划id", required = true)
private String interviewPlanId;
@ApiModelProperty(value = "用户id", required = true)
private String userId;

View File

@@ -15,6 +15,9 @@ import java.util.Date;
@ApiModel
public class PartnerInterviewInfoVO {
@ApiModelProperty("会议计划id")
private Long interviewPlanId;
@ApiModelProperty("会议id")
private Long interviewId;

View File

@@ -18,8 +18,11 @@ public class PartnerPassLetterDetailVO {
@ApiModelProperty("审核城市")
private String verifyCity;
@ApiModelProperty("函文件URL")
private String passFileUrl;
@ApiModelProperty("函文件图片URL")
private String passImageUrl;
@ApiModelProperty("函文件pdfURL")
private String passPdfUrl;
@ApiModelProperty("生成日期YYYY-MM-DD")
private String createTime;

View File

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

View File

@@ -125,15 +125,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;
@@ -59,15 +60,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 +80,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 +97,52 @@ 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);
FileOutputStream fileOutputStream = new FileOutputStream("passLetter.pdf");
fileOutputStream.write(pdfOut.toByteArray());
fileOutputStream.close();
//生成的 pdf 通过函内存输入流
ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfOut.toByteArray());
// String passPdfUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".pdf");
String passPdfUrl = "";
//转换为图片
inputStream.reset();
ByteArrayOutputStream imageOut = PDFUtils.pdf2Img(inputStream, 2.0f);
//上传 OSS
// String passImageUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".jpg");
String passImageUrl = "";
//计算有效期截止日期
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();
}

View File

@@ -33,8 +33,8 @@ public class InterviewController {
@PostMapping("/passLetter/detail")
@ApiOperation("通过函详情")
public ResponseResult<PartnerPassLetterDetailVO> passLetterDetail(@RequestParam String interviewId) {
return ResponseResult.success(interviewService.passLetterDetail(interviewId));
public ResponseResult<PartnerPassLetterDetailVO> passLetterDetail(@RequestParam String interviewPlanId) {
return ResponseResult.success(interviewService.passLetterDetail(interviewPlanId));
}
}