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 b3d42bd84..0c9b00c83 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
@@ -493,6 +493,13 @@ public enum ErrorCodeEnum {
CLOSE_UP_CLOSED_AUDIT_NOT_PASS(1840008, "歇业申请未通过", null),
CLOSE_UP_EXIST_OPEN_APPLY(1840009, "该歇业申请单已存在开业申请", null),
CLOSE_UP_APPROVED(1840010, "该申请单已审批", null),
+
+ BONUS_EXIST_OVERLAP_RULE(1850000, "门店该有效期范围内存在相同类型的启用规则", null),
+ BONUS_RULE_NOT_EXIST(1850001, "不存在该奖金发放规则", null),
+ BONUS_RULE_NOT_CONFIG(1850002, "奖金规则或分配规则未配置", null),
+ BONUS_DISTRIBUTE_RATIO_OVER_100(1850003, "分配规则员工比例之和大于100", null),
+ BONUS_PRODUCT_CONFIG_DUPLICATE(1850004, "奖金规则配置存在重复菜品", null),
+ BONUS_RULE_CONFIG_ERROR(1850005, "规则配置异常", null),
;
diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/StoreOpenSigner.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/StoreOpenSigner.java
new file mode 100644
index 000000000..da08476f9
--- /dev/null
+++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/StoreOpenSigner.java
@@ -0,0 +1,78 @@
+package com.cool.store.utils;
+
+import java.nio.charset.StandardCharsets;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.SecureRandom;
+
+/**
+ * 门店开放数据签名工具类
+ *
+ * @author wangff
+ * @since 2026/4/20
+ */
+public class StoreOpenSigner {
+
+ private static final SecureRandom RANDOM = new SecureRandom();
+
+ /**
+ * 构建签名串
+ *
+ * @param method HTTP方法,如POST
+ * @param requestPath 请求路径,如/open/v1/store/monthRevenue
+ * @param rawJsonBody 原始JSON请求体
+ * @param signTime 签名时间戳
+ * @param signRandom 随机串
+ * @return 签名串
+ */
+ public static String buildSigningString(String method, String requestPath, String rawJsonBody,
+ String signTime, String signRandom) {
+ return method + "&" + requestPath + "&" + rawJsonBody + "&" + signTime + "&" + signRandom;
+ }
+
+ /**
+ * HMAC-SHA256签名,返回小写十六进制字符串
+ *
+ * @param signingString 签名串
+ * @param secret 密钥
+ * @return 签名结果
+ */
+ public static String sign(String signingString, String secret) {
+ try {
+ Mac mac = Mac.getInstance("HmacSHA256");
+ mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
+ byte[] digest = mac.doFinal(signingString.getBytes(StandardCharsets.UTF_8));
+ StringBuilder sb = new StringBuilder(digest.length * 2);
+ for (byte b : digest) {
+ sb.append(String.format("%02x", b));
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ throw new RuntimeException("签名失败", e);
+ }
+ }
+
+ /**
+ * 生成随机串
+ *
+ * @param length 随机串长度
+ * @return 随机串
+ */
+ public static String generateRandom(int length) {
+ String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ StringBuilder sb = new StringBuilder(length);
+ for (int i = 0; i < length; i++) {
+ sb.append(chars.charAt(RANDOM.nextInt(chars.length())));
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 生成签名时间戳(秒)
+ *
+ * @return Unix秒时间戳字符串
+ */
+ public static String generateSignTime() {
+ return String.valueOf(System.currentTimeMillis() / 1000);
+ }
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusDistributionRuleDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusDistributionRuleDAO.java
new file mode 100644
index 000000000..cb7b484e7
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusDistributionRuleDAO.java
@@ -0,0 +1,61 @@
+package com.cool.store.dao.bonus;
+
+import com.cool.store.entity.bonus.BonusDistributionRuleDO;
+import com.cool.store.mapper.bonus.BonusDistributionRuleMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 奖金发放规则DAO
+ *
+ *
+ * @author wangff
+ * @since 2026/4/20
+ */
+@Repository
+@RequiredArgsConstructor
+public class BonusDistributionRuleDAO {
+ private final BonusDistributionRuleMapper bonusDistributionRuleMapper;
+
+ public boolean addRule(BonusDistributionRuleDO ruleDO) {
+ return bonusDistributionRuleMapper.insertSelective(ruleDO) > 0;
+ }
+
+ /**
+ * 门店下相同规则类型的启用规则生效期间有无交集
+ * @param storeId 门店id
+ * @param type 规则类型
+ * @param startDate 开始有效日期
+ * @param endDate 结束有效日期
+ * @return 是否存在
+ */
+ public boolean existOverlap(String storeId, Integer type, Date startDate, Date endDate) {
+ return bonusDistributionRuleMapper.existOverlap(storeId, type, startDate, endDate) > 0;
+ }
+
+ public BonusDistributionRuleDO getById(Long id) {
+ return bonusDistributionRuleMapper.selectByPrimaryKey(id);
+ }
+
+ public boolean updateByPrimaryKeySelective(BonusDistributionRuleDO ruleDO) {
+ return bonusDistributionRuleMapper.updateByPrimaryKeySelective(ruleDO) > 0;
+ }
+
+ public List getList(String storeNumOrName, Integer type, Integer enable, String storeId) {
+ return bonusDistributionRuleMapper.getList(storeNumOrName, type, enable, storeId);
+ }
+
+ /**
+ * 获取指定类型和生效月份的启用规则列表
+ * @param type 规则类型
+ * @param payMonth 发放月份 yyyy-MM
+ * @return 规则列表
+ */
+ public List getEnabledRulesByTypeAndMonth(Integer type, String payMonth) {
+ return bonusDistributionRuleMapper.selectEnabledRulesByTypeAndMonth(type, payMonth);
+ }
+}
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusEmployeeRewardDetailDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusEmployeeRewardDetailDAO.java
new file mode 100644
index 000000000..d62e0e695
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusEmployeeRewardDetailDAO.java
@@ -0,0 +1,37 @@
+package com.cool.store.dao.bonus;
+
+import com.alibaba.excel.util.CollectionUtils;
+import com.cool.store.entity.bonus.BonusEmployeeRewardDetailDO;
+import com.cool.store.mapper.bonus.BonusEmployeeRewardDetailMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 员工奖励明细DAO
+ *
+ * @author wangff
+ * @since 2026/4/21
+ */
+@Repository
+@RequiredArgsConstructor
+public class BonusEmployeeRewardDetailDAO {
+ private final BonusEmployeeRewardDetailMapper mapper;
+
+ public int insert(BonusEmployeeRewardDetailDO entity) {
+ return mapper.insertSelective(entity);
+ }
+
+ public int insertOrUpdateBatch(List list) {
+ if (CollectionUtils.isEmpty(list)) {
+ return 0;
+ }
+ return mapper.insertOrUpdateBatch(list);
+ }
+
+ public List selectListByCondition(String storeNumOrName, Date startDate, Date endDate, String rewardUserName, String storeId) {
+ return mapper.selectListByCondition(storeNumOrName, startDate, endDate, rewardUserName, storeId);
+ }
+}
\ No newline at end of file
diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusNewProductEmployeeDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusNewProductEmployeeDAO.java
new file mode 100644
index 000000000..4c3e4fce4
--- /dev/null
+++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/bonus/BonusNewProductEmployeeDAO.java
@@ -0,0 +1,82 @@
+package com.cool.store.dao.bonus;
+
+import cn.hutool.core.collection.CollStreamUtil;
+import com.cool.store.entity.bonus.BonusNewProductEmployeeDO;
+import com.cool.store.mapper.bonus.BonusNewProductEmployeeMapper;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Repository;
+import tk.mybatis.mapper.entity.Example;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 新品销售奖金-员工DAO
+ *
+ * @author wangff
+ * @since 2026/4/21
+ */
+@Repository
+@RequiredArgsConstructor
+public class BonusNewProductEmployeeDAO {
+ private final BonusNewProductEmployeeMapper mapper;
+
+ public int insert(BonusNewProductEmployeeDO entity) {
+ return mapper.insertSelective(entity);
+ }
+
+ public int insertBatch(List list) {
+ if (CollectionUtils.isEmpty(list)) {
+ return 0;
+ }
+ return mapper.insertBatch(list);
+ }
+
+ /**
+ * 月度奖金统计
+ * @param storeId 门店id
+ * @param payDate 发放年月
+ * @param userIds 用户id列表
+ * @return 实体列表
+ */
+ public Map getMonthlyStatistics(String storeId, String payDate, List userIds) {
+ List