diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index 03237cc04..bb98209a9 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -232,4 +232,7 @@ public class CommonConstants { public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; public static final int BATCH_SIZE = 200; + + public static final Integer INDEX_ZERO = 0; + public static final Integer INDEX_ONE = 1; } 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 f98a853da..9fda6f917 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 @@ -315,6 +315,16 @@ public enum ErrorCodeEnum { JOIN_MODE_NOT_ALLOW_OPERATE(1610012,"加盟部人员只能新建加盟店或联营店,请确认!",null), STORE_NOT_FIND(1610013,"门店不存在",null), + /** + * 181 十二分制 + */ + TP_NOT_EXIST_RULE(1810000, "不存在该规则", null), + TP_MONTH_EXIST_APPLY(1810001, "该门店一个月内存在相同项目的加分申请", null), + TP_SCORE_EQUAL_TWELVE(1810002, "该门店已满12分,无法申请加分", null), + TP_NOT_EXIST_PENDING_AUDIT(1810003, "申请单不存在待审批记录", null), + TP_NOT_EXIST_APPLY_FORM(1810004, "不存在申请单", null), + TP_APPLY_AUDIT_COMPLETED(1810005, "该申请单已审批", null), + TP_EXISTS_PENDING_APPLY(1810006, "存在待审批的申请单", null), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormStatusEnum.java new file mode 100644 index 000000000..5dbf56f40 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormStatusEnum.java @@ -0,0 +1,38 @@ +package com.cool.store.enums.tp; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *
+ * 十二分制-单据状态 枚举类 + *
+ * + * @author wangff + * @since 2025/11/5 + */ +@Getter +@AllArgsConstructor +public enum TpFormStatusEnum { + + PENDING("pending", "审批中"), + PASS("pass", "审批通过"), + REJECT("reject", "审批拒绝"), + + EFFECTIVE("effective", "已生效"), + CANCEL("cancel", "已作废"), + ; + + private final String status; + + private final String msg; + + public static String getMsgByStatus(String status) { + for (TpFormStatusEnum value : values()) { + if (value.status.equals(status)) { + return value.msg; + } + } + return 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 new file mode 100644 index 000000000..695f035dc --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java @@ -0,0 +1,44 @@ +package com.cool.store.enums.tp; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *+ * 十二分制-单据类型 枚举类 + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Getter +@AllArgsConstructor +public enum TpFormTypeEnum { + + REWARD(0, "加分申请单"), + WARNING(1, "警告书"), + PENALTY(2, "处罚书"), + ; + + private final Integer type; + + private final String msg; + + public static String getMsgByType(Integer type) { + for (TpFormTypeEnum value : values()) { + if (value.type.equals(type)) { + return value.msg; + } + } + return null; + } + + public static TpFormTypeEnum getByType(Integer type) { + for (TpFormTypeEnum value : values()) { + if (value.type.equals(type)) { + return value; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpPayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpPayStatusEnum.java new file mode 100644 index 000000000..46ca5b9e3 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpPayStatusEnum.java @@ -0,0 +1,35 @@ +package com.cool.store.enums.tp; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *+ * 十二分制-缴费状态 枚举类 + *
+ * + * @author wangff + * @since 2025/11/5 + */ +@Getter +@AllArgsConstructor +public enum TpPayStatusEnum { + + UNPAID(0, "未缴费"), + NO_NEED_PAY(1, "无需缴费"), + PAID(2, "已缴费") + ; + + private final Integer status; + + private final String msg; + + public static String getMsgByStatus(Integer status) { + for (TpPayStatusEnum value : values()) { + if (value.status.equals(status)) { + return value.msg; + } + } + return null; + } +} 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 b5d080279..f9c911e07 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 @@ -1,5 +1,7 @@ package com.cool.store.utils; +import com.cool.store.enums.tp.TpFormTypeEnum; + import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -15,16 +17,30 @@ public class TpHelper { private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); /** - * 生成惩处单号 + * 生成奖惩规则编码 + * @param isReward 是否为加分规则 + * @return 规则编码 */ - public static String generatePenaltyRuleCode() { - return "CC" + generateCode(); + public static String generateRuleNo(boolean isReward) { + return (isReward ? "JR" : "CR") + generateCode(); } + /** - * 生成加分单号 + * 生成积分流水号 */ - public static String generateRewardRuleCode() { - return "JF" + generateCode(); + public static String generateScoreJournalNo() { + return "LS" + generateCode(); + } + + /** + * 生成申请单号 + * @param applyType 单据类型 + * @return 申请单号 + */ + public static String generateApplyNo(Integer applyType) { + TpFormTypeEnum type = TpFormTypeEnum.getByType(applyType); + if (type == null) return null; + return (TpFormTypeEnum.REWARD.equals(type) ? "JF" : TpFormTypeEnum.PENALTY.equals(type) ? "CF" : "JG") + generateCode(); } private static String generateCode() { diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java index 65c3575c0..6e64fe69c 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java @@ -1,5 +1,6 @@ package com.cool.store.dao; +import cn.hutool.core.collection.CollStreamUtil; import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.StoreDO; import com.cool.store.mapper.StoreMapper; @@ -7,11 +8,12 @@ import com.cool.store.response.MiniShopsResponse; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; +import java.math.BigDecimal; +import java.util.*; @Repository public class StoreDao { @@ -30,6 +32,13 @@ public class StoreDao { return storeMapper.getByStoreId(storeId); } + public StoreDO getEffectiveByStoreId(String storeId) { + if(StringUtils.isBlank(storeId)) { + return null; + } + return storeMapper.getEffectiveByStoreId(storeId); + } + public List+ * 十二分制-申请单DAO + *
+ * + * @author wangff + * @since 2025/11/5 + */ +@Repository +@RequiredArgsConstructor +public class TpApplyFormDAO { + private final TpApplyFormMapper tpApplyFormMapper; + + /** + * 新增 + */ + public boolean insertSelective(TpApplyFormDO tpApplyFormDO) { + return tpApplyFormMapper.insertSelective(tpApplyFormDO) > 0; + } + + /** + * 编辑 + */ + public boolean updateSelective(TpApplyFormDO tpApplyFormDO) { + return tpApplyFormMapper.updateByPrimaryKeySelective(tpApplyFormDO) > 0; + } + + public boolean insertOrUpdate(TpApplyFormDO tpApplyFormDO) { + if (Objects.isNull(tpApplyFormDO.getId())) { + return tpApplyFormMapper.insertSelective(tpApplyFormDO) > 0; + } else { + return tpApplyFormMapper.updateByPrimaryKeySelective(tpApplyFormDO) > 0; + } + } + + /** + * 一个月内是否存在相同加分申请 + * @param storeId 门店id + * @param ruleId 规则id + * @return 是否存在 + */ + public boolean existPassRewardForm(String storeId, Long ruleId) { + Example example = new Example(TpApplyFormDO.class); + example.createCriteria() + .andEqualTo("type", 0) + .andEqualTo("storeId", storeId) + .andEqualTo("ruleId", ruleId) + .andEqualTo("status", TpFormStatusEnum.PASS.getStatus()) + .andGreaterThan("approveTime", LocalDate.now().minusMonths(1)); + return tpApplyFormMapper.selectCountByExample(example) > 0; + } + + /** + * 根据id查询 + */ + public TpApplyFormDO getById(Long id) { + return tpApplyFormMapper.selectByPrimaryKey(id); + } + + /** + * 查询有效记录列表 + * @param request 申请单查询Request + * @return 申请单列表 + */ + public List+ * 十二分制-审批记录DAO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Repository +@RequiredArgsConstructor +public class TpAuditRecordDAO { + private final TpAuditRecordMapper tpAuditRecordMapper; + + /** + * 新增提交记录 + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + * @param userId 申请人id + * @param userName 申请人名称 + */ + public void addSubmitRecord(Long applyId, Integer applyType, String userId, String userName) { + Date now = new Date(); + TpAuditRecordDO recordDO = TpAuditRecordDO.builder() + .applyType(applyType) + .applyId(applyId) + .recordType(1) + .auditStatus(1) + .handlerUserId(userId) + .handlerUserName(userName) + .receiveTaskTime(now) + .finishTaskTime(now) + .build(); + tpAuditRecordMapper.insertSelective(recordDO); + } + + /** + * 新增审批记录 + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + */ + public void addApproveRecord(Long applyId, Integer applyType) { + Date now = new Date(); + TpAuditRecordDO recordDO = TpAuditRecordDO.builder() + .applyType(applyType) + .applyId(applyId) + .recordType(2) + .auditStatus(0) + .receiveTaskTime(now) + .finishTaskTime(now) + .build(); + tpAuditRecordMapper.insertSelective(recordDO); + } + + /** + * 首次发起流程 + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + * @param userId 申请人id + * @param userName 申请人名称 + */ + public void addRecord(Long applyId, Integer applyType, String userId, String userName) { + addSubmitRecord(applyId, applyType, userId, userName); + addApproveRecord(applyId, applyType); + } + + /** + * 根据申请单id查询待审批记录 + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + * @return 审批记录 + */ + public TpAuditRecordDO getPendingRecordByApplyId(Long applyId, Integer applyType) { + TpAuditRecordDO recordDO = TpAuditRecordDO.builder() + .applyId(applyId) + .applyType(applyType) + .auditStatus(0) + .build(); + return tpAuditRecordMapper.selectOne(recordDO); + } + + /** + * 根据申请单id审批待处理的审批记录 + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + * @param userId 审批人id + * @param userName 审批人名称 + * @param auditStatus 审批状态 + * @param remark 备注 + * @param auditTime 审批时间 + */ + public void auditPendingRecordByApplyId(Long applyId, Integer applyType, String userId, String userName, Integer auditStatus, String remark, Date auditTime) { + TpAuditRecordDO auditRecordDO = getPendingRecordByApplyId(applyId, applyType); + if (Objects.isNull(auditRecordDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_PENDING_AUDIT); + } + auditRecordDO.setAuditStatus(auditStatus); + auditRecordDO.setRemark(remark); + auditRecordDO.setHandlerUserId(userId); + auditRecordDO.setHandlerUserName(userName); + auditRecordDO.setFinishTaskTime(auditTime); + updateKeySelective(auditRecordDO); + } + + /** + * 编辑 + */ + public void updateKeySelective(TpAuditRecordDO recordDO) { + tpAuditRecordMapper.updateByPrimaryKeySelective(recordDO); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java index 8c9c16cd0..7288c83f5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java @@ -1,5 +1,6 @@ package com.cool.store.dao.tp; +import cn.hutool.core.collection.CollStreamUtil; import com.cool.store.entity.tp.TpRuleDO; import com.cool.store.mapper.tp.TpRuleMapper; import com.cool.store.request.tp.TpRuleQueryRequest; @@ -9,7 +10,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; /** diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java new file mode 100644 index 000000000..db2ff465f --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java @@ -0,0 +1,27 @@ +package com.cool.store.dao.tp; + +import com.cool.store.entity.tp.TpScoreJournalDO; +import com.cool.store.mapper.tp.TpScoreJournalMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +/** + *+ * 十二分制-积分流水DAO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Repository +@RequiredArgsConstructor +public class TpScoreJournalDAO { + private final TpScoreJournalMapper tpScoreJournalMapper; + + /** + * 新增 + */ + public void insertSelective(TpScoreJournalDO record) { + tpScoreJournalMapper.insertSelective(record); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java index 25adad05a..fef08b58a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java @@ -7,6 +7,7 @@ import com.cool.store.response.MiniShopsResponse; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; import java.util.List; @Mapper @@ -14,7 +15,11 @@ public interface StoreMapper { StoreDO getByStoreId(@Param("storeId") String storeId); + StoreDO getEffectiveByStoreId(@Param("storeId") String storeId); + List+ * 申请单审批Request + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyAuditRequest { + @ApiModelProperty("申请单id") + @NotNull(message = "申请单id不能为空") + private Long applyId; + + @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书", hidden = true) + private Integer applyType; + + @ApiModelProperty("审批状态 1通过 2拒绝") + @NotNull(message = "审批状态不能为空") + private Integer auditStatus; + + @ApiModelProperty("备注") + private String remark; +} 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 new file mode 100644 index 000000000..e832e6aff --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -0,0 +1,45 @@ +package com.cool.store.request.tp; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *+ * 申请单查询Request + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyQueryRequest extends PageBasicInfo { + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店名称或编码") + private String storeNameOrNum; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("规则id") + private String ruleId; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书") + private Integer type; + + @ApiModelProperty("缴款状态,0未缴费 1无需缴费 2已缴费") + private Integer payStatus; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty(value = "是惩处单", hidden = true) + private Boolean isPenalty; +} 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 new file mode 100644 index 000000000..51d46dea4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java @@ -0,0 +1,49 @@ +package com.cool.store.request.tp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *+ * 奖惩申请Request + *
+ * + * @author wangff + * @since 2025/11/5 + */ +@Data +public class TpApplyRequest { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("门店id") + @NotNull(message = "门店id不能为空") + private String storeId; + + @ApiModelProperty("规则id") + @NotNull(message = "规则id不能为空") + private Long ruleId; + + @ApiModelProperty("备注") + private String remark; + + @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("证明图片列表,逗号隔开") + @NotBlank(message = "证明图片列表不能为空") + private String proofUrls; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java index 4156d59ed..841a395d7 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java @@ -42,7 +42,7 @@ public class TpPenaltyRuleUpdateRequest { @ApiModelProperty("扣分值") @NotNull(message = "扣分值不能为空", groups = {InsertGroup.class, UpdateGroup.class}) - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") @NotNull(message = "罚款金额不能为空", groups = {InsertGroup.class, UpdateGroup.class}) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java index ab91fc2fb..d80023ff9 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java @@ -37,7 +37,7 @@ public class TpRewardRuleUpdateRequest { private Integer isFull; @ApiModelProperty("加分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("启用状态,0未启用 1启用") @NotNull(message = "启用状态不能为空", groups = {InsertGroup.class, UpdateGroup.class}) 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 new file mode 100644 index 000000000..e9b102144 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java @@ -0,0 +1,83 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *+ * 申请表单列表基础VO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyListBaseVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("规则编码") + private String ruleNo; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("审批人") + private String approveUserId; + + @ApiModelProperty("审批人名称") + private String approveUserName; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("申请人名称") + private String applyUserName; + + @ApiModelProperty("申请时间") + private Date createTime; + + @ApiModelProperty("审核时间") + private Date approveTime; + + public String getStatusName() { + return TpFormStatusEnum.getMsgByStatus(this.status); + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java new file mode 100644 index 000000000..0e81ab8d2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java @@ -0,0 +1,79 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *+ * 惩处申请详情VO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpPenaltyApplyDetailVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("单据类型") + private Integer type; + + @ApiModelProperty("单据类型名称") + private String typeName; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("申请复议截止日期") + private LocalDate appealEndDate; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("状态") + private String status; + + public String getTypeName() { + return TpFormTypeEnum.getMsgByType(this.type); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java new file mode 100644 index 000000000..b71ac95f4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java @@ -0,0 +1,47 @@ +package com.cool.store.vo.tp; + +import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.enums.tp.TpPayStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *+ * 惩处申请单列表VO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpPenaltyApplyListVO extends TpApplyListBaseVO { + + @ApiModelProperty("单据类型") + private Integer type; + + @ApiModelProperty("单据类型名称") + private String typeName; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("申请复议截止日期") + private LocalDate appealEndDate; + + @ApiModelProperty("缴费状态") + private Integer payStatus; + + @ApiModelProperty("缴费状态名称") + private String payStatusName; + + public String getTypeName() { + return TpFormTypeEnum.getMsgByType(this.type); + } + + public String getPayStatusName() { + return TpPayStatusEnum.getMsgByStatus(this.payStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java index 4d955d746..b6ba3b59c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java @@ -20,7 +20,7 @@ public class TpPenaltyRuleDetailVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("问题分类") private String problemClassification; @@ -43,7 +43,7 @@ public class TpPenaltyRuleDetailVO { private Integer warningLimit; @ApiModelProperty("扣分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") private BigDecimal amount; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java index 2b0c22079..b840d179a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java @@ -20,7 +20,7 @@ public class TpPenaltyRuleListVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("问题分类") private String problemClassification; @@ -43,7 +43,7 @@ public class TpPenaltyRuleListVO { private Integer warningLimit; @ApiModelProperty("扣分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") private BigDecimal amount; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java new file mode 100644 index 000000000..012ab680e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java @@ -0,0 +1,64 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *+ * 加分申请详情VO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpRewardApplyDetailVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("是否加满") + private Integer isFull; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("状态") + private String status; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java new file mode 100644 index 000000000..cafe4c86b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java @@ -0,0 +1,16 @@ +package com.cool.store.vo.tp; + +import lombok.Data; + +/** + *+ * 加分申请单列表VO + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpRewardApplyListVO extends TpApplyListBaseVO { + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java index a0c21da2d..115e1e2cd 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java @@ -20,7 +20,7 @@ public class TpRewardRuleDetailVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("项目大类") private String projectCategory; @@ -36,7 +36,7 @@ public class TpRewardRuleDetailVO { private Integer isFull; @ApiModelProperty("加分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("启用状态,0未启用 1启用") private Integer status; 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 new file mode 100644 index 000000000..b37851678 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -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; + +/** + *+ * 十二分制-申请单 服务类 + *
+ * + * @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+ * 十二分制-申请单 服务实现类 + *
+ * + * @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+ * 十二分制-申请单 前端控制器 + *
+ * + * @author wangff + * @since 2025/11/6 + */ +@Api(tags = "十二分制-奖惩规则") +@RestController +@RequestMapping("/pc/tp/apply") +@RequiredArgsConstructor +public class TpApplyController { + private final TpApplyService tpApplyService; + + @ApiOperation("加分申请提交or保存") + @PostMapping("/rewardApplySubmit") + public ResponseResult