| | |
| | | |
| | | /** |
| | | * |
| | | * 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-董事收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款 |
| | | * 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款 |
| | | * @author wzy |
| | | * @date 2021-09-24 |
| | | **/ |
| | |
| | | RANK_BONUS(4), |
| | | |
| | | /** |
| | | * 董事收益 |
| | | * 总监收益 |
| | | */ |
| | | DIRECTOR_BONUS(5), |
| | | |
| | |
| | | log.info("/ /` / / \\ | |\\/| | |_) | | | |_ | | | |_ "); |
| | | log.info("\\_\\_, \\_\\_/ |_| | |_| |_|__ |_|__ |_| |_|__ "); |
| | | log.info(" "); |
| | | log.info("全民商城 权限系统启动完毕,地址:{}", url); |
| | | log.info("中基商城 权限系统启动完毕,地址:{}", url); |
| | | |
| | | boolean auto = febsProperties.isAutoOpenBrowser(); |
| | | if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) { |
| | |
| | | @ApiModelProperty(value = "页码", example = "1") |
| | | private Integer pageNum; |
| | | |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-董事收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "类型 1-全部 2-支出 3-收入") |
| | |
| | | private BigDecimal score; |
| | | @TableField(exist = false) |
| | | private BigDecimal prizeScore; |
| | | @TableField(exist = false) |
| | | private BigDecimal commission; |
| | | |
| | | @TableField(exist = false) |
| | | private BigDecimal amount; |
| | |
| | | private BigDecimal amount; |
| | | |
| | | /** |
| | | * 类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-董事收益 6-社区点补 7-一代收益 8-提现 9-转增 |
| | | * 类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 |
| | | */ |
| | | private Integer type; |
| | | |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.STATIC_BONUS.getType(), DataDictionaryEnum.STATIC_BONUS.getCode()); |
| | | BigDecimal perProfit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); |
| | | |
| | | Map<Long, List<Map<String, Object>>> map = new HashMap<>(); |
| | | Map<Long, BigDecimal> goodsProp = new HashMap<>(); |
| | | for (MallMember member : members) { |
| | | List<MallGoods> goodsList = mallGoodsMapper.selectOrderGoodsList(member.getId(), profitDate); |
| | | |
| | |
| | | continue; |
| | | } |
| | | |
| | | BigDecimal goodsProfit = goods.getStaticProp().multiply(perProfit); |
| | | |
| | | int reduce = walletService.reduce(goodsProfit, member.getId(), "score"); |
| | | if (reduce == 2) { |
| | | break; |
| | | List<Map<String, Object>> list = map.get(goods.getId()); |
| | | if (CollUtil.isEmpty(list)) { |
| | | list = new ArrayList<>(); |
| | | } |
| | | |
| | | walletService.add(goodsProfit, member.getId(), "commission"); |
| | | moneyFlowService.addMoneyFlow(member.getId(), goodsProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), goods.getOrderNo(), FlowTypeEnum.COMMISSION.getValue()); |
| | | moneyFlowService.addMoneyFlow(member.getId(), goodsProfit.negate(), MoneyFlowTypeEnum.STATIC_BONUS.getValue(), goods.getOrderNo(), FlowTypeEnum.SCORE.getValue()); |
| | | Map<String, Object> listItem = new HashMap<>(); |
| | | listItem.put("memberId", member.getId()); |
| | | listItem.put("orderNo", goods.getOrderNo()); |
| | | list.add(listItem); |
| | | |
| | | map.put(goods.getId(), list); |
| | | goodsProp.put(goods.getId(), goods.getStaticProp()); |
| | | } |
| | | } |
| | | |
| | | if (!map.isEmpty()) { |
| | | for (Map.Entry<Long, List<Map<String, Object>>> entry : map.entrySet()) { |
| | | List<Map<String, Object>> list = entry.getValue(); |
| | | BigDecimal staticProfit = goodsProp.get(entry.getKey()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).multiply(perProfit); |
| | | BigDecimal preStaticProfit = staticProfit.divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP); |
| | | |
| | | for (Map<String, Object> item : list) { |
| | | Long memberId = (Long) item.get("memberId"); |
| | | String orderNo = (String) item.get("orderNo"); |
| | | |
| | | int reduce = walletService.reduce(preStaticProfit, memberId, "score"); |
| | | if (reduce == 2) { |
| | | break; |
| | | } |
| | | |
| | | walletService.add(preStaticProfit, memberId, "commission"); |
| | | moneyFlowService.addMoneyFlow(memberId, preStaticProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo, FlowTypeEnum.COMMISSION.getValue()); |
| | | moneyFlowService.addMoneyFlow(memberId, preStaticProfit.negate(), MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo, FlowTypeEnum.SCORE.getValue()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANK_BONUS.getType(), DataDictionaryEnum.RANK_BONUS.getCode()); |
| | | |
| | | |
| | | BigDecimal rankBonusTotal = new BigDecimal(dic.getValue()).divide(totalIncome, 2, RoundingMode.HALF_UP); |
| | | BigDecimal rankBonusTotal = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)); |
| | | BigDecimal preBonus = rankBonusTotal.divide(BigDecimal.valueOf(100),2 , RoundingMode.HALF_UP); |
| | | |
| | | int i = 0; |
| | |
| | | @ApiModelProperty(value = "金额,有正负") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-董事收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "对方手机号") |
| | |
| | | @Override |
| | | public String aliPay(MallOrderInfo orderInfo) { |
| | | AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); |
| | | model.setSubject("全民商城商品支付"); |
| | | model.setSubject("中基商城商品支付"); |
| | | model.setBody(orderInfo.getName()); |
| | | model.setOutTradeNo(orderInfo.getOrderNo()); |
| | | model.setTimeoutExpress("15m"); |
| | |
| | | select a.*,c.order_no from mall_goods a |
| | | inner join mall_order_item b on a.id=b.goods_id |
| | | inner join mall_order_info c on b.order_id=c.ID |
| | | where c.status=4 |
| | | where c.status in (2, 3, 4) and b.is_normal=2 |
| | | <if test="memberId != null"> |
| | | and c.member_id=#{memberId} |
| | | </if> |
| | | <if test="date != null"> |
| | | and date_format(c.receving_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') |
| | | and date_format(c.pay_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') |
| | | </if> |
| | | </select> |
| | | </mapper> |
| | |
| | | <mapper namespace="cc.mrbird.febs.mall.mapper.MallMemberMapper"> |
| | | |
| | | <select id="selectMallMemberListInPage" resultType="cc.mrbird.febs.mall.entity.MallMember"> |
| | | SELECT m.*,a.name referrerName,IFNULL(c.balance,0) balance,IFNULL(c.score,0) score,IFNULL(c.prize_score,0) prizeScore |
| | | SELECT m.*,a.name referrerName,IFNULL(c.balance,0) balance,IFNULL(c.score,0) score,IFNULL(c.prize_score,0) prizeScore,IFNULL(c.commission,0) commission |
| | | ,d.description levelName |
| | | FROM mall_member m |
| | | left join mall_member a on m.referrer_id = a.invite_id |
| | |
| | | <if test="record.accountType != null" > |
| | | and m.account_type = #{record.accountType} |
| | | </if> |
| | | <if test="record.level!=null and record.level!=''"> |
| | | and m.level=#{record.level} |
| | | </if> |
| | | </if> |
| | | </where> |
| | | order by m.CREATED_TIME desc |
| | |
| | | <html xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>全民商城 权限系统</title> |
| | | <title>中基商城 权限系统</title> |
| | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | |
| | | <html xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>全民商城 权限系统</title> |
| | | <title>中基商城 权限系统</title> |
| | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | |
| | | <html xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>全民商城 权限系统</title> |
| | | <title>中基商城 权限系统</title> |
| | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | |
| | | <div class="layui-side-scroll"> |
| | | <div class="layui-logo" style="cursor: pointer"> |
| | | <img data-th-src="@{febs/images/logo.png}"> |
| | | <span>全民商城 权限系统</span> |
| | | <span>中基商城 权限系统</span> |
| | | </div> |
| | | <script |
| | | type="text/html" |
| | |
| | | <html xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>全民商城 权限系统</title> |
| | | <title>中基商城 权限系统</title> |
| | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | |
| | | <div class="layui-container"> |
| | | <div class="layui-row"> |
| | | <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4 febs-tc"> |
| | | <div class="layui-logo"><span><b>全民商城</b> 权限系统</span></div> |
| | | <div class="layui-logo"><span><b>中基商城</b> 权限系统</span></div> |
| | | </div> |
| | | <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4" id="login-div"> |
| | | <div class="layui-form" lay-filter="login-form"> |
| | |
| | | </button> |
| | | </div> |
| | | </div> |
| | | <div class="layui-form-item febs-tr"> |
| | | <a id="regist-href">注册账号</a> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4 febs-hide" id="regist-div"> |
| | | <div class="layui-form" lay-filter="regist-form"> |
| | | <div class="layui-anim layui-anim-upbit"> |
| | | <ul class="login-type-tab"> |
| | | <li class="active">账号注册</li> |
| | | </ul> |
| | | <div class="normal-login-form"> |
| | | <div class="layui-form-item"> |
| | | <label class="layui-icon label-icon layui-icon-username"></label> |
| | | <input type="text" name="username" minlength="2" maxlength="10" lay-verify="range" |
| | | placeholder="用户名" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | <div class="layui-form-item password-block"> |
| | | <label class="layui-icon label-icon layui-icon-password"></label> |
| | | <input type="password" name="password" minlength="6" lay-verify="range" |
| | | placeholder="密码" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | <div class="layui-form-item password-block"> |
| | | <label class="layui-icon label-icon layui-icon-password"></label> |
| | | <input type="password" name="passwordB" lay-verify="required" |
| | | placeholder="密码确认" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | <div class="layui-form-item"> |
| | | <button class="layui-btn layui-btn-normal layui-btn-fluid" lay-submit |
| | | lay-filter="regist-submit" id="regist"> |
| | | <i style="display: none" |
| | | class="layui-icon layui-icon-loading layui-icon layui-anim layui-anim-rotate layui-anim-loop"></i> |
| | | 立即注册 |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="layui-form-item febs-tr"> |
| | | <a id="login-href">已有账号?马上登录</a> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | layer.msg(r.message); |
| | | loading.hide(); |
| | | initCode(); |
| | | } |
| | | }); |
| | | return false; |
| | | }); |
| | | |
| | | //提交注册表单 |
| | | form.on('submit(regist-submit)', function (data) { |
| | | if (data.field.password !== data.field.passwordB) { |
| | | layer.msg('两次密码输入不一致!'); |
| | | return; |
| | | } |
| | | var loading = $(this).find('.layui-icon'); |
| | | if (loading.is(":visible")) return; |
| | | loading.show(); |
| | | $.post(ctx + 'regist', data.field, function (r) { |
| | | if (r.code === 200) { |
| | | layer.msg('注册成功,请登录'); |
| | | loading.hide(); |
| | | $view.find('#login-href').trigger('click'); |
| | | } else { |
| | | layer.msg(r.message); |
| | | loading.hide(); |
| | | } |
| | | }); |
| | | return false; |
| | |
| | | <select name="level"> |
| | | <option value="">请选择</option> |
| | | <option value="FIRST_LEVEL">普通会员</option> |
| | | <option value="SECOND_LEVEL">区级代理</option> |
| | | <option value="THIRD_LEVEL">市级代理</option> |
| | | <option value="FOUR_LEVEL">省级代理</option> |
| | | <option value="FIFTH_LEVEL">全国总代</option> |
| | | <option value="SECOND_LEVEL">一星</option> |
| | | <option value="THIRD_LEVEL">二星</option> |
| | | <option value="FOUR_LEVEL">三星</option> |
| | | <option value="FIFTH_LEVEL">四星</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">会员类型</label> |
| | | <div class="layui-input-inline"> |
| | | <select name="level"> |
| | | <option value="">请选择</option> |
| | | <option value="FIRST_LEVEL">普通会员</option> |
| | | <option value="SECOND_LEVEL">一星</option> |
| | | <option value="THIRD_LEVEL">二星</option> |
| | | <option value="FOUR_LEVEL">三星</option> |
| | | <option value="FIFTH_LEVEL">四星</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> |
| | |
| | | cols: [[ |
| | | {type: 'checkbox'}, |
| | | {field: 'phone', title: '账号', minWidth: 150,align:'left'}, |
| | | {field: 'bindPhone', title: '手机号', minWidth: 150,align:'left'}, |
| | | {field: 'name', title: '名称', minWidth: 100,align:'left'}, |
| | | {field: 'balance', title: '余额', minWidth: 100,align:'left'}, |
| | | {field: 'score', title: '赠送积分', minWidth: 100,align:'left'}, |
| | | {field: 'prizeScore', title: '竞猜积分', minWidth: 100,align:'left'}, |
| | | {field: 'commission', title: '佣金', minWidth: 100,align:'left'}, |
| | | {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'}, |
| | | {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'}, |
| | | {field: 'levelName', title: '会员类型', minWidth: 100,align:'left'}, |
| | | {field: 'storeMaster', title: '店长', templet:'#switchStoreMaster', minWidth: 100}, |
| | | {field: 'director', title: '董事', templet:'#switchDirector', minWidth: 100}, |
| | | {field: 'director', title: '总监', templet:'#switchDirector', minWidth: 100}, |
| | | {field: 'accountType', title: '账号类型', |
| | | templet: function (d) { |
| | | if (d.accountType === 2) { |
| | |
| | | name: $searchForm.find('input[name="name"]').val().trim(), |
| | | account: $searchForm.find('input[name="account"]').val().trim(), |
| | | accountStatus: $searchForm.find("select[name='accountStatus']").val(), |
| | | level: $searchForm.find("select[name='level']").val(), |
| | | }; |
| | | } |
| | | |
| | |
| | | } else if (d.type === 4) { |
| | | return '<span>排名收益</span>' |
| | | }else if (d.type === 5) { |
| | | return '<span>董事收益</span>' |
| | | return '<span>总监收益</span>' |
| | | }else if (d.type === 6) { |
| | | return '<span>社区店补</span>' |
| | | }else if (d.type === 7) { |
| | |
| | | <option value="2">直推奖</option> |
| | | <option value="3">代理收益</option> |
| | | <option value="4">排名收益</option> |
| | | <option value="5">董事收益</option> |
| | | <option value="5">总监收益</option> |
| | | <option value="6">社区店补</option> |
| | | <option value="7">一代收益</option> |
| | | <option value="8">提现</option> |
| | |
| | | } else if (d.type === 4) { |
| | | return '<span>排名收益</span>' |
| | | }else if (d.type === 5) { |
| | | return '<span>董事收益</span>' |
| | | return '<span>总监收益</span>' |
| | | }else if (d.type === 6) { |
| | | return '<span>社区店补</span>' |
| | | }else if (d.type === 7) { |
| | |
| | | xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <title>全民商城 权限系统</title> |
| | | <title>中基商城 权限系统</title> |
| | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | |
| | | |
| | | @Test |
| | | public void insertAgentTest() { |
| | | AgentInfo agentInfo = new AgentInfo(); |
| | | agentInfo.setOrderType(2); |
| | | agentInfo.setOrderCnt(2000); |
| | | agentInfo.setLastCnt(3); |
| | | agentInfo.setDirectIncome(BigDecimal.valueOf(50)); |
| | | agentInfo.setTeamIncome(BigDecimal.valueOf(15)); |
| | | agentInfo.setTeamIncomeType(2); |
| | | |
| | | DataDictionaryCustom data = new DataDictionaryCustom(); |
| | | data.setType("AGENT_LEVEL_REQUIRE"); |
| | | data.setCode(AgentLevelEnum.FOUR_LEVEL.name()); |
| | | data.setValue(JSONObject.toJSONString(agentInfo)); |
| | | dataDictionaryCustomMapper.insert(data); |
| | | // AgentInfo agentInfo = new AgentInfo(); |
| | | // agentInfo.setOrderType(2); |
| | | // agentInfo.setOrderCnt(2000); |
| | | // agentInfo.setLastCnt(3); |
| | | // agentInfo.setDirectIncome(BigDecimal.valueOf(50)); |
| | | // agentInfo.setTeamIncome(BigDecimal.valueOf(15)); |
| | | // agentInfo.setTeamIncomeType(2); |
| | | // |
| | | // DataDictionaryCustom data = new DataDictionaryCustom(); |
| | | // data.setType("AGENT_LEVEL_REQUIRE"); |
| | | // data.setCode(AgentLevelEnum.FOUR_LEVEL.name()); |
| | | // data.setValue(JSONObject.toJSONString(agentInfo)); |
| | | // dataDictionaryCustomMapper.insert(data); |
| | | } |
| | | |
| | | @Test |
| | |
| | | memberProfitService.dynamicProfit(59L); |
| | | } |
| | | |
| | | |
| | | @Test |
| | | public void staticProfit() { |
| | | memberProfitService.staticProfit(); |
| | | } |
| | | |
| | | @Test |
| | | public void thankfulProfit() { |
| | | memberProfitService.thankfulProfit(); |
| | | } |
| | | |
| | | @Test |
| | | public void rankProfit() { |
| | | memberProfitService.rankProfit(); |
| | | } |
| | | |
| | | @Autowired |
| | | private MallOrderInfoMapper mallOrderInfoMapper; |
| | | |