Administrator
2025-05-15 852b685fc99028dbd47f14e50939e00216ee26e7
feat(mall): 新增新人礼设置功能

- 新增新人礼设置页面和相关 API
- 实现新人礼状态切换、积分赠送和优惠券选择功能
- 优化订单支付逻辑,支持积分支付
6 files modified
2 files added
288 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/CommonDictionaryEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminScoreController.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewScoreController.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/signActivity/ApiNewGiftSettingDto.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 71 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java 16 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/score/newGiftSetting.html 102 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/CommonDictionaryEnum.java
@@ -4,6 +4,10 @@
@Getter
public enum CommonDictionaryEnum {
    /**
     * 新人礼设置
     */
    NEW_GIFT_SETTING("NEW_GIFT_SETTING", "NEW_GIFT_SETTING"),
    /**
     * 开屏页设置
src/main/java/cc/mrbird/febs/mall/controller/AdminScoreController.java
@@ -1,8 +1,10 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.CommonDictionaryEnum;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.dto.signActivity.ApiNewGiftSettingDto;
import cc.mrbird.febs.mall.service.ICommonService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -30,4 +32,14 @@
        return new FebsResponse().success();
    }
    @PostMapping(value = "/addNewGiftSetting")
    public FebsResponse addNewGiftSetting(ApiNewGiftSettingDto dto) {
        commonService.addDataDic(
                CommonDictionaryEnum.NEW_GIFT_SETTING.getType(),
                CommonDictionaryEnum.NEW_GIFT_SETTING.getCode(),
                dto,
                "新人礼设置");
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewScoreController.java
@@ -1,9 +1,11 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.enumerates.CommonDictionaryEnum;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.dto.signActivity.ApiNewGiftSettingDto;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
@@ -39,6 +41,24 @@
        return FebsUtil.view("modules/score/setting");
    }
    /**
     * 新人礼设置
     * @param model
     * @return
     */
    @GetMapping("newGiftSetting")
    public String newGiftSetting(Model model) {
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                CommonDictionaryEnum.NEW_GIFT_SETTING.getType(),
                CommonDictionaryEnum.NEW_GIFT_SETTING.getCode()
        );
        if (dic != null) {
            model.addAttribute("obj", JSONObject.parseObject(dic.getValue(), ApiNewGiftSettingDto.class));
        }
        return FebsUtil.view("modules/score/newGiftSetting");
    }
    @GetMapping("goods")
    public String goodsList() {
        return FebsUtil.view("modules/score/goodsList");
src/main/java/cc/mrbird/febs/mall/dto/signActivity/ApiNewGiftSettingDto.java
New file
@@ -0,0 +1,22 @@
package cc.mrbird.febs.mall.dto.signActivity;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "ApiNewGiftSettingDto", description = "参数类")
public class ApiNewGiftSettingDto {
    /**
     * 是否开启新人礼
     */
    private int state;
    /**
     * 积分
     */
    private String prizeScore;
    /**
     * 优惠券ID
     */
    private Long couponId;
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -357,6 +357,11 @@
        return new FebsResponse().success().message("设置成功");
    }
    public static void main(String[] args) {
        String pwd = SecureUtil.md5("123456");
        System.out.println(pwd);
    }
    @Override
    public FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto) {
        MallMember member = LoginUserUtil.getLoginUser();
@@ -1521,39 +1526,39 @@
        return new FebsResponse().success().data(apiMoneyFlowHeaderVo);
    }
    public static void main(String[] args) {
        Long userld = 16425L;
        String shopAccount = "爱和美医疗";
        String shopPwd = "blnka2005";
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("userId",userld.toString());
        //sign= MD5(shopAccount+shopPwd+userId)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        stringBuffer.append(userld);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        System.out.println(sign);
        System.out.println(objectObjectHashMap);
        String url = "https://data.muchun.co/api/getCustomerCheckRecords";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode){
            System.out.println(message);
        }
        JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
        System.out.println(data);
    }
//    public static void main(String[] args) {
//        Long userld = 16425L;
//        String shopAccount = "爱和美医疗";
//        String shopPwd = "blnka2005";
//
//        HashMap<String, String> objectObjectHashMap = new HashMap<>();
//
//        objectObjectHashMap.put("shopAccount",shopAccount);
//        objectObjectHashMap.put("shopPwd",shopPwd);
//        objectObjectHashMap.put("userId",userld.toString());
//
//        //sign= MD5(shopAccount+shopPwd+userId)
//        StringBuffer stringBuffer = new StringBuffer();
//        stringBuffer.append(shopAccount);
//        stringBuffer.append(shopPwd);
//        stringBuffer.append(userld);
//        String sign = MD5.MD5Encode(stringBuffer.toString());
//        objectObjectHashMap.put("sign",sign);
//
//        System.out.println(sign);
//
//        System.out.println(objectObjectHashMap);
//        String url = "https://data.muchun.co/api/getCustomerCheckRecords";
//        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
//        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
//        String message = JSONUtil.parseObj(result).getStr("message");
//        if(0 != retCode){
//            System.out.println(message);
//        }
//
//        JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
//        System.out.println(data);
//    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -543,23 +543,23 @@
        if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
            throw new FebsException("订单状态不能支付");
        }
        //先支付积分部分
        if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){
            balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore");
            mallMoneyFlowService.addMoneyFlow(
                    member.getId(),
                    orderInfo.getAmount().negate(),
                    ScoreFlowTypeEnum.PAY.getValue(),
                    orderInfo.getOrderNo(),
                    FlowTypeEnum.PRIZE_SCORE.getValue(),
                    StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),orderInfo.getScoreAmount()),
                    2
            );
        }
        String payResultStr = "";
        String wxResultStr = "";
        if(orderInfo.getAmount().compareTo(BigDecimal.ZERO) <= 0){
            //先支付积分部分
            if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){
                balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore");
                mallMoneyFlowService.addMoneyFlow(
                        member.getId(),
                        orderInfo.getScoreAmount().negate(),
                        ScoreFlowTypeEnum.PAY.getValue(),
                        orderInfo.getOrderNo(),
                        FlowTypeEnum.PRIZE_SCORE.getValue(),
                        StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),orderInfo.getScoreAmount()),
                        2
                );
            }
            orderInfo.setPayOrderNo(orderInfo.getOrderNo());
            orderInfo.setPayMethod("积分支付");
            orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
@@ -591,8 +591,23 @@
                    agentProducer.sendOrderReturn(orderInfo.getId());
                    break;
                case "3":
                    payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance");
                    //先支付积分部分
                    if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){
                        balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore");
                        mallMoneyFlowService.addMoneyFlow(
                                member.getId(),
                                orderInfo.getScoreAmount().negate(),
                                ScoreFlowTypeEnum.PAY.getValue(),
                                orderInfo.getOrderNo(),
                                FlowTypeEnum.PRIZE_SCORE.getValue(),
                                StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),orderInfo.getScoreAmount()),
                                2
                        );
                    }
                    orderInfo.setPayOrderNo(orderInfo.getOrderNo());
                    orderInfo.setPayMethod("余额支付");
                    orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -23,6 +23,7 @@
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 cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -320,6 +321,21 @@
                            order.setPayOrderNo(transaction_id);
                            mallOrderInfoMapper.updateById(order);
                            //先支付积分部分
                            if(order.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){
                                memberWalletService.reduce(order.getScoreAmount(), order.getMemberId(), "prizeScore");
                                mallMoneyFlowService.addMoneyFlow(
                                        order.getMemberId(),
                                        order.getScoreAmount().negate(),
                                        ScoreFlowTypeEnum.PAY.getValue(),
                                        order.getOrderNo(),
                                        FlowTypeEnum.PRIZE_SCORE.getValue(),
                                        StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),order.getScoreAmount()),
                                        2
                                );
                            }
                            agentProducer.sendOrderCoupon(order.getId());
//                            agentProducer.sendGetScoreMsg(order.getId());
src/main/resources/templates/febs/views/modules/score/newGiftSetting.html
New file
@@ -0,0 +1,102 @@
<div class="layui-fluid layui-anim febs-anim" id="new-gift-setting" lay-title="新人礼设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="new-gift-setting-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">基本规则:</blockquote>
                    <div class="layui-form-item">
                        <label class="layui-form-label">新人礼:</label>
                        <div class="layui-input-block">
                            <input type="radio" name="state" value="0" title="关闭" />
                            <input type="radio" name="state" value="1" title="开启" checked/>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">赠送积分:</label>
                        <div class="layui-input-inline" style="width: 120px">
                            <input type="text" name="prizeScore" lay-verify="number" th:value="${obj != null ? obj.prizeScore : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">优惠卷:</label>
                        <div class="layui-input-inline">
                            <select name="couponId" class="coupon-select-category" id="couponCategarySelect">
                                <option value="">请选择</option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="new-gift-setting-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
<!--        <div class="layui-form-item febs-hide">-->
<!--            <button class="layui-btn" lay-submit="" lay-filter="new-gift-setting-form-submit" id="submit-form"></button>-->
<!--            <button type="reset" class="layui-btn" id="reset"></button>-->
<!--        </div>-->
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree', 'xmSelect'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            validate = layui.validate,
            obj = [[${obj}]],
            $view = $('#new-gift-setting');
        //(下拉框)
        $.get(ctx + 'admin/goods/coupon/tree', function (data) {
            for (var k in data)
            {
                $(".coupon-select-category").append("<option value='" + data[k].couponId + "'>" + data[k].couponName + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                // //如果obj.couponId不为空,则赋值
                // if (null != obj.couponId) {
                    $("#couponCategarySelect").val(obj.couponId);
                // }
                form.render();
            });
        });
        form.verify(validate);
        initNewGiftValue();
        function initNewGiftValue() {
            form.val("new-gift-setting-form", {
                "state": obj.state,
                "prizeScore": obj.prizeScore,
                "couponId": obj.couponId,
            });
        }
        form.on('submit(new-gift-setting-form-submit)', function (data) {
            console.log(data);
            febs.post(ctx + 'admin/score/addNewGiftSetting', data.field, function (res) {
                febs.alert.success('设置成功');
            });
            return false;
        });
    });
</script>