KKSU
2024-12-19 32185e7f8501b2cd1db3dede0bb555b4039c5ac2
feat(mall): 添加跑腿会员系统设置功能

- 新增系统设置页面和相关控制器方法
- 实现跑腿会员系统设置的后端逻辑
- 优化数据字典枚举类
-移除不必要的定时任务代码
8 files modified
1 files added
527 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java 8 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminRunVipController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewRunVipController.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java 77 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java 97 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java 95 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java 140 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/DataDictionaryCustomMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/systemSetting.html 94 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
@@ -6,12 +6,12 @@
public enum RunVipDataDictionaryEnum {
    //释放碳积分的开始结束时间
    RUN_START_TIME("RUN_START_TIME", "RUN_START_TIME"),
    RUN_END_TIME("RUN_END_TIME", "RUN_END_TIME"),
    RUN_START_TIME("CHARGE_TYPE", "RUN_START_TIME"),
    RUN_END_TIME("CHARGE_TYPE", "RUN_END_TIME"),
    //充值类型
    CHARGE_TYPE_TRC("CHARGE_TYPE", "CHARGE_TYPE_TRC"),
    CHARGE_TYPE_BSC("CHARGE_TYPE", "CHARGE_TYPE_BSC"),
    CHARGE_TYPE_TRC("CHARGE_TYPE_TRC", "CHARGE_TYPE_TRC"),
    CHARGE_TYPE_BSC("CHARGE_TYPE_BSC", "CHARGE_TYPE_BSC"),
    //系统充值失效时间
    CHARGE_SYS_FAIL_TIME("CHARGE_TYPE", "CHARGE_SYS_FAIL_TIME"),
src/main/java/cc/mrbird/febs/mall/controller/AdminRunVipController.java
@@ -10,6 +10,7 @@
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.service.IAdminRunVipService;
import cc.mrbird.febs.mall.service.ISystemService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
@@ -27,6 +28,13 @@
    private final IAdminRunVipService iAdminRunVipService;
    private final MallMemberMapper mallMemberMapper;
    private final ISystemService systemService;
    @PostMapping(value = "/bonusSystemSetting")
    public FebsResponse bonusSystemSetting(@RequestBody Map<String, Object> map) {
        systemService.bonusSystemSetting(map);
        return new FebsResponse().success().message("设置成功");
    }
    @GetMapping(value = "/allMoneyType")
    public FebsResponse allMoneyType() {
src/main/java/cc/mrbird/febs/mall/controller/ViewRunVipController.java
@@ -46,4 +46,10 @@
        return FebsUtil.view("modules/runVip/vipEdit");
    }
    @GetMapping("systemSetting")
    @RequiresPermissions("systemSetting:view")
    public String vipCenterSetting() {
        return FebsUtil.view("modules/runVip/systemSetting");
    }
}
src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
@@ -1,14 +1,9 @@
package cc.mrbird.febs.mall.quartz;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.pay.util.WechatConfigure;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.exceptions.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@@ -24,41 +19,41 @@
    @Resource
    RestTemplate restTemplate;
    @Scheduled(cron = "0 0 1 * * ? ")
    public void getAccessToken(){
        // 官网获取的 API Key 更新为你注册的
        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + clientId
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + clientSecret;
        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
        /**
         * 返回结果
         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
         */
        if (!jsonStr.contains("access_token")) {
            System.out.println("获取access_token失败");
        }
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        String accessToken = jsonObject.getString("access_token");
        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
        if (StrUtil.isEmpty(accessToken)) {
            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
            throw new ApiException("获取access token失败");
        } else {
            log.info("baidu access_token : {}",accessToken);
            System.out.println(accessToken);
            redisUtils.set(accessTokenKey,accessToken);
        }
    }
//    @Scheduled(cron = "0 0 1 * * ? ")
//    public void getAccessToken(){
//        // 官网获取的 API Key 更新为你注册的
//        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
//        // 官网获取的 Secret Key 更新为你注册的
//        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
//        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
//        String getAccessTokenUrl = authHost
//                // 1. grant_type为固定参数
//                + "grant_type=client_credentials"
//                // 2. 官网获取的 API Key
//                + "&client_id=" + clientId
//                // 3. 官网获取的 Secret Key
//                + "&client_secret=" + clientSecret;
//        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
//
//        /**
//         * 返回结果
//         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
//         */
//        if (!jsonStr.contains("access_token")) {
//            System.out.println("获取access_token失败");
//        }
//        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
//        String accessToken = jsonObject.getString("access_token");
//
//        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
//        if (StrUtil.isEmpty(accessToken)) {
//            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
//            throw new ApiException("获取access token失败");
//        } else {
//            log.info("baidu access_token : {}",accessToken);
//            System.out.println(accessToken);
//            redisUtils.set(accessTokenKey,accessToken);
//        }
//    }
}
src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
@@ -1,21 +1,10 @@
package cc.mrbird.febs.mall.quartz;
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
 * @author wzy
@@ -44,51 +33,51 @@
    @Autowired
    private MallMemberCouponMapper mallMemberCouponMapper;
    @Scheduled(cron = "0 0/5 * * * ? ")
    public void overtimeJob() {
        log.info("订单超时任务执行");
        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoUpTime(OrderStatusEnum.WAIT_PAY.getValue());
        if (CollUtil.isNotEmpty(orderList)) {
            for (MallOrderInfo orderInfo : orderList) {
                //更新订单状态
                orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
                orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
                orderInfoMapper.updateById(orderInfo);
                List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfo.getId());
                if(CollUtil.isNotEmpty(mallOrderItemList)){
                    for(MallOrderItem mallOrderItem : mallOrderItemList){
                        MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
                        if (sku == null) {
                            throw new FebsException("购买商品或sku不存在");
                        }
//                        if (sku.getStock() < mallOrderItem.getCnt()) {
//    @Scheduled(cron = "0 0/5 * * * ? ")
//    public void overtimeJob() {
//        log.info("订单超时任务执行");
//        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoUpTime(OrderStatusEnum.WAIT_PAY.getValue());
//        if (CollUtil.isNotEmpty(orderList)) {
//            for (MallOrderInfo orderInfo : orderList) {
//                //更新订单状态
//                orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
//                orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
//                orderInfoMapper.updateById(orderInfo);
//
//                List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfo.getId());
//                if(CollUtil.isNotEmpty(mallOrderItemList)){
//                    for(MallOrderItem mallOrderItem : mallOrderItemList){
//                        MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
//                        if (sku == null) {
//                            throw new FebsException("购买商品或sku不存在");
//                        }
//
////                        if (sku.getStock() < mallOrderItem.getCnt()) {
////                            throw new FebsException(sku.getSkuName() + "库存不足");
////                        }
//
//                        MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
//                        Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
//                        if(1 != goodsResult){
//                            throw new FebsException(mallGoods.getGoodsName() + "库存不足");
//                        }
//
//                        Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
//                        if(1 != skuResult){
//                            throw new FebsException(sku.getSkuName() + "库存不足");
//                        }
                        MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                        Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
                        if(1 != goodsResult){
                            throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                        }
                        Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
                        if(1 != skuResult){
                            throw new FebsException(sku.getSkuName() + "库存不足");
                        }
                        Long memberCouponId = mallOrderItem.getMemberCouponId();
                        MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
                        if(ObjectUtil.isNotEmpty(mallMemberCoupon)){
                            mallMemberCoupon.setState(1);
                            mallMemberCouponMapper.updateById(mallMemberCoupon);
                        }
                    }
                }
            }
        }
    }
//                        Long memberCouponId = mallOrderItem.getMemberCouponId();
//                        MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
//                        if(ObjectUtil.isNotEmpty(mallMemberCoupon)){
//                            mallMemberCoupon.setState(1);
//                            mallMemberCouponMapper.updateById(mallMemberCoupon);
//                        }
//                    }
//                }
//            }
//        }
//
//    }
//    @Scheduled(cron = "0/5 * * * * ? ")
//    public void wakeup() {
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
@@ -1,24 +1,15 @@
package cc.mrbird.febs.mall.quartz;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallAchieveService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
 * @author wzy
@@ -100,49 +91,49 @@
    /**
     * 自动确认收货
     */
    @Scheduled(cron = "0 0 0 * * ?")
//    @Scheduled(cron = "1 * * * * ?")
    public void orderAutoConfirmJob() {
        log.info("自动确认收货");
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.OEDER_AUTO_CONFIRM.getType(), DataDictionaryEnum.OEDER_AUTO_CONFIRM.getCode());
        Integer value = Integer.parseInt(dic.getValue());
        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderByStatusAndPayTime(3,DateUtil.offsetDay(new Date(), -value));
        if(CollUtil.isNotEmpty(orderInfos)){
//            for(MallOrderInfo orderInfo : orderInfos){
//                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
//                Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch();
//                if(1 == profitSwitch){
//                    BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
////                DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
////                BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
//                    //生成一条团长提成记录
//                    Long id = orderInfo.getId();
//                    List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
//                    if(CollUtil.isNotEmpty(mallOrderItemList)){
//                        for(MallOrderItem mallOrderItem : mallOrderItemList){
//                            Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState();
//                            if(1 == state){
//                                MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
//                                mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
//                                mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
//                                mallLeaderAchieve.setOrderItemId(mallOrderItem.getId());
//                                BigDecimal itemAmount = mallOrderItem.getAmount();
//                                mallLeaderAchieve.setAmount(itemAmount);
//                                BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN);
//                                mallLeaderAchieve.setProfitAmount(bigDecimal);
//                                mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
//                                mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
//                                mallLeaderAchieveMapper.insert(mallLeaderAchieve);
//                            }
//                        }
//                    }
//                }
//            }
            mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value));
        }
    }
//    @Scheduled(cron = "0 0 0 * * ?")
//
////    @Scheduled(cron = "1 * * * * ?")
//    public void orderAutoConfirmJob() {
//        log.info("自动确认收货");
//        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.OEDER_AUTO_CONFIRM.getType(), DataDictionaryEnum.OEDER_AUTO_CONFIRM.getCode());
//        Integer value = Integer.parseInt(dic.getValue());
//        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderByStatusAndPayTime(3,DateUtil.offsetDay(new Date(), -value));
//        if(CollUtil.isNotEmpty(orderInfos)){
////            for(MallOrderInfo orderInfo : orderInfos){
////                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
////                Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch();
////                if(1 == profitSwitch){
////                    BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
//////                DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
//////                BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
////                    //生成一条团长提成记录
////                    Long id = orderInfo.getId();
////                    List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
////                    if(CollUtil.isNotEmpty(mallOrderItemList)){
////                        for(MallOrderItem mallOrderItem : mallOrderItemList){
////                            Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState();
////                            if(1 == state){
////                                MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
////                                mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
////                                mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
////                                mallLeaderAchieve.setOrderItemId(mallOrderItem.getId());
////                                BigDecimal itemAmount = mallOrderItem.getAmount();
////                                mallLeaderAchieve.setAmount(itemAmount);
////                                BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN);
////                                mallLeaderAchieve.setProfitAmount(bigDecimal);
////                                mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
////                                mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
////                                mallLeaderAchieveMapper.insert(mallLeaderAchieve);
////                            }
////                        }
////                    }
////                }
////            }
//            mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value));
//
//        }
//    }
    /**
     * 团长第二天才会结算前一天的所有提成
     * 从团长业绩表中查询出前一天的所有已完成订单金额*提成系数,得到今日提成
src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
@@ -1,94 +1,80 @@
package cc.mrbird.febs.mall.quartz;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextHolder;
import cc.mrbird.febs.mall.entity.MallMemberCoupon;
import cc.mrbird.febs.mall.mapper.MallMemberCouponMapper;
import cc.mrbird.febs.mall.service.MallInvoiceService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Component
@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
public class WxxcxJob {
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private MallMemberCouponMapper mallMemberCouponMapper;
    @Autowired
    private MallInvoiceService mallInvoiceService;
    @Resource
    RestTemplate restTemplate;
//    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
//
//    @Autowired
//    private SpringContextHolder springContextHolder;
    /**
     * 获取access_token
     * 有效期两小时
     */
//    @Scheduled(cron = "0 0 0/1 * * ? ")
//    public void getAccessToken() throws IOException {
//        log.info("执行access_token刷新");
//        String appId = xcxProperties.getXcxAppid();
//        String appSecret = xcxProperties.getXcxSecret();
//        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
//        String jsonStr = restTemplate.getForObject(url, String.class);
//
//        /**
//         * 返回结果
//         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
//         */
//        if (!jsonStr.contains("access_token")) {
//            System.out.println("获取微信access_token失败");
//        }
//
//        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
//        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
//        String accessToken = jsonObject.getString(accessTokenKey);
//        if (StrUtil.isEmpty(accessToken)) {
//            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
//            throw new ApiException("获取access token失败");
//        } else {
//            log.info("wx access_token : {}",accessToken);
//            redisUtils.set(accessTokenKey,accessToken);
//        }
//
//    }
    @Scheduled(cron = "0 0 0/1 * * ? ")
    public void expireCoupon() {
        List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByExpireTime(DateUtil.date());
        if(CollUtil.isEmpty(mallMemberCoupons)){
            return;
        }
        for(MallMemberCoupon mallMemberCoupon : mallMemberCoupons){
            mallMemberCoupon.setState(3);
            mallMemberCouponMapper.updateById(mallMemberCoupon);
        }
    }
//    private RedisUtils redisUtils;
//    @Autowired
//    private MallMemberCouponMapper mallMemberCouponMapper;
//    @Autowired
//    private MallInvoiceService mallInvoiceService;
//    @Resource
//    RestTemplate restTemplate;
////    @Autowired
////    private SpringContextHolder springContextHolder;
//    /**
//     * 更新发票记录表数据
//     * 定时,每天凌晨一点
//     * 已完成的订单,更新到发票记录中
//     * 获取access_token
//     * 有效期两小时
//     */
//    @Scheduled(cron = "0 0 1 * * ?")
//    public void mallInvoiceJob() {
//        mallInvoiceService.mallInvoiceJob();
////    @Scheduled(cron = "0 0 0/1 * * ? ")
////    public void getAccessToken() throws IOException {
////        log.info("执行access_token刷新");
////        String appId = xcxProperties.getXcxAppid();
////        String appSecret = xcxProperties.getXcxSecret();
////        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
////        String jsonStr = restTemplate.getForObject(url, String.class);
////
////        /**
////         * 返回结果
////         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
////         */
////        if (!jsonStr.contains("access_token")) {
////            System.out.println("获取微信access_token失败");
////        }
////
////        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
////        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
////        String accessToken = jsonObject.getString(accessTokenKey);
////        if (StrUtil.isEmpty(accessToken)) {
////            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
////            throw new ApiException("获取access token失败");
////        } else {
////            log.info("wx access_token : {}",accessToken);
////            redisUtils.set(accessTokenKey,accessToken);
////        }
////
////    }
//
//    @Scheduled(cron = "0 0 0/1 * * ? ")
//    public void expireCoupon() {
//        List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByExpireTime(DateUtil.date());
//        if(CollUtil.isEmpty(mallMemberCoupons)){
//            return;
//        }
//        for(MallMemberCoupon mallMemberCoupon : mallMemberCoupons){
//            mallMemberCoupon.setState(3);
//            mallMemberCouponMapper.updateById(mallMemberCoupon);
//        }
//
//    }
//
////    /**
////     * 更新发票记录表数据
////     * 定时,每天凌晨一点
////     * 已完成的订单,更新到发票记录中
////     */
////    @Scheduled(cron = "0 0 1 * * ?")
////    public void mallInvoiceJob() {
////        mallInvoiceService.mallInvoiceJob();
////    }
}
src/main/resources/mapper/modules/DataDictionaryCustomMapper.xml
@@ -3,7 +3,7 @@
<mapper namespace="cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper">
    <select id="selectDicByType" resultType="cc.mrbird.febs.mall.entity.DataDictionaryCustom">
        select * from data_dictionary_custom where type=#{type}
        select * from data_dictionary_custom where type=#{type} ORDER by code asc
    </select>
    <select id="getPayMethodListInPage" resultType="cc.mrbird.febs.mall.vo.AdminPayMethodVo">
src/main/resources/templates/febs/views/modules/runVip/systemSetting.html
New file
@@ -0,0 +1,94 @@
<div class="layui-fluid layui-anim febs-anim" id="system-setting" lay-title="参数设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="system-setting-form">
            <div class="layui-card">
                <div class="layui-card-body" id="setBody">
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal save-btn" lay-submit="" lay-filter="system-setting-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
    .save-btn{
        display: block;
        margin: 0 auto;
    }
</style>
<script type="text/html" id="systemSettingOperate">
    {{#  layui.each(d, function(index, item){ }}
    <div class="layui-form-item">
        <div class="layui-col-lg6">
            <label class="layui-form-label febs-form-item-require">参数{{item.id}}:</label>
            <div class="layui-input-block">
                <input type="text" name="{{item.code}}" value="{{item.value}}" lay-verify="required" autocomplete="off" class="layui-input" >
                <div class="layui-form-mid layui-word-aux">{{item.description}}。</div>
            </div>
        </div>
    </div>
    {{# }) }}
</script>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree', 'laytpl', 'upload'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            validate = layui.validate
            , templateHtml = systemSettingOperate.innerHTML
            , $setBody = $("#setBody")
            , laytpl = layui.laytpl
            , upload = layui.upload
            , $view = $('#system-setting');
        form.verify(validate);
        form.render();
        dicDataReq("CHARGE_TYPE");
        function dicDataReq(type) {
            $setBody.empty();
            $.get(ctx + 'admin/common/findDicByType/' + type, function (r) {
                if (r.code === 200) {
                    var data = r.data;
                    laytpl(templateHtml).render(data, function(html) {
                        $setBody.append(html);
                    })
                }
            });
        }
        form.on('submit(system-setting-form-submit)', function (data) {
            $.ajax({
                'url':ctx + 'admin/runVip/bonusSystemSetting',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'},
                'traditional': true,
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if (data.code == 200) {
                        febs.alert.success(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>