fix:十二分制-申请单

This commit is contained in:
wangff
2025-11-10 14:20:44 +08:00
parent a3d0f9572c
commit bd64b33ebb
19 changed files with 496 additions and 199 deletions

View File

@@ -325,6 +325,7 @@ public enum ErrorCodeEnum {
TP_NOT_EXIST_APPLY_FORM(1810004, "不存在申请单", null),
TP_APPLY_AUDIT_COMPLETED(1810005, "该申请单已审批", null),
TP_EXISTS_PENDING_APPLY(1810006, "存在待审批的申请单", null),
TP_PENALTY_APPLY_APPEAL_COMPLETED(1810007, "该处罚单已完成复议", null),
;

View File

@@ -18,6 +18,7 @@ public enum TpFormTypeEnum {
REWARD(0, "加分申请单"),
WARNING(1, "警告书"),
PENALTY(2, "处罚书"),
APPEAL(3, "复议申请单"),
;
private final Integer type;
@@ -41,4 +42,11 @@ public enum TpFormTypeEnum {
}
return null;
}
/**
* 是惩处单
*/
public static boolean isPenalty(Integer type) {
return PENALTY.getType().equals(type) || WARNING.getType().equals(type);
}
}

View File

@@ -43,6 +43,13 @@ public class TpHelper {
return (TpFormTypeEnum.REWARD.equals(type) ? "JF" : TpFormTypeEnum.PENALTY.equals(type) ? "CF" : "JG") + generateCode();
}
/**
* 生成复议申请单号
*/
public static String generateAppealNo() {
return "FY" + generateCode();
}
private static String generateCode() {
return LocalDateTime.now().format(dtf) + ((int) (Math.random() * 900) + 100);
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.dao.tp;
import com.alibaba.excel.util.CollectionUtils;
import com.cool.store.entity.tp.TpApplyFormDO;
import com.cool.store.enums.tp.TpFormStatusEnum;
import com.cool.store.enums.tp.TpFormTypeEnum;
@@ -11,6 +12,7 @@ import tk.mybatis.mapper.entity.Example;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -73,6 +75,13 @@ public class TpApplyFormDAO {
return tpApplyFormMapper.selectByPrimaryKey(id);
}
/**
* 根据id查询有效申请单
*/
public TpApplyFormDO getEffectiveById(Long id) {
return tpApplyFormMapper.selectOne(TpApplyFormDO.builder().id(id).deleted(0).build());
}
/**
* 查询有效记录列表
* @param request 申请单查询Request
@@ -118,4 +127,35 @@ public class TpApplyFormDAO {
}
return tpApplyFormMapper.selectCountByExample(example) > 0;
}
/**
* 根据处罚单id查询申请单
* @param penaltyId 处罚单id
* @return 申请单
*/
public TpApplyFormDO getByPenaltyId(Long penaltyId) {
return tpApplyFormMapper.selectOne(TpApplyFormDO.builder().penaltyId(penaltyId).deleted(0).build());
}
/**
* 根据id列表查询
*/
public List<TpApplyFormDO> getByIds(List<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return Collections.emptyList();
}
Example example = new Example(TpApplyFormDO.class);
example.createCriteria().andIn("id", ids);
return tpApplyFormMapper.selectByExample(example);
}
/**
* 申请单作废
* @param applyId 申请单id
*/
public void cancelApply(Long applyId) {
Example example = new Example(TpApplyFormDO.class);
example.createCriteria().andEqualTo("id", applyId).andEqualTo("deleted", 0);
tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().status(TpFormStatusEnum.CANCEL.getStatus()).build(), example);
}
}

View File

@@ -1,7 +0,0 @@
package com.cool.store.mapper.tp;
import com.cool.store.entity.tp.TpAppealFormDO;
import tk.mybatis.mapper.common.Mapper;
public interface TpAppealFormMapper extends Mapper<TpAppealFormDO> {
}

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cool.store.mapper.tp.TpAppealFormMapper">
<resultMap id="BaseResultMap" type="com.cool.store.entity.tp.TpAppealFormDO">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="apply_no" jdbcType="VARCHAR" property="applyNo" />
<result column="punish_id" jdbcType="BIGINT" property="punishId" />
<result column="store_id" jdbcType="VARCHAR" property="storeId" />
<result column="applicant_name" jdbcType="VARCHAR" property="applicantName" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="appeal_reason" jdbcType="VARCHAR" property="appealReason" />
<result column="detail_reason" jdbcType="VARCHAR" property="detailReason" />
<result column="status" jdbcType="BIT" property="status" />
<result column="source" jdbcType="BIT" property="source" />
<result column="approve_user_id" jdbcType="VARCHAR" property="approveUserId" />
<result column="approve_time" jdbcType="TIMESTAMP" property="approveTime" />
<result column="is_draft" jdbcType="TINYINT" property="isDraft" />
<result column="create_user_id" jdbcType="VARCHAR" property="createUserId" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="deleted" jdbcType="BIT" property="deleted" />
<result column="proof_urls" jdbcType="LONGVARCHAR" property="proofUrls" />
</resultMap>
</mapper>

View File

@@ -31,12 +31,18 @@
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="deleted" jdbcType="BIT" property="deleted" />
<result column="proof_urls" jdbcType="LONGVARCHAR" property="proofUrls" />
<result column="penalty_id" jdbcType="BIGINT" property="penaltyId" />
<result column="applicant_name" jdbcType="VARCHAR" property="applicantName" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="appeal_reason" jdbcType="VARCHAR" property="appealReason" />
<result column="appeal_detail_reason" jdbcType="VARCHAR" property="appealDetailReason" />
</resultMap>
<sql id="Base_Column_List">
id, type, apply_no, store_id, rule_id, rule_no, problem_classification, project_category, project_name,
is_full, score, remark, amount, appeal_end_date, status, pay_status, is_draft, source, apply_user_id,
apply_user_name, approve_user_id, approve_time, create_time, update_time, deleted, proof_urls
apply_user_name, approve_user_id, approve_time, create_time, update_time, deleted, proof_urls,
penalty_id, applicant_name, phone, appeal_reason, appeal_detail_reason
</sql>
<select id="getEffectiveList" parameterType="com.cool.store.request.tp.TpApplyQueryRequest" resultMap="BaseResultMap">
@@ -74,6 +80,9 @@
AND (b.store_name LIKE CONCAT('%', #{storeNameOrNum}, '%')
OR b.store_num LIKE CONCAT('%', #{storeNameOrNum}, '%')
</if>
<if test="appealReason != null and appealReason != ''">
AND b.appeal_reason LIKE CONCAT('%', #{appealReason}, '%')
</if>
</where>
</select>

View File

@@ -1,123 +0,0 @@
package com.cool.store.entity.tp;
import lombok.Data;
import java.util.Date;
import javax.persistence.*;
/**
* <p>
* 十二分制-复议申请单
* </p>
*
* @author wangff
* @since 2025/11/4
*/
@Table(name = "zxjp_tp_appeal_form")
@Data
public class TpAppealFormDO {
/**
* id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 申请单号
*/
@Column(name = "apply_no")
private String applyNo;
/**
* 处罚单id
*/
@Column(name = "punish_id")
private Long punishId;
/**
* 门店id
*/
@Column(name = "store_id")
private String storeId;
/**
* 申请人姓名
*/
@Column(name = "applicant_name")
private String applicantName;
/**
* 联系电话
*/
private String phone;
/**
* 复议理由
*/
@Column(name = "appeal_reason")
private String appealReason;
/**
* 详细理由
*/
@Column(name = "detail_reason")
private String detailReason;
/**
* 状态
*/
private Integer status;
/**
* 来源0非小程序 1小程序
*/
private Integer source;
/**
* 审批人id
*/
@Column(name = "approve_user_id")
private String approveUserId;
/**
* 审批时间
*/
@Column(name = "approve_time")
private Date approveTime;
/**
* 是否为草稿 0否 1是
*/
@Column(name = "is_draft")
private Integer isDraft;
/**
* 创建人id
*/
@Column(name = "create_user_id")
private String createUserId;
/**
* 创建时间
*/
@Column(name = "create_time")
private Date createTime;
/**
* 更新时间
*/
@Column(name = "update_time")
private Date updateTime;
/**
* 是否删除 0否1是
*/
private Integer deleted;
/**
* 证明图片列表
*/
@Column(name = "proof_urls")
private String proofUrls;
}

View File

@@ -129,13 +129,13 @@ public class TpApplyFormDO {
private Integer source;
/**
* 申请人id
* 申请人(创建人)id
*/
@Column(name = "apply_user_id")
private String applyUserId;
/**
* 申请人名称
* 申请人(创建人)名称
*/
@Column(name = "apply_user_name")
private String applyUserName;
@@ -174,4 +174,34 @@ public class TpApplyFormDO {
*/
@Column(name = "proof_urls")
private String proofUrls;
/**
* 处罚单id
*/
@Column(name = "penalty_id")
private Long penaltyId;
/**
* 申请人姓名(复议申请单)
*/
@Column(name = "applicant_name")
private String applicantName;
/**
* 联系电话
*/
@Column(name = "phone")
private String phone;
/**
* 复议理由
*/
@Column(name = "appeal_reason")
private String appealReason;
/**
* 复议详细理由
*/
@Column(name = "appeal_detail_reason")
private String appealDetailReason;
}

View File

@@ -0,0 +1,63 @@
package com.cool.store.request.tp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* <p>
* 复议申请Request
* </p>
*
* @author wangff
* @since 2025/11/10
*/
@Data
public class TpAppealApplyRequest {
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("门店id")
@NotBlank(message = "门店id不能为空")
private String storeId;
@ApiModelProperty("是否为草稿 0否 1是")
@NotNull(message = "是否为草稿不能为空")
private Integer isDraft;
@ApiModelProperty(value = "来源0非小程序 1小程序", hidden = true)
private Integer source;
@ApiModelProperty(value = "申请人(创建人)id", hidden = true)
private String applyUserId;
@ApiModelProperty(value = "申请人(创建人)名称", hidden = true)
private String applyUserName;
@ApiModelProperty("证明图片列表")
@NotEmpty(message = "证明图片列表不能为空")
private String proofUrls;
@ApiModelProperty("处罚单id")
@NotNull(message = "处罚单id不能为空")
private Long penaltyId;
@ApiModelProperty("申请人姓名")
@NotBlank(message = "申请人姓名不能为空")
private String applicantName;
@ApiModelProperty("联系电话")
@NotBlank(message = "联系电话不能为空")
private String phone;
@ApiModelProperty("复议理由")
@NotBlank(message = "复议理由不能为空")
private String appealReason;
@ApiModelProperty("复议详细理由")
@NotBlank(message = "复议详细理由不能为空")
private String appealDetailReason;
}

View File

@@ -19,9 +19,6 @@ public class TpApplyAuditRequest {
@NotNull(message = "申请单id不能为空")
private Long applyId;
@ApiModelProperty(value = "单据类型0加分单 1警告书 2处罚书", hidden = true)
private Integer applyType;
@ApiModelProperty("审批状态 1通过 2拒绝")
@NotNull(message = "审批状态不能为空")
private Integer auditStatus;

View File

@@ -42,4 +42,7 @@ public class TpApplyQueryRequest extends PageBasicInfo {
@ApiModelProperty(value = "是惩处单", hidden = true)
private Boolean isPenalty;
@ApiModelProperty("复议理由")
private String appealReason;
}

View File

@@ -5,6 +5,8 @@ import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* <p>
@@ -37,13 +39,22 @@ public class TpApplyRequest {
@ApiModelProperty(value = "来源0非小程序 1小程序", hidden = true)
private Integer source;
@ApiModelProperty(value = "申请人id", hidden = true)
@ApiModelProperty(value = "申请人(创建人)id", hidden = true)
private String applyUserId;
@ApiModelProperty(value = "申请人名称", hidden = true)
@ApiModelProperty(value = "申请人(创建人)名称", hidden = true)
private String applyUserName;
@ApiModelProperty("证明图片列表,逗号隔开")
@NotBlank(message = "证明图片列表不能为空")
private String proofUrls;
@ApiModelProperty("分值")
private BigDecimal score;
@ApiModelProperty("金额")
private BigDecimal amount;
@ApiModelProperty("申请复议截止日期yyyy-MM-dd")
private LocalDate appealEndDate;
}

View File

@@ -0,0 +1,59 @@
package com.cool.store.vo.tp;
import com.cool.store.annotation.DictField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* <p>
* 复议申请单详情VO
* </p>
*
* @author wangff
* @since 2025/11/10
*/
@Data
public class TpAppealFormDetailVO {
@ApiModelProperty("id")
private Long id;
@ApiModelProperty("门店id")
private String storeId;
@ApiModelProperty("门店编码")
private String storeNum;
@ApiModelProperty("门店名称")
private String storeName;
@ApiModelProperty("是否为草稿 0否 1是")
private Integer isDraft;
@ApiModelProperty("处罚单id")
private Long penaltyId;
@ApiModelProperty("处罚单号")
private Long penaltyNo;
@ApiModelProperty("证明图片列表")
private String proofUrls;
@ApiModelProperty("申请人姓名")
private String applicantName;
@ApiModelProperty("联系电话")
private String phone;
@ApiModelProperty("复议理由")
private String appealReason;
@ApiModelProperty("复议理由名称")
@DictField
private String appealReasonName;
@ApiModelProperty("复议详细理由")
private String appealDetailReason;
@ApiModelProperty("处罚单")
private TpPenaltyApplyDetailVO penaltyDetail;
}

View File

@@ -0,0 +1,38 @@
package com.cool.store.vo.tp;
import com.cool.store.annotation.DictField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* <p>
* 复审列表VO
* </p>
*
* @author wangff
* @since 2025/11/10
*/
@Data
public class TpAppealListVO extends TpApplyListBaseVO {
@ApiModelProperty("处罚单id")
private Long penaltyId;
@ApiModelProperty("处罚单号")
private String penaltyNo;
@ApiModelProperty("申请人姓名")
private String applicantName;
@ApiModelProperty("联系电话")
private String phone;
@ApiModelProperty("复议理由")
private String appealReason;
@ApiModelProperty("复议理由名称")
@DictField
private String appealReasonName;
@ApiModelProperty("复议详细理由")
private String appealDetailReason;
}

View File

@@ -67,7 +67,7 @@ public class TpApplyListBaseVO {
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("申请人名称")
@ApiModelProperty("申请人(创建人)名称")
private String applyUserName;
@ApiModelProperty("申请时间")

View File

@@ -1,12 +1,10 @@
package com.cool.store.service.tp;
import com.cool.store.request.tp.TpAppealApplyRequest;
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.cool.store.vo.tp.*;
import com.github.pagehelper.PageInfo;
/**
@@ -74,4 +72,32 @@ public interface TpApplyService {
* @return 是否成功
*/
Boolean penaltyAudit(TpApplyAuditRequest request);
/**
* 复议申请提交
* @param request 复议申请Request
* @return 是否成功
*/
Boolean appealApplySubmit(TpAppealApplyRequest request);
/**
* 复议申请单详情
* @param applyId 复议申请单id
* @return 复议申请单详情VO
*/
TpAppealFormDetailVO appealDetail(Long applyId);
/**
* 复议申请单分页查询
* @param request 申请单查询Request
* @return 复审列表VO列表
*/
PageInfo<TpAppealListVO> appealPage(TpApplyQueryRequest request);
/**
* 复议申请审批
* @param request 申请单审批Request
* @return 是否成功
*/
Boolean appealAudit(TpApplyAuditRequest request);
}

View File

@@ -6,10 +6,7 @@ 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.dao.tp.*;
import com.cool.store.entity.StoreDO;
import com.cool.store.entity.tp.TpApplyFormDO;
import com.cool.store.entity.tp.TpRuleDO;
@@ -19,6 +16,7 @@ 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.TpAppealApplyRequest;
import com.cool.store.request.tp.TpApplyAuditRequest;
import com.cool.store.request.tp.TpApplyQueryRequest;
import com.cool.store.request.tp.TpApplyRequest;
@@ -82,7 +80,6 @@ public class TpApplyServiceImpl implements TpApplyService {
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);
@@ -96,7 +93,7 @@ public class TpApplyServiceImpl implements TpApplyService {
@Override
public TpRewardApplyDetailVO rewardDetail(Long applyId) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId);
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId);
if (Objects.nonNull(formDO)) {
TpRewardApplyDetailVO vo = BeanUtil.toBean(formDO, TpRewardApplyDetailVO.class);
dictService.fillDictField(vo);
@@ -130,11 +127,8 @@ public class TpApplyServiceImpl implements TpApplyService {
throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY);
}
boolean isInsert = Objects.isNull(request.getId());
formDO.setApplyNo(isInsert ? TpHelper.generateApplyNo(formDO.getType()) : null);
fillRuleFields(formDO);
if (isInsert) {
formDO.setApplyNo(TpHelper.generateApplyNo(formDO.getType()));
formDO.setStatus(TpFormStatusEnum.PENDING.getStatus());
}
tpApplyFormDAO.insertOrUpdate(formDO);
// 第一次提交后添加审批记录
if (isInsert && !isDraft) {
@@ -145,7 +139,7 @@ public class TpApplyServiceImpl implements TpApplyService {
@Override
public TpPenaltyApplyDetailVO penaltyDetail(Long applyId) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId);
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId);
if (Objects.nonNull(formDO)) {
TpPenaltyApplyDetailVO vo = BeanUtil.toBean(formDO, TpPenaltyApplyDetailVO.class);
dictService.fillDictField(vo);
@@ -161,7 +155,6 @@ public class TpApplyServiceImpl implements TpApplyService {
@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);
@@ -173,8 +166,8 @@ public class TpApplyServiceImpl implements TpApplyService {
@Override
@Transactional
public Boolean rewardAudit(TpApplyAuditRequest request) {
TpApplyFormDO formDO = tpApplyFormDAO.getById(request.getApplyId());
if (Objects.isNull(formDO)) {
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId());
if (Objects.isNull(formDO) || !TpFormTypeEnum.REWARD.getType().equals(formDO.getType())) {
throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM);
}
if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) {
@@ -183,6 +176,100 @@ public class TpApplyServiceImpl implements TpApplyService {
if (tpApplyFormDAO.existPassRewardForm(formDO.getStoreId(), formDO.getRuleId())) {
throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY);
}
auditCommon(request, formDO);
return true;
}
@Override
@Transactional
public Boolean penaltyAudit(TpApplyAuditRequest request) {
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId());
if (Objects.isNull(formDO) || !TpFormTypeEnum.isPenalty(formDO.getType())) {
throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM);
}
if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) {
throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED);
}
auditCommon(request, formDO);
return true;
}
@Override
public Boolean appealApplySubmit(TpAppealApplyRequest request) {
TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class);
boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft());
TpApplyFormDO punishFormDO = tpApplyFormDAO.getByPenaltyId(request.getPenaltyId());
if (Objects.nonNull(punishFormDO) && !isDraft) {
if (TpFormStatusEnum.PENDING.getStatus().equals(punishFormDO.getStatus())) {
throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY);
}
if (TpFormStatusEnum.PASS.getStatus().equals(punishFormDO.getStatus())) {
throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_APPEAL_COMPLETED);
}
}
boolean isInsert = Objects.isNull(request.getId());
formDO.setApplyNo(isInsert ? TpHelper.generateAppealNo() : null);
formDO.setRuleId(punishFormDO.getRuleId());
formDO.setType(TpFormTypeEnum.APPEAL.getType());
fillRuleFields(formDO);
tpApplyFormDAO.insertOrUpdate(formDO);
// 第一次提交后添加审批记录
if (isInsert && !isDraft) {
tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.APPEAL.getType(), request.getApplyUserId(), request.getApplyUserName());
}
return true;
}
@Override
public TpAppealFormDetailVO appealDetail(Long applyId) {
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId);
if (Objects.nonNull(formDO)) {
TpAppealFormDetailVO vo = BeanUtil.toBean(formDO, TpAppealFormDetailVO.class);
dictService.fillDictField(vo);
StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId());
if (Objects.nonNull(storeDO)) {
vo.setStoreNum(storeDO.getStoreNum());
vo.setStoreName(storeDO.getStoreName());
}
vo.setPenaltyDetail(penaltyDetail(vo.getPenaltyId()));
return vo;
}
return null;
}
@Override
public PageInfo<TpAppealListVO> appealPage(TpApplyQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<TpApplyFormDO> list = tpApplyFormDAO.getEffectiveList(request);
PageInfo<TpApplyFormDO> page = new PageInfo<>(list);
PageInfo<TpAppealListVO> newPage = BeanUtil.toPage(page, TpAppealListVO.class);
List<Long> penaltyIds = CollStreamUtil.toList(newPage.getList(), TpAppealListVO::getPenaltyId);
List<TpApplyFormDO> penaltyList = tpApplyFormDAO.getByIds(penaltyIds);
Map<Long, String> penaltyNoMap = CollStreamUtil.toMap(penaltyList, TpApplyFormDO::getId, TpApplyFormDO::getApplyNo);
newPage.getList().forEach(vo -> {
vo.setPenaltyNo(penaltyNoMap.get(vo.getPenaltyId()));
});
fillListFields(newPage.getList());
return newPage;
}
@Override
public Boolean appealAudit(TpApplyAuditRequest request) {
TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId());
if (Objects.isNull(formDO) || !TpFormTypeEnum.APPEAL.getType().equals(formDO.getType())) {
throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM);
}
if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) {
throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED);
}
auditCommon(request, formDO);
return true;
}
/**
* 审批通用方法
*/
private void auditCommon(TpApplyAuditRequest request, TpApplyFormDO formDO) {
Date now = new Date();
// 修改申请单审批数据
formDO.setStatus(CommonConstants.INDEX_ONE.equals(request.getAuditStatus()) ? TpFormStatusEnum.PASS.getStatus() : TpFormStatusEnum.REJECT.getStatus());
@@ -190,15 +277,23 @@ public class TpApplyServiceImpl implements TpApplyService {
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;
tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), formDO.getType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now);
if (TpFormTypeEnum.APPEAL.getType().equals(formDO.getType())) {
appealPassResolve(formDO);
} else {
// 审批通过后门店积分变动
scoreChange(formDO);
}
}
@Override
public Boolean penaltyAudit(TpApplyAuditRequest request) {
return null;
/**
* 复议申请通过时处罚单作废
*/
private void appealPassResolve(TpApplyFormDO formDO) {
if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) {
// 申诉通过后,处罚单失效
tpApplyFormDAO.cancelApply(formDO.getPenaltyId());
}
}
/**
@@ -248,11 +343,18 @@ public class TpApplyServiceImpl implements TpApplyService {
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 (Objects.isNull(formDO.getScore())) {
formDO.setScore(ruleDO.getScore());
}
if (Objects.isNull(formDO.getAmount())) {
formDO.setAmount(ruleDO.getAmount());
}
// 扣分
if (CommonConstants.INDEX_ZERO.equals(ruleDO.getType())) {
// 如果是扣分规则,判断警告次数
if (Objects.isNull(formDO.getAppealEndDate())) {
formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline()));
}
// 超过警告次数的为处罚单,否则警告单
int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId());
formDO.setType(ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType());
// 是否缴费

View File

@@ -3,13 +3,13 @@ package com.cool.store.controller.webb;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.enums.tp.TpFormTypeEnum;
import com.cool.store.request.tp.TpAppealApplyRequest;
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.response.ResponseResult;
import com.cool.store.service.tp.TpApplyService;
import com.cool.store.vo.tp.TpRewardApplyDetailVO;
import com.cool.store.vo.tp.TpRewardApplyListVO;
import com.cool.store.vo.tp.*;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -28,7 +28,7 @@ import javax.validation.constraints.NotNull;
* @author wangff
* @since 2025/11/6
*/
@Api(tags = "十二分制-奖惩规则")
@Api(tags = "十二分制-申请单")
@RestController
@RequestMapping("/pc/tp/apply")
@RequiredArgsConstructor
@@ -62,7 +62,67 @@ public class TpApplyController {
@ApiOperation("加分申请审批")
@PostMapping("/rewardAudit")
public ResponseResult<Boolean> rewardAudit(@RequestBody @Validated TpApplyAuditRequest request) {
request.setApplyType(TpFormTypeEnum.REWARD.getType());
return ResponseResult.success(tpApplyService.rewardAudit(request));
}
@ApiOperation("惩处申请提交or保存")
@PostMapping("/penaltyApplySubmit")
public ResponseResult<Boolean> penaltyApplySubmit(@RequestBody @Validated TpApplyRequest request) {
LoginUserInfo user = CurrentUserHolder.getUser();
request.setSource(0);
request.setApplyUserId(user.getUserId());
request.setApplyUserName(user.getName());
return ResponseResult.success(tpApplyService.penaltyApplySubmit(request));
}
@ApiOperation("惩处申请单详情")
@GetMapping("/penaltyDetail")
@ApiImplicitParam(name = "applyId", value = "惩处申请单id", required = true, dataType = "Long", paramType = "query")
public ResponseResult<TpPenaltyApplyDetailVO> penaltyDetail(@NotNull(message = "惩处申请单id不能为空") Long applyId) {
return ResponseResult.success(tpApplyService.penaltyDetail(applyId));
}
@ApiOperation("惩处申请单分页查询")
@GetMapping("/penaltyPage")
public ResponseResult<PageInfo<TpPenaltyApplyListVO> > penaltyPage(TpApplyQueryRequest request) {
request.setIsPenalty(true);
return ResponseResult.success(tpApplyService.penaltyPage(request));
}
@ApiOperation("惩处申请审批")
@PostMapping("/penaltyAudit")
public ResponseResult<Boolean> penaltyAudit(@RequestBody @Validated TpApplyAuditRequest request) {
return ResponseResult.success(tpApplyService.penaltyAudit(request));
}
@ApiOperation("复议申请提交or保存")
@PostMapping("/appealApplySubmit")
public ResponseResult<Boolean> appealApplySubmit(@RequestBody @Validated TpAppealApplyRequest request) {
LoginUserInfo user = CurrentUserHolder.getUser();
request.setSource(0);
request.setApplyUserId(user.getUserId());
request.setApplyUserName(user.getName());
return ResponseResult.success(tpApplyService.appealApplySubmit(request));
}
@ApiOperation("复议申请单详情")
@GetMapping("/appealDetail")
@ApiImplicitParam(name = "applyId", value = "复议申请单id", required = true, dataType = "Long", paramType = "query")
public ResponseResult<TpAppealFormDetailVO> appealDetail(@NotNull(message = "复议申请单id不能为空") Long applyId) {
return ResponseResult.success(tpApplyService.appealDetail(applyId));
}
@ApiOperation("复议申请单分页查询")
@GetMapping("/appealPage")
public ResponseResult<PageInfo<TpAppealListVO> > appealPage(TpApplyQueryRequest request) {
request.setType(TpFormTypeEnum.APPEAL.getType());
return ResponseResult.success(tpApplyService.appealPage(request));
}
@ApiOperation("复议申请审批")
@PostMapping("/appealAudit")
public ResponseResult<Boolean> appealAudit(@RequestBody @Validated TpApplyAuditRequest request) {
return ResponseResult.success(tpApplyService.appealAudit(request));
}
}