|
@@ -13,19 +13,28 @@ import com.citu.module.menduner.system.controller.base.CommonRespVO;
|
|
|
import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
|
|
|
import com.citu.module.menduner.system.controller.base.interview.InterviewInvitePageReqVO;
|
|
|
import com.citu.module.menduner.system.controller.base.interview.InterviewInviteSaveReqVO;
|
|
|
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
|
|
|
import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
|
|
|
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
|
|
|
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
|
|
|
import com.citu.module.menduner.system.dal.mysql.interview.InterviewInviteMapper;
|
|
|
import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
|
|
|
+import com.citu.module.menduner.system.enums.MathOperationEnum;
|
|
|
+import com.citu.module.menduner.system.enums.account.BalanceBizTypeEnum;
|
|
|
+import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
|
|
|
import com.citu.module.menduner.system.enums.cv.ConversationStatusEnum;
|
|
|
import com.citu.module.menduner.system.enums.interview.InterviewInviteStatusEnum;
|
|
|
import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
|
|
|
import com.citu.module.menduner.system.service.hire.HireCommissionRatioService;
|
|
|
+import com.citu.module.menduner.system.service.job.JobCvRelService;
|
|
|
import com.citu.module.menduner.system.service.record.EnterpriseAccountRecordService;
|
|
|
import com.citu.module.menduner.system.service.record.UserAccountRecordService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.List;
|
|
|
|
|
|
import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
@@ -49,6 +58,10 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
|
|
|
@Resource
|
|
|
private HireCommissionRatioService ratioService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private JobCvRelService jobCvRelService;
|
|
|
+
|
|
|
+
|
|
|
@Resource
|
|
|
private UserAccountRecordService userAccountRecordService;
|
|
|
|
|
@@ -251,8 +264,152 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
|
|
|
interviewInvite.setStatus(ConversationStatusEnum.SETTLEMENT.getStatus());
|
|
|
mapper.updateById(interviewInvite);
|
|
|
|
|
|
+ // 获取 面试的求职者投递的简历信息
|
|
|
+ JobCvRelDO cv = jobCvRelService
|
|
|
+ .selectByUserIdAndJobId(interviewInvite.getUserId(), interviewInvite.getJobId());
|
|
|
+
|
|
|
+ // 猎头、 推荐人、投递人
|
|
|
+ // 获取比例配置
|
|
|
+ HireCommissionRatioDO ratio = ratioService.get();
|
|
|
+
|
|
|
+ JobAdvertisedDO job = jobAdvertisedMapper.selectById(cv.getJobId());
|
|
|
+
|
|
|
+ if (null != job.getHirePrice()) {
|
|
|
+ // 余额结算
|
|
|
+ priceSettlement(job, ratio, cv);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null != job.getHirePoint()) {
|
|
|
+ // 积分结算
|
|
|
+ pointSettlement(job, ratio, cv);
|
|
|
+ }
|
|
|
//TODO 发送推送消息
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 余额结算
|
|
|
+ *
|
|
|
+ * @param job 职位信息
|
|
|
+ * @param ratio 佣金比例
|
|
|
+ * @param cv 投递信息
|
|
|
+ **/
|
|
|
+ public void priceSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, JobCvRelDO cv) {
|
|
|
+ BigDecimal hirePrice = job.getHirePrice();
|
|
|
+ // 总比例
|
|
|
+ BigDecimal totalRate = BigDecimal.valueOf(100);
|
|
|
+ // 猎头佣金
|
|
|
+ BigDecimal headhuntPrice = hirePrice.multiply(ratio.getHeadhuntRate())
|
|
|
+ .divide(totalRate, 2, RoundingMode.HALF_UP);
|
|
|
+ // 推荐人佣金
|
|
|
+ BigDecimal recommendPrice = hirePrice.multiply(ratio.getRecommendRate())
|
|
|
+ .divide(totalRate, 2, RoundingMode.HALF_UP);
|
|
|
+ // 投递人佣金
|
|
|
+ BigDecimal cvPrice = hirePrice.multiply(ratio.getCvRate())
|
|
|
+ .divide(totalRate, 2, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ // 猎头 (平台自己)
|
|
|
+ if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ enterpriseAccountRecordService.createBalanceRecord(
|
|
|
+ 1L,
|
|
|
+ 1L,
|
|
|
+ BalanceBizTypeEnum.PLATFORM_COMMISSION.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ headhuntPrice,
|
|
|
+ BalanceBizTypeEnum.PLATFORM_COMMISSION,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 推荐人
|
|
|
+ if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ userAccountRecordService.createBalanceRecord(
|
|
|
+ cv.getRecommendUserId(),
|
|
|
+ BalanceBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ recommendPrice,
|
|
|
+ BalanceBizTypeEnum.RECOMMENDED_POSITIONS,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 投递人
|
|
|
+ if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ userAccountRecordService.createBalanceRecord(
|
|
|
+ cv.getUserId(),
|
|
|
+ BalanceBizTypeEnum.DELIVERY_PERSON.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ cvPrice,
|
|
|
+ BalanceBizTypeEnum.DELIVERY_PERSON,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 积分结算
|
|
|
+ *
|
|
|
+ * @param job 职位信息
|
|
|
+ * @param ratio 佣金比例
|
|
|
+ * @param cv 投递信息
|
|
|
+ **/
|
|
|
+ public void pointSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, JobCvRelDO cv) {
|
|
|
+ Integer hirePoint = job.getHirePoint();
|
|
|
+ int totalRate = 100; // 总比例
|
|
|
+
|
|
|
+ // 猎头佣金
|
|
|
+ int headhuntPoint = (int) (hirePoint * ratio.getHeadhuntRate().intValue() / (long) totalRate);
|
|
|
+
|
|
|
+ // 推荐人佣金
|
|
|
+ int recommendPoint = (int) (hirePoint * ratio.getRecommendRate().intValue() / (long) totalRate);
|
|
|
+
|
|
|
+ // 投递人佣金
|
|
|
+ int cvPoint = (int) (hirePoint * ratio.getCvRate().intValue() / (long) totalRate);
|
|
|
+
|
|
|
+ // 由于比例之和可能不等于100%,剩余的点数可能需要进行分配或处理
|
|
|
+ int remainingPoint = hirePoint - (headhuntPoint + recommendPoint + cvPoint);
|
|
|
+
|
|
|
+ // 这里你可以选择将剩余点数分配给任意一方,或者按照比例再次分配
|
|
|
+ // 将剩余点数全部分配给猎头
|
|
|
+ headhuntPoint += remainingPoint;
|
|
|
+
|
|
|
+ // 猎头 (平台自己)
|
|
|
+ if (headhuntPoint > 0) {
|
|
|
+ enterpriseAccountRecordService.createPointRecord(
|
|
|
+ 1L,
|
|
|
+ 1L,
|
|
|
+ PointBizTypeEnum.PLATFORM_COMMISSION.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ headhuntPoint,
|
|
|
+ PointBizTypeEnum.PLATFORM_COMMISSION,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 推荐人
|
|
|
+ if (headhuntPoint > 0) {
|
|
|
+ userAccountRecordService.createPointRecord(
|
|
|
+ cv.getRecommendUserId(),
|
|
|
+ "",
|
|
|
+ PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ recommendPoint,
|
|
|
+ PointBizTypeEnum.RECOMMENDED_POSITIONS,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 投递人
|
|
|
+ if (headhuntPoint > 0) {
|
|
|
+ userAccountRecordService.createPointRecord(
|
|
|
+ cv.getUserId(),
|
|
|
+ "",
|
|
|
+ PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
|
|
|
+ MathOperationEnum.ADD,
|
|
|
+ cvPoint,
|
|
|
+ PointBizTypeEnum.RECOMMENDED_POSITIONS,
|
|
|
+ String.valueOf(job.getId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|