diff --git a/coolstore-partner-common/pom.xml b/coolstore-partner-common/pom.xml index 0961b14dd..204706c33 100644 --- a/coolstore-partner-common/pom.xml +++ b/coolstore-partner-common/pom.xml @@ -98,6 +98,12 @@ openpdf 1.3.30 + + + org.icepdf.os + icepdf-core + 6.1.2 + \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index 07f705625..21140ab24 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -10,6 +10,8 @@ public class CommonConstants { public static final String REQUEST_ID = "requestId"; + public static final String MESSAGE_ID = "messageId"; + public static final String ACCESS_TOKEN_KEY = "access_token"; public static final String REFRESH_TOKEN_KEY = "refresh_token"; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java index 9fd0fb7bb..688c01bec 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java @@ -189,6 +189,11 @@ public class RedisConstant { public static final String STOREWORK_NOTICE_KEY = "storeWorkNoticeCache:{0}:{1}:{2}:{3}"; + /** + * 冷静期内是否首次登录 冷静期首次登录 是-true 否-false + */ + public static final String COOLINGPERIOD_FIRSTLOGIN_KEY = "coolingPeriodFirstLoginCache:{0}"; + /** * 七天 */ diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 86502ebf0..5cb37ba14 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -48,6 +48,7 @@ public enum ErrorCodeEnum { IDENTITY_CARD_PARSE_FAIL(1021080, "身份证解析失败", null), PARAMS_REQUIRED(400002, "参数缺失!", null), DATA_CONVERT_ERROR(400002, "日期转换异常!", null), + PARENT_NODE_NOT_EXIST(400002, "父节点不存在", null), LINE_ID_IS_NOT_EXIST(500001, "线索ID不存在!", null), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/IDCardSideEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/IDCardSideEnum.java new file mode 100644 index 000000000..ce4f76114 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/IDCardSideEnum.java @@ -0,0 +1,32 @@ +package com.cool.store.enums; + +/** + * @author zhangchenbiao + * @FileName: IDCardSideEnum + * @Description: 身份证正反面类型 + * @date 2023-06-16 16:49 + */ +public enum IDCardSideEnum { + + FACE("face", "正面"), + BACK("back", "反面") + ; + + private String code; + + private String message; + + IDCardSideEnum(String code, String message) { + this.code = code; + this.message = message; + } + + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java index 272b19a0e..e2f9eb1e6 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java @@ -5,10 +5,16 @@ import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.*; +import org.icepdf.core.exceptions.PDFException; +import org.icepdf.core.exceptions.PDFSecurityException; +import org.icepdf.core.pobjects.Page; +import org.icepdf.core.util.GraphicsRenderingHints; +import javax.imageio.ImageIO; import java.awt.*; -import java.io.IOException; -import java.io.OutputStream; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.*; /** * 使用 OpenPDF 封装的 pdf 工具类 @@ -120,7 +126,46 @@ public class PDFUtils { throw new RuntimeException(ex); } } - } + /** + * PDF 转图片 + * @param inputStream pdf 输入流 + * @param scale 缩放比例 + */ + public static ByteArrayOutputStream pdf2Img(InputStream inputStream, float scale) { + org.icepdf.core.pobjects.Document document = new org.icepdf.core.pobjects.Document(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + document.setInputStream(inputStream, ""); + + float rotation = 0f;// 旋转角度 + for (int i = 0; i < document.getNumberOfPages(); i++) { + BufferedImage image = (BufferedImage) document.getPageImage(i, + GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, + rotation, scale); + RenderedImage rendImage = image; + try { + ImageIO.write(rendImage, "png", outputStream); + //例子中是pdf转png格式的,也可以将上面两行改成jpg,转出jpg格式的, + //但是从转换效果来看png的清晰度会相对较高。有个小技巧是第一行行改成jpg, + //但第二行使用png,也就是转换成jpg格式但有png清晰度的图片。 + } catch (IOException e) { + e.printStackTrace(); + } + image.flush(); + document.dispose(); + return outputStream; + } + } catch (PDFException | PDFSecurityException | IOException e1) { + e1.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return outputStream; + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java index a94e5ee53..264061202 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java @@ -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; @@ -41,15 +42,16 @@ public class PassLetterUtils { document.close(); //3. 填写通过函模板信息 - addContentToPdf(outputStream, partnerName + " 先生/女士", 122, 640); - addContentToPdf(outputStream, passCode, 122, 558); - addContentToPdf(outputStream, verifyCity, 155, 494); - addContentToPdf(outputStream, "60天", 135, 450); - addContentToPdf(outputStream, passTimeStr, 393, 152); + addContentToPdf(outputStream, partnerName + " 先生/女士", 122, 638); + addContentToPdf(outputStream, passCode, 122, 557); + addContentToPdf(outputStream, verifyCity, 155, 492); + addContentToPdf(outputStream, "60天", 135, 448); + addContentToPdf(outputStream, passTimeStr, 385, 152); 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 fontFamilyPath = PassLetterUtils.class.getResource("/static/Alibaba-PuHuiTi-Regular.ttf").getPath(); + BaseFont font = BaseFont.createFont(fontFamilyPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); + PDFUtils.putParagraphAbsolutely(pdfReader, outputStream, x, y, content, font, 19, 1, new Color(255, 82,25)); + } catch (Exception e) { throw new RuntimeException(e); } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerBaseInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerBaseInfoDAO.java index 9e141f57d..f796e298d 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerBaseInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerBaseInfoDAO.java @@ -45,4 +45,10 @@ public class HyPartnerBaseInfoDAO { return hyPartnerBaseInfoMapper.getByPartnerIdAndLineId(partnerId, partnerLineId); } + public Long getLineIdByIdCard(String idCard){ + if (StringUtils.isEmpty(idCard)){ + return null; + } + return hyPartnerBaseInfoMapper.getLineIdByIdCard(idCard); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java index 95121dbb7..1318be319 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java @@ -7,6 +7,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; import javax.annotation.Resource; @@ -61,4 +62,16 @@ public class RegionDAO { return ListUtils.emptyIfNull(regionList).stream().collect(Collectors.toMap(RegionDO::getRegionId, RegionDO::getName)); } + /** + * 获取区域 + * @param regionId + * @return + */ + public RegionDO getRegionInfoByRegionId(String regionId){ + if(StringUtils.isBlank(regionId)){ + return null; + } + return regionMapper.getRegionInfoByRegionId(regionId); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerBaseInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerBaseInfoMapper.java index 6488260db..2f4e48e5a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerBaseInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerBaseInfoMapper.java @@ -36,4 +36,6 @@ public interface HyPartnerBaseInfoMapper { HyPartnerBaseInfoDO getByPartnerIdAndLineId(@Param("partnerId") String partnerId, @Param("partnerLineId") Long partnerLineId); + Long getLineIdByIdCard(@Param("idCard") String idCard); + } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewMapper.java index 3e865e13d..5b60798b3 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewMapper.java @@ -2,6 +2,7 @@ package com.cool.store.mapper; import com.cool.store.entity.HyPartnerInterviewDO; import com.cool.store.vo.EnterInterviewVO; +import com.cool.store.vo.EnterpriseUserBaseInfoVO; import com.cool.store.vo.PartnerInterviewInfoVO; import com.cool.store.vo.PartnerPassLetterDetailVO; import org.apache.ibatis.annotations.Param; @@ -37,13 +38,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,28 +52,28 @@ 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); /** * 根据面试 id 查询面试信息 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewPlanMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewPlanMapper.java index 4501d7963..1fd495385 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewPlanMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerInterviewPlanMapper.java @@ -4,6 +4,7 @@ import com.cool.store.dto.partner.PartnerInterviewInfoDTO; import com.cool.store.dto.partner.SpecialDateRangeInterviewCountDTO; import com.cool.store.entity.HyPartnerInterviewPlanDO; import com.cool.store.request.GetInterviewListReq; +import com.cool.store.vo.EnterpriseUserBaseInfoVO; import com.cool.store.vo.interview.InterviewVO; import com.github.pagehelper.PageInfo; import org.apache.ibatis.annotations.Param; @@ -88,6 +89,11 @@ public interface HyPartnerInterviewPlanMapper { */ InterviewVO getInterviewInfo(String interviewId); + /** + * 查询用户基本信息 + */ + EnterpriseUserBaseInfoVO getEnterpriseUserBaseInfo(@Param("userId") String userId); + /** * 根据条件字段查询面试安排信息 * @param record diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java index fc3a734fe..6d7e785f2 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java @@ -51,4 +51,11 @@ public interface RegionMapper { * @return */ List getRegionBaseInfoList(); + + /** + * 获取区域信息 + * @param regionId + * @return + */ + RegionDO getRegionInfoByRegionId(@Param("regionId") String regionId); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerBaseInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerBaseInfoMapper.xml index 8168519e8..a1ba51823 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerBaseInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerBaseInfoMapper.xml @@ -224,4 +224,11 @@ where partner_id = #{partnerId} and partner_line_id = #{partnerLineId} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerInterviewMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerInterviewMapper.xml index 954b49ad4..584bebc81 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerInterviewMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerInterviewMapper.xml @@ -28,7 +28,7 @@ - + @@ -259,7 +259,7 @@ + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml index 6fd0729d7..a997ef69d 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerUserInfoMapper.xml @@ -13,10 +13,16 @@ + + + + + + id, partner_id, mobile, username, live_area, want_shop_area, accept_adjust_type, - invite_code, is_write_partner_know, create_time, update_time + invite_code, is_write_partner_know, create_time, update_time, shop_code, shop_name, shop_id, recommend_partner_id, recommend_partner_name, recommend_partner_mobile + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java index 45f2b8e8c..97bb60208 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java @@ -227,4 +227,47 @@ public class SysDepartmentDTO { } return resultList; } + + + public static RegionDO convertRegionDO(SysDepartmentDTO dept, Multimap leaderDeptMap, RegionDO parentRegion){ + RegionDO region = new RegionDO(); + region.setRegionId(dept.getId()); + region.setName(dept.getName()); + region.setParentId(dept.getParentId()); + region.setUnclassifiedFlag(CommonConstants.ZERO); + region.setLeaderUserId(dept.getLeaderUserId()); + region.setOrderNum(dept.getDepartOrder()); + region.setThirdDeptId(dept.getId()); + region.setCreateTime(System.currentTimeMillis()); + region.setUpdateTime(System.currentTimeMillis()); + String regionPath = parentRegion.getRegionPath() + region.getRegionId() + CommonConstants.PATH_SPILT; + region.setRegionPath(regionPath); + region.setDeleted(Boolean.FALSE); + if(CollectionUtils.isNotEmpty(dept.getDeptManagerUseridList())){ + for (String leader : dept.getDeptManagerUseridList()) { + leaderDeptMap.put(leader, dept.getId()); + } + } + return region; + } + + public static RegionDO convertRegionDO(SysDepartmentDTO dept, Multimap leaderDeptMap){ + RegionDO region = new RegionDO(); + region.setRegionId(dept.getId()); + region.setName(dept.getName()); + region.setParentId(dept.getParentId()); + region.setUnclassifiedFlag(CommonConstants.ZERO); + region.setLeaderUserId(dept.getLeaderUserId()); + region.setOrderNum(dept.getDepartOrder()); + region.setThirdDeptId(dept.getId()); + region.setCreateTime(System.currentTimeMillis()); + region.setUpdateTime(System.currentTimeMillis()); + region.setDeleted(Boolean.FALSE); + if(CollectionUtils.isNotEmpty(dept.getDeptManagerUseridList())){ + for (String leader : dept.getDeptManagerUseridList()) { + leaderDeptMap.put(leader, dept.getId()); + } + } + return region; + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/EnterInterviewDto.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/EnterInterviewDto.java index 30015417d..6eb2646c3 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/EnterInterviewDto.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/EnterInterviewDto.java @@ -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; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java index 01b9f33ef..c1d88f267 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyPartnerUserInfoDO.java @@ -50,4 +50,22 @@ public class HyPartnerUserInfoDO implements Serializable { @ApiModelProperty("更新时间") private Date updateTime; + + @ApiModelProperty("店铺编码") + private String shopCode; + + @ApiModelProperty("店铺名称") + private String shopName; + + @ApiModelProperty("店铺ID") + private String shopId; + + @ApiModelProperty("推荐加盟商id") + private String recommendPartnerId; + + @ApiModelProperty("推荐加盟商姓名") + private String recommendPartnerName; + + @ApiModelProperty("推荐加盟商手机号") + private String recommendPartnerMobile; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/EnterpriseUserBaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/EnterpriseUserBaseInfoVO.java new file mode 100644 index 000000000..b44f6a17b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/EnterpriseUserBaseInfoVO.java @@ -0,0 +1,18 @@ +package com.cool.store.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 员工基本信息(名字 + 电话) + */ +@Data +public class EnterpriseUserBaseInfoVO { + + @ApiModelProperty("名字") + private String name; + + @ApiModelProperty("电话") + private String Mobile; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerInterviewInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerInterviewInfoVO.java index 0311cc371..8020b5fbc 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerInterviewInfoVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerInterviewInfoVO.java @@ -15,6 +15,9 @@ import java.util.Date; @ApiModel public class PartnerInterviewInfoVO { + @ApiModelProperty("会议计划id") + private Long interviewPlanId; + @ApiModelProperty("会议id") private Long interviewId; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerPassLetterDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerPassLetterDetailVO.java index 4bb0a40e2..480bba5bb 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerPassLetterDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerPassLetterDetailVO.java @@ -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; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/interview/InterviewVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/interview/InterviewVO.java index d4855f309..0d0a17823 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/interview/InterviewVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/interview/InterviewVO.java @@ -1,19 +1,29 @@ package com.cool.store.vo.interview; -import com.alibaba.fastjson.annotation.JSONField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * @Author: young.yu * @Date: 2023-06-08 16:26 * @Description: */ +@Data @ApiModel(description = "面试信息") public class InterviewVO { @ApiModelProperty(value = "会议id", required = true) private String interviewId; + @ApiModelProperty("资质审核流程id") + private String qualifyVerifyId; + + @ApiModelProperty("审核通过时间") + private String passTime; + + @ApiModelProperty("审核通过原因") + private String passReason; + @ApiModelProperty(value = "加盟商用户编号") private String partnerId; @@ -37,6 +47,22 @@ public class InterviewVO { @ApiModelProperty(value = "面试官手机号", required = true) private String interviewerMobile; + + @ApiModelProperty(value = "记录人id", required = true) + private String recorderId; + + @ApiModelProperty(value = "记录人姓名", required = true) + private String recorderName; + + @ApiModelProperty(value = "记录人电话", required = true) + private String recorderMobile; + + @ApiModelProperty(value = "记录时间", required = true) + private String recordTime; + + @ApiModelProperty(value = "面试总结", required = true) + private String summary; + @ApiModelProperty(value = "房间状态(0待开放;1已开放;2已关闭)", required = true) private String roomStatus; @@ -46,100 +72,19 @@ public class InterviewVO { @ApiModelProperty(value = "预约状态 0 待预约;1待面试;2已开始;3待审核;4审批中;5审批通过;6拒绝", required = true) private Integer status; + @ApiModelProperty(value = "面试过程信息", required = false) + private String processInfo; - public String getPartnerId() { - return partnerId; - } + @ApiModelProperty("授权码") + private String authCode; - public void setPartnerId(String partnerId) { - this.partnerId = partnerId; - } + @ApiModelProperty("通过函有效期至") + private String expiryDate; - public String getInterviewerId() { - return interviewerId; - } + @ApiModelProperty("通过函PDF文件URL") + private String passPdfUrl; - public void setInterviewerId(String interviewerId) { - this.interviewerId = interviewerId; - } + @ApiModelProperty("通过函图片文件URL") + private String passImageUrl; - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getInterviewId() { - return interviewId; - } - - public void setInterviewId(String interviewId) { - this.interviewId = interviewId; - } - - public String getPartnerName() { - return partnerName; - } - - public void setPartnerName(String partnerName) { - this.partnerName = partnerName; - } - - public String getPartnerMobile() { - return partnerMobile; - } - - public void setPartnerMobile(String partnerMobile) { - this.partnerMobile = partnerMobile; - } - - public String getRoomId() { - return roomId; - } - - public void setRoomId(String roomId) { - this.roomId = roomId; - } - - public String getStartTime() { - return startTime; - } - - public void setStartTime(String startTime) { - this.startTime = startTime; - } - - public String getInterviewerName() { - return interviewerName; - } - - public void setInterviewerName(String interviewerName) { - this.interviewerName = interviewerName; - } - - public String getInterviewerMobile() { - return interviewerMobile; - } - - public void setInterviewerMobile(String interviewerMobile) { - this.interviewerMobile = interviewerMobile; - } - - public String getRoomStatus() { - return roomStatus; - } - - public void setRoomStatus(String roomStatus) { - this.roomStatus = roomStatus; - } - - public String getEndTime() { - return endTime; - } - - public void setEndTime(String endTime) { - this.endTime = endTime; - } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/handler/CustomExceptionHandler.java b/coolstore-partner-service/src/main/java/com/cool/store/handler/CustomExceptionHandler.java index 39e4b658a..510227552 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/handler/CustomExceptionHandler.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/handler/CustomExceptionHandler.java @@ -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 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 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 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); + } } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/http/ISVHttpRequest.java b/coolstore-partner-service/src/main/java/com/cool/store/http/ISVHttpRequest.java index 0d0cdb989..3093ea01a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/http/ISVHttpRequest.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/http/ISVHttpRequest.java @@ -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(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/RocketMqLogAspect.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/RocketMqLogAspect.java index 1f1cc1c27..59f62f5e1 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/RocketMqLogAspect.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/RocketMqLogAspect.java @@ -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 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); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/AliyunService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/AliyunService.java index 0a7bf8b6c..7ec359b0c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/AliyunService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/AliyunService.java @@ -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; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerBaseInfoService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerBaseInfoService.java index 2b57f6384..a5d97e465 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerBaseInfoService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerBaseInfoService.java @@ -22,4 +22,8 @@ public interface HyPartnerBaseInfoService { Boolean submitPartnerBaseInfo(PartnerBaseInfoRequest request); PartnerBaseInfoVO queryPartnerBaseInfo(String partnerId, Long lineId); + + Long getLineIdByIdCard(String idCard); + + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerLineInfoService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerLineInfoService.java index 0b7f0b30a..93da5e217 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerLineInfoService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/HyPartnerLineInfoService.java @@ -104,5 +104,7 @@ public interface HyPartnerLineInfoService { */ PageInfo publicSeaLineList(String userId,LineRequest lineRequest); + PartnerLineBaseInfoVO getPartnerLinBaseInfo(String partnerId); + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PartnerInterviewService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PartnerInterviewService.java index 9d8bca88f..8c2ece594 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PartnerInterviewService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PartnerInterviewService.java @@ -25,6 +25,6 @@ public interface PartnerInterviewService { /** * 获取通知函详情 */ - PartnerPassLetterDetailVO passLetterDetail(String interviewId); + PartnerPassLetterDetailVO passLetterDetail(String interviewPlanId); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java index 0d171c9f1..fcbd9bc8f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AliyunServiceImpl.java @@ -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()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java index c76787c16..564dbfe43 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java @@ -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 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 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 leaderDeptMap){ + if(leaderDeptMap.isEmpty()){ + return; + } + List userIds = leaderDeptMap.keys().stream().collect(Collectors.toList()); + List userList = enterpriseUserDAO.getUserInfoByUserIds(userIds); + for (EnterpriseUserDO enterpriseUser : userList) { + List deptIds = leaderDeptMap.get(enterpriseUser.getUserId()).stream().collect(Collectors.toList()); + String leaderDeptIds = enterpriseUser.getLeaderDeptIds(); + if(StringUtils.isNotBlank(leaderDeptIds)){ + List existDeptIds = JSONObject.parseArray(leaderDeptIds).stream().map(String::valueOf).collect(Collectors.toList()); + //取并集 + existDeptIds.addAll(deptIds); + List 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); + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java index 08e6979f2..d2bffd4e2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java @@ -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()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java index e4b456878..d48672826 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java @@ -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 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/InterviewServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/InterviewServiceImpl.java index c4e5488cf..83d9a1dac 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/InterviewServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/InterviewServiceImpl.java @@ -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); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java index f2606d200..fc9d6f8b5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java @@ -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(); } diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/controller/TestController.java b/coolstore-partner-webb/src/main/java/com/cool/store/controller/TestController.java index e0c16c7f4..8a6c7d9c4 100644 --- a/coolstore-partner-webb/src/main/java/com/cool/store/controller/TestController.java +++ b/coolstore-partner-webb/src/main/java/com/cool/store/controller/TestController.java @@ -13,6 +13,7 @@ import com.cool.store.entity.HyOpenAreaInfoDO; import com.cool.store.entity.EnterpriseUserDO; 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.mapper.HyOpenAreaInfoMapper; @@ -205,7 +206,7 @@ public class TestController { @ApiOperation("根据身份证正面解析获取数据") public ResponseResult getIdentityCardInfo(@RequestParam(value = "faceImageUrl")String faceImageUrl){ try { - IdentityCardInfoVO identityCardInfo = aliyunService.getIdentityCardInfo(faceImageUrl); + IdentityCardInfoVO identityCardInfo = aliyunService.getIdentityCardInfo(faceImageUrl, IDCardSideEnum.FACE); return ResponseResult.success(identityCardInfo); } catch (Exception e) { throw new ServiceException(ErrorCodeEnum.IDENTITY_CARD_PARSE_FAIL); diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/controller/InterviewController.java b/coolstore-partner-webc/src/main/java/com/cool/store/controller/InterviewController.java index 3af188129..8f19500d4 100644 --- a/coolstore-partner-webc/src/main/java/com/cool/store/controller/InterviewController.java +++ b/coolstore-partner-webc/src/main/java/com/cool/store/controller/InterviewController.java @@ -33,8 +33,8 @@ public class InterviewController { @PostMapping("/passLetter/detail") @ApiOperation("通过函详情") - public ResponseResult passLetterDetail(@RequestParam String interviewId) { - return ResponseResult.success(interviewService.passLetterDetail(interviewId)); + public ResponseResult passLetterDetail(@RequestParam String interviewPlanId) { + return ResponseResult.success(interviewService.passLetterDetail(interviewPlanId)); } } diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/controller/PartnerController.java b/coolstore-partner-webc/src/main/java/com/cool/store/controller/PartnerController.java index c41b9ea90..34b87581c 100644 --- a/coolstore-partner-webc/src/main/java/com/cool/store/controller/PartnerController.java +++ b/coolstore-partner-webc/src/main/java/com/cool/store/controller/PartnerController.java @@ -1,18 +1,17 @@ package com.cool.store.controller; +import com.cool.store.constants.RedisConstant; import com.cool.store.context.PartnerUserHolder; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.IDCardSideEnum; import com.cool.store.exception.ServiceException; import com.cool.store.request.BaseUserInfoRequest; import com.cool.store.request.PartnerBaseInfoRequest; import com.cool.store.request.PartnerClerkInfoRequest; import com.cool.store.request.PartnerIntentInfoRequest; import com.cool.store.response.ResponseResult; -import com.cool.store.service.AliyunService; -import com.cool.store.service.HyPartnerBaseInfoService; -import com.cool.store.service.HyPartnerClerkService; -import com.cool.store.service.HyPartnerIntentInfoService; -import com.cool.store.service.PartnerUserInfoService; +import com.cool.store.service.*; +import com.cool.store.utils.RedisUtilPool; import com.cool.store.vo.*; import com.cool.store.vo.cuser.IdentityCardInfoVO; import io.swagger.annotations.Api; @@ -23,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.text.MessageFormat; import java.util.List; /** @@ -38,18 +38,18 @@ public class PartnerController { @Resource private PartnerUserInfoService partnerUserInfoService; - @Resource private HyPartnerIntentInfoService hyPartnerIntentInfoService; - @Resource private AliyunService aliyunService; - @Resource private HyPartnerBaseInfoService hyPartnerBaseInfoService; @Resource private HyPartnerClerkService hyPartnerClerkService; - + @Resource + private HyPartnerLineInfoService hyPartnerLineInfoService; + @Resource + private RedisUtilPool redisUtilPool; @@ -76,8 +76,8 @@ public class PartnerController { }) public ResponseResult getLineByIdCard(@RequestParam(value = "idCard",required = false)String idCard){ - - return ResponseResult.success(); + Long lineId = hyPartnerBaseInfoService.getLineIdByIdCard(idCard); + return ResponseResult.success(lineId != null); } @@ -133,18 +133,21 @@ public class PartnerController { return ResponseResult.success(hyPartnerIntentInfoService.submitPartnerIntentInfo(partnerIntentInfoRequest)); } - - - @GetMapping(path = "/getPartnerLineBaseInfo") @ApiOperation("查询加盟商线索详情(适用全部流程) 包括冷静期是否首次登录") @ApiImplicitParams({ @ApiImplicitParam(name = "partnerId", value = "C端用户基本信息ID", required = false), }) - public ResponseResult getPartnerLinBaseInfo(@RequestParam(value = "partnerId",required = false)Long partnerId){ + public ResponseResult getPartnerLinBaseInfo(@RequestParam(value = "partnerId",required = false)String partnerId){ + return ResponseResult.success(hyPartnerLineInfoService.getPartnerLinBaseInfo(partnerId)); + } - - return ResponseResult.success(); + @PostMapping(path = "/delCoolDownFirstLoginFlag") + @ApiOperation("删除冷静期是否首次登录缓存") + public ResponseResult delCoolDownFirstLoginFlag(@RequestParam(value = "partnerId",required = true)String partnerId){ + String coolingPeriodFirstLoginCacheKey = MessageFormat.format(RedisConstant.COOLINGPERIOD_FIRSTLOGIN_KEY, partnerId); + redisUtilPool.delKey(coolingPeriodFirstLoginCacheKey); + return ResponseResult.success(true); } @@ -208,9 +211,9 @@ public class PartnerController { @GetMapping(path = "/getIdentityCardInfo") @ApiOperation("根据身份证正面解析获取数据") - public ResponseResult getIdentityCardInfo(@RequestParam(value = "faceImageUrl")String faceImageUrl){ + public ResponseResult getIdentityCardInfo(@RequestParam(value = "faceImageUrl")String faceImageUrl, @RequestParam("side")IDCardSideEnum sideEnum){ try { - IdentityCardInfoVO identityCardInfo = aliyunService.getIdentityCardInfo(faceImageUrl); + IdentityCardInfoVO identityCardInfo = aliyunService.getIdentityCardInfo(faceImageUrl, sideEnum); return ResponseResult.success(identityCardInfo); } catch (Exception e) { throw new ServiceException(ErrorCodeEnum.IDENTITY_CARD_PARSE_FAIL); diff --git a/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf b/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf new file mode 100644 index 000000000..9f8ab8d8f Binary files /dev/null and b/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf differ diff --git a/coolstore-partner-webc/src/main/resources/static/simsun.ttc b/coolstore-partner-webc/src/main/resources/static/simsun.ttc new file mode 100644 index 000000000..e360db744 Binary files /dev/null and b/coolstore-partner-webc/src/main/resources/static/simsun.ttc differ