fix:十二分制-奖惩规则
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user