xiaoyong931011
2023-05-06 076f5a4f0a7c5a4d3a6d3a1a61ff96a0091e3320
星级补贴逻辑修改
44 files modified
1 files added
1012 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java 99 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java 64 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AgentDto.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/HlmBasicPerkDto.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallOrderInfoDto.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MoneyChargeListDto.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MoneyFlowListDto.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/RegisterDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdraw.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAgentService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 69 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 193 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MallMemberWithdrawServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminAgentMemberVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminAgentVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMallOrderInfoVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyChargeListVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyFlowListVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 134 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 16 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallOrderInfoMapper.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml 1 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/agentAllMember.html 3 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/agentList.html 14 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/chargeFlowList.html 40 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/chargeFlowListType.html 76 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html 50 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html 15 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html 3 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/order/orderList.html 17 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/system/hlmBasicPerk.html 19 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/ProfitTest.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -6,6 +6,14 @@
@Getter
public enum DataDictionaryEnum {
    /**
     * 星级补贴百分比
     */
    PERK_AGENT_ACHIEVE_PERCENT("PERK_SET","PERK_AGENT_ACHIEVE_PERCENT"),
    /**
     * 星级补贴总数
     */
    PERK_AGENT_ACHIEVE_TOTAL("PERK_SET","PERK_AGENT_ACHIEVE_TOTAL"),
    /**
     * 贡献点设置-购买商品获得
     */
    STAR_GET("PERK_SET","STAR_GET"),
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -4,11 +4,21 @@
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.utils.excl.ExcelSheetPO;
import cc.mrbird.febs.common.utils.excl.ExcelUtil;
import cc.mrbird.febs.common.utils.excl.ExcelVersion;
import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.service.IAdminMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.vo.AdminAgentLevelOptionTreeVo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
@@ -16,8 +26,15 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -29,6 +46,8 @@
public class AdminMallMemberController extends BaseController {
    private final IAdminMallMemberService mallMemberService;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final MallMemberMapper mallMemberMapper;
    private final IApiMallMemberService apiMallMemberService;
    /**
@@ -79,6 +98,30 @@
    @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "开启失败")
    public FebsResponse openAccount(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.openAccount(id);
    }
    /**
     * 会员列表---禁止
     *
     * @param id
     * @return
     */
    @GetMapping("outsideWithYes/{id}")
    @ControllerEndpoint(operation = "会员列表---禁止", exceptionMessage = "禁止失败")
    public FebsResponse outsideWithYes(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.outsideWithType(id,1);
    }
    /**
     * 会员列表---开启
     *
     * @param id
     * @return
     */
    @GetMapping("outsideWithNo/{id}")
    @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "开启失败")
    public FebsResponse outsideWithNo(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.outsideWithType(id,2);
    }
    /**
@@ -195,6 +238,15 @@
    @ControllerEndpoint(operation = "会员提现-同意", exceptionMessage = "操作失败")
    public FebsResponse chargeAgree(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.chargeAgree(id);
    }
    /**
     * 会员提现-同意
     */
    @PostMapping("chargeAgreeWithType")
    @ControllerEndpoint(operation = " 会员提现-同意", exceptionMessage = "操作失败")
    public FebsResponse chargeAgreeWithType(@Valid MallMemberWithdraw mallMemberWithdraw) {
        return mallMemberService.chargeAgreeWithType(mallMemberWithdraw);
    }
    /**
@@ -482,4 +534,51 @@
        return new FebsResponse().success().data(dataTable);
    }
    @GetMapping("exportMember")
    @ControllerEndpoint(operation = "会员列表", exceptionMessage = "导出失败")
    public FebsResponse exportMemberList(MallMember mallMember, HttpServletResponse response) throws IOException {
        List<ExcelSheetPO> res = new ArrayList<>();
        ExcelSheetPO orderSheet = new ExcelSheetPO();
        String title = "会员列表";
        orderSheet.setSheetName(title);
        orderSheet.setTitle(title);
        String[] header = {"登录账户", "手机号码", "名称", "余额", "现金积分", "贡献点", "补贴额度", "凭证", "凭证现金"};
        orderSheet.setHeaders(header);
        QueryRequest request = new QueryRequest();
        request.setPageNum(1);
        request.setPageSize(9999);
        List<MallMember> dataList = mallMemberMapper.selectList(null);
        List<List<Object>> list = new ArrayList<>();
        if (dataList.size() > 0) {
            for (MallMember item : dataList) {
                List<Object> temp = new ArrayList<>();
                temp.add(item.getAccountLogin());
                temp.add(item.getPhone());
                temp.add(item.getName());
                Long memberId = item.getId();
                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
                if(ObjectUtil.isNotNull(mallMemberWallet)){
                    temp.add(mallMemberWallet.getBalance());
                    temp.add(mallMemberWallet.getPrizeScore());
                    temp.add(mallMemberWallet.getStar());
                    temp.add(mallMemberWallet.getTotalScore());
                    temp.add(mallMemberWallet.getVoucherCnt());
                    temp.add(mallMemberWallet.getVoucherAmount());
                }
                list.add(temp);
            }
        }
        orderSheet.setDataList(list);
        res.add(orderSheet);
        response = ResponseHeadUtil.setExcelHead(response);
        response.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(title + DateUtil.format(new Date(), "yyyyMMDDHHmmss") + ".xlsx".trim(), "UTF-8"));
        OutputStream os = response.getOutputStream();
        ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true);
        return null;
    }
}
src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java
@@ -14,6 +14,7 @@
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.MallExpressInfoMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cc.mrbird.febs.mall.mapper.MallOrderRefundOperationMapper;
import cc.mrbird.febs.mall.service.IAdminMallGoodsService;
import cc.mrbird.febs.mall.service.IAdminMallOrderService;
@@ -52,6 +53,7 @@
    private final IAdminMallOrderService adminMallOrderService;
    private final MallExpressInfoMapper mallExpressInfoMapper;
    private final MallMemberMapper mallMemberMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    /**
     * 订单列表
@@ -340,6 +342,68 @@
        return null;
    }
    @GetMapping("exportOrderListAll")
    @ControllerEndpoint(operation = "订单列表", exceptionMessage = "导出失败")
    public FebsResponse exportOrderListAll(MallOrderInfo mallOrderInfo, HttpServletResponse response) throws IOException {
        List<ExcelSheetPO> res = new ArrayList<>();
        ExcelSheetPO orderSheet = new ExcelSheetPO();
        String title = "订单列表";
        orderSheet.setSheetName(title);
        orderSheet.setTitle(title);
        String[] header = {"订单编号", "登录账户", "购买人", "手机号码", "订单金额", "状态"};
        orderSheet.setHeaders(header);
        QueryRequest request = new QueryRequest();
        request.setPageNum(1);
        request.setPageSize(9999);
        List<MallOrderInfo> dataList = mallOrderInfoMapper.selectList(null);
        List<List<Object>> list = new ArrayList<>();
        if (dataList.size() > 0) {
            for (MallOrderInfo item : dataList) {
                List<Object> temp = new ArrayList<>();
                temp.add(item.getOrderNo());
                temp.add(mallMemberMapper.selectById(item.getMemberId()).getAccountLogin());
                temp.add(mallMemberMapper.selectById(item.getMemberId()).getName());
                temp.add(mallMemberMapper.selectById(item.getMemberId()).getPhone());
                temp.add(item.getAmount());
                switch (item.getStatus()) {
                    case 1:
                        temp.add("待支付");
                        break;
                    case 2:
                        temp.add("待发货");
                        break;
                    case 3:
                        temp.add("待收货");
                        break;
                    case 4:
                        temp.add("已完成");
                        break;
                    case 5:
                        temp.add("退款中");
                        break;
                    case 6:
                        temp.add("已退款");
                        break;
                    case 7:
                        temp.add("已取消");
                        break;
                    default:
                }
                list.add(temp);
            }
        }
        orderSheet.setDataList(list);
        res.add(orderSheet);
        response = ResponseHeadUtil.setExcelHead(response);
        response.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(title + DateUtil.format(new Date(), "yyyyMMDDHHmmss") + ".xlsx".trim(), "UTF-8"));
        OutputStream os = response.getOutputStream();
        ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true);
        return null;
    }
    @PostMapping(value = "/importDeliver")
    @ControllerEndpoint(operation = "导入发货", exceptionMessage = "导入失败")
    public FebsResponse importDeliver(@RequestBody MultipartFile file) throws IOException {
src/main/java/cc/mrbird/febs/mall/controller/AdminSystemController.java
@@ -115,6 +115,14 @@
                DataDictionaryEnum.AGENT_PERK.getType(),
                DataDictionaryEnum.AGENT_PERK.getCode(),
                hlmBasicPerkDto.getAgentPerk());
        commonService.updateDataDic(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode(),
                hlmBasicPerkDto.getPerkAgentAchieveTotal());
        commonService.updateDataDic(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getCode(),
                hlmBasicPerkDto.getPerkAgentAchievePercent());
        return new FebsResponse().success();
    }
src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
@@ -155,6 +155,21 @@
    }
    /**
     * 提现列表-付款方式
     * @param id
     * @param model
     * @return
     */
    @GetMapping("chargeFlowListType/{id}")
    @RequiresPermissions("chargeFlowListType:update")
    public String chargeFlowListType(@PathVariable long id, Model model) {
        AdminMallMemberPaymentVo data = new AdminMallMemberPaymentVo();
        data.setId(id);
        model.addAttribute("chargeUpdateInfo", data);
        return FebsUtil.view("modules/mallMember/chargeFlowListType");
    }
    /**
     * 代理列表
     * @return
     */
src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
@@ -215,6 +215,20 @@
            String agentPerk = ObjectUtil.isEmpty(agentPerkDic.getValue()) ? "0" : agentPerkDic.getValue();
            hlmBasicPerkDto.setAgentPerk(agentPerk);
        }
        DataDictionaryCustom perkAgentAchieveTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode());
        if (perkAgentAchieveTotalDic != null) {
            String perkAgentAchieveTotal = ObjectUtil.isEmpty(perkAgentAchieveTotalDic.getValue()) ? "0" : perkAgentAchieveTotalDic.getValue();
            hlmBasicPerkDto.setPerkAgentAchieveTotal(perkAgentAchieveTotal);
        }
        DataDictionaryCustom perkAgentAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getCode());
        if (perkAgentAchievePercentDic != null) {
            String perkAgentAchievePercent = ObjectUtil.isEmpty(perkAgentAchievePercentDic.getValue()) ? "0" : perkAgentAchievePercentDic.getValue();
            hlmBasicPerkDto.setPerkAgentAchievePercent(perkAgentAchievePercent);
        }
        model.addAttribute("hlmBasicPerk", hlmBasicPerkDto);
        return FebsUtil.view("modules/system/hlmBasicPerk");
    }
src/main/java/cc/mrbird/febs/mall/dto/AgentDto.java
@@ -9,6 +9,8 @@
    private String name;
    private String accountLogin;
    private String account;
    private String level;
src/main/java/cc/mrbird/febs/mall/dto/HlmBasicPerkDto.java
@@ -27,5 +27,13 @@
     * 基础补贴-代理商补贴
     */
    private String agentPerk;
    /**
     * 星级补贴总数
     */
    private String perkAgentAchieveTotal;
    /**
     * 星级补贴百分比
     */
    private String perkAgentAchievePercent;
}
src/main/java/cc/mrbird/febs/mall/dto/MallOrderInfoDto.java
@@ -23,6 +23,8 @@
    private String name;
    private String accountLogin;
    private Integer orderType;
    private String startTime;
src/main/java/cc/mrbird/febs/mall/dto/MoneyChargeListDto.java
@@ -9,6 +9,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private Integer status;
src/main/java/cc/mrbird/febs/mall/dto/MoneyFlowListDto.java
@@ -7,6 +7,8 @@
@ApiModel(value = "MoneyFlowListDto", description = "接收参数类")
public class MoneyFlowListDto {
    private String accountLogin;
    private String name;
    private String phone;
src/main/java/cc/mrbird/febs/mall/dto/RegisterDto.java
@@ -15,6 +15,10 @@
public class RegisterDto {
    @NotBlank(message = "账号不能为空")
    @ApiModelProperty(value = "账号", example = "hjsj")
    private String accountLogin;
    @NotBlank(message = "手机号不能为空")
    @ApiModelProperty(value = "手机号", example = "15773001234")
    private String account;
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -18,6 +18,10 @@
public class MallMember extends BaseEntity {
    /**
     * 登录账号
     */
    private String accountLogin;
    /**
     * 姓名
     */
    private String name;
@@ -160,4 +164,7 @@
    //内转标识 1:开启 2:关闭
    private Integer insideWith;
    //提现开关 1:开启 2:关闭
    private Integer outsideWith;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdraw.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;
@@ -32,4 +33,9 @@
    private String withdrawNo;
    
    private String remark;
    /**
     * 绿色凭证
     */
    @TableField(exist = false)
    private String agreeType;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -52,5 +52,8 @@
    private String name;
    @TableField(exist = false)
    private String accountLogin;
    @TableField(exist = false)
    private String phone;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -103,4 +103,8 @@
    List<MallMember> selectByRole(@Param("type") int type, @Param("state")int state);
    List<MallMember> selectByLevel( @Param("level")String type);
    MallMember selectByAccountLogin(@Param("accountLogin")String accountLogin);
    MallMember selectInfoByAccountLoginAndPwd(@Param("accountLogin")String account, @Param("password")String md5Pwd);
}
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -7,6 +7,7 @@
import cc.mrbird.febs.mall.entity.MallMoneyFlow;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
@@ -36,6 +37,8 @@
    @Autowired
    private IMemberProfitService memberProfitService;
    @Autowired
    private IAgentService agentService;
    /**
     * 代理分红
@@ -106,6 +109,14 @@
        memberProfitService.achieveReleaseJob();
    }
    /**
     * 代理星级补贴
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void perkAgentAchieveJob() {
        agentService.perkAgent();
    }
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -5,6 +5,7 @@
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.vo.*;
import com.alipay.api.domain.AlipayOfflineTrade;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -116,4 +117,8 @@
    FebsResponse searchInfo(Long id);
    FebsResponse accountInfo(Long id);
    FebsResponse outsideWithType(Long id, int i);
    FebsResponse chargeAgreeWithType(MallMemberWithdraw mallMemberWithdraw);
}
src/main/java/cc/mrbird/febs/mall/service/IAgentService.java
@@ -37,4 +37,6 @@
     * 按购买业绩(不按权益积分)每天静态释0.6%~1.2%
     */
    void achieveReleasePercent();
    void perkAgent();
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -806,6 +806,75 @@
        return new FebsResponse().success().message("可以转账");
    }
    @Override
    public FebsResponse outsideWithType(Long id, int i) {
        MallMember mallMember = mallMemberMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallMember)) {
            return new FebsResponse().fail().message("会员信息不存在");
        }
        mallMember.setOutsideWith(i);
        mallMemberMapper.updateById(mallMember);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse chargeAgreeWithType(MallMemberWithdraw mallMemberWithdrawInfo) {
        MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(mallMemberWithdrawInfo.getId());
        if(ObjectUtil.isEmpty(mallMemberWithdraw)){
            return new FebsResponse().fail().message("系统繁忙,请刷新后重试");
        }
        if(1 != mallMemberWithdraw.getStatus()){
            return new FebsResponse().fail().message("当前状态不是提现中");
        }
        Long wtihdrawTypeId = mallMemberWithdraw.getWtihdrawTypeId();
        MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(wtihdrawTypeId);
        if(ObjectUtil.isEmpty(mallMemberBank)){
            return new FebsResponse().fail().message("提现银行卡已删除");
        }
        String agreeType = mallMemberWithdrawInfo.getAgreeType();
        if("1".equals(agreeType)){
            mallMemberWithdraw.setStatus(2);
            mallMemberWithdrawMapper.updateById(mallMemberWithdraw);
            QueryWrapper<MallMoneyFlow> flowQueryWrapper = new QueryWrapper<>();
            flowQueryWrapper.eq("order_no",mallMemberWithdraw.getWithdrawNo());
            flowQueryWrapper.eq("type",MoneyFlowTypeEnum.WITHDRAWAL.getValue());
            MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOne(flowQueryWrapper);
            if(ObjectUtil.isNotEmpty(mallMoneyFlow)){
                mallMoneyFlow.setStatus(2);
                mallMoneyFlowMapper.updateById(mallMoneyFlow);
            }
            return new FebsResponse().success();
        }else{
            String bankName = mallMemberBank.getBankName();
            NBYHResponse nbyhResponse = new NBYHResponse();
            if("宁波银行".equals(bankName)){
                nbyhResponse = nbyhService.tradeSinge(mallMemberWithdraw.getId());
            }else{
                nbyhResponse = nbyhService.tradeSingeOuterTransfer(mallMemberWithdraw.getId());
            }
            if(nbyhResponse.isFlag()){
                mallMemberWithdraw.setStatus(2);
                mallMemberWithdrawMapper.updateById(mallMemberWithdraw);
                QueryWrapper<MallMoneyFlow> flowQueryWrapper = new QueryWrapper<>();
                flowQueryWrapper.eq("order_no",mallMemberWithdraw.getWithdrawNo());
                flowQueryWrapper.eq("type",MoneyFlowTypeEnum.WITHDRAWAL.getValue());
                MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOne(flowQueryWrapper);
                if(ObjectUtil.isNotEmpty(mallMoneyFlow)){
                    mallMoneyFlow.setStatus(2);
                    mallMoneyFlowMapper.updateById(mallMoneyFlow);
                }
                return new FebsResponse().success().message(nbyhResponse.getMsg());
            }else{
                return new FebsResponse().fail().message(nbyhResponse.getMsg());
            }
        }
    }
    private String refererIds(String parentId) {
        boolean flag = false;
        if (StrUtil.isBlank(parentId)) {
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -52,6 +52,8 @@
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMqRecordMapper mallMqRecordMapper;
    private final ICommonService commonService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoUpAgentLevel(Long memberId) {
@@ -241,12 +243,41 @@
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
        DataDictionaryCustom perkAgentAchieveTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode());
        BigDecimal perkAgentAchieveTotal = new BigDecimal(perkAgentAchieveTotalDic.getValue());
        //星级奖励百分比等于每个级别的累计之和
        List<DataDictionaryCustom> starPerkDics = dataDictionaryCustomMapper.selectDicByType(
                "AGENT_LEVEL_REQUIRE");
        BigDecimal totalProfitProp = BigDecimal.ZERO;
        if(CollUtil.isNotEmpty(starPerkDics)){
            for(DataDictionaryCustom starPerkDic : starPerkDics){
                String starPerkStr = starPerkDic.getValue();
                AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
                BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
                String code = starPerkDic.getCode();
                //存在当前级别的会员,则加上这个比例的补贴
                List<MallMember> mallMembers = memberMapper.selectByLevel(code);
                if(CollUtil.isNotEmpty(mallMembers)){
                    totalProfitProp = totalProfitProp.add(profitProp);
                }
            }
        }
        if(totalProfitProp.compareTo(BigDecimal.ZERO) > 0){
            BigDecimal perkTotal = amount.multiply(totalProfitProp).setScale(2,BigDecimal.ROUND_DOWN);
            perkAgentAchieveTotal = perkAgentAchieveTotal.add(perkTotal);
            perkAgentAchieveTotalDic.setValue(perkAgentAchieveTotal.toString());
            dataDictionaryCustomMapper.updateById(perkAgentAchieveTotalDic);
        }
//        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
//        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
//        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
//        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
//        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
//        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
        /**
         * 团队补贴
@@ -345,7 +376,8 @@
     * @return
     */
    public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){
        //实际补贴总金额
        BigDecimal totalPerkAgentAmount = BigDecimal.ZERO;
        //根据用户的level获取用户
        List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam);
        if(CollUtil.isNotEmpty(mallMembersOlds)){
@@ -367,13 +399,32 @@
            if(starSum <= 0){
                return mallMemberStars;
            }
            BigDecimal totalProfitProp = BigDecimal.ZERO;
            List<DataDictionaryCustom> agentLevelRequireDics = dataDictionaryCustomMapper.selectDicByType("AGENT_LEVEL_REQUIRE");
            if(CollUtil.isNotEmpty(agentLevelRequireDics)){
                for(DataDictionaryCustom dic : agentLevelRequireDics){
                    String starPerkStr = dic.getValue();
                    AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
                    //当前星级所占份数
                    BigDecimal profitProp = agentInfo.getProfitProp().abs();
                    List<MallMember> mallMembers = memberMapper.selectByLevel(dic.getCode());
                    if(CollUtil.isNotEmpty(mallMembers)){
                        totalProfitProp = profitProp.add(totalProfitProp);
                    }
                }
            }
            //星级补贴比例
            DataDictionaryCustom starPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    "AGENT_LEVEL_REQUIRE",
                    LevelParam);
            String starPerkStr = starPerkDic.getValue();
            AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
            BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
//            BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
            //当前星级所占份数
            BigDecimal profitProp = agentInfo.getProfitProp().abs();
            //每一份多少钱
            amount = amount.divide(totalProfitProp,4,BigDecimal.ROUND_DOWN);
            //当前等级的星级补贴
            BigDecimal starPerkAmountSum = amount.multiply(profitProp);
            //当前等级的每一个贡献点的补贴金额
@@ -416,6 +467,7 @@
                        mallMoneyFlows.add(mallMoneyFlow);
                        reduceStar(mallMemberWallet.getMemberId(),starPerkAmount);
                        totalPerkAgentAmount = totalPerkAgentAmount.add(starPerkAmount);
                    }
                    count = count + 1;
                    if (count % 1000 == 0 || count == mallMemberWallets.size()) {
@@ -452,6 +504,16 @@
                }
            }
        }
        log.info("============实际补贴金额:{}",totalPerkAgentAmount.setScale(2,BigDecimal.ROUND_DOWN));
        DataDictionaryCustom totalPerkAgentAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode()
        );
        totalPerkAgentAmountDic.setValue(
                new BigDecimal(totalPerkAgentAmountDic.getValue()).subtract(totalPerkAgentAmount).setScale(2,BigDecimal.ROUND_DOWN).toString()
        );
        dataDictionaryCustomMapper.updateById(totalPerkAgentAmountDic);
        return mallMemberStars;
    }
@@ -591,15 +653,41 @@
        );
        List<MallMember> mallMembers = memberMapper.selectByLevel(MemberLevelEnum.SECOND_LEVEL.getType());
        BigDecimal jobAchieveReleasePercent = new BigDecimal(jobAchieveReleasePercentDic.getValue())
                .multiply(new BigDecimal(0.001));
        BigDecimal totalAchieve = BigDecimal.ZERO;
        Integer totalStar = 0;
        if(CollUtil.isNotEmpty(mallMembers)){
            for(MallMember mallMember : mallMembers){
                //总业绩
                BigDecimal sumAchieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
                BigDecimal jobAchieveReleasePercent = new BigDecimal(jobAchieveReleasePercentDic.getValue())
                        .multiply(new BigDecimal(0.001));
                //每个人的补贴额度
                BigDecimal multiply = sumAchieve.multiply(jobAchieveReleasePercent);
                BigDecimal achieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
                totalAchieve = totalAchieve.add(achieve);
                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
                Integer star = mallMemberWallet.getStar();
                totalStar = totalStar + star;
            }
        }
        if(BigDecimal.ZERO.compareTo(totalAchieve) >= 0){
            return;
        }
        //总释放=总业绩*一星每日业绩每日释放业绩到余额的千分比
        totalAchieve = totalAchieve.multiply(jobAchieveReleasePercent);
        if(totalStar <= 0){
            return;
        }
        //一个贡献点的价值
        BigDecimal divide = totalAchieve.divide(new BigDecimal(totalStar), 2, BigDecimal.ROUND_DOWN);
        if(CollUtil.isNotEmpty(mallMembers)){
            for(MallMember mallMember : mallMembers){
                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
                Integer star = mallMemberWallet.getStar();
                //每个人贡献值数量*一个贡献点的价值=获取的收益
                BigDecimal multiply = divide.multiply(new BigDecimal(star)).setScale(2,BigDecimal.ROUND_DOWN);
                BigDecimal totalScore = mallMemberWallet.getTotalScore();
                if(BigDecimal.ZERO.compareTo(multiply) < 0){
                    if(BigDecimal.ZERO.compareTo(totalScore) < 0){
@@ -623,6 +711,85 @@
                }
            }
        }
//        if(CollUtil.isNotEmpty(mallMembers)){
//            for(MallMember mallMember : mallMembers){
//                //总业绩
//                BigDecimal sumAchieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
//                //每个人的补贴额度
//                BigDecimal multiply = sumAchieve.multiply(jobAchieveReleasePercent);
//                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
//                BigDecimal totalScore = mallMemberWallet.getTotalScore();
//                if(BigDecimal.ZERO.compareTo(multiply) < 0){
//                    if(BigDecimal.ZERO.compareTo(totalScore) < 0){
//                        if(totalScore.compareTo(multiply) < 0){
//                            multiply = totalScore;
//                        }
//                        //减少补贴额度
//                        mallMemberWalletMapper.reduceTotalScoreById(multiply, mallMemberWallet.getId());
//
//                        reduceStar(mallMember.getId(),multiply);
//
//                        mallMemberWalletMapper.addBalanceById(multiply, mallMemberWallet.getId());
//
//                        mallMoneyFlowService.addMoneyFlow(
//                                mallMember.getId(),
//                                multiply,
//                                MoneyFlowTypeEnum.STATIC_BONUS.getValue(),
//                                MallUtils.getOrderNum(),
//                                FlowTypeEnum.BALANCE.getValue());
//                    }
//                }
//            }
//        }
    }
    @Override
    public void perkAgent() {
        DataDictionaryCustom totalAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode()
        );
        if(ObjectUtil.isEmpty(totalAmountDic)){
            return;
        }
        //星级补贴总数
        BigDecimal totalAmount = new BigDecimal(totalAmountDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
        if(BigDecimal.ZERO.compareTo(totalAmount) >= 0){
            return;
        }
        DataDictionaryCustom perkAgentPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getCode()
        );
        if(ObjectUtil.isEmpty(perkAgentPercentDic)){
            return;
        }
        //星级补贴百分比
        BigDecimal perkAgentPercent = new BigDecimal(perkAgentPercentDic.getValue()).abs().divide(new BigDecimal(100));
        BigDecimal amount = totalAmount.multiply(perkAgentPercent);
        if(BigDecimal.ZERO.compareTo(amount) >= 0){
            return;
        }
//        //星级补贴总数
//        totalAmountDic.setValue(totalAmount.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN).toString());
//        dataDictionaryCustomMapper.updateById(totalAmountDic);
        String orderNo = MallUtils.getOrderNum("SPA");
        /**
         * 星级奖励
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
    }
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -67,18 +67,23 @@
    @Transactional(rollbackFor = Exception.class)
    @Override
    public FebsResponse register(RegisterDto registerDto) {
        MallMember mallMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount());
//        MallMember mallMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount());
//        if (mallMember != null) {
//            throw new FebsException("该账号已被占用");
//        }
        String accountLogin = registerDto.getAccountLogin();
        MallMember mallMember = this.baseMapper.selectByAccountLogin(accountLogin);
        if (mallMember != null) {
            throw new FebsException("该账号已被占用");
        }
        List<MallMember> mallMembers = this.baseMapper.selectMemberByName(registerDto.getName());
        if (CollUtil.isNotEmpty(mallMembers)) {
            MallRegisterAppeal registerAppeal = mallRegisterAppealMapper.selectByPhoneAndName(registerDto.getName(), registerDto.getAccount());
            if (registerAppeal == null || registerAppeal.getStatus() != 1) {
                return new FebsResponse().code(HttpStatus.ACCEPTED).message("用户名已存在");
            }
        }
//        List<MallMember> mallMembers = this.baseMapper.selectMemberByName(registerDto.getName());
//        if (CollUtil.isNotEmpty(mallMembers)) {
//            MallRegisterAppeal registerAppeal = mallRegisterAppealMapper.selectByPhoneAndName(registerDto.getName(), registerDto.getAccount());
//            if (registerAppeal == null || registerAppeal.getStatus() != 1) {
//                return new FebsResponse().code(HttpStatus.ACCEPTED).message("用户名已存在");
//            }
//        }
        String account = registerDto.getAccount();
        if (!"admin".equals(registerDto.getRegistType())) {
@@ -90,6 +95,7 @@
        }
        mallMember = new MallMember();
        mallMember.setAccountLogin(accountLogin);
        mallMember.setPassword(SecureUtil.md5(registerDto.getPassword()));
        // 判断账号类型
@@ -160,7 +166,8 @@
    public FebsResponse toLogin(LoginDto loginDto) {
        String md5Pwd = SecureUtil.md5(loginDto.getPassword());
        MallMember mallMember = this.baseMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd);
//        MallMember mallMember = this.baseMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd);
        MallMember mallMember = this.baseMapper.selectInfoByAccountLoginAndPwd(loginDto.getAccount(), md5Pwd);
        if (mallMember == null) {
            throw new FebsException("用户不存在或账号密码错误");
        }
src/main/java/cc/mrbird/febs/mall/service/impl/MallMemberWithdrawServiceImpl.java
@@ -53,6 +53,12 @@
    public void withdrawal(WithdrawalDto withdrawalDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = mallMemberService.getById(memberId);
        Integer outsideWith = mallMember.getOutsideWith() == null ? 2 :mallMember.getOutsideWith();
        if (1 != outsideWith) {
            throw new FebsException("功能升级中");
        }
        if (StrUtil.isBlank(mallMember.getTradePassword())) {
            throw new FebsException("未设置支付密码");
        }
src/main/java/cc/mrbird/febs/mall/vo/AdminAgentMemberVo.java
@@ -13,6 +13,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private String level;
src/main/java/cc/mrbird/febs/mall/vo/AdminAgentVo.java
@@ -13,6 +13,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private String bindPhone;
src/main/java/cc/mrbird/febs/mall/vo/AdminMallOrderInfoVo.java
@@ -47,6 +47,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private String address;
src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyChargeListVo.java
@@ -26,6 +26,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private String bindPhone;
src/main/java/cc/mrbird/febs/mall/vo/AdminMoneyFlowListVo.java
@@ -28,6 +28,8 @@
    private String name;
    private String accountLogin;
    private String phone;
    private Integer status;
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -15,6 +15,9 @@
    @ApiModelProperty(value = "id")
    private Long id;
    @ApiModelProperty(value = "登录账号")
    private String accountLogin;
    @ApiModelProperty(value = "昵称")
    private String name;
src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java
@@ -15,6 +15,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.*;
import java.math.BigDecimal;
import java.net.*;
@@ -107,15 +108,12 @@
     * 接收报文url
     */
//    private static final String URL = "http://127.0.0.1:9080/directlink/httpAccess";
//    private static final String URL = "http://220.168.79.89:9080/directlink/httpAccess";
    private static final String URL = "http://747f9407.r3.cpolar.top/directlink/httpAccess";
//    private static final String URL = "http://1d6d-220-168-79-89.ngrok.io/directlink/httpAccess";
    private static final String URL = "http://n5z7ej.natappfree.cc/directlink/httpAccess";
    /**
     * 签名ip
     */
//    private static final String VERIFY_IP = "127.0.0.1";
    private static final String VERIFY_IP = "3b425db8.r10.cpolar.top";
//    private static final String VERIFY_IP = "747f9407.r3.cpolar.top";
    private static final String VERIFY_IP = "server.natappfree.cc";
    /**
     * 付款账号
     */
@@ -123,7 +121,8 @@
    /**
     * 签名端口
     */
    private static final int VERIFY_PORT = 8010;
    private static final int VERIFY_PORT = 41933;
//    private static final int VERIFY_PORT = 8010;
    /**
     * cookies
@@ -154,22 +153,12 @@
        try {
            InetAddress addr = InetAddress.getByName(VERIFY_IP);
            String hostName = addr.getHostName();
//            Socket socket = new Socket(hostName, VERIFY_PORT);
            String hostAddress = addr.getHostAddress();
            SocketAddress address = new InetSocketAddress(VERIFY_IP, 8010);
            Socket socket = new Socket(addr, VERIFY_PORT);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
            Socket socket = new Socket(proxy);
            int port = socket.getPort();
            System.out.println("发送登录请求:"+addr);
            System.out.println("发送登录请求:"+address);
            System.out.println("发送登录请求:"+hostName);
            System.out.println("发送登录请求:"+port);
            System.out.println("发送登录请求:"+socket.getKeepAlive());
//            System.out.println("发送登录请求:");
//            test.executeServerHttpService("srv001_signOn");
//            System.out.println("\n发送转账结果查询请求:");
//            executeServerHttpService("srv008_transferResultInfoQuery","转账结果查询","2023032910585227466");
//            System.out.println("\n发送跨行转账请求:");
//            test.executeServerHttpService("srv007_singleOuterTransfer","跨行转账",null);
//            System.out.println("\n发送行内转账请求:");
@@ -180,11 +169,11 @@
    }
    @Autowired
    @Resource
    private MallMemberWithdrawMapper mallMemberWithdrawMapper;
    @Autowired
    @Resource
    private MallMemberWithdrawMsgMapper mallMemberWithdrawMsgMapper;
    @Autowired
    @Resource
    private MallMemberBankMapper mallMemberBankMapper;
    @Override
@@ -683,6 +672,8 @@
        try {
            addr = InetAddress.getByName(VERIFY_IP);
            socket = new Socket(addr, VERIFY_PORT);
//            InetAddress localHost = addr.getLocalHost();
//            socket = new Socket(localHost, VERIFY_PORT);
            // 发送
            BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream(),"GBK"));
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -29,71 +29,71 @@
    @Autowired
    private IMemberProfitService memberProfitService;
//    @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT)
//    public void agentReturn(Message message, Channel channel) {
//        log.info("消费者:{}", new String(message.getBody()));
//    }
//
//    @RabbitListener(queues = "hlm_queue_order_delay")
//    public void orderCancelDelay(String id) {
//        try {
//            orderInfoService.autoCancelOrder(Long.parseLong(id));
//        } catch (Exception e) {
//            log.error("订单超时支付异常", e);
//        }
//    }
//
//    @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP)
//    public void agentAutoLevelUp(String id) {
//        log.info("收到合伙人自动升级消息:{}", id);
//        try {
//            agentService.autoUpAgentLevel(Long.parseLong(id));
//        } catch (Exception e) {
//            log.error("合伙人自动升级异常", e);
//        }
//    }
//
//    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
//    public void agentReturnMoney(String orderId) {
//        log.info("收到返利消息:{}", orderId);
//        try {
//            agentService.returnMoneyToAgent(Long.parseLong(orderId));
//        } catch (Exception e) {
//            log.error("返利异常", e);
//        }
//    }
//
//    @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY)
//    public void orderReturnMoney(String orderId) {
//        log.info("收到订单返利消息:{}", orderId);
//        try {
//            memberProfitService.dynamicProfit(Long.parseLong(orderId));
//        } catch (Exception e) {
//            log.error("订单返利异常:", e);
//        }
//    }
//
//    @RabbitListener(queues = QueueConstants.PERK_MONEY)
//    public void perkMoneyConsumer(String id) {
//        log.info("收到补贴消息:{}", id);
//        try {
//            agentService.perkMoneyConsumer(Long.parseLong(id));
//        } catch (Exception e) {
//            log.error("用户补贴异常", e);
//            // todo 更新表
//
//        }
//    }
//
//    @RabbitListener(queues = QueueConstants.FORCE_VOUCHER_SALE)
//    public void forceVoucherSaleConsumer(String price) {
//        log.info("收到强制卖出消息,价格:{}",price);
//        try {
//            memberProfitService.selaHalfVoucher(price);
//        } catch (Exception e) {
//            log.error("强制卖出异常", e);
//            // todo 更新表
//
//        }
//    }
    @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT)
    public void agentReturn(Message message, Channel channel) {
        log.info("消费者:{}", new String(message.getBody()));
    }
    @RabbitListener(queues = "hlm_queue_order_delay")
    public void orderCancelDelay(String id) {
        try {
            orderInfoService.autoCancelOrder(Long.parseLong(id));
        } catch (Exception e) {
            log.error("订单超时支付异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP)
    public void agentAutoLevelUp(String id) {
        log.info("收到合伙人自动升级消息:{}", id);
        try {
            agentService.autoUpAgentLevel(Long.parseLong(id));
        } catch (Exception e) {
            log.error("合伙人自动升级异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
    public void agentReturnMoney(String orderId) {
        log.info("收到返利消息:{}", orderId);
        try {
            agentService.returnMoneyToAgent(Long.parseLong(orderId));
        } catch (Exception e) {
            log.error("返利异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY)
    public void orderReturnMoney(String orderId) {
        log.info("收到订单返利消息:{}", orderId);
        try {
            memberProfitService.dynamicProfit(Long.parseLong(orderId));
        } catch (Exception e) {
            log.error("订单返利异常:", e);
        }
    }
    @RabbitListener(queues = QueueConstants.PERK_MONEY)
    public void perkMoneyConsumer(String id) {
        log.info("收到补贴消息:{}", id);
        try {
            agentService.perkMoneyConsumer(Long.parseLong(id));
        } catch (Exception e) {
            log.error("用户补贴异常", e);
            // todo 更新表
        }
    }
    @RabbitListener(queues = QueueConstants.FORCE_VOUCHER_SALE)
    public void forceVoucherSaleConsumer(String price) {
        log.info("收到强制卖出消息,价格:{}",price);
        try {
            memberProfitService.selaHalfVoucher(price);
        } catch (Exception e) {
            log.error("强制卖出异常", e);
            // todo 更新表
        }
    }
}
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -24,6 +24,9 @@
                <if test="record.name!=null and record.name!=''">
                    and m.name like concat('%',  #{record.name},'%')
                </if>
                <if test="record.accountLogin!=null and record.accountLogin!=''">
                    and m.account_login like concat('%',  #{record.accountLogin},'%')
                </if>
                <if test="record.account!=null and record.account!=''">
                    and (
                        m.phone like concat('%',  #{record.account},'%')
@@ -163,6 +166,9 @@
        left join data_dictionary_custom a on a.code = m.level
        <where>
            <if test="record != null" >
                <if test="record.accountLogin!=null and record.accountLogin!=''">
                    and m.account_login like concat('%',  #{record.accountLogin},'%')
                </if>
                <if test="record.name!=null and record.name!=''">
                    and m.name like concat('%',  #{record.name},'%')
                </if>
@@ -450,4 +456,14 @@
        select * from mall_member
        where level = #{level}
    </select>
    <select id="selectByAccountLogin" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select * from mall_member
        where account_login = #{accountLogin}
    </select>
    <select id="selectInfoByAccountLoginAndPwd" resultType="cc.mrbird.febs.mall.entity.MallMember">
        select * from mall_member
        where account_login = #{accountLogin} and password = #{password}
    </select>
</mapper>
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -47,6 +47,7 @@
        a.*,
        b.name,
        b.bind_phone bindPhone,
        b.account_login accountLogin,
        c.pay_method payMethod,
        b.phone,
        d.name fromMemberName
@@ -56,6 +57,9 @@
        left join mall_member d on d.id = a.rt_member_id
        <where>
            <if test="record != null" >
                <if test="record.accountLogin!=null and record.accountLogin!=''">
                    and b.account_login like concat('%',  #{record.accountLogin},'%')
                </if>
                <if test="record.name!=null and record.name!=''">
                    and b.name like concat('%',  #{record.name},'%')
                </if>
@@ -83,12 +87,16 @@
        a.remark remark,
        a.status status,
        b.name,
        b.account_login accountLogin,
        b.bind_phone bindPhone,
        b.phone
        from mall_member_withdraw a
        inner join mall_member b on a.member_id=b.id
        <where>
            <if test="record != null" >
                <if test="record.accountLogin!=null and record.accountLogin!=''">
                    and b.account_login like concat('%',  #{record.accountLogin},'%')
                </if>
                <if test="record.name!=null and record.name!=''">
                    and b.name like concat('%',  #{record.name},'%')
                </if>
src/main/resources/mapper/modules/MallOrderInfoMapper.xml
@@ -47,6 +47,7 @@
        select a.*,
               b.name memberName,
               b.bind_phone memberBindPhone,
               b.account_login accountLogin,
               b.phone memberPhone,
               c.goods_name
        from mall_order_item c
@@ -72,6 +73,9 @@
                <if test="record.name != null and record.name != ''">
                    and b.name like CONCAT('%', CONCAT(#{record.name}, '%'))
                </if>
                <if test="record.accountLogin != null and record.accountLogin != ''">
                    and b.account_login like CONCAT('%', CONCAT(#{record.accountLogin}, '%'))
                </if>
                <if test="record.startTime != null and record.startTime != ''">
                    and a.order_time &gt;= #{record.startTime}
                </if>
src/main/resources/mapper/modules/MallScoreAchieveReleaseMapper.xml
@@ -13,6 +13,7 @@
        select
            a.*,
               b.name name,
               b.account_login accountLogin,
               b.phone phone
        from mall_money_flow a
        left join mall_member b on b.id = a.member_id
src/main/resources/templates/febs/views/modules/mallMember/agentAllMember.html
@@ -49,8 +49,9 @@
                id: 'agentChild',
                url: ctx + 'admin/mallMember/agentChild?parentId=1',
                cols: [[
                    {field: 'accountLogin', title: '登录账户', minWidth: 150,align:'center'},
                    {field: 'name', title: '姓名', minWidth: 150,align:'center'},
                    {field: 'phone', title: '电话', minWidth: 150,align:'center',hide:toolbarAgentListChild},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'center',hide:toolbarAgentListChild},
                    {field: 'inviteId', title: '邀请码', minWidth: 150,align:'center'},
                    {field: 'levelName', title: '等级', minWidth: 150,align:'center'},
                    {field: 'amount', title: '团队业绩', minWidth: 150,align:'center'},
src/main/resources/templates/febs/views/modules/mallMember/agentList.html
@@ -8,15 +8,21 @@
                            <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="accountLogin" 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="name" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label">账号:</label>
                                        <label class="layui-form-label">手机号码:</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="账号" name="account" autocomplete="off" class="layui-input">
                                            <input type="text" placeholder="手机号码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
@@ -141,7 +147,8 @@
                url: ctx + 'admin/mallMember/getAgentList',
                cols: [[
                    // {field: 'bindPhone', title: '手机号', minWidth: 150,align:'left'},
                    {field: 'phone', title: '账号', minWidth: 150,align:'left',hide:toolbarAgentList},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left',hide:toolbarAgentList},
                    {field: 'accountLogin', title: '登录账号', minWidth: 100,align:'left'},
                    {field: 'name', title: '名称', minWidth: 100,align:'left'},
                    {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'},
                    {field: 'levelName', title: '代理层级', minWidth: 100,align:'left'},
@@ -159,6 +166,7 @@
        // 获取查询参数
        function getQueryParams() {
            return {
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
                name: $searchForm.find('input[name="name"]').val().trim(),
                account: $searchForm.find('input[name="account"]').val().trim(),
                level: $searchForm.find("select[name='level']").val(),
src/main/resources/templates/febs/views/modules/mallMember/chargeFlowList.html
@@ -8,15 +8,21 @@
                            <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="accountLogin" 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="name" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label">账号:</label>
                                        <label class="layui-form-label">手机号码:</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="账号" name="phone" autocomplete="off" class="layui-input">
                                            <input type="text" placeholder="手机号码" name="phone" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
@@ -50,6 +56,7 @@
</div>
<script type="text/html" id="charge-flow-list-option">
    {{# if(d.status === 1) { }}
<!--        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="chargeAgree:update" lay-event="chargeAgree">同意</button>-->
        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="chargeAgree:update" lay-event="chargeAgree">同意</button>
        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="searchInfo:view" lay-event="searchInfo">查询结果</button>
        <button class="layui-btn layui-btn-normal layui-btn-xs" type="button" shiro:hasPermission="accountInfo:view" lay-event="accountInfo">账户余额</button>
@@ -87,9 +94,20 @@
        table.on('tool(moneyFlowChargeTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            // if (layEvent === 'chargeAgree') {
            //     febs.modal.confirm('同意', '同意提现?', function () {
            //         chargeAgree(data.id);
            //     });
            // }
            if (layEvent === 'chargeAgree') {
                febs.modal.confirm('同意', '同意提现?', function () {
                    chargeAgree(data.id);
                febs.modal.open( '提现方式', 'modules/mallMember/chargeFlowListType/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#charge-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'chargeDisagree') {
@@ -117,16 +135,16 @@
            febs.get(ctx + 'admin/mallMember/searchInfo/' + id, null, function (data) {
                febs.alert.success(data.message);
                // febs.alert.success('操作成功');
                window.location.reload();
                // $query.click();
                // window.location.reload();
                $query.click();
            });
        }
        function accountInfo(id) {
            febs.get(ctx + 'admin/mallMember/accountInfo/' + id, null, function (data) {
                febs.alert.success(data.message);
                // febs.alert.success('操作成功');
                window.location.reload();
                // $query.click();
                // window.location.reload();
                $query.click();
            });
        }
        function chargeAgree(id) {
@@ -164,9 +182,10 @@
                totalRow: true ,// 开启合计行
                cols: [[
                    {field: 'withdrawNo', title: '编号', minWidth: 100,align:'left', totalRowText: '合计:'},
                    {field: 'accountLogin', title: '登录账户', minWidth: 100,align:'left'},
                    {field: 'name', title: '名称', minWidth: 100,align:'left'},
                    {field: 'phone', title: '账号', minWidth: 150,align:'left'},
                    {field: 'bindPhone', title: '手机号', minWidth: 150,align:'left'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left'},
                    // {field: 'bindPhone', title: '手机号', minWidth: 150,align:'left'},
                    {field: 'amount', title: '金额', minWidth: 150,align:'left',totalRow: '{{= parseInt(d.amount) }}'},
                    {field: 'amountFee', title: '手续费', minWidth: 150,align:'left',totalRow: '{{= parseInt(d.amountFee) }}'},
                    {field: 'remark', title: '类型', minWidth: 150,align:'left'},
@@ -192,6 +211,7 @@
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
                phone: $searchForm.find('input[name="phone"]').val().trim(),
                status: $searchForm.find("select[name='status']").val(),
            };
src/main/resources/templates/febs/views/modules/mallMember/chargeFlowListType.html
New file
@@ -0,0 +1,76 @@
<style>
    #charge-update {
        padding: 20px 25px 25px 0;
    }
    #charge-update .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #charge-update #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #charge-update .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
</style>
<div class="layui-fluid" id="charge-update">
    <form class="layui-form" action="" lay-filter="charge-update-form">
        <blockquote class="layui-elem-quote blue-border">请选择以下提现方式</blockquote>
        <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 sftj">
            <label class="layui-form-label febs-form-item-require">方式:</label>
            <div class="layui-input-block">
                <input type="radio" name="agreeType" value="1" title="手动转账" >
                <input type="radio" name="agreeType" value="2" title="宁波银行转账" checked="">
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="charge-update-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            formSelects = layui.formSelects,
            treeSelect = layui.treeSelect,
            form = layui.form,
            eleTree = layui.eleTree,
            chargeUpdateInfo = [[${chargeUpdateInfo}]],
            $view = $('#charge-update'),
            validate = layui.validate,
            _deptTree;
        form.render();
        initUserValue();
        function initUserValue() {
            form.val("charge-update-form", {
                "id": chargeUpdateInfo.id
            });
        }
        form.on('submit(charge-update-form-submit)', function (data) {
            febs.post(ctx + 'admin/mallMember/chargeAgreeWithType', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-money-flow-charge').find('#reset').click();
            });
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -8,6 +8,12 @@
                            <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="accountLogin" 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="name" autocomplete="off" class="layui-input">
@@ -16,7 +22,7 @@
                                    <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">
                                            <input type="text" placeholder="手机号码/邀请码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
@@ -110,6 +116,13 @@
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchInsideWith">
    {{# } }}
</script>
<script type="text/html" id="switchOutsideWith">
    {{# if(d.outsideWith === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchOutsideWith">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchOutsideWith">
    {{# } }}
</script>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
@@ -117,6 +130,7 @@
</style>
<script type="text/html" id="tableMemberBar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="exportMember">导出会员信息</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="addMember:update" lay-event="registMember">添加会员</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="mallSystemPay:update" lay-event="balance">拨付余额</button>
<!--        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="mallSystemPay:update" lay-event="score">拨付赠送积分</button>-->
@@ -130,7 +144,7 @@
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
    layui.use([ 'jquery', 'form', 'table', 'upload','febs'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
@@ -199,6 +213,18 @@
            }
        });
        function outsideWithYes(id) {
            febs.get(ctx + 'admin/mallMember/outsideWithYes/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function outsideWithNo(id) {
            febs.get(ctx + 'admin/mallMember/outsideWithNo/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function insideWithYes(id) {
            febs.get(ctx + 'admin/mallMember/insideWithYes/' + id, null, function () {
                febs.alert.success('操作成功');
@@ -264,11 +290,12 @@
                id: 'userTable',
                url: ctx + 'admin/mallMember/getMallMemberList',
                toolbar:"#tableMemberBar",
                defaultToolbar:[],
                // defaultToolbar:[],
                totalRow: true ,// 开启合计行
                cols: [[
                    {type: 'checkbox'},
                    {field: 'phone', title: '账号', minWidth: 150,align:'left',hide:toolbarMallmember},
                    {field: 'accountLogin', title: '登录账户', minWidth: 150,align:'left'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left',hide:toolbarMallmember},
                    {field: 'name', title: '名称', minWidth: 100,align:'left', totalRowText: '合计:'},
                    {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'},
                    {field: 'balance', title: '余额', minWidth: 100,align:'left',totalRow: '{{= parseInt(d.balance) }}'},
@@ -284,6 +311,7 @@
                    {field: 'creater', title: '联创', templet:'#switchCreate', minWidth: 120,align:'left' ,hide:toolbarMallmember},
                    {field: 'partner', title: '合伙人', templet:'#switchPartner', minWidth: 120,align:'left' ,hide:toolbarMallmember},
                    {field: 'insideWith', title: '是否内转', templet:'#switchInsideWith', minWidth: 120,align:'left' ,hide:toolbarMallmember},
                    {field: 'outsideWith', title: '是否提现', templet:'#switchOutsideWith', minWidth: 120,align:'left' ,hide:toolbarMallmember},
                    {field: 'accountType', title: '账号类型',
                        templet: function (d) {
                            if (d.accountType === 2) {
@@ -313,7 +341,12 @@
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'exportMember') {
                window.location.href = ctx + "admin/mallMember/exportMember";
            }
            if (layEvent === 'registMember') {
                febs.modal.open( '添加会员', 'modules/mallMember/addMember', {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
@@ -467,6 +500,7 @@
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
                account: $searchForm.find('input[name="account"]').val().trim(),
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
                accountStatus: $searchForm.find("select[name='accountStatus']").val(),
                level: $searchForm.find("select[name='level']").val(),
            };
@@ -480,6 +514,14 @@
            }
        })
        form.on('switch(switchOutsideWith)', function (data) {
            if (data.elem.checked) {
                outsideWithYes(data.value);
            } else {
                outsideWithNo(data.value);
            }
        })
        form.on('switch(switchStatus)', function (data) {
            if (data.elem.checked) {
                openAccount(data.value);
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
@@ -8,15 +8,21 @@
                            <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="accountLogin" 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="name" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label">账号:</label>
                                        <label class="layui-form-label">手机号码:</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="账号" name="phone" autocomplete="off" class="layui-input">
                                            <input type="text" placeholder="手机号码" name="phone" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
@@ -24,6 +30,7 @@
                                        <div class="layui-input-inline">
                                            <select name="type">
                                                <option value="">请选择</option>
                                                <option value="1">静态收益</option>
                                                <option value="2">直推奖</option>
                                                <option value="8">提现</option>
                                                <option value="9">转账</option>
@@ -123,8 +130,9 @@
                id: 'moneyFlowTable',
                url: ctx + 'admin/mallMember/getMoneyFlowList',
                cols: [[
                    {field: 'accountLogin', title: '登录账户', minWidth: 100,align:'left'},
                    {field: 'name', title: '名称', minWidth: 100,align:'left'},
                    {field: 'phone', title: '账号', minWidth: 150,align:'left'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left'},
                    {field: 'amount', title: '金额', minWidth: 150,align:'left'},
                    {field: 'fromMemberName', title: '来自', minWidth: 150,align:'left'},
                    {field: 'type', title: '流水类型',
@@ -216,6 +224,7 @@
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
                phone: $searchForm.find('input[name="phone"]').val().trim(),
                type: $searchForm.find("select[name='type']").val(),
                flowType: $searchForm.find("select[name='flowType']").val(),
src/main/resources/templates/febs/views/modules/mallMember/scoreAchieveReleaseList.html
@@ -30,7 +30,8 @@
                totalRow: true ,// 开启合计行
                cols: [[
                    {field: 'name', title: '名称', minWidth: 150,align:'center', totalRowText: '合计:'},
                    {field: 'phone', title: '电话', minWidth: 150,align:'center'},
                    {field: 'accountLogin', title: '登录账户', minWidth: 150,align:'center'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'center'},
                    {field: 'createdTime', title: '释放时间', minWidth: 150,align:'center'},
                    {field: 'type', title: '类型',
                        templet: function (d) {
src/main/resources/templates/febs/views/modules/order/orderList.html
@@ -7,6 +7,12 @@
                        <div class="layui-form-item">
                            <div class="layui-col-md10">
                                <div class="layui-inline">
                                    <label class="layui-form-label">登录账户:</label>
                                    <div class="layui-input-inline">
                                        <input type="text" placeholder="登录账户" name="accountLogin" 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="name" autocomplete="off" class="layui-input">
@@ -121,6 +127,7 @@
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" shiro:hasPermission="orderDetail:view" id="importDeliver" lay-event="importDeliver">导入发货</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" shiro:hasPermission="orderDetail:view" lay-event="exportDeliverDone">导出已发货订单</button>
        <button id="printSelect" type="button" class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" shiro:hasPermission="orderDetail:view">自定义打印</button>
        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" shiro:hasPermission="orderDetail:view" lay-event="exportDeliverAll">导出全部订单</button>
    </div>
</script>
<!-- 表格操作栏 end -->
@@ -165,6 +172,10 @@
            if (event == 'exportDeliver') {
                window.location.href = ctx + "admin/order/exportOrderList?orderType=1&status=2";
            }
            if (event == 'exportDeliverAll') {
                window.location.href = ctx + "admin/order/exportOrderListAll?orderType=1&status=0";
            }
            if (event == 'exportDeliverDone') {
@@ -287,9 +298,10 @@
                cols: [[
                        {type: 'checkbox',fixed: 'left'},
                        {field: 'orderNo', title: '订单编号', minWidth: 120,align:'left', totalRowText: '合计:'},
                        {field: 'accountLogin', title: '登录账户', minWidth: 120,align:'left'},
                        {field: 'memberName', title: '购买人', minWidth: 120,align:'left'},
                        {field: 'memberPhone', title: '账号', minWidth: 120,align:'left'},
                        {field: 'memberBindPhone', title: '联系方式', minWidth: 120,align:'left'},
                        {field: 'memberPhone', title: '手机号码', minWidth: 120,align:'left'},
                        // {field: 'memberBindPhone', title: '联系方式', minWidth: 120,align:'left'},
                        {field: 'goodsName', title: '商品信息', minWidth: 200,align:'left'},
                        {field: 'remark', title: '备注', minWidth: 200,align:'left'},
                        {field: 'amount', title: '订单金额', minWidth: 120,align:'left',totalRow: '{{= parseInt(d.amount) }}'},
@@ -366,6 +378,7 @@
            return {
                startTime: $searchForm.find('input[name="startTime"]').val().trim(),
                endTime: $searchForm.find('input[name="endTime"]').val().trim(),
                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
                name: $searchForm.find('input[name="name"]').val().trim(),
                orderNo: $searchForm.find('input[name="orderNo"]').val().trim(),
                goodsName: $searchForm.find('input[name="goodsName"]').val().trim(),
src/main/resources/templates/febs/views/modules/system/hlmBasicPerk.html
@@ -40,6 +40,23 @@
                        </div>
                    </div>
                </div>
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">星级每日补贴</blockquote>
                    <div class="layui-row layui-col-space10 layui-form-item">
                        <label class="layui-form-label febs-form-item-require">补贴总额:</label>
                        <div class="layui-input-block">
                            <input type="text" name="perkAgentAchieveTotal" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
                            <div class="layui-word-aux">例:15000</div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label febs-form-item-require">补贴百分比:</label>
                        <div class="layui-input-block">
                            <input type="text" name="perkAgentAchievePercent" lay-verify="required" placeholder="请输入数字" autocomplete="off" class="layui-input" >
                            <div class="layui-word-aux">例:15%,填写15</div>
                        </div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="hlm-basic-perk-submit" id="submit">保存</button>
@@ -82,6 +99,8 @@
        function initHlmBasicPerkValue() {
            form.val("hlm-basic-perk-form", {
                "perkAgentAchieveTotal": hlmBasicPerk.perkAgentAchieveTotal,
                "perkAgentAchievePercent": hlmBasicPerk.perkAgentAchievePercent,
                "sharePerk": hlmBasicPerk.sharePerk,
                "teamPerk": hlmBasicPerk.teamPerk,
                "teamEqualsPerk": hlmBasicPerk.teamEqualsPerk,
src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -37,6 +37,8 @@
@SpringBootTest
public class ProfitTest {
    @Autowired
    private IAgentService agentService;
//    @Autowired
//    private AgentConsumer agentConsumer;
//
@@ -92,6 +94,7 @@
    private NBYHService nbyhService;
    @Autowired
    private IAdminMallMemberService mallMemberService;
    @Test
    public void agentProfitTrade() {
//        try {
@@ -102,10 +105,12 @@
//        nbyhService.tradeSinge(306L);
//        nbyhService.tradeSingeOuterTransfer(306L);
//        nbyhService.accountInfoQuery(306L);
//        nbyhService.transferResultInfoQuery(306L);
//        nbyhService.transferResultInfoQuery(315L);
//        mallMemberService.chargeAgree(307L);
//        mallMemberService.searchInfo(307L);
        agentService.perkAgent();
    }
    @Test
    public void agentProfit() {