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 9fda6f917..62b8b194e 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 @@ -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), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java index 695f035dc..3f62a2dec 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java @@ -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); + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java index f9c911e07..31a742437 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java @@ -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); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java index b3e70628a..cb5937e7a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java @@ -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 getByIds(List 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); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java deleted file mode 100644 index 6104bef94..000000000 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java +++ /dev/null @@ -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 { -} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml deleted file mode 100644 index bdeae3a11..000000000 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index c618c1544..5a88744a9 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -31,12 +31,18 @@ + + + + + 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 diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java deleted file mode 100644 index 51450546a..000000000 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.cool.store.entity.tp; - -import lombok.Data; - -import java.util.Date; -import javax.persistence.*; - -/** - *

- * 十二分制-复议申请单 - *

- * - * @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; -} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java index 669997010..2e244dd1e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java @@ -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; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java new file mode 100644 index 000000000..8b7ed080d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java @@ -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; + +/** + *

+ * 复议申请Request + *

+ * + * @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; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java index f98dca46d..9df312896 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java @@ -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; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java index e832e6aff..f0bcb9eb6 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -42,4 +42,7 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty(value = "是惩处单", hidden = true) private Boolean isPenalty; + + @ApiModelProperty("复议理由") + private String appealReason; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java index 51d46dea4..b1987112d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java @@ -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; /** *

@@ -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; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java new file mode 100644 index 000000000..44de731c3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java @@ -0,0 +1,59 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 复议申请单详情VO + *

+ * + * @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; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java new file mode 100644 index 000000000..93aad75bf --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java @@ -0,0 +1,38 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 复审列表VO + *

+ * + * @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; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java index e9b102144..5d225c066 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java @@ -67,7 +67,7 @@ public class TpApplyListBaseVO { @ApiModelProperty("备注") private String remark; - @ApiModelProperty("申请人名称") + @ApiModelProperty("申请人(创建人)名称") private String applyUserName; @ApiModelProperty("申请时间") diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java index b37851678..3ee950054 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -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 appealPage(TpApplyQueryRequest request); + + /** + * 复议申请审批 + * @param request 申请单审批Request + * @return 是否成功 + */ + Boolean appealAudit(TpApplyAuditRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 61af644b6..3f6dfa931 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -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 penaltyPage(TpApplyQueryRequest request) { - request.setIsPenalty(true); PageHelper.startPage(request.getPageNum(), request.getPageSize()); List list = tpApplyFormDAO.getEffectiveList(request); PageInfo 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 appealPage(TpApplyQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpApplyFormDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, TpAppealListVO.class); + List penaltyIds = CollStreamUtil.toList(newPage.getList(), TpAppealListVO::getPenaltyId); + List penaltyList = tpApplyFormDAO.getByIds(penaltyIds); + Map 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()); // 是否缴费 diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java index 66a264ff7..a48ac2cb4 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java @@ -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 rewardAudit(@RequestBody @Validated TpApplyAuditRequest request) { - request.setApplyType(TpFormTypeEnum.REWARD.getType()); return ResponseResult.success(tpApplyService.rewardAudit(request)); } + + + @ApiOperation("惩处申请提交or保存") + @PostMapping("/penaltyApplySubmit") + public ResponseResult 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 penaltyDetail(@NotNull(message = "惩处申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.penaltyDetail(applyId)); + } + + @ApiOperation("惩处申请单分页查询") + @GetMapping("/penaltyPage") + public ResponseResult > penaltyPage(TpApplyQueryRequest request) { + request.setIsPenalty(true); + return ResponseResult.success(tpApplyService.penaltyPage(request)); + } + + @ApiOperation("惩处申请审批") + @PostMapping("/penaltyAudit") + public ResponseResult penaltyAudit(@RequestBody @Validated TpApplyAuditRequest request) { + return ResponseResult.success(tpApplyService.penaltyAudit(request)); + } + + @ApiOperation("复议申请提交or保存") + @PostMapping("/appealApplySubmit") + public ResponseResult 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 appealDetail(@NotNull(message = "复议申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.appealDetail(applyId)); + } + + @ApiOperation("复议申请单分页查询") + @GetMapping("/appealPage") + public ResponseResult > appealPage(TpApplyQueryRequest request) { + request.setType(TpFormTypeEnum.APPEAL.getType()); + return ResponseResult.success(tpApplyService.appealPage(request)); + } + + @ApiOperation("复议申请审批") + @PostMapping("/appealAudit") + public ResponseResult appealAudit(@RequestBody @Validated TpApplyAuditRequest request) { + return ResponseResult.success(tpApplyService.appealAudit(request)); + } }