From d5a96c3122c136d4b0c585d08e61b42e8a123743 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Mon, 03 Apr 2023 00:26:52 +0800
Subject: [PATCH] 按照商品的来设置补贴额度的系数

---
 src/main/java/cc/mrbird/febs/mall/mapper/MallScoreRecordMapper.java                     |   23 
 src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java                  |   77 ++
 src/test/java/cc/mrbird/febs/ProfitTest.java                                            |    6 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java         |   22 
 src/main/java/cc/mrbird/febs/mall/dto/AdminRoleReleaseDto.java                          |   11 
 src/main/java/cc/mrbird/febs/mall/mapper/MallScoreAchieveReleaseMapper.java             |   16 
 src/main/resources/templates/febs/views/modules/mallMember/voucherUpdate.html           |   91 ++
 src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java          |   89 ++
 src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java                   |   27 
 src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java                 |   52 +
 src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html |   55 +
 src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java                   |    2 
 src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java                  |   21 
 src/main/resources/templates/febs/views/modules/system/hlmVoucherSet.html               |  142 ++++
 src/main/java/cc/mrbird/febs/common/enumerates/GreenScoreEnum.java                      |   59 +
 src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveRelease.html     |  107 +++
 src/main/resources/mapper/modules/MallAchieveRecordMapper.xml                           |    7 
 src/test/java/cc/mrbird/febs/AgentTest.java                                             |    2 
 src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java                             |    7 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java                          |    8 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java                    |    6 
 src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java             |   60 +
 src/main/resources/mapper/modules/MallMemberMapper.xml                                  |   14 
 src/main/resources/templates/febs/views/modules/mallMember/scoreRoleRelease.html        |  123 +++
 src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java                          |   10 
 src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java                     |    4 
 src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html          |   60 +
 src/main/java/cc/mrbird/febs/mall/entity/MallMember.java                                |   20 
 src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java              |   65 ++
 src/main/resources/mapper/modules/MallMemberWalletMapper.xml                            |   17 
 src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java             |  301 +++++++++
 src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java                                 |   19 
 src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java                        |    6 
 src/main/java/cc/mrbird/febs/mall/entity/MallScoreRecord.java                           |   39 +
 src/main/resources/templates/febs/views/modules/system/hlmVoucherButton.html            |   74 ++
 src/main/java/cc/mrbird/febs/mall/entity/MallScoreAchieveRelease.java                   |   31 +
 src/main/resources/mapper/modules/MallScoreRecordMapper.xml                             |   44 +
 src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml                     |   24 
 src/main/resources/templates/febs/views/modules/mallMember/scoreRoleReleaseList.html    |   39 +
 src/main/java/cc/mrbird/febs/mall/dto/HlmVoucherSetDto.java                             |   46 +
 40 files changed, 1,801 insertions(+), 25 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java
index 47c6edc..d3fea93 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java
@@ -33,7 +33,11 @@
     /**
      * 补贴额度
      */
-    TOTAL_SCORE(6);
+    TOTAL_SCORE(6),
+    /**
+     * 凭证数量
+     */
+    VOUCHER_CNT(7);
 
     private final int value;
 
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/GreenScoreEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/GreenScoreEnum.java
new file mode 100644
index 0000000..dd625f3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/GreenScoreEnum.java
@@ -0,0 +1,59 @@
+package cc.mrbird.febs.common.enumerates;
+
+import lombok.Getter;
+
+/**
+ * 绿色积分
+ */
+@Getter
+public enum GreenScoreEnum {
+    /**
+     * 绿色凭证价格
+     */
+    SCORE_PRICE("GREEN_SCORE", "SCORE_PRICE"),
+    /**
+     * 业绩产生凭证给星级的比例
+     */
+    LEVEL_ACHIEVE_PERCENT("GREEN_SCORE", "LEVEL_ACHIEVE_PERCENT"),
+    /**
+     * 业绩产生凭证给贡献点的比例
+     */
+    STAR_ACHIEVE_PERCENT("GREEN_SCORE", "STAR_ACHIEVE_PERCENT"),
+    /**
+     * 业绩产生凭证给创世的比例
+     */
+    ROLE_ACHIEVE_PERCENT("GREEN_SCORE", "ROLE_ACHIEVE_PERCENT"),
+    /**
+     * 业绩的最小值
+     */
+    ACHIEVE_MIN("GREEN_SCORE", "ACHIEVE_MIN"),
+    /**
+     * 业绩的最大值
+     */
+    ACHIEVE_MAX("GREEN_SCORE", "ACHIEVE_MAX"),
+    /**
+     * 产生业绩的释放积分比例(万分之几)
+     */
+    ACHIEVE_RELEASE_PERCENT("GREEN_SCORE", "ACHIEVE_RELEASE_PERCENT"),
+    /**
+     * 创始角色的每日释放积分比例(千分之几)
+     */
+    ROLE_RELEASE_PERCENT("GREEN_SCORE", "ROLE_RELEASE_PERCENT"),
+    /**
+     * 绿色积分剩余数量
+     */
+    SURPLUS_CNT("GREEN_SCORE", "SURPLUS_CNT"),
+    /**
+     * 绿色积分总数
+     */
+    TOTAL_CNT("GREEN_SCORE", "TOTAL_CNT");
+
+    private String type;
+
+    private String code;
+
+    GreenScoreEnum(String type, String code) {
+        this.type = type;
+        this.code = code;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
index 48f1881..27d0fdf 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -153,7 +153,32 @@
     /**
      * 代理商补贴
      */
-    AGENT_PERK(30);
+    AGENT_PERK(30),
+
+    /**
+     * 联创合伙人释放凭证
+     */
+    ROLE_RELEASE_SCORE(31),
+
+    /**
+     * 业绩释放联创凭证
+     */
+    ACHIEVE_RELEASE_SCORE_LC(32),
+
+    /**
+     * 业绩释放合伙人凭证
+     */
+    ACHIEVE_RELEASE_SCORE_HHR(33),
+
+    /**
+     * 业绩释放贡献点凭证
+     */
+    ACHIEVE_RELEASE_SCORE_GXD(34),
+
+    /**
+     * 业绩释放星级凭证
+     */
+    ACHIEVE_RELEASE_SCORE_XJ(35);
 
     private final int value;
 
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
index a683d78..dbd1b5e 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -117,6 +117,16 @@
     }
 
     /**
+     * 会员列表-系统拨付绿色凭证
+     */
+    @PostMapping("updateVoucher")
+    @ControllerEndpoint(operation = "会员列表-系统拨付绿色凭证", exceptionMessage = "操作失败")
+    public FebsResponse updateVoucher(@Valid MallSystemPayDto mallSystemPayDto) {
+//        return mallMemberService.updateSystemPay(mallSystemPayDto);
+        return mallMemberService.updateVoucher(mallSystemPayDto);
+    }
+
+    /**
      * 会员列表-详情更新
      */
     @PostMapping("updateMemberInfo")
@@ -374,4 +384,54 @@
         return new FebsResponse().success();
     }
 
+    /**
+     * 创世释放记录-列表
+     * @param roleReleaseDto
+     * @param request
+     * @return
+     */
+    @GetMapping("gerRoleRelease")
+    public FebsResponse gerRoleRelease(AdminRoleReleaseDto roleReleaseDto, QueryRequest request) {
+        Map<String, Object> data = getDataTable(mallMemberService.gerRoleReleaseList(roleReleaseDto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 创世释放记录-全部记录
+     */
+    @GetMapping("/roleReleaseChild")
+    public FebsResponse roleReleaseChild(QueryRequest request, MallScoreRecord mallScoreRecord, Integer parentId) {
+        if (parentId == null) {
+            ViewMallMemberController.idFromScoreRoleRelease = 0;
+        }
+        mallScoreRecord.setId(ViewMallMemberController.idFromScoreRoleRelease);
+        Map<String, Object> dataTable = getDataTable(mallMemberService.roleReleaseChild(request, mallScoreRecord));
+        return new FebsResponse().success().data(dataTable);
+    }
+
+    /**
+     * 业绩释放记录-列表
+     * @param roleReleaseDto
+     * @param request
+     * @return
+     */
+    @GetMapping("gerAchieveRelease")
+    public FebsResponse gerAchieveRelease(AdminRoleReleaseDto roleReleaseDto, QueryRequest request) {
+        Map<String, Object> data = getDataTable(mallMemberService.gerAchieveReleaseList(roleReleaseDto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 业绩释放记录-全部记录
+     */
+    @GetMapping("/achieveReleaseChild")
+    public FebsResponse achieveReleaseChild(QueryRequest request, MallScoreAchieveRelease mallScoreAchieveRelease, Integer parentId) {
+        if (parentId == null) {
+            ViewMallMemberController.idFromScoreAchieveRelease = 0;
+        }
+        mallScoreAchieveRelease.setId(ViewMallMemberController.idFromScoreAchieveRelease);
+        Map<String, Object> dataTable = getDataTable(mallMemberService.achieveReleaseChild(request, mallScoreAchieveRelease));
+        return new FebsResponse().success().data(dataTable);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java
index 92a3cb7..2b18daa 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java
@@ -2,10 +2,8 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
-import cc.mrbird.febs.mall.dto.CashOutSettingDto;
-import cc.mrbird.febs.mall.dto.HlmBasicPerkDto;
-import cc.mrbird.febs.mall.dto.HlmScoreSetDto;
-import cc.mrbird.febs.mall.dto.ScorePoorDto;
+import cc.mrbird.febs.common.enumerates.GreenScoreEnum;
+import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.service.ICommonService;
 import cc.mrbird.febs.mall.service.ISystemService;
 import lombok.RequiredArgsConstructor;
@@ -17,6 +15,7 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.util.Map;
 
 @Slf4j
@@ -102,4 +101,49 @@
                 hlmBasicPerkDto.getAgentPerk());
         return new FebsResponse().success();
     }
+
+    @PostMapping(value = "/hlmVoucherSet")
+    public FebsResponse hlmVoucherSet(HlmVoucherSetDto hlmVoucherSetDto) {
+        BigDecimal roleReleasePercent = new BigDecimal(hlmVoucherSetDto.getRoleReleasePercent());
+        if(roleReleasePercent.compareTo(BigDecimal.ZERO) <= 0
+        || roleReleasePercent.compareTo(new BigDecimal(1000)) >= 0){
+            return new FebsResponse().fail().message("请输入合理的比例");
+        }
+
+        commonService.updateDataDic(
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getCode(),
+                hlmVoucherSetDto.getRoleReleasePercent());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getCode(),
+                hlmVoucherSetDto.getAchieveReleasePercent());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.ACHIEVE_MAX.getType(),
+                GreenScoreEnum.ACHIEVE_MAX.getCode(),
+                hlmVoucherSetDto.getAchieveMax());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.ACHIEVE_MIN.getType(),
+                GreenScoreEnum.ACHIEVE_MIN.getCode(),
+                hlmVoucherSetDto.getAchieveMin());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getCode(),
+                hlmVoucherSetDto.getRoleAchievePercent());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getCode(),
+                hlmVoucherSetDto.getStarAchievePercent());
+
+        commonService.updateDataDic(
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getCode(),
+                hlmVoucherSetDto.getLevelAchievePercent());
+        return new FebsResponse().success();
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
index b0e2688..767c777 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
@@ -28,6 +28,10 @@
 
     public static long idFromAgentAllMember;
 
+    public static long idFromScoreRoleRelease;
+
+    public static long idFromScoreAchieveRelease;
+
     /**
      * 平台账单
      * @return
@@ -85,6 +89,21 @@
         model.addAttribute("systemPay", data);
         model.addAttribute("type", type);
         return FebsUtil.view("modules/mallMember/mallSystemPay");
+    }
+
+    /**
+     * 会员列表-系统拨付绿色凭证
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("voucherUpdate/{type}/{id}")
+    @RequiresPermissions("voucherUpdate:update")
+    public String voucherUpdate(@PathVariable long id, @PathVariable Integer type, Model model) {
+        MallMemberVo data = mallMemberService.getMallMemberInfoById(id);
+        model.addAttribute("systemPay", data);
+        model.addAttribute("type", type);
+        return FebsUtil.view("modules/mallMember/voucherUpdate");
     }
 
     /**
@@ -304,6 +323,52 @@
     }
 
 
+    /**
+     * 创世释放记录-列表
+     * @return
+     */
+    @GetMapping("scoreRoleRelease")
+    @RequiresPermissions("scoreRoleRelease:view")
+    public String scoreRoleRelease() {
+        return FebsUtil.view("modules/mallMember/scoreRoleRelease");
+    }
+
+    /**
+     * 创世释放记录-全部记录
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("scoreRoleReleaseList/{id}")
+    public String scoreRoleReleaseList(@PathVariable long id, Model model) {
+        idFromScoreRoleRelease = id;
+        return FebsUtil.view("modules/mallMember/scoreRoleReleaseList");
+    }
+
+
+    /**
+     * 业绩释放记录-列表
+     * @return
+     */
+    @GetMapping("scoreAchieveRelease")
+    @RequiresPermissions("scoreAchieveRelease:view")
+    public String scoreAchieveRelease() {
+        return FebsUtil.view("modules/mallMember/scoreAchieveRelease");
+    }
+
+    /**
+     * 业绩释放记录-全部记录
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("scoreAchieveReleaseList/{id}")
+    public String scoreAchieveReleaseList(@PathVariable long id, Model model) {
+        idFromScoreAchieveRelease = id;
+        return FebsUtil.view("modules/mallMember/scoreAchieveReleaseList");
+    }
+
+
 
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
index 30abf20..796674d 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsConstant;
 import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
 import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
+import cc.mrbird.febs.common.enumerates.GreenScoreEnum;
 import cc.mrbird.febs.common.enumerates.OrderPayMethodEnum;
 import cc.mrbird.febs.common.service.ValidateCodeService;
 import cc.mrbird.febs.common.utils.FebsUtil;
@@ -217,4 +218,80 @@
         model.addAttribute("hlmBasicPerk", hlmBasicPerkDto);
         return FebsUtil.view("modules/system/hlmBasicPerk");
     }
+
+    /**
+     * 积分凭证设置
+     * @param model
+     * @return
+     */
+    @GetMapping("hlmVoucherSet")
+    @RequiresPermissions("hlmVoucherSet:view")
+    public String hlmVoucherSet(Model model) {
+        HlmVoucherSetDto hlmVoucherSetDto = new HlmVoucherSetDto();
+        DataDictionaryCustom totalCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.TOTAL_CNT.getType(),
+                GreenScoreEnum.TOTAL_CNT.getCode());
+        if (totalCntDic != null) {
+            String totalCnt = ObjectUtil.isEmpty(totalCntDic.getValue()) ? "0" : totalCntDic.getValue();
+            hlmVoucherSetDto.setTotalCnt(totalCnt);
+        }
+        DataDictionaryCustom surplusCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.SURPLUS_CNT.getType(),
+                GreenScoreEnum.SURPLUS_CNT.getCode());
+        if (surplusCntDic != null) {
+            String surplusCnt = ObjectUtil.isEmpty(surplusCntDic.getValue()) ? "0" : surplusCntDic.getValue();
+            hlmVoucherSetDto.setSurplusCnt(surplusCnt);
+        }
+        DataDictionaryCustom roleReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getCode());
+        if (roleReleasePercentDic != null) {
+            String roleReleasePercent = ObjectUtil.isEmpty(roleReleasePercentDic.getValue()) ? "0" : roleReleasePercentDic.getValue();
+            hlmVoucherSetDto.setRoleReleasePercent(roleReleasePercent);
+        }
+        DataDictionaryCustom achieveReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getCode());
+        if (achieveReleasePercentDic != null) {
+            String achieveReleasePercent = ObjectUtil.isEmpty(achieveReleasePercentDic.getValue()) ? "0" : achieveReleasePercentDic.getValue();
+            hlmVoucherSetDto.setAchieveReleasePercent(achieveReleasePercent);
+        }
+        DataDictionaryCustom achieveMaxDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_MAX.getType(),
+                GreenScoreEnum.ACHIEVE_MAX.getCode());
+        if (achieveMaxDic != null) {
+            String achieveMax = ObjectUtil.isEmpty(achieveMaxDic.getValue()) ? "0" : achieveMaxDic.getValue();
+            hlmVoucherSetDto.setAchieveMax(achieveMax);
+        }
+        DataDictionaryCustom achieveMinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_MIN.getType(),
+                GreenScoreEnum.ACHIEVE_MIN.getCode());
+        if (achieveMinDic != null) {
+            String achieveMin = ObjectUtil.isEmpty(achieveMinDic.getValue()) ? "0" : achieveMinDic.getValue();
+            hlmVoucherSetDto.setAchieveMin(achieveMin);
+        }
+        DataDictionaryCustom roleAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getCode());
+        if (roleAchievePercentDic != null) {
+            String roleAchievePercent = ObjectUtil.isEmpty(roleAchievePercentDic.getValue()) ? "0" : roleAchievePercentDic.getValue();
+            hlmVoucherSetDto.setRoleAchievePercent(roleAchievePercent);
+        }
+        DataDictionaryCustom starAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getCode());
+        if (starAchievePercentDic != null) {
+            String starAchievePercent = ObjectUtil.isEmpty(starAchievePercentDic.getValue()) ? "0" : starAchievePercentDic.getValue();
+            hlmVoucherSetDto.setStarAchievePercent(starAchievePercent);
+        }
+        DataDictionaryCustom levelAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getCode());
+        if (levelAchievePercentDic != null) {
+            String levelAchievePercent = ObjectUtil.isEmpty(levelAchievePercentDic.getValue()) ? "0" : levelAchievePercentDic.getValue();
+            hlmVoucherSetDto.setLevelAchievePercent(levelAchievePercent);
+        }
+        model.addAttribute("hlmVoucherSetDto", hlmVoucherSetDto);
+        return FebsUtil.view("modules/system/hlmVoucherSet");
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AdminRoleReleaseDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AdminRoleReleaseDto.java
new file mode 100644
index 0000000..b0d8c66
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AdminRoleReleaseDto.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.mall.dto;
+
+import lombok.Data;
+
+@Data
+public class AdminRoleReleaseDto {
+
+    private String name;
+
+    private String account;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/HlmVoucherSetDto.java b/src/main/java/cc/mrbird/febs/mall/dto/HlmVoucherSetDto.java
new file mode 100644
index 0000000..45cb50c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/HlmVoucherSetDto.java
@@ -0,0 +1,46 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "HlmVoucherSetDto", description = "绿色凭证设置")
+public class HlmVoucherSetDto {
+    /**
+     * 绿色积分总数
+     */
+    private String totalCnt;
+    /**
+     * 绿色积分剩余数量
+     */
+    private String surplusCnt;
+    /**
+     * 创始角色的每日释放积分比例(千分之几)
+     */
+    private String roleReleasePercent;
+    /**
+     * 业绩最大值
+     */
+    private String achieveMax;
+    /**
+     * 业绩最小值
+     */
+    private String achieveMin;
+    /**
+     * 每日总释放积分凭证比例(万分之几)
+     */
+    private String achieveReleasePercent;
+    /**
+     * 业绩积分凭证每日释放联创、合伙人的比例
+     */
+    private String roleAchievePercent;
+    /**
+     * 业绩积分凭证按贡献点比例
+     */
+    private String starAchievePercent;
+    /**
+     * 业绩积分凭证按用户星级比例
+     */
+    private String levelAchievePercent;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
index f349c52..3010f79 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -138,4 +138,24 @@
      */
     private Integer storeMaster;
 
+    /**
+     * 联创  1-是 2-否
+     */
+    private Integer creater;
+
+    /**
+     * 合伙人 1-是 2-否
+     */
+    private Integer partner;
+    /**
+     * 绿色凭证
+     */
+    @TableField(exist = false)
+    private BigDecimal voucherCnt;
+    /**
+     * 凭证现金
+     */
+    @TableField(exist = false)
+    private BigDecimal voucherAmount;
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
index cd46097..bf21ddc 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
@@ -48,4 +48,14 @@
      * 贡献点
      */
     private Integer star;
+
+    /**
+     * 凭证数量
+     */
+    private BigDecimal voucherCnt;
+
+    /**
+     * 凭证金额
+     */
+    private BigDecimal voucherAmount;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
index 5d43427..5b05c03 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -1,6 +1,7 @@
 package cc.mrbird.febs.mall.entity;
 
 import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -46,4 +47,10 @@
      * 流水类型 1-余额 2-赠送积分 3-竞猜积分 4-佣金
      */
     private Integer flowType;
+
+    @TableField(exist = false)
+    private String name;
+
+    @TableField(exist = false)
+    private String phone;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallScoreAchieveRelease.java b/src/main/java/cc/mrbird/febs/mall/entity/MallScoreAchieveRelease.java
new file mode 100644
index 0000000..75ba2d7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallScoreAchieveRelease.java
@@ -0,0 +1,31 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 业绩释放凭证记录
+ */
+@Data
+@TableName("mall_score_achieve_release")
+public class MallScoreAchieveRelease extends BaseEntity {
+    /**
+     * 编号
+     */
+    private String releaseNo;
+    /**
+     * 业绩总数
+     */
+    private BigDecimal achieve;
+    /**
+     * 预期产生凭证数量
+     */
+    private BigDecimal voucherExpect;
+    /**
+     * 实际产生凭证数量
+     */
+    private BigDecimal voucherReal;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallScoreRecord.java b/src/main/java/cc/mrbird/febs/mall/entity/MallScoreRecord.java
new file mode 100644
index 0000000..73937ee
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallScoreRecord.java
@@ -0,0 +1,39 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 会员购买绿色凭证(绿色积分)
+ */
+@Data
+@TableName("mall_score_record")
+public class MallScoreRecord extends BaseEntity {
+
+    private Long memberId;
+    /**
+     * 编号
+     */
+    private String scoreNo;
+    /**
+     * 积分数量
+     */
+    private BigDecimal scoreCnt;
+    /**
+     * 剩余数量
+     */
+    private BigDecimal surplusCnt;
+
+    @TableField(exist = false)
+    private String name;
+
+    @TableField(exist = false)
+    private String phone;
+
+    @TableField(exist = false)
+    private String inviteId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java
index 86dd69b..f2a20f3 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java
@@ -18,4 +18,6 @@
     BigDecimal selectAchieveTotal(@Param("type") String type, @Param("date") Date date);
 
     BigDecimal selectSumAchieveByMemberIds(@Param("list")List<Long> mallMembersOffLinePerkIds, @Param("date") Date date);
+
+    List<MallAchieveRecord> selectListByDate(@Param("date")Date profitDate);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
index 6e486ac..60f30cd 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -93,4 +93,12 @@
     List<MallMember> selectMemberByDirector(@Param("state")Integer state);
 
     List<MallMember> selectMemberByStoreMaster(@Param("state")Integer state);
+
+    /**
+     * 根据type查询对应的角色的集合
+     * @param type 3:联创 4:合伙人
+     * @param state 1:是 2:否
+     * @return
+     */
+    List<MallMember> selectByRole(@Param("type") int type, @Param("state")int state);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
index f9f04b1..dcb70c8 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
@@ -41,4 +41,10 @@
     void addStarByMemberId(@Param("star")Integer starSum,  @Param("memberId")Long memberId);
 
     void reduceStarByMemberId(@Param("star")int i, @Param("memberId")Long memberId);
+
+    void addVorCherCntByMemberId(@Param("voucherCnt")BigDecimal voucherCnt, @Param("memberId")Long memberId);
+
+    BigDecimal selectSumStar();
+
+    List<MallMemberWallet> selectStar();
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreAchieveReleaseMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreAchieveReleaseMapper.java
new file mode 100644
index 0000000..3f5412b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreAchieveReleaseMapper.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.dto.AdminRoleReleaseDto;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
+import cc.mrbird.febs.mall.entity.MallScoreAchieveRelease;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+public interface MallScoreAchieveReleaseMapper extends BaseMapper<MallScoreAchieveRelease> {
+
+    IPage<MallScoreAchieveRelease> gerAchieveReleaseListInPage(Page<MallScoreAchieveRelease> page, @Param("record")AdminRoleReleaseDto roleReleaseDto);
+
+    IPage<MallMoneyFlow> gerAchieveReleaseChildInPage(Page<MallMoneyFlow> page, @Param("record")MallScoreAchieveRelease mallScoreAchieve);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreRecordMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreRecordMapper.java
new file mode 100644
index 0000000..18c4ba8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallScoreRecordMapper.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.dto.AdminRoleReleaseDto;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
+import cc.mrbird.febs.mall.entity.MallScoreRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface MallScoreRecordMapper extends BaseMapper<MallScoreRecord> {
+
+    BigDecimal selectSumScoreCnt();
+
+    List<MallScoreRecord> selectList();
+
+    IPage<MallScoreRecord> gerRoleReleaseListInPage(Page<MallScoreRecord> page, @Param("record")AdminRoleReleaseDto roleReleaseDto);
+
+    IPage<MallMoneyFlow> gerRoleReleaseChildInPage(Page<MallMoneyFlow> page, @Param("record")MallScoreRecord mallScoreRecord);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
index 63db4b2..62c44f7 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -59,7 +59,7 @@
 //    }
 
     /**
-     * 代理商补贴
+     * 代理商补贴 TODO 需要去掉注释
      */
     @Scheduled(cron = "0 0 1 * * ?")
     public void agentPerkJob() {
@@ -90,6 +90,23 @@
     public void mqPerkRetryJob() {
         memberProfitService.mqPerkRetryJob();
     }
+    /**
+     * 联创、合伙人的每日绿色凭证释放
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void scoreRecordReleaseJob() {
+        memberProfitService.scoreRecordReleaseJob();
+    }
+
+    /**
+     * 业绩产生凭证
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void achieveReleaseJob() {
+        memberProfitService.achieveReleaseJob();
+    }
+
+
 
 
     /**
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
index 09fc113..819fd08 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -3,10 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.mall.dto.*;
-import cc.mrbird.febs.mall.entity.AppVersion;
-import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.entity.MallNewsInfo;
-import cc.mrbird.febs.mall.entity.MallShopApply;
+import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.vo.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -97,4 +94,20 @@
     void updateShopApply(MallShopApply apply);
 
     AdminMallMemberPaymentVo getMallBankInfoById(long id);
+
+    FebsResponse updateVoucher(MallSystemPayDto mallSystemPayDto);
+
+    /**
+     * 后台查询会员购买绿色凭证(绿色积分)
+     * @param roleReleaseDto
+     * @param request
+     * @return
+     */
+    IPage<MallScoreRecord> gerRoleReleaseList(AdminRoleReleaseDto roleReleaseDto, QueryRequest request);
+
+    IPage<MallMoneyFlow> roleReleaseChild(QueryRequest request, MallScoreRecord mallScoreRecord);
+
+    IPage<MallScoreAchieveRelease> gerAchieveReleaseList(AdminRoleReleaseDto roleReleaseDto, QueryRequest request);
+
+    IPage<MallMoneyFlow> achieveReleaseChild(QueryRequest request, MallScoreAchieveRelease mallScoreAchieveRelease);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
index 4d3e914..0251cd1 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -49,4 +49,8 @@
     void teamEqualsPerkJob(Date profitDate);
 
     void mqPerkRetryJob();
+
+    void scoreRecordReleaseJob();
+
+    void achieveReleaseJob();
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
index e97394b..99cccf7 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -4,6 +4,7 @@
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
 import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.GreenScoreEnum;
 import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
@@ -69,6 +70,8 @@
     private final IMallMoneyFlowService mallMoneyFlowService;
     private final UnipayService unipayService;
     private final MallMemberBankMapper mallMemberBankMapper;
+    private final MallScoreRecordMapper mallScoreRecordMapper;
+    private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper;
 
     @Override
     public IPage<MallMember> getMallMemberList(MallMember mallMember, QueryRequest request) {
@@ -121,6 +124,10 @@
 //                throw new FebsException("团队存在线下服务中心,账号为【"+phoneList.toString()+"】");
 //            }
             mallMember.setStoreMaster(value);
+        }else if (type == 3){
+            mallMember.setCreater(value);
+        } else if (type == 4){
+            mallMember.setPartner(value);
         } else {
             throw new FebsException("参数错误");
         }
@@ -629,6 +636,88 @@
         return adminMallMemberPaymentVo;
     }
 
+    @Override
+    public FebsResponse updateVoucher(MallSystemPayDto mallSystemPayDto) {
+        Long memberId = mallSystemPayDto.getId();
+        MallMember mallMember = mallMemberMapper.selectById(memberId);
+        if(ObjectUtil.isEmpty(mallMember)){
+            return new FebsResponse().fail().message("系统繁忙,请刷新页面重试");
+        }
+
+        BigDecimal addBalance = mallSystemPayDto.getAddBalance();
+        if(addBalance.compareTo(BigDecimal.ZERO) <= 0){
+            return new FebsResponse().fail().message("请输入正确的数量");
+        }
+
+        DataDictionaryCustom totalCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.TOTAL_CNT.getType(),
+                GreenScoreEnum.TOTAL_CNT.getCode()
+        );
+
+        BigDecimal totalCnt = new BigDecimal(totalCntDic.getValue());
+        //凭证占总数的10%
+        BigDecimal roleCnt = totalCnt.multiply(new BigDecimal(0.1));
+        //获取已卖出的凭证数量
+        BigDecimal roleCntSale = mallScoreRecordMapper.selectSumScoreCnt().setScale(2,BigDecimal.ROUND_DOWN);
+        roleCntSale = roleCntSale.add(addBalance);
+
+        if(roleCnt.compareTo(roleCntSale) < 0){
+            return new FebsResponse().fail().message("已拨付:"+roleCntSale);
+        }
+        /**
+         * 增加一条会员购买记录
+         * mall_score_record
+         */
+        MallScoreRecord mallScoreRecord = new MallScoreRecord();
+        mallScoreRecord.setMemberId(memberId);
+        mallScoreRecord.setScoreNo(MallUtils.getOrderNum("MSR"));
+        mallScoreRecord.setScoreCnt(addBalance);
+        mallScoreRecord.setSurplusCnt(addBalance);
+        mallScoreRecordMapper.insert(mallScoreRecord);
+        /**
+         * 减少剩余绿色凭证数量
+         */
+        DataDictionaryCustom surplusCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.SURPLUS_CNT.getType(),
+                GreenScoreEnum.SURPLUS_CNT.getCode()
+        );
+        BigDecimal surplusCnt = new BigDecimal(surplusCntDic.getValue());
+        surplusCnt = surplusCnt.subtract(addBalance);
+        surplusCntDic.setValue(surplusCnt.toString());
+        dataDictionaryCustomMapper.updateById(surplusCntDic);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public IPage<MallScoreRecord> gerRoleReleaseList(AdminRoleReleaseDto roleReleaseDto, QueryRequest request) {
+        Page<MallScoreRecord> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<MallScoreRecord> mallScoreRecordIPage = mallScoreRecordMapper.gerRoleReleaseListInPage(page, roleReleaseDto);
+        return mallScoreRecordIPage;
+    }
+
+    @Override
+    public IPage<MallMoneyFlow> roleReleaseChild(QueryRequest request, MallScoreRecord mallScoreRecord) {
+        Page<MallMoneyFlow> page = new Page<>(request.getPageNum(), request.getPageSize());
+        MallScoreRecord mallScore = mallScoreRecordMapper.selectById(mallScoreRecord.getId());
+        IPage<MallMoneyFlow> mallMoneyFlowIPage = mallScoreRecordMapper.gerRoleReleaseChildInPage(page, mallScore);
+        return mallMoneyFlowIPage;
+    }
+
+    @Override
+    public IPage<MallScoreAchieveRelease> gerAchieveReleaseList(AdminRoleReleaseDto roleReleaseDto, QueryRequest request) {
+        Page<MallScoreAchieveRelease> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<MallScoreAchieveRelease> MallScoreAchieveReleases = mallScoreAchieveReleaseMapper.gerAchieveReleaseListInPage(page, roleReleaseDto);
+        return MallScoreAchieveReleases;
+    }
+
+    @Override
+    public IPage<MallMoneyFlow> achieveReleaseChild(QueryRequest request, MallScoreAchieveRelease mallScoreAchieveRelease) {
+        Page<MallMoneyFlow> page = new Page<>(request.getPageNum(), request.getPageSize());
+        MallScoreAchieveRelease mallScoreAchieve = mallScoreAchieveReleaseMapper.selectById(mallScoreAchieveRelease.getId());
+        IPage<MallMoneyFlow> mallMoneyFlowIPage = mallScoreAchieveReleaseMapper.gerAchieveReleaseChildInPage(page, mallScoreAchieve);
+        return mallMoneyFlowIPage;
+    }
+
     private String refererIds(String parentId) {
         boolean flag = false;
         if (StrUtil.isBlank(parentId)) {
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 1a380ba..c87ca01 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -448,6 +448,7 @@
          * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。
          */
         BigDecimal scoreSum = BigDecimal.ZERO;
+        BigDecimal achieveSum = BigDecimal.ZERO;
         List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId());
         if (CollUtil.isNotEmpty(orderItems)) {
             for (MallOrderItem orderItem : orderItems) {
@@ -488,6 +489,11 @@
                             new BigDecimal(mallGoods.getPresentPrice())
                                     .multiply(new BigDecimal(orderItem.getCnt()))
                                     .multiply(basePercent)
+                                    .abs()
+                                    .setScale(2,BigDecimal.ROUND_DOWN));
+                    achieveSum = achieveSum.add(
+                            new BigDecimal(mallGoods.getPresentPrice())
+                                    .multiply(new BigDecimal(orderItem.getCnt()))
                                     .abs()
                                     .setScale(2,BigDecimal.ROUND_DOWN));
                 }
@@ -608,13 +614,15 @@
         /**
          * 产生一条业绩记录
          */
-        MallAchieveRecord mallAchieveRecord = new MallAchieveRecord();
-        mallAchieveRecord.setMemberId(memberId);
-        mallAchieveRecord.setAchieveTime(new Date());
-        mallAchieveRecord.setAmount(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()));
-        mallAchieveRecord.setOrderId(orderId);
-        mallAchieveRecord.setPayTime(orderInfo.getPayTime());
-        mallAchieveRecordMapper.insert(mallAchieveRecord);
+        if(achieveSum.compareTo(BigDecimal.ZERO) > 0){
+            MallAchieveRecord mallAchieveRecord = new MallAchieveRecord();
+            mallAchieveRecord.setMemberId(memberId);
+            mallAchieveRecord.setAchieveTime(new Date());
+            mallAchieveRecord.setAmount(achieveSum.subtract(orderInfo.getScoreAmount()));
+            mallAchieveRecord.setOrderId(orderId);
+            mallAchieveRecord.setPayTime(orderInfo.getPayTime());
+            mallAchieveRecordMapper.insert(mallAchieveRecord);
+        }
     }
 
     public static void main(String[] args) {
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
index b71bb06..5993c95 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -1,9 +1,6 @@
 package cc.mrbird.febs.mall.service.impl;
 
-import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
-import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
-import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
-import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.*;
 import cc.mrbird.febs.common.utils.AppContants;
 import cc.mrbird.febs.common.utils.MallUtils;
 import cc.mrbird.febs.common.utils.RedisUtils;
@@ -59,6 +56,8 @@
     private final IMallMoneyFlowService mallMoneyFlowService;
     private final MallMqRecordMapper mallMqRecordMapper;
     private final AgentProducer agentProducer;
+    private final MallScoreRecordMapper mallScoreRecordMapper;
+    private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -789,4 +788,298 @@
         }
     }
 
+    @Override
+    public void scoreRecordReleaseJob() {
+        /**
+         * 每日按照比例释放记录的百分比到用户的绿色凭证账户
+         */
+        //获取全部剩余数量大于零的记录
+        List<MallScoreRecord> mallScoreRecords = mallScoreRecordMapper.selectList();
+        if(CollUtil.isEmpty(mallScoreRecords)){
+            return;
+        }
+
+        DataDictionaryCustom roleReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_RELEASE_PERCENT.getCode()
+        );
+        if(ObjectUtil.isEmpty(roleReleasePercentDic)){
+            return;
+        }
+        //释放比例
+        BigDecimal roleReleasePercent = new BigDecimal(roleReleasePercentDic.getValue()).multiply(new BigDecimal(0.001));
+        for(MallScoreRecord mallScoreRecord : mallScoreRecords){
+            Long memberId = mallScoreRecord.getMemberId();
+            //每日释放的绿色凭证数量 = 总数 * 释放比例
+            BigDecimal scoreCnt = mallScoreRecord.getScoreCnt();
+            BigDecimal scoreReleaseCnt = scoreCnt.multiply(roleReleasePercent).setScale(2,BigDecimal.ROUND_DOWN);
+
+            BigDecimal surplusCnt = mallScoreRecord.getSurplusCnt();
+            if(scoreReleaseCnt.compareTo(surplusCnt) >= 0){
+                scoreReleaseCnt = surplusCnt;
+            }
+            if(scoreReleaseCnt.compareTo(BigDecimal.ZERO) > 0){
+                releaseToMemberAndAddFlow(scoreReleaseCnt,memberId,
+                        MoneyFlowTypeEnum.ROLE_RELEASE_SCORE.getValue(),mallScoreRecord.getScoreNo());
+
+                //更新凭证记录的剩余数量
+                surplusCnt = surplusCnt.subtract(scoreReleaseCnt);
+                mallScoreRecord.setSurplusCnt(surplusCnt);
+                mallScoreRecordMapper.updateById(mallScoreRecord);
+            }
+        }
+    }
+
+    @Override
+    public void achieveReleaseJob() {
+        /**
+         * 业绩产生凭证
+         *      获取每日最大产生的凭证数量
+         *      获取每日总业绩
+         *      获取业绩产生凭证的最大值和最小值
+         *      每条业绩记录占
+         */
+
+        //获取每日总业绩
+        Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
+        BigDecimal achieveTotal = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate);
+
+        DataDictionaryCustom achieveMinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_MIN.getType(),
+                GreenScoreEnum.ACHIEVE_MIN.getCode()
+        );
+        //业绩的最小值
+        BigDecimal achieveMin = new BigDecimal(achieveMinDic.getValue() == null ? "0" : achieveMinDic.getValue());
+        if(achieveTotal.compareTo(achieveMin) < 0){
+            return;
+        }
+
+        DataDictionaryCustom achieveMaxDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_MAX.getType(),
+                GreenScoreEnum.ACHIEVE_MAX.getCode()
+        );
+        //业绩的最大值
+        BigDecimal achieveMax = new BigDecimal(achieveMaxDic.getValue() == null ? "0" : achieveMaxDic.getValue());
+
+        /**
+         * 获取每日最大产生的凭证数量
+         */
+        BigDecimal achieveDailyRelease = getAchieveDailyRelease();
+
+        if(achieveTotal.compareTo(achieveMax) < 0){
+            BigDecimal divide = achieveTotal.divide(achieveMax, 2, BigDecimal.ROUND_DOWN);
+            achieveDailyRelease = achieveDailyRelease.multiply(divide).setScale(2,BigDecimal.ROUND_DOWN);
+        }
+        /**
+         * 实际每日最大产生的凭证数量
+         */
+        BigDecimal achieveDailyReleaseReal = BigDecimal.ZERO;
+        /**
+         * 业务编号
+         */
+        String scoreNo = MallUtils.getOrderNum("ARSX");
+
+        /**
+         * 20%给合伙人、联创
+         *  5% 给联创
+         *  15% 给合伙人
+         */
+        DataDictionaryCustom roleAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getCode()
+        );
+        //业绩产生凭证给创世的比例
+        BigDecimal roleAchievePercent = new BigDecimal(roleAchievePercentDic.getValue() == null ? "0" : roleAchievePercentDic.getValue())
+                                        .multiply(new BigDecimal(0.01));
+        //创世的凭证数量
+        BigDecimal roleAchieveRelease = achieveDailyRelease.multiply(roleAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+        List<MallMember> roleAchieveReleaseMembers = mallMemberMapper.selectByRole(3,1);
+        if(CollUtil.isNotEmpty(roleAchieveReleaseMembers)){
+            //联创拿走0.25
+            BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.25));
+            BigDecimal memberAchieveRelease = multiply.divide(new BigDecimal(roleAchieveReleaseMembers.size()), 2, BigDecimal.ROUND_DOWN);
+            if(memberAchieveRelease.compareTo(BigDecimal.ZERO) > 0){
+                for(MallMember mallMember : roleAchieveReleaseMembers){
+
+                    releaseToMemberAndAddFlow(memberAchieveRelease,mallMember.getId(),
+                            MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_LC.getValue(),scoreNo);
+
+                    achieveDailyReleaseReal = achieveDailyReleaseReal.add(memberAchieveRelease);
+                }
+            }
+        }
+        //合伙人拿走0.75
+        List<MallMember> roleAchieveReleaseHHR = mallMemberMapper.selectByRole(4,1);
+        if(CollUtil.isNotEmpty(roleAchieveReleaseHHR)){
+            //合伙人拿走0.75
+            BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.75));
+            BigDecimal memberAchieveReleaseHHR = multiply.divide(new BigDecimal(roleAchieveReleaseHHR.size()), 2, BigDecimal.ROUND_DOWN);
+            if(memberAchieveReleaseHHR.compareTo(BigDecimal.ZERO) > 0){
+                for(MallMember mallMember : roleAchieveReleaseHHR){
+
+                    releaseToMemberAndAddFlow(memberAchieveReleaseHHR,mallMember.getId(),
+                            MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_HHR.getValue(),scoreNo);
+
+                    achieveDailyReleaseReal = achieveDailyReleaseReal.add(memberAchieveReleaseHHR);
+                }
+            }
+        }
+
+        /**
+         * 30%按贡献点分配给所有人
+         */
+        DataDictionaryCustom starAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.STAR_ACHIEVE_PERCENT.getCode()
+        );
+        //业绩产生凭证给贡献点分配给所有人
+        BigDecimal starAchievePercent = new BigDecimal(starAchievePercentDic.getValue() == null ? "0" : starAchievePercentDic.getValue())
+                .multiply(new BigDecimal(0.01));
+        //贡献点的凭证数量
+        BigDecimal starAchieveRelease = achieveDailyRelease.multiply(starAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+        BigDecimal starSumCnt = mallMemberWalletMapper.selectSumStar();
+        if(starSumCnt.compareTo(BigDecimal.ZERO) > 0){
+            //每一个贡献点获取的凭证
+            BigDecimal starAchieveReleaseOne = starAchieveRelease.divide(starSumCnt, 2, BigDecimal.ROUND_DOWN);
+            List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectStar();
+            if(CollUtil.isNotEmpty(mallMemberWallets) && starAchieveReleaseOne.compareTo(BigDecimal.ZERO) > 0){
+                for(MallMemberWallet mallMemberWallet : mallMemberWallets){
+                    //每个人获取的凭证 = 贡献点 * 每一个贡献点值的凭证
+                    BigDecimal bigDecimal = starAchieveReleaseOne.multiply(new BigDecimal(mallMemberWallet.getStar())).setScale(2, BigDecimal.ROUND_DOWN);
+
+                    releaseToMemberAndAddFlow(bigDecimal,mallMemberWallet.getMemberId(),
+                            MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_GXD.getValue(),scoreNo);
+
+                    achieveDailyReleaseReal = achieveDailyReleaseReal.add(bigDecimal);
+                }
+            }
+        }
+        /**
+         * 50%按按星级分配给所有人
+         * 二星  30%
+         * 三星  25%
+         * 四星  20%
+         * 五星  15%
+         * 六星  10%
+         */
+        DataDictionaryCustom levelAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getType(),
+                GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getCode()
+        );
+        //业绩产生凭证给星级分配给所有人
+        BigDecimal levelAchievePercent = new BigDecimal(levelAchievePercentDic.getValue() == null ? "0" : levelAchievePercentDic.getValue())
+                .multiply(new BigDecimal(0.01));
+        //业绩产生凭证给星级分配给所有人总数
+        BigDecimal levelAchieveRelease = achieveDailyRelease.multiply(levelAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+        BigDecimal thirdRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.THIRD_LEVEL.getCode(), new BigDecimal(0.3),scoreNo);
+        achieveDailyReleaseReal = achieveDailyReleaseReal.add(thirdRelease);
+
+        BigDecimal fourRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.FOUR_LEVEL.getCode(), new BigDecimal(0.25),scoreNo);
+        achieveDailyReleaseReal = achieveDailyReleaseReal.add(fourRelease);
+
+        BigDecimal fiveRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.FIFTH_LEVEL.getCode(), new BigDecimal(0.2),scoreNo);
+        achieveDailyReleaseReal = achieveDailyReleaseReal.add(fiveRelease);
+
+        BigDecimal sixRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.SIX_LEVEL.getCode(), new BigDecimal(0.15),scoreNo);
+        achieveDailyReleaseReal = achieveDailyReleaseReal.add(sixRelease);
+
+        BigDecimal sevenRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.SEVEN_LEVEL.getCode(), new BigDecimal(0.1),scoreNo);
+        achieveDailyReleaseReal = achieveDailyReleaseReal.add(sevenRelease);
+
+        if(achieveDailyReleaseReal.compareTo(BigDecimal.ZERO) > 0){
+            DataDictionaryCustom surplusCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                    GreenScoreEnum.SURPLUS_CNT.getType(),
+                    GreenScoreEnum.SURPLUS_CNT.getCode()
+            );
+            //绿色积分剩余数量
+            BigDecimal surplusCnt = new BigDecimal(surplusCntDic.getValue() == null ? "0" : surplusCntDic.getValue());
+            BigDecimal subtract = surplusCnt.subtract(achieveDailyReleaseReal).setScale(2,BigDecimal.ROUND_DOWN);
+            surplusCntDic.setValue(subtract.toString());
+            dataDictionaryCustomMapper.updateById(surplusCntDic);
+        }
+
+        log.info("昨日实际业绩:{},昨日凭证总共:{},实际产生凭证:{}",
+                achieveTotal,achieveDailyRelease,achieveDailyReleaseReal);
+        MallScoreAchieveRelease mallScoreAchieveRelease = new MallScoreAchieveRelease();
+        mallScoreAchieveRelease.setAchieve(achieveTotal);
+        mallScoreAchieveRelease.setReleaseNo(scoreNo);
+        mallScoreAchieveRelease.setVoucherExpect(achieveDailyRelease);
+        mallScoreAchieveRelease.setVoucherReal(achieveDailyReleaseReal);
+        mallScoreAchieveReleaseMapper.updateById(mallScoreAchieveRelease);
+
+    }
+
+    /**
+     * 给用户的增加凭证数据,并且增加流水
+     * @param memberAchieveRelease 释放数量
+     * @param memberId 用户ID
+     * @param Type 流水类型
+     * @param flowNo 流水编号
+     */
+    private void releaseToMemberAndAddFlow(BigDecimal memberAchieveRelease,Long memberId,int Type,String flowNo){
+        //释放到用户的账户
+        mallMemberWalletMapper.addVorCherCntByMemberId(memberAchieveRelease,memberId);
+        //产生一条流水记录 TODO 需要去掉注释
+        mallMoneyFlowService.addMoneyFlow(
+                memberId,
+                memberAchieveRelease,
+                Type,
+                flowNo,
+                FlowTypeEnum.VOUCHER_CNT.getValue());
+    }
+
+    /**
+     *  根据星级等级和占比,给该星级的用户释放凭证
+     * @param levelAchieveRelease
+     * @param level
+     * @param percent
+     * @return
+     */
+    private BigDecimal releaseByLevel(BigDecimal levelAchieveRelease,String level,BigDecimal percent,String scoreNo){
+        //实际支付的凭证数量
+        BigDecimal levelReleaseReal = BigDecimal.ZERO;
+        //当前星级的人数
+        List<MallMember> levelMembers = mallMemberMapper.selectMemberWithLevel(level);
+        if(CollUtil.isNotEmpty(levelMembers)){
+            //这个星级该获得的凭证数量 = 总数 * 比例
+            BigDecimal levelReleaseCnt = levelAchieveRelease.multiply(percent).setScale(2, BigDecimal.ROUND_DOWN);
+            if(levelReleaseCnt.compareTo(BigDecimal.ZERO) > 0){
+                //每个人获得的数量
+                BigDecimal levelRelease = levelReleaseCnt.divide(new BigDecimal(levelMembers.size()), 2, BigDecimal.ROUND_DOWN);
+                if(levelRelease.compareTo(BigDecimal.ZERO) > 0){
+                    for(MallMember mallMember : levelMembers){
+                        releaseToMemberAndAddFlow(levelRelease,mallMember.getId(),MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_XJ.getValue(),scoreNo);
+                        levelReleaseReal.add(levelRelease);
+                    }
+                }
+            }
+        }
+        return levelReleaseReal;
+    }
+
+    /**
+     * 获取每日最大产生的凭证数量
+     * @return
+     */
+    private BigDecimal getAchieveDailyRelease(){
+        DataDictionaryCustom achieveReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getType(),
+                GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getCode()
+        );
+        BigDecimal achieveReleasePercent = new BigDecimal(achieveReleasePercentDic.getValue() == null ? "0" : achieveReleasePercentDic.getValue())
+                .multiply(new BigDecimal(0.0001));
+
+
+        DataDictionaryCustom totalCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                GreenScoreEnum.TOTAL_CNT.getType(),
+                GreenScoreEnum.TOTAL_CNT.getCode()
+        );
+        //总凭证数量
+        BigDecimal totalCnt = new BigDecimal(totalCntDic.getValue() == null ? "0" : totalCntDic.getValue()).multiply(new BigDecimal(0.9));
+
+        //获取每日最大产生的凭证数量
+        BigDecimal achieveRelease = totalCnt.multiply(achieveReleasePercent);
+        return achieveRelease;
+    }
+
 }
diff --git a/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml b/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml
index 0825990..116720c 100644
--- a/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml
+++ b/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml
@@ -13,7 +13,7 @@
         </if>
     </select>
 
-    <select id="selectSumAchieveByMemberIds" resultType="cc.mrbird.febs.mall.entity.MallAchieveRecord">
+    <select id="selectSumAchieveByMemberIds" resultType="java.math.BigDecimal">
         select IFNULL(sum(IFNULL(amount,0)),0)
         from mall_achieve_record
         where  member_id IN
@@ -23,4 +23,9 @@
         and date_format(achieve_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d');
     </select>
 
+    <select id="selectListByDate" resultType="cc.mrbird.febs.mall.entity.MallAchieveRecord">
+        select * from mall_achieve_record
+        where date_format(achieve_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d');
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml
index 287c83c..f0ab081 100644
--- a/src/main/resources/mapper/modules/MallMemberMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -12,6 +12,8 @@
                IFNULL(c.commission,0) commission,
                IFNULL(c.star,0) star,
                IFNULL(c.total_score,0) totalScore,
+               IFNULL(c.voucher_cnt,0) voucherCnt,
+               IFNULL(c.voucher_amount,0) voucherAmount,
                d.description levelName
         FROM mall_member m
         left join mall_member a on m.referrer_id = a.invite_id
@@ -431,4 +433,16 @@
         from mall_member
         where store_master = #{state}
     </select>
+
+    <select id="selectByRole" resultType="cc.mrbird.febs.mall.entity.MallMember">
+        select * from mall_member
+        <where>
+            <if test="type == 3">
+                and creater = #{state}
+            </if>
+            <if test="type == 4">
+                and partner = #{state}
+            </if>
+        </where>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
index ac0aa70..09beb31 100644
--- a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
@@ -127,5 +127,22 @@
             WHERE member_id =  #{memberId}
     </update>
 
+    <update id="addVorCherCntByMemberId">
+        update mall_member_wallet
+        <set>
+            voucher_cnt = voucher_cnt + #{voucherCnt},
+        </set>
+        WHERE member_id =  #{memberId}
+    </update>
+
+    <select id="selectSumStar" resultType="java.math.BigDecimal">
+        select ifnull(sum(star),0) total from mall_member_wallet
+    </select>
+
+    <select id="selectStar" resultType="cc.mrbird.febs.mall.entity.MallMemberWallet">
+        select * from mall_member_wallet
+        where  star > 0
+    </select>
+
 
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml b/src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml
new file mode 100644
index 0000000..dcbc73b
--- /dev/null
+++ b/src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml
@@ -0,0 +1,24 @@
+<?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="cc.mrbird.febs.mall.mapper.MallScoreAchieveReleaseMapper">
+
+    <select id="gerAchieveReleaseListInPage" resultType="cc.mrbird.febs.mall.entity.MallScoreAchieveRelease">
+        select
+        a.*
+        from mall_score_achieve_release a
+        order by a.created_time desc
+    </select>
+
+    <select id="gerAchieveReleaseChildInPage" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow">
+        select
+            a.*,
+               b.name name,
+               b.phone phone
+        from mall_money_flow a
+        left join mall_member b on b.id = a.member_id
+        where
+            a.order_no = #{record.releaseNo}
+        order by a.created_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallScoreRecordMapper.xml b/src/main/resources/mapper/modules/MallScoreRecordMapper.xml
new file mode 100644
index 0000000..df062e9
--- /dev/null
+++ b/src/main/resources/mapper/modules/MallScoreRecordMapper.xml
@@ -0,0 +1,44 @@
+<?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="cc.mrbird.febs.mall.mapper.MallScoreRecordMapper">
+
+    <select id="selectSumScoreCnt" resultType="java.math.BigDecimal">
+        select IFNULL(sum(IFNULL(score_cnt,0)),0) from mall_score_record
+    </select>
+
+    <select id="selectList" resultType="cc.mrbird.febs.mall.entity.MallScoreRecord">
+        select * from mall_score_record where surplus_cnt > 0
+    </select>
+
+    <select id="gerRoleReleaseListInPage" resultType="cc.mrbird.febs.mall.entity.MallScoreRecord">
+        select
+               a.*,
+               b.name name,
+               b.phone phone,
+               b.invite_id inviteId
+        from mall_score_record a
+        left join mall_member b on a.member_id = b.id
+        <where>
+            <if test="record != null">
+                <if test="record.name != null and record.name != ''">
+                    and b.name like CONCAT('%', CONCAT(#{record.name}, '%'))
+                </if>
+                <if test="record.account != null and record.account != ''">
+                    and (b.phone like CONCAT('%', CONCAT(#{record.account}, '%'))
+                        or b.invite_id like CONCAT('%', CONCAT(#{record.account}, '%')))
+                </if>
+            </if>
+        </where>
+        order by a.created_time desc
+    </select>
+
+    <select id="gerRoleReleaseChildInPage" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow">
+        select
+               a.*
+        from mall_money_flow a
+        where
+            a.order_no = #{record.scoreNo}
+        order by a.created_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
index 5334e89..1fcd344 100644
--- a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
+++ b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -89,6 +89,20 @@
     <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchDirector">
     {{# } }}
 </script>
+<script type="text/html" id="switchCreate">
+    {{# if(d.creater === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchCreate">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchCreate">
+    {{# } }}
+</script>
+<script type="text/html" id="switchPartner">
+    {{# if(d.partner === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchPartner">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchPartner">
+    {{# } }}
+</script>
 <style>
     .layui-form-onswitch {
         background-color: #5FB878 !important;
@@ -103,6 +117,7 @@
         <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="resetPwd:update" lay-event="resetPwd">重置登录密码</button>
         <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="resetPwd:update" lay-event="resetPayPwd">重置支付密码</button>
         <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="agentLevelSet:update" lay-event="agentLevel">设置代理等级</button>
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="voucherUpdate:update" lay-event="voucherUpdate">拨付绿色凭证</button>
     </div>
 </script>
 <!-- 表格操作栏 end -->
@@ -241,10 +256,14 @@
                     {field: 'prizeScore', title: '现金积分', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.prizeScore) }}'},
                     {field: 'star', title: '贡献点', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.star) }}'},
                     {field: 'totalScore', title: '补贴额度', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.totalScore) }}'},
+                    {field: 'voucherCnt', title: '绿色凭证', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.voucherCnt) }}'},
+                    {field: 'voucherAmount', title: '凭证现金', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.voucherAmount) }}'},
                     {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'},
                     {field: 'levelName', title: '会员类型', minWidth: 100,align:'left'},
                     {field: 'storeMaster', title: '线下服务中心', templet:'#switchStoreMaster', minWidth: 120,align:'left'},
                     {field: 'director', title: '代理商', templet:'#switchDirector', minWidth: 120,align:'left' },
+                    {field: 'creater', title: '联创', templet:'#switchCreate', minWidth: 120,align:'left' },
+                    {field: 'partner', title: '合伙人', templet:'#switchPartner', minWidth: 120,align:'left' },
                     {field: 'accountType', title: '账号类型',
                         templet: function (d) {
                             if (d.accountType === 2) {
@@ -338,6 +357,19 @@
                 systemPay("修改余额", checkData[0].id, 1);
             }
 
+            if (layEvent === 'voucherUpdate') {
+                var checkData = table.checkStatus('userTable').data;
+                if (checkData.length <= 0) {
+                    febs.alert.warn('请选择需要的用户');
+                    return;
+                }
+                if (checkData.length > 1) {
+                    febs.alert.warn('请选择一个用户');
+                    return;
+                }
+                voucherUpdate("拨付绿色凭证", checkData[0].id, 1);
+            }
+
             if (layEvent === 'score') {
                 var checkData = table.checkStatus('userTable').data;
                 if (checkData.length <= 0) {
@@ -386,6 +418,18 @@
             }
         });
 
+        function voucherUpdate(text, id, type) {
+            febs.modal.open(text, 'modules/mallMember/voucherUpdate/' + type +'/'+ id, {
+                btn: ['提交', '取消'],
+                yes: function (index, layero) {
+                    $('#voucher-update').find('#submit').trigger('click');
+                },
+                btn2: function () {
+                    layer.closeAll();
+                }
+            });
+        }
+
         function systemPay(text, id, type) {
             febs.modal.open('text', 'modules/mallMember/mallSystemPay/' + type +'/'+ id, {
                 btn: ['提交', '取消'],
@@ -431,5 +475,21 @@
                 changeIdentityNo(1, data.value);
             }
         })
+
+        form.on('switch(switchCreate)', function (data) {
+            if (data.elem.checked) {
+                changeIdentityYes(3, data.value);
+            } else {
+                changeIdentityNo(3, data.value);
+            }
+        })
+
+        form.on('switch(switchPartner)', function (data) {
+            if (data.elem.checked) {
+                changeIdentityYes(4, data.value);
+            } else {
+                changeIdentityNo(4, data.value);
+            }
+        })
     })
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveRelease.html b/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveRelease.html
new file mode 100644
index 0000000..6c995a7
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveRelease.html
@@ -0,0 +1,107 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-achieve-release" lay-title="业绩释放记录">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="achieveReleaseTable" lay-data="{id: 'achieveReleaseTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-achieve-release'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: '', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(scoreAchieveReleaseList)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'scoreAchieveReleaseList') {
+                febs.modal.open( '全部记录', 'modules/mallMember/scoreAchieveReleaseList/' + data.id, {
+                    maxmin: true,
+                });
+            }
+        });
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'achieveReleaseTable',
+                url: ctx + 'admin/mallMember/gerAchieveRelease',
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'releaseNo', title: '编号', minWidth: 150,align:'center', totalRowText: '合计:'},
+                    {field: 'achieve', title: '业绩总数', minWidth: 100,align:'center'},
+                    {field: 'voucherExpect', title: '预期凭证数量', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.voucherExpect) }}'},
+                    {field: 'voucherReal', title: '实际凭证数量', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.voucherReal) }}'},
+                    {field: 'createdTime', title: '释放时间', minWidth: 150,align:'center'},
+                    {title: '操作',
+                        templet: function (d) {
+                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="scoreAchieveReleaseList" shiro:hasPermission="user:update">全部记录</button>'
+                        },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html b/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html
new file mode 100644
index 0000000..c61ab35
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html
@@ -0,0 +1,55 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-achieve-release-child" lay-title="全部记录">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <table lay-filter="achieveReleaseChild" lay-data="{id: 'achieveReleaseChild'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script data-th-inline="none" type="text/javascript">
+    layui.use([ 'jquery',  'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-achieve-release-child'),
+            tableIns;
+
+        form.render();
+
+        initTable();
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'achieveReleaseChild',
+                url: ctx + 'admin/mallMember/roleReleaseChild?parentId=1',
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'name', title: '名称', minWidth: 150,align:'center', totalRowText: '合计:'},
+                    {field: 'phone', title: '电话', minWidth: 150,align:'center'},
+                    {field: 'createdTime', title: '释放时间', minWidth: 150,align:'center'},
+                    {field: 'type', title: '类型',
+                        templet: function (d) {
+                            if (d.type === 32) {
+                                return '<span>联创</span>'
+                            } else if (d.type === 33) {
+                                return '<span>合伙人</span>'
+                            } else if (d.type === 34) {
+                                return '<span>贡献点</span>'
+                            } else if (d.type === 35) {
+                                return '<span>星级</span>'
+                            }else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'amount', title: '数量', minWidth: 150,align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleRelease.html b/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleRelease.html
new file mode 100644
index 0000000..be3bcd0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleRelease.html
@@ -0,0 +1,123 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-role-release" lay-title="创世释放记录">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">名称:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="名称" name="name" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">账号:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="账号/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="roleReleaseTable" lay-data="{id: 'roleReleaseTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-role-release'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(roleReleaseTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'scoreRoleReleaseList') {
+                febs.modal.open( '全部记录', 'modules/mallMember/scoreRoleReleaseList/' + data.id, {
+                    maxmin: true,
+                });
+            }
+        });
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'roleReleaseTable',
+                url: ctx + 'admin/mallMember/gerRoleRelease',
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'phone', title: '账号', minWidth: 150,align:'center', totalRowText: '合计:'},
+                    {field: 'name', title: '名称', minWidth: 100,align:'center'},
+                    {field: 'inviteId', title: '邀请码', minWidth: 100,align:'center'},
+                    {field: 'scoreNo', title: '编号', minWidth: 100,align:'center'},
+                    {field: 'scoreCnt', title: '总量', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.scoreCnt) }}'},
+                    {field: 'surplusCnt', title: '剩余', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.surplusCnt) }}'},
+                    {field: 'createdTime', title: '购买时间', minWidth: 150,align:'center'},
+                    {title: '操作',
+                        templet: function (d) {
+                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="scoreRoleReleaseList" shiro:hasPermission="user:update">全部记录</button>'
+                        },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                name: $searchForm.find('input[name="name"]').val().trim(),
+                account: $searchForm.find('input[name="account"]').val().trim(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleReleaseList.html b/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleReleaseList.html
new file mode 100644
index 0000000..22f2bea
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/scoreRoleReleaseList.html
@@ -0,0 +1,39 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-role-release-child" lay-title="全部记录">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <table lay-filter="roleReleaseChild" lay-data="{id: 'roleReleaseChild'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script data-th-inline="none" type="text/javascript">
+    layui.use([ 'jquery',  'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-role-release-child'),
+            tableIns;
+
+        form.render();
+
+        initTable();
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'roleReleaseChild',
+                url: ctx + 'admin/mallMember/roleReleaseChild?parentId=1',
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'createdTime', title: '释放时间', minWidth: 150,align:'center', totalRowText: '合计:'},
+                    {field: 'amount', title: '数量', minWidth: 150,align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/voucherUpdate.html b/src/main/resources/templates/febs/views/modules/mallMember/voucherUpdate.html
new file mode 100644
index 0000000..d4cf0d2
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/voucherUpdate.html
@@ -0,0 +1,91 @@
+<style>
+    #voucher-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #voucher-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #voucher-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #voucher-update .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+    #voucher-update img{
+        max-width:100px
+    }
+
+</style>
+<div class="layui-fluid" id="voucher-update">
+    <form class="layui-form" action="" lay-filter="voucher-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id">
+            </div>
+        </div>
+<!--        <div class="layui-form-item">-->
+<!--            <label class="layui-form-label febs-form-item-require">当前余额:</label>-->
+<!--            <div class="layui-input-block">-->
+<!--                <input type="number" name="balance" lay-verify="required" autocomplete="off" class="layui-input" readonly>-->
+<!--            </div>-->
+<!--        </div>-->
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">拨付数目:</label>
+            <div class="layui-input-block">
+                <input type="number" name="addBalance" lay-verify="required" autocomplete="off" class="layui-input">
+                <div class="layui-word-aux">拨付数目会按照设定的比例,每日拨付到用户账户</div>
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="voucher-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            systemPay = [[${systemPay}]],
+            type = [[${type}]],
+            $view = $('#voucher-update'),
+            validate = layui.validate;
+
+        form.render();
+        laydate.render({
+            elem: '#febs-form-group-date'
+        });
+
+        formSelects.render();
+
+
+        initUserValue();
+
+        function initUserValue() {
+            form.val("voucher-update-form", {
+                "id": systemPay.id,
+            });
+        }
+
+        form.on('submit(voucher-update-form-submit)', function (data) {
+            data.field.type = type;
+            febs.post(ctx + 'admin/mallMember/updateVoucher', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('操作成功');
+                $('#febs-member-list').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/system/hlmVoucherButton.html b/src/main/resources/templates/febs/views/modules/system/hlmVoucherButton.html
new file mode 100644
index 0000000..d47f681
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/system/hlmVoucherButton.html
@@ -0,0 +1,74 @@
+<div class="layui-fluid layui-anim febs-anim" id="hlm-voucher-button" lay-title="一键卖出">
+    <div class="layui-row layui-col-space8 febs-container">
+        <form class="layui-form" action="" lay-filter="hlm-voucher-button-form">
+            <div class="layui-card">
+                <div class="layui-card-body">
+                    <blockquote class="layui-elem-quote blue-border">绿色积分凭证</blockquote>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label febs-form-item-require">价格:</label>
+                            <div class="layui-form-mid layui-word-aux">当前价格:</div>
+                            <div class="layui-input-inline">
+                                <input type="text" name="scorePrice" lay-verify="required|integer" placeholder="请输入数字" autocomplete="off" class="layui-input" readonly>
+                            </div>
+                            <div class="layui-form-mid layui-word-aux">剩余:</div>
+                        </div>
+                    </div>
+                    <div class="layui-card-footer">
+                        <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="hlm-voucher-button-submit" id="submit">保存</button>
+                    </div>
+                    <div class="layui-card-footer">
+                        <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="hlm-voucher-button-submit" id="submit">确认一键卖出</button>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+<style>
+    .layui-form-label {
+        width: 120px;
+    }
+
+    .layui-form-item .layui-input-block {
+        margin-left: 150px;
+    }
+
+    .layui-table-form .layui-form-item {
+        margin-bottom: 20px !important;
+    }
+</style>
+<script data-th-inline="javascript" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'febs', 'form', 'eleTree'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            hlmVoucherSet = [[${hlmVoucherSetDto}]],
+            $view = $('#hlm-voucher-button');
+
+        form.verify({
+            integer: [
+                /^[1-9]\d*$/
+                , '只能输入正整数'
+            ]
+        });
+
+        initHlmVoucherSetValue();
+
+        form.render();
+
+        function initHlmVoucherSetValue() {
+            form.val("hlm-voucher-button-form", {
+                "roleReleasePercent": hlmVoucherSet.roleReleasePercent
+            });
+        }
+
+        form.on('submit(hlm-voucher-button-submit)', function (data) {
+            febs.post(ctx + 'admin/system/hlmVoucherSet', data.field, function (res) {
+                febs.alert.success('设置成功');
+                return ;
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/system/hlmVoucherSet.html b/src/main/resources/templates/febs/views/modules/system/hlmVoucherSet.html
new file mode 100644
index 0000000..024e2e0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/system/hlmVoucherSet.html
@@ -0,0 +1,142 @@
+<div class="layui-fluid layui-anim febs-anim" id="hlm-voucher-set" lay-title="绿色积分凭证">
+    <div class="layui-row layui-col-space8 febs-container">
+        <form class="layui-form" action="" lay-filter="hlm-voucher-set-form">
+            <div class="layui-card">
+                <div class="layui-card-body">
+                    <blockquote class="layui-elem-quote blue-border">绿色积分凭证</blockquote>
+                    <div class="layui-form-item">
+                        <div class="layui-inline">
+                            <label class="layui-form-label febs-form-item-require">详情:</label>
+                            <div class="layui-form-mid layui-word-aux">总数:</div>
+                            <div class="layui-input-inline">
+                                <input type="text" name="totalCnt" lay-verify="required|integer" placeholder="请输入数字" autocomplete="off" class="layui-input" readonly>
+                            </div>
+                            <div class="layui-form-mid layui-word-aux">剩余:</div>
+                            <div class="layui-input-inline">
+                                <input type="text" name="surplusCnt" lay-verify="required|integer" placeholder="请输入数字" autocomplete="off" class="layui-input" readonly>
+                            </div>
+                        </div>
+                    </div>
+
+                    <blockquote class="layui-elem-quote blue-border">联创、合伙人每日拨付比例</blockquote>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">比例:</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="roleReleasePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
+                            <div class="layui-word-aux">设置1,每日拨付千分之1</div>
+                        </div>
+                    </div>
+
+                    <blockquote class="layui-elem-quote blue-border">业绩产生积分凭证设置一</blockquote>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">比例:</label>
+                        <div class="layui-form-mid layui-word-aux">每日总释放积分凭证比例(万分之几):</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="achieveReleasePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">例如:1,则表示总凭证数3000000*0.9*0.0001</div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">规则一:</label>
+                        <div class="layui-form-mid layui-word-aux">业绩大于最小值:</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="achieveMin" lay-verify="required|integer" placeholder="请输入数字" autocomplete="off" class="layui-input">
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">才释放积分凭证。</div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">规则二:</label>
+                        <div class="layui-form-mid layui-word-aux">业绩大于、等于最大值:</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="achieveMax" lay-verify="required|integer" placeholder="请输入数字" autocomplete="off" class="layui-input">
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">释放今日的全额积分凭证。</div>
+                    </div>
+                    <blockquote class="layui-elem-quote blue-border">业绩产生积分凭证设置二</blockquote>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">比例一:</label>
+                        <div class="layui-form-mid layui-word-aux">业绩积分凭证每日释放联创、合伙人的比例:</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="roleAchievePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">设置20,则表示比例为20%</div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">比例二:</label>
+                        <div class="layui-form-mid layui-word-aux">业绩积分凭证按贡献点比例:</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="starAchievePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">设置20,则表示比例为20%</div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label febs-form-item-require">比例三:</label>
+                        <div class="layui-form-mid layui-word-aux">业绩积分凭证按用户星级比例:</div>
+                        <div class="layui-input-inline">
+                            <input type="text" name="levelAchievePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">。设置20,则表示比例为20%</div>
+                    </div>
+                    <div class="layui-card-footer">
+                        <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="hlm-voucher-set-submit" id="submit">保存</button>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+<style>
+    .layui-form-label {
+        width: 120px;
+    }
+
+    .layui-form-item .layui-input-block {
+        margin-left: 150px;
+    }
+
+    .layui-table-form .layui-form-item {
+        margin-bottom: 20px !important;
+    }
+</style>
+<script data-th-inline="javascript" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'febs', 'form', 'eleTree'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            hlmVoucherSet = [[${hlmVoucherSetDto}]],
+            $view = $('#hlm-voucher-set');
+
+        form.verify({
+            integer: [
+                /^[1-9]\d*$/
+                , '只能输入正整数'
+            ]
+        });
+
+        initHlmVoucherSetValue();
+
+        form.render();
+
+        function initHlmVoucherSetValue() {
+            form.val("hlm-voucher-set-form", {
+                "levelAchievePercent": hlmVoucherSet.levelAchievePercent,
+                "starAchievePercent": hlmVoucherSet.starAchievePercent,
+                "roleAchievePercent": hlmVoucherSet.roleAchievePercent,
+                "achieveReleasePercent": hlmVoucherSet.achieveReleasePercent,
+                "achieveMin": hlmVoucherSet.achieveMin,
+                "achieveMax": hlmVoucherSet.achieveMax,
+                "totalCnt": hlmVoucherSet.totalCnt,
+                "surplusCnt": hlmVoucherSet.surplusCnt,
+                "roleReleasePercent": hlmVoucherSet.roleReleasePercent
+            });
+        }
+
+        form.on('submit(hlm-voucher-set-submit)', function (data) {
+            febs.post(ctx + 'admin/system/hlmVoucherSet', data.field, function (res) {
+                febs.alert.success('设置成功');
+                return ;
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/test/java/cc/mrbird/febs/AgentTest.java b/src/test/java/cc/mrbird/febs/AgentTest.java
index 4fd5721..d3195e9 100644
--- a/src/test/java/cc/mrbird/febs/AgentTest.java
+++ b/src/test/java/cc/mrbird/febs/AgentTest.java
@@ -623,6 +623,6 @@
 
     @Test
     public void orderReturnTest() {
-        agentConsumer.orderReturnMoney("7");
+//        agentConsumer.orderReturnMoney("7");
     }
 }
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index 0581b77..0ad3247 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -55,7 +55,11 @@
 
     @Test
     public void dynamicProfit() {
-        agentProducer.sendPerkMoneyMsg(679L);
+        agentService.perkMoneyConsumer(Long.parseLong("712"));
+//        memberProfitService.dynamicProfit(Long.parseLong("709"));
+//        memberProfitService.scoreRecordReleaseJob();
+//        memberProfitService.achieveReleaseJob();
+//        agentProducer.sendPerkMoneyMsg(679L);
 //        agentService.perkMoneyConsumer(665L);
 //        memberProfitService.teamEqualsPerkJob(null);
 //        List<MallMember> mallMemberTeamPerk = new ArrayList<>();

--
Gitblit v1.9.1