fix:十二分制-奖惩规则

This commit is contained in:
wangff
2025-11-07 15:12:25 +08:00
parent 85a411bc9a
commit a3d0f9572c
41 changed files with 1534 additions and 38 deletions

View File

@@ -0,0 +1,77 @@
package com.cool.store.service.tp;
import com.cool.store.request.tp.TpApplyAuditRequest;
import com.cool.store.request.tp.TpApplyQueryRequest;
import com.cool.store.request.tp.TpApplyRequest;
import com.cool.store.vo.tp.TpPenaltyApplyDetailVO;
import com.cool.store.vo.tp.TpPenaltyApplyListVO;
import com.cool.store.vo.tp.TpRewardApplyDetailVO;
import com.cool.store.vo.tp.TpRewardApplyListVO;
import com.github.pagehelper.PageInfo;
/**
* <p>
* 十二分制-申请单 服务类
* </p>
*
* @author wangff
* @since 2025/11/5
*/
public interface TpApplyService {
/**
* 加分申请提交
* @param request 奖惩申请Request
* @return 是否成功
*/
Boolean rewardApplySubmit(TpApplyRequest request);
/**
* 加分申请单详情
* @param applyId 申请单id
* @return 加分申请详情VO
*/
TpRewardApplyDetailVO rewardDetail(Long applyId);
/**
* 加分申请单分页查询
* @param request 申请单查询Request
* @return 加分申请单VO列表
*/
PageInfo<TpRewardApplyListVO> rewardPage(TpApplyQueryRequest request);
/**
* 扣分申请提交
* @param request 奖惩申请Request
* @return 是否成功
*/
Boolean penaltyApplySubmit(TpApplyRequest request);
/**
* 惩处申请单详情
* @param applyId 申请单id
* @return 惩处申请详情VO
*/
TpPenaltyApplyDetailVO penaltyDetail(Long applyId);
/**
* 惩处申请单分页查询
* @param request 申请单查询Request
* @return 惩处申请单列表VO列表
*/
PageInfo<TpPenaltyApplyListVO> penaltyPage(TpApplyQueryRequest request);
/**
* 加分申请审批
* @param request 申请单审批Request
* @return 是否成功
*/
Boolean rewardAudit(TpApplyAuditRequest request);
/**
* 惩处申请审批
* @param request 申请单审批Request
* @return 是否成功
*/
Boolean penaltyAudit(TpApplyAuditRequest request);
}

View File

@@ -0,0 +1,283 @@
package com.cool.store.service.tp.impl;
import cn.hutool.core.collection.CollStreamUtil;
import com.cool.store.constants.CommonConstants;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.StoreDao;
import com.cool.store.dao.tp.TpApplyFormDAO;
import com.cool.store.dao.tp.TpAuditRecordDAO;
import com.cool.store.dao.tp.TpRuleDAO;
import com.cool.store.dao.tp.TpScoreJournalDAO;
import com.cool.store.entity.StoreDO;
import com.cool.store.entity.tp.TpApplyFormDO;
import com.cool.store.entity.tp.TpRuleDO;
import com.cool.store.entity.tp.TpScoreJournalDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.tp.TpFormStatusEnum;
import com.cool.store.enums.tp.TpFormTypeEnum;
import com.cool.store.enums.tp.TpPayStatusEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.request.tp.TpApplyAuditRequest;
import com.cool.store.request.tp.TpApplyQueryRequest;
import com.cool.store.request.tp.TpApplyRequest;
import com.cool.store.service.dict.impl.DictService;
import com.cool.store.service.tp.TpApplyService;
import com.cool.store.utils.BeanUtil;
import com.cool.store.utils.TpHelper;
import com.cool.store.vo.tp.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.*;
/**
* <p>
* 十二分制-申请单 服务实现类
* </p>
*
* @author wangff
* @since 2025/11/5
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class TpApplyServiceImpl implements TpApplyService {
private final TpRuleDAO tpRuleDAO;
private final TpApplyFormDAO tpApplyFormDAO;
private final StoreDao storeDao;
private final TpAuditRecordDAO tpAuditRecordDAO;
private final DictService dictService;
private final TpScoreJournalDAO tpScoreJournalDAO;
private final EnterpriseUserDAO enterpriseUserDAO;
@Override
@Transactional
public Boolean rewardApplySubmit(TpApplyRequest request) {
// 1.每个门店一个月内相同加分项仅能申请一次
// 2.门店分值=12时所有加分项不允许申请
boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft());
if (!isDraft && tpApplyFormDAO.existPassRewardForm(request.getStoreId(), request.getRuleId())) {
throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY);
}
if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), true)) {
throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY);
}
BigDecimal score = storeDao.getStoreScore(request.getStoreId());
if (!isDraft && BigDecimal.valueOf(12.0).compareTo(score.setScale(1, RoundingMode.DOWN)) == 0) {
throw new ServiceException(ErrorCodeEnum.TP_SCORE_EQUAL_TWELVE);
}
TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class);
boolean isInsert = Objects.isNull(request.getId());
if (isInsert) {
formDO.setApplyNo(TpHelper.generateApplyNo(TpFormTypeEnum.REWARD.getType()));
formDO.setType(TpFormTypeEnum.REWARD.getType());
formDO.setStatus(TpFormStatusEnum.PENDING.getStatus());
formDO.setPayStatus(TpPayStatusEnum.NO_NEED_PAY.getStatus());
}
fillRuleFields(formDO);
tpApplyFormDAO.insertOrUpdate(formDO);
// 第一次提交后添加审批记录
if (isInsert && !isDraft) {
tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.REWARD.getType(), request.getApplyUserId(), request.getApplyUserName());
}
return true;
}
@Override
public TpRewardApplyDetailVO rewardDetail(Long applyId) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId);
if (Objects.nonNull(formDO)) {
TpRewardApplyDetailVO vo = BeanUtil.toBean(formDO, TpRewardApplyDetailVO.class);
dictService.fillDictField(vo);
StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId());
if (Objects.nonNull(storeDO)) {
vo.setStoreNum(storeDO.getStoreNum());
vo.setStoreName(storeDO.getStoreName());
}
return vo;
}
return null;
}
@Override
public PageInfo<TpRewardApplyListVO> rewardPage(TpApplyQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<TpApplyFormDO> list = tpApplyFormDAO.getEffectiveList(request);
PageInfo<TpApplyFormDO> page = new PageInfo<>(list);
PageInfo<TpRewardApplyListVO> newPage = BeanUtil.toPage(page, TpRewardApplyListVO.class);
fillListFields(newPage.getList());
return newPage;
}
@Override
@Transactional
public Boolean penaltyApplySubmit(TpApplyRequest request) {
TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class);
// 如果存在审批中的申请,则不允许再次提交
boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft());
if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), false)) {
throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY);
}
boolean isInsert = Objects.isNull(request.getId());
fillRuleFields(formDO);
if (isInsert) {
formDO.setApplyNo(TpHelper.generateApplyNo(formDO.getType()));
formDO.setStatus(TpFormStatusEnum.PENDING.getStatus());
}
tpApplyFormDAO.insertOrUpdate(formDO);
// 第一次提交后添加审批记录
if (isInsert && !isDraft) {
tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.PENALTY.getType(), request.getApplyUserId(), request.getApplyUserName());
}
return true;
}
@Override
public TpPenaltyApplyDetailVO penaltyDetail(Long applyId) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId);
if (Objects.nonNull(formDO)) {
TpPenaltyApplyDetailVO vo = BeanUtil.toBean(formDO, TpPenaltyApplyDetailVO.class);
dictService.fillDictField(vo);
StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId());
if (Objects.nonNull(storeDO)) {
vo.setStoreNum(storeDO.getStoreNum());
vo.setStoreName(storeDO.getStoreName());
}
return vo;
}
return null;
}
@Override
public PageInfo<TpPenaltyApplyListVO> penaltyPage(TpApplyQueryRequest request) {
request.setIsPenalty(true);
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<TpApplyFormDO> list = tpApplyFormDAO.getEffectiveList(request);
PageInfo<TpApplyFormDO> page = new PageInfo<>(list);
PageInfo<TpPenaltyApplyListVO> newPage = BeanUtil.toPage(page, TpPenaltyApplyListVO.class);
fillListFields(newPage.getList());
return newPage;
}
@Override
@Transactional
public Boolean rewardAudit(TpApplyAuditRequest request) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(request.getApplyId());
if (Objects.isNull(formDO)) {
throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM);
}
if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) {
throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED);
}
if (tpApplyFormDAO.existPassRewardForm(formDO.getStoreId(), formDO.getRuleId())) {
throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY);
}
Date now = new Date();
// 修改申请单审批数据
formDO.setStatus(CommonConstants.INDEX_ONE.equals(request.getAuditStatus()) ? TpFormStatusEnum.PASS.getStatus() : TpFormStatusEnum.REJECT.getStatus());
formDO.setApproveTime(now);
tpApplyFormDAO.updateSelective(formDO);
LoginUserInfo user = CurrentUserHolder.getUser();
// 处理审批记录
tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), request.getApplyType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now);
// 审批通过后门店积分变动
scoreChange(formDO);
return null;
}
@Override
public Boolean penaltyAudit(TpApplyAuditRequest request) {
return null;
}
/**
* 门店积分变动
*/
private void scoreChange(TpApplyFormDO formDO) {
if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) {
BigDecimal occurBeforeScore = storeDao.getStoreScore(formDO.getStoreId());
BigDecimal occurAfterScore = null;
String occurScore = "";
if (TpFormTypeEnum.REWARD.getType().equals(formDO.getType())) {
// 加分
if (CommonConstants.INDEX_ONE.equals(formDO.getIsFull())) {
occurAfterScore = BigDecimal.valueOf(12.0);
occurScore = "加满";
} else {
occurAfterScore = occurBeforeScore.add(formDO.getScore());
occurScore = "+" + formDO.getScore().toString();
}
} else if (TpFormTypeEnum.PENALTY.getType().equals(formDO.getType())) {
occurAfterScore = occurBeforeScore.subtract(formDO.getScore());
occurScore = "-" + formDO.getScore().toString();
}
// 修改门店积分
if (Objects.nonNull(occurAfterScore)) {
storeDao.updateStoreScore(formDO.getStoreId(), occurAfterScore);
}
StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId());
if (Objects.isNull(storeDO)) {
throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND);
}
// 添加积分流水
tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore));
}
}
/**
* 填充规则相关字段
*/
private void fillRuleFields(TpApplyFormDO formDO) {
TpRuleDO ruleDO = tpRuleDAO.getById(formDO.getRuleId());
if (Objects.isNull(ruleDO)) {
throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_RULE);
}
formDO.setRuleNo(ruleDO.getRuleNo());
formDO.setProblemClassification(ruleDO.getProblemClassification());
formDO.setProjectCategory(ruleDO.getProjectCategory());
formDO.setProjectName(ruleDO.getProjectName());
formDO.setIsFull(ruleDO.getIsFull());
formDO.setScore(ruleDO.getScore());
formDO.setAmount(ruleDO.getAmount());
formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline()));
if (CommonConstants.INDEX_ZERO.equals(ruleDO.getType())) {
// 如果是扣分规则,判断警告次数
int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId());
formDO.setType(ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType());
// 是否缴费
formDO.setPayStatus(Objects.nonNull(ruleDO.getAmount()) && BigDecimal.ZERO.compareTo(ruleDO.getAmount()) < 0 ? TpPayStatusEnum.UNPAID.getStatus() : TpPayStatusEnum.NO_NEED_PAY.getStatus());
}
}
/**
* 填充列表相关字段
*/
private void fillListFields(List<? extends TpApplyListBaseVO> list) {
if (CollectionUtils.isNotEmpty(list)) return;
dictService.fillDictField(list);
Set<String> storeIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getStoreId);
Set<String> approveUserIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getApproveUserId);
Map<String, StoreDO> storeMap = storeDao.getStoreMapByStoreIds(new ArrayList<>(storeIds));
Map<String, String> userNameMap = enterpriseUserDAO.getUserNameMap(new ArrayList<>(approveUserIds));
for (TpApplyListBaseVO vo : list) {
StoreDO storeDO = storeMap.get(vo.getStoreId());
if (Objects.nonNull(storeDO)) {
vo.setStoreName(storeDO.getStoreName());
vo.setStoreNum(storeDO.getStoreNum());
}
vo.setApproveUserName(userNameMap.get(vo.getApproveUserId()));
}
}
}

View File

@@ -37,7 +37,7 @@ public class TpRuleServiceImpl implements TpRuleService {
@Override
public Boolean insertPenaltyRule(TpPenaltyRuleUpdateRequest request) {
TpRuleDO tpRuleDO = BeanUtil.toBean(request, TpRuleDO.class);
tpRuleDO.setRuleCode(TpHelper.generatePenaltyRuleCode());
tpRuleDO.setRuleNo(TpHelper.generateRuleNo(false));
tpRuleDO.setType(0);
return tpRuleDAO.insertSelective(tpRuleDO);
}
@@ -72,7 +72,7 @@ public class TpRuleServiceImpl implements TpRuleService {
@Override
public Boolean insertRewardRule(TpRewardRuleUpdateRequest request) {
TpRuleDO tpRuleDO = BeanUtil.toBean(request, TpRuleDO.class);
tpRuleDO.setRuleCode(TpHelper.generateRewardRuleCode());
tpRuleDO.setRuleNo(TpHelper.generateRuleNo(true));
tpRuleDO.setType(1);
return tpRuleDAO.insertSelective(tpRuleDO);
}