2 files added
17 files modified
1020 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityController.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiOperateValidRegisterActivityDto.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 72 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java 151 ●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 10 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/layout.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/login.html 4 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList-bak.html 534 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html 100 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/discountUpdate.html 38 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/optionList.html 4 ●●●● patch | view | raw | blame | history
src/main/resources/templates/index.html 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -589,6 +589,15 @@
    }
    /**
     * 会员列表-核销员设置
     */
    @GetMapping("checkOrder/{id}")
    @ControllerEndpoint(operation = " 会员列表-核销员设置", exceptionMessage = "操作失败")
    public FebsResponse checkOrder(@NotNull(message = "{required}") @PathVariable Long id) {
        return mallMemberService.checkOrder(id);
    }
    /**
     * 会员列表-推销员设置
     */
    @GetMapping("downSale/{id}")
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityController.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.dto.activity.ApiOperateValidRegisterActivityDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto;
import cc.mrbird.febs.mall.service.HappyActivityService;
@@ -49,7 +50,6 @@
    @ApiOperation(value = "点赞关注转发", notes = "点赞关注转发")
    @PostMapping(value = "/operateDo")
    @Limit(key = "operateDo", period = 60, count = 1, name = "点赞关注转发接口", prefix = "limit")
    public FebsResponse operateDo(@RequestBody @Validated ApiOperateDoDto dto) {
        return happyActivityService.operateDo(dto);
@@ -97,7 +97,6 @@
    @ApiOperation(value = "投票活动-选项投票", notes = "投票活动-选项投票")
    @PostMapping(value = "/operateVote")
    @Limit(key = "operateVote", period = 60, count = 1, name = "投票接口", prefix = "limit")
    public FebsResponse operateVote(@RequestBody @Validated ApiOperateVoteDto dto) {
        return happyActivityService.operateVote(dto);
@@ -113,6 +112,13 @@
        return happyActivityService.voteRecordInPage(dto);
    }
    @ApiOperation(value = "投票活动-报名-验证", notes = "投票活动-报名-验证")
    @PostMapping(value = "/operateValidRegister")
    public FebsResponse operateValidRegister(@RequestBody @Validated ApiOperateValidRegisterActivityDto dto) {
        return happyActivityService.operateValidRegister(dto);
    }
    @ApiOperation(value = "投票活动-报名", notes = "投票活动-报名")
    @PostMapping(value = "/operateRegister")
    public FebsResponse operateRegister(@RequestBody @Validated ApiOperateRegisterActivityDto dto) {
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiOperateValidRegisterActivityDto.java
New file
@@ -0,0 +1,18 @@
package cc.mrbird.febs.mall.dto.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "ApiOperateValidRegisterActivityDto", description = "参数")
public class ApiOperateValidRegisterActivityDto {
    @NotNull(message = "活动ID不可为空")
    @ApiModelProperty(value = "活动ID", example = "1")
    private Long activityId;//投票活动ID
}
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -2,10 +2,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto;
import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
import cc.mrbird.febs.mall.dto.ApiOperateVoteDto;
@@ -36,6 +33,8 @@
    FebsResponse voteRecordInPage(ApiVoteRecordInPageDto dto);
    FebsResponse operateValidRegister(ApiOperateValidRegisterActivityDto dto);
    FebsResponse operateRegister(ApiOperateRegisterActivityDto dto);
    FebsResponse addConnect(ApiOperateRegisterUserDto dto);
src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -141,4 +141,6 @@
    FebsResponse salemanCoupon(MallMember mallmember);
    FebsResponse addMemberCoupon(MallMember member);
    FebsResponse checkOrder(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -268,7 +268,7 @@
        List<HappyActivity> happyActivities = this.baseMapper.selectList(
                new LambdaQueryWrapper<HappyActivity>()
                        .select(HappyActivity::getId, HappyActivity::getName)
                        .eq(HappyActivity::getType, StateUpDownEnum.ACTIVITY_TYPE_CROWDFUNDING.getCode())
                        .eq(HappyActivity::getPayState, StateUpDownEnum.ACTIVITY_CROWDFUNDING_STATE_OPEN.getCode())
                        .eq(HappyActivity::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
        );
        return happyActivities;
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -4,6 +4,7 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.StateUpDownEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.RedisUtils;
@@ -23,6 +24,7 @@
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -78,22 +80,21 @@
    @Override
    public IPage<MallMember> getMallMemberList(MallMember mallMember, QueryRequest request) {
        Page<MallMember> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallMember> mallMembers = this.baseMapper.selectMallMemberListInPage(page, mallMember);
//        if(CollUtil.isNotEmpty(mallMembers.getRecords())){
//            for(MallMember mallMemberTeam : mallMembers.getRecords()){
//                Long salesmansId = mallMemberTeam.getSalesmansId();
//                MallSalesman mallSalesman = mallSalesmanMapper.selectById(salesmansId);
//                if(ObjectUtil.isNotEmpty(mallSalesman)){
//                    StringBuffer salesmanName = new StringBuffer();
//                    salesmanName.append(mallSalesman.getName());
//                    if(2 == mallSalesman.getState()){
//                        salesmanName.append("(禁用)");
//                    }
//                    mallMemberTeam.setSalesmansName(salesmanName.toString());
//                }
//            }
//        }
        return mallMembers;
        LambdaQueryWrapper<MallMember> mallMemberLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(ObjectUtil.isNotEmpty(mallMember.getName())){
            mallMemberLambdaQueryWrapper.like(MallMember::getName, mallMember.getName());
        }
        if(ObjectUtil.isNotEmpty(mallMember.getPhone())){
            mallMemberLambdaQueryWrapper.eq(MallMember::getPhone, mallMember.getPhone());
        }
        if(ObjectUtil.isNotEmpty(mallMember.getCheckOrder())){
            mallMemberLambdaQueryWrapper.eq(MallMember::getCheckOrder, mallMember.getCheckOrder());
        }
        mallMemberLambdaQueryWrapper.orderByDesc(MallMember::getId);
        Page<MallMember> mallMemberPage = this.baseMapper.selectPage(page, mallMemberLambdaQueryWrapper);
//        IPage<MallMember> mallMembers = this.baseMapper.selectMallMemberListInPage(page, mallMember);
        return mallMemberPage;
    }
    @Override
@@ -955,4 +956,14 @@
        return new FebsResponse().success().message("操作成功");
    }
    @Override
    public FebsResponse checkOrder(Long id) {
        MallMember mallMember = this.baseMapper.selectById(id);
        mallMember.setCheckOrder(StateUpDownEnum.DOWN.getCode() == mallMember.getCheckOrder() ? StateUpDownEnum.UP.getCode() : StateUpDownEnum.DOWN.getCode());
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success().message("操作成功");
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -7,10 +7,7 @@
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.common.utils.ShareCodeUtil;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto;
import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.HappyActivityService;
@@ -80,7 +77,6 @@
            // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3
            List<HappyFollow> happyFollows = happyFollowMapper.selectList(
                    new LambdaQueryWrapper<HappyFollow>()
                            .select(HappyFollow::getMemberId)
                            .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode())
                            .in(HappyFollow::getSourceId, ids)
                            .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
@@ -169,6 +165,44 @@
        if(happyActivityOption != null){
            BeanUtil.copyProperties(happyActivityOption, apiActivityOptionVo);
        }
        //投票人数
        List<HappyFollow> happyFollows = happyFollowMapper.selectList(
                new LambdaQueryWrapper<HappyFollow>()
                        .select(HappyFollow::getId)
                        .eq(HappyFollow::getSourceOptionId, id)
                        .eq(HappyFollow::getType, StateUpDownEnum.VOTE.getCode())
                        .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
                        .groupBy(HappyFollow::getMemberId)
        );
        apiActivityOptionVo.setVoteCnt(CollUtil.isNotEmpty(happyFollows) ? happyFollows.size() : 0);
        List<HappyActivityOption> happyActivityOptions = happyActivityOptionMapper.selectList(
                new LambdaQueryWrapper<HappyActivityOption>()
                        .select(HappyActivityOption::getId,HappyActivityOption::getLikesCnt)
                        .eq(HappyActivityOption::getActivityId, happyActivityOption.getActivityId())
                        .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
                        .eq(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode())
                .orderByDesc(HappyActivityOption::getLikesCnt)
        );
        //获取上一个名次的数据
        int firstCnt = 1;
        int distanceCnt = 0;
        for (HappyActivityOption option : happyActivityOptions){
            if(option.getId().equals(id)){
                apiActivityOptionVo.setFirstCnt(firstCnt);
                if( firstCnt == 1 ){
                    apiActivityOptionVo.setDistanceCnt(distanceCnt);
                }else{
                    apiActivityOptionVo.setDistanceCnt(distanceCnt- option.getLikesCnt());
                }
                break;
            }else{
                firstCnt = firstCnt + 1;
                distanceCnt = option.getLikesCnt();
            }
        }
        return new FebsResponse().success().data(apiActivityOptionVo);
    }
@@ -263,7 +297,6 @@
                new LambdaQueryWrapper<HappyFollow>()
                        .eq(HappyFollow::getMemberId, memberId)
                        .eq(HappyFollow::getSourceId, sourceId)
                        .eq(HappyFollow::getSourceOptionId, sourceOptionId)
                        .eq(HappyFollow::getType, type)
                        .gt(HappyFollow::getCreatedTime, DateUtil.beginOfDay(new Date()))
        );
@@ -285,7 +318,7 @@
        if(CollUtil.isNotEmpty(records)){
            //stream流操作records,获取全部的memberId(全部投票人)
            Set<Long> memberIds = records.stream().map(ApiVoteRecordInPageVo::getMemberId).collect(Collectors.toSet());
            if(CollUtil.isEmpty(memberIds)){
            if(CollUtil.isNotEmpty(memberIds)){
                List<MallMember> mallMembers = mallMemberMapper.selectList(
                        new LambdaQueryWrapper<MallMember>()
                                .select(MallMember::getId, MallMember::getName, MallMember::getAvatar)
@@ -307,6 +340,31 @@
    }
    @Override
    public FebsResponse operateValidRegister(ApiOperateValidRegisterActivityDto dto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        HappyActivity happyActivity = this.baseMapper.selectById(dto.getActivityId());
        if (StateUpDownEnum.ACTIVITY_STATE_END.getCode() == happyActivity.getState()) {
            throw new FebsException("活动已结束");
        }
        if (StateUpDownEnum.DOWN.getCode() == happyActivity.getAddState()) {
            throw new FebsException("活动尚未开启报名");
        }
        //判断用户是否重复报名
        Integer registerCnt = happyActivityOptionMapper.selectCount(
                new LambdaQueryWrapper<HappyActivityOption>()
                        .eq(HappyActivityOption::getMemberId, memberId)
                        .eq(HappyActivityOption::getActivityId, dto.getActivityId())
                        .ne(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_REFUSE.getCode())
                        .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode())
        );
        if (registerCnt > 0) {
            throw new FebsException("您已经报名过了");
        }
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse operateRegister(ApiOperateRegisterActivityDto dto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java
@@ -17,6 +17,15 @@
    @ApiModelProperty(value = "票数")
    private Integer likesCnt;
    @ApiModelProperty(value = "名次")
    private Integer firstCnt;
    @ApiModelProperty(value = "距离上一名")
    private Integer distanceCnt;
    @ApiModelProperty(value = "投票人数")
    private Integer voteCnt;
    @ApiModelProperty(value = "封面头像")
    private String image;
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
@@ -52,6 +52,9 @@
    @ApiModelProperty(value = "门票剩余数量")
    private Integer surplusCnt;
    @ApiModelProperty(value = "每天的限制次数")
    private Integer voteCnt;
    @ApiModelProperty(value = "是否众筹 0-关闭 1-开启(开启代表收取参与费用)")
    private Integer payState;
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -23,6 +23,7 @@
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +32,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -50,37 +52,23 @@
@Slf4j
@RestController
@RequestMapping(value = "/api/xcxPay")
@RequiredArgsConstructor
public class XcxPayController {
    @Autowired
    MallOrderInfoMapper mallOrderInfoMapper;
    @Autowired
    MallMoneyFlowMapper mallMoneyFlowMapper;
    @Autowired
    MallMemberWalletMapper mallMemberWalletMapper;
    @Autowired
    MallMemberMapper mallMemberMapper;
    @Autowired
    DataDictionaryCustomMapper dataDictionaryCustomMapper;
    @Autowired
    IMallMoneyFlowService mallMoneyFlowService;
    @Autowired
    RedisUtils redisUtils;
    @Autowired
    private IApiMallMemberWalletService memberWalletService;
    @Autowired
    private IApiMallMemberService mallMemberService;
    @Autowired
    private MallAgentRecordMapper mallAgentRecordMapper;
    @Autowired
    private AgentProducer agentProducer;
    @Autowired
    private IXcxPayService iXcxPayService;
    @Autowired
    private WxFaPiaoService wxFaPiaoService;
    private final HappyActivityOrderMapper happyActivityOrderMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final MallMemberMapper mallMemberMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final RedisUtils redisUtils;
    private final IApiMallMemberWalletService memberWalletService;
    private final IApiMallMemberService mallMemberService;
    private final MallAgentRecordMapper mallAgentRecordMapper;
    private final AgentProducer agentProducer;
    private final IXcxPayService iXcxPayService;
    private final WxFaPiaoService wxFaPiaoService;
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
    /**
     * 微信充值回调接口
@@ -369,6 +357,111 @@
    }
    /**
     * 活动门票支付回调接口
     */
    @Transactional(rollbackFor = Exception.class)
    @RequestMapping(value = "/activityOrderCallback")
    public void activityOrderCallback(HttpServletResponse response, HttpServletRequest request) throws IOException {
        log.info("活动门票支付回调start....");
        // 获取输入参数
        String inputLine;
        StringBuffer notityXml = new StringBuffer();
        String resXml = "";
        String orderId = "";
        FebsResponse threadResult = new FebsResponse();
        try {
            while ((inputLine = request.getReader().readLine()) != null) {
                notityXml.append(inputLine);
            }
            request.getReader().close();
            log.info("notityXml ---- :{} ", notityXml);
            // XMl转对象
            Object bb = Util.getObjectFromXML(notityXml.toString(), NotifyData.class);
            NotifyData data = new NotifyData();
            BeanUtils.copyProperties(bb,data);
            log.info("----return_code = {}", data.getReturn_code());
            // 返回状态码 SUCCESS/FAIL
            if (WechatConfigure.CODE_SUCCESS.equals(data.getReturn_code())) {
                orderId = data.getAttach();
                // 检验订单状态
                HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(Long.valueOf(orderId));
                // 校验签名
                String paySecret = xcxProperties.getWecharpaySecret();
                if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret)) {
                    // 校验业务结果
                    if (WechatConfigure.CODE_SUCCESS.equals(data.getResult_code())) {
                        // 返回SUCCESS报文
                        resXml = WechatConfigure.RESULT_XML_SUCCESS;
                        // 支付费用
                        Double total_fee = Double.parseDouble(data.getTotal_fee());
                        //微信支付订单号
                        String transaction_id = data.getTransaction_id();
                        // 商户订单号
                        String payNum = data.getOut_trade_no();
                        log.info("支付回调关键信息---total_fee:{},payNum:{},orderId:{}", total_fee, payNum, orderId);
                        // 订单ID
                        BigDecimal payMoney = new BigDecimal(total_fee).divide(new BigDecimal(100), 2,
                                RoundingMode.HALF_UP);
                        if (happyActivityOrder != null && StateUpDownEnum.PAY_STATE_NOT_PAY.getCode() == happyActivityOrder.getPayState()) {
                            log.debug("检查支付金额payMoney={},order.getPayMoney()={}", payMoney, happyActivityOrder.getAmount());
                            happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode());
                            happyActivityOrder.setPayState(StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode());
                            happyActivityOrder.setUpdatedTime(new Date());
                            happyActivityOrder.setPayOrderNo(payNum);
                            happyActivityOrder.setWxOrderNo(transaction_id);
                            happyActivityOrderMapper.updateById(happyActivityOrder);
                            mallMoneyFlowService.addMoneyFlow(
                                    happyActivityOrder.getMemberId(),
                                    happyActivityOrder.getAmount().negate(),
                                    MoneyFlowTypeEnum.WECHAT_PAY.getValue(),
                                    happyActivityOrder.getOrderNo(),
                                    FlowTypeEnum.WECHAT.getValue(),
                                    "微信支付",
                                    2);
                            threadResult.success().message("支付成功");
                        } else {
                            log.info("订单状态不为待付款,happyActivityOrder state=", happyActivityOrder.getPayState());
                        }
                    } else {
                        log.info("微信标识业务是失败");
                        threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:001)");
//                        resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
                    }
                } else {
                    log.info("无效签名");
                    threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:002)");
//                    resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
                }
            } else {
                log.info("通信标识失败");
                threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:003)");
//                resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "通信标识失败");
            }
        } catch (Exception e) {
            log.error("支付回调签名错误", e);
            threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:004)");
//            resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "支付回调签名错误");
        } finally {
            // 通知线程消息
//            PayThreadPool.notifyThread(Integer.valueOf(orderId), threadResult);
            sendResultBack(response, resXml);
        }
        return;
    }
    private void sendResultBack(HttpServletResponse response, String resXml) throws IOException {
        log.info("返回微信数据={}", resXml);
        ServletOutputStream out = response.getOutputStream();
src/main/resources/application-test.yml
@@ -74,12 +74,12 @@
  xcx_secret: 33c3ad513344cf6c16904e5d528b70ea
  debug: true
  wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
  wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
  wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/activityOrderCallback
  wecharRechargePaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/rechargeCallBack
  certLocalPath: /home/blnkaCert/apiclient_cert.p12
  wecharpayMchid: 1658958205
  wecharpaySecret: daL341aN5orDt13puXadsAf2rpuXdq4r
  wecharpaySecretV3: daL341aN5orDt13puXadsAf2rpuX12v3
  certLocalPath: /home/cert/apiclient_cert.p12
  wecharpayMchid: 1714199495
  wecharpaySecret: kKUSYkP73JiCAzDGu2ZfecJNfhvh3sSc
  wecharpaySecretV3: 1234567hnggcmyxgs731907666310878
  gaodeKey: 95ede7157929f5f6b6c758971be924b1
  serviceName: yiyuanshucai
src/main/resources/templates/febs/views/layout.html
@@ -64,7 +64,7 @@
        <div class="layui-side-scroll">
            <div class="layui-logo" style="cursor: pointer">
                <img data-th-src="@{febs/images/logo.png}">
                <span>blnka 权限系统</span>
                <span>快乐社区 权限系统</span>
            </div>
            <script
                    type="text/html"
src/main/resources/templates/febs/views/login.html
@@ -2,7 +2,7 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <title>blnka 权限系统</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">
@@ -19,7 +19,7 @@
        <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>blnka</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">
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList-bak.html
New file
@@ -0,0 +1,534 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-member-list" lay-title="会员列表">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">用户昵称</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 layui-form-label-sm">手机号码</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="手机号码" name="account" autocomplete="off" class="layui-input">
                                        </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="ZERO_LEVEL">普通用户</option>
                                                <option value="FIRST_LEVEL">城市合伙人</option>
                                            </select>
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">会员生日</label>
                                        <div class="layui-input-inline">
                                            <input type="text" name="birthday" id="febs-member-benefits-list-birthday-start" lay-verify="date"
                                                   placeholder="MM-dd" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
                    <style type="text/css">
                        ::-webkit-scrollbar {
                            height: 20px !important;
                            background-color: #f4f4f4;
                        }
                    </style>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 表格操作栏 start -->
<script type="text/html" id="user-option">
    <span shiro:lacksPermission="user:view,user:update,user:delete">
        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
    </span>
    <a lay-event="edit" shiro:hasPermission="user:update"><i
            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
</script>
<script type="text/html" id="switchStatus">
    {{# if(d.accountStatus === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="正常|禁用" checked lay-skin="switch" lay-filter="switchStatus">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="正常|禁用" lay-skin="switch" lay-filter="switchStatus">
    {{# } }}
</script>
<script type="text/html" id="switchStoreMaster">
    {{# if(d.storeMaster === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchStoreMaster">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchStoreMaster">
    {{# } }}
</script>
<script type="text/html" id="switchDirector">
    {{# if(d.director === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchDirector">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchDirector">
    {{# } }}
</script>
<script type="text/html" id="isSalesmanSwitch">
    {{# if(d.isSale === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="isSalesmanSwitch">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="isSalesmanSwitch">
    {{# } }}
</script>
<script type="text/html" id="isDoctorSwitch">
    {{# if(d.doctorState === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="isDoctorSwitch">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="isDoctorSwitch">
    {{# } }}
</script>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
    }
</style>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateReferer">修改推荐人</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateVipLevel">修改会员等级</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="addCoupon">优惠券派送</button>
    </div>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use([ 'jquery', 'form', 'table', 'febs', 'laydate'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            $view = $('#febs-member-list'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            laydate = layui.laydate,
            tableIns;
        form.render();
        laydate.render({
            elem: '#febs-member-benefits-list-birthday-start',
            format:'MM-dd'
        });
        // 表格初始化
        initTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(userTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'memberOut') {
                febs.modal.confirm('注销', '确认注销该账号?', function () {
                    memberOut(data.id);
                });
            }
            if (layEvent === 'close') {
                febs.modal.confirm('禁用', '确认禁用该账号?', function () {
                    closeAccount(data.id);
                });
            }
            if (layEvent === 'open') {
                febs.modal.confirm('开启', '确认开启该账号?', function () {
                    openAccount(data.id);
                });
            }
            if (layEvent === 'see') {
                febs.modal.open( '个人信息', 'modules/mallMember/detail/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#user-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'addLeader') {
                febs.modal.open( '团长新增', 'modules/leader/addLeader/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#user-addLeader').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'agentSelect') {
                febs.modal.open('推销员设置', 'modules/mallMember/agentSelect/' + data.id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#agent-select').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'moneyFlow') {
                febs.modal.open( '用户资金流水', 'modules/mallMember/moneyFlow/' + data.id, {
                    maxmin: true,
                });
            }
        });
        function memberOut(id) {
            febs.get(ctx + 'admin/mallMember/memberOut/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function closeAccount(id) {
            febs.get(ctx + 'admin/mallMember/closeAccount/' + id, null, function () {
                febs.alert.success('禁用成功');
                $query.click();
            });
        }
        function openAccount(id) {
            febs.get(ctx + 'admin/mallMember/openAccount/' + id, null, function () {
                febs.alert.success('开启成功');
                $query.click();
            });
        }
        function changeIdentityYes(type, id) {
            febs.get(ctx + 'admin/mallMember/changeIdentityYes/' + type + "/" + id, null, function () {
                febs.alert.success('设置成功');
                $query.click();
            });
        }
        function changeIdentityNo(type, id) {
            febs.get(ctx + 'admin/mallMember/changeIdentityNo/' + type + "/" + id, null, function () {
                febs.alert.success('设置成功');
                $query.click();
            });
        }
        function resetPwd(id, type) {
            febs.post(ctx + 'admin/mallMember/resetPwdNew/' + type + "/"+ id, null, function () {
                febs.alert.success('重置成功');
                $query.click();
            });
        }
        form.on('switch(isSalesmanSwitch)', function (data) {
            if (data.elem.checked) {
                upSale(data.value);
            } else {
                downSale(data.value);
            }
        })
        form.on('switch(isDoctorSwitch)', function (data) {
            if (data.elem.checked) {
                doctorStateChange(data.value);
            } else {
                doctorStateChange(data.value);
            }
        })
        function doctorStateChange(id) {
            febs.get(ctx + 'admin/mallMember/doctorStateChange/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function upSale(id) {
            febs.get(ctx + 'admin/mallMember/upSale/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function downSale(id) {
            febs.get(ctx + 'admin/mallMember/downSale/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'userTable',
                url: ctx + 'admin/mallMember/getMallMemberList',
                toolbar:"#toolbar",
                defaultToolbar:[],
                cols: [[
                    {type: 'checkbox'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left'},
                    {field: 'name', title: '用户昵称', minWidth: 100,align:'left'},
                    {field: 'birthday', title: '会员生日', minWidth: 100,align:'left'},
                    {field: 'inviteId', 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: 'referrerName', title: '推荐人', minWidth: 100,align:'left'},
                    {field: 'levelName', title: '会员等级', minWidth: 100,align:'left'},
                    // {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'},
                    {field: 'doctorState', title: '医生设置', templet: '#isDoctorSwitch', minWidth: 100,align:'center'},
                    {field: 'isSalesman', title: '推销员设置', templet: '#isSalesmanSwitch', minWidth: 100,align:'center'},
                    // {field: 'director', title: '总监', templet:'#switchDirector', minWidth: 100},
                    // {field: 'accountType', title: '账号类型',
                    //     templet: function (d) {
                    //         if (d.accountType === 2) {
                    //             return '<span style="color:red;">测试账号</span>'
                    //         } else if (d.accountType === 1) {
                    //             return '<span style="color:green;">正常账号</span>'
                    //         }else{
                    //             return ''
                    //         }
                    //     }, minWidth: 100,align:'center'},
                    // {field: 'leaderState', title: '是否是团长',
                    //     templet: function (d) {
                    //         if (d.leaderState === 1) {
                    //             return '<span style="color:green;">团长</span>'
                    //         }else if (d.leaderState === 3) {
                    //             return '<span">申请中</span>'
                    //         }else if (d.leaderState === 4) {
                    //             return '<span">普通用户(取消团长资格)</span>'
                    //         }else{
                    //             return '<span">普通用户</span>'
                    //         }
                    //     }, minWidth: 100,align:'center'},
                    // {field: 'accountStatus', title: '账号状态', templet: '#switchStatus', minWidth: 100,align:'center'},
                    {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return  ''
                                +'<button class="layui-btn layui-btn-normal layui-btn-xs febs-bg-red" lay-event="memberOut" shiro:hasPermission="user:update">注销</button>'
                                // + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="addLeader" shiro:hasPermission="user:update">设置为团长</button>'
                        },minWidth: 200,align:'center'}
                ]]
            });
        }
        table.on('toolbar(userTable)', function(obj){
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'registMember') {
                febs.modal.open( '添加会员', 'modules/mallMember/addMember', {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#member-add').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
                return;
            }
            var checkData = table.checkStatus('userTable').data;
            if (checkData.length <= 0) {
                febs.alert.warn('请选择需要的用户');
                return;
            }
            if (layEvent == 'updateReferer') {
                if (checkData.length > 1) {
                    febs.alert.warn('每次只能修改一个用户');
                    return;
                }
                febs.modal.open( '修改推荐人', 'modules/mallMember/updateReferer/' + checkData[0].id, {
                    btn: ['提交', '取消'],
                    yes: function (index, layero) {
                        $('#referer-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'updateVipLevel') {
                var checkData = table.checkStatus('userTable').data;
                if (checkData.length > 1) {
                    febs.alert.warn('每次只能修改一个用户');
                    return;
                }
                // var idList = [];
                // for (var i = 0; i < checkData.length; i++) {
                //     idList.push(checkData[i].id);
                // }
                febs.modal.open('设置会员等级', 'modules/mallMember/vipLevelSetting/' + checkData[0].id, {
                    btn: ['确认', '取消'],
                    yes: function (index, layero) {
                        $('#vip-level-set').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'resetPwd') {
                febs.modal.confirm('重置登录密码', '是否重置选中账号登录密码?', function () {
                    var ids = [];
                    layui.each(checkData, function (key, item) {
                        ids.push(item.id)
                    });
                    resetPwd(ids.join(','), 2);
                });
            }
            if (layEvent === 'resetPayPwd') {
                febs.modal.confirm('重置交易密码', '是否重置选中账号交易密码?', function () {
                    var ids = [];
                    layui.each(checkData, function (key, item) {
                        ids.push(item.id)
                    });
                    resetPwd(ids.join(','), 1);
                });
            }
            if (layEvent === 'balance') {
                if (checkData.length > 1) {
                    febs.alert.warn('请选择一个用户');
                }
                systemPay("修改余额", checkData[0].id, 1);
            }
            if (layEvent === 'score') {
                if (checkData.length > 1) {
                    febs.alert.warn('请选择一个用户');
                }
                systemPay("修改赠送积分", checkData[0].id, 2);
            }
            if (layEvent === 'prizeScore') {
                if (checkData.length > 1) {
                    febs.alert.warn('请选择一个用户');
                }
                systemPay("修改竞猜积分", checkData[0].id, 3);
            }
            if (layEvent === 'agentLevel') {
                febs.modal.open('设置代理级别', 'modules/mallMember/agentLevelSet/' + checkData[0].id, {
                    btn: ['确认', '取消'],
                    yes: function (index, layero) {
                        $('#agent-level-set').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
            if (layEvent === 'addCoupon') {
                febs.modal.open('添加优惠券', 'modules/mallMember/addCoupon/' + checkData[0].id, {
                    btn: ['确认', '取消'],
                    yes: function (index, layero) {
                        $('#member-coupon-select').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
        });
        function systemPay(text, id, type) {
            febs.modal.open('text', 'modules/mallMember/mallSystemPay/' + type +'/'+ id, {
                btn: ['提交', '取消'],
                yes: function (index, layero) {
                    $('#systemPay-update').find('#submit').trigger('click');
                },
                btn2: function () {
                    layer.closeAll();
                }
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
                account: $searchForm.find('input[name="account"]').val().trim(),
                level: $searchForm.find("select[name='level']").val(),
                birthdayQuery: $searchForm.find("input[name='birthday']").val(),
                // level: $searchForm.find("select[name='level']").val(),
            };
        }
        form.on('switch(switchStatus)', function (data) {
            if (data.elem.checked) {
                openAccount(data.value);
            } else {
                closeAccount(data.value);
            }
        })
        form.on('switch(switchStoreMaster)', function (data) {
            if (data.elem.checked) {
                changeIdentityYes(2, data.value);
            } else {
                changeIdentityNo(2, data.value);
            }
        })
        form.on('switch(switchDirector)', function (data) {
            if (data.elem.checked) {
                changeIdentityYes(1, data.value);
            } else {
                changeIdentityNo(1, data.value);
            }
        })
    })
</script>
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -16,24 +16,17 @@
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">手机号码</label>
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="手机号码" name="account" autocomplete="off" class="layui-input">
                                            <input type="text" placeholder="手机号码" name="phone" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">会员类型</label>
                                        <label class="layui-form-label layui-form-label-sm">核销员</label>
                                        <div class="layui-input-inline">
                                            <select name="level">
                                            <select name="checkOrder">
                                                <option value="">请选择</option>
                                                <option value="ZERO_LEVEL">普通用户</option>
                                                <option value="FIRST_LEVEL">城市合伙人</option>
                                                <option value="0">否</option>
                                                <option value="1">是</option>
                                            </select>
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">会员生日</label>
                                        <div class="layui-input-inline">
                                            <input type="text" name="birthday" id="febs-member-benefits-list-birthday-start" lay-verify="date"
                                                   placeholder="MM-dd" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
@@ -98,6 +91,14 @@
    {{# } }}
</script>
<script type="text/html" id="checkOrderSwitch">
    {{# if(d.checkOrder === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="checkOrderSwitch">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="checkOrderSwitch">
    {{# } }}
</script>
<script type="text/html" id="isDoctorSwitch">
    {{# if(d.doctorState === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="isDoctorSwitch">
@@ -112,10 +113,14 @@
</style>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateReferer">修改推荐人</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateVipLevel">修改会员等级</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="addCoupon">优惠券派送</button>
<!--        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateReferer">修改推荐人</button>-->
<!--        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateVipLevel">修改会员等级</button>-->
<!--        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="addCoupon">优惠券派送</button>-->
    </div>
</script>
<script type="text/html" id="memberOption">
<!--    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="memberOut">注销</button>-->
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
@@ -249,6 +254,14 @@
            });
        }
        form.on('switch(checkOrderSwitch)', function (data) {
            if (data.elem.checked) {
                checkOrder(data.value);
            } else {
                checkOrder(data.value);
            }
        })
        form.on('switch(isSalesmanSwitch)', function (data) {
            if (data.elem.checked) {
                upSale(data.value);
@@ -267,6 +280,13 @@
        function doctorStateChange(id) {
            febs.get(ctx + 'admin/mallMember/doctorStateChange/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function checkOrder(id) {
            febs.get(ctx + 'admin/mallMember/checkOrder/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
@@ -307,51 +327,13 @@
                defaultToolbar:[],
                cols: [[
                    {type: 'checkbox'},
                    {type: 'numbers', title: '', width: 80},
                    // {title: '操作', toolbar: '#memberOption', minWidth: 200, align: 'center'},
                    {field: 'phone', title: '手机号码', minWidth: 150,align:'left'},
                    {field: 'name', title: '用户昵称', minWidth: 100,align:'left'},
                    {field: 'birthday', title: '会员生日', minWidth: 100,align:'left'},
                    {field: 'inviteId', 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: 'referrerName', title: '推荐人', minWidth: 100,align:'left'},
                    {field: 'levelName', title: '会员等级', minWidth: 100,align:'left'},
                    // {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'},
                    {field: 'doctorState', title: '医生设置', templet: '#isDoctorSwitch', minWidth: 100,align:'center'},
                    {field: 'isSalesman', title: '推销员设置', templet: '#isSalesmanSwitch', minWidth: 100,align:'center'},
                    // {field: 'director', title: '总监', templet:'#switchDirector', minWidth: 100},
                    // {field: 'accountType', title: '账号类型',
                    //     templet: function (d) {
                    //         if (d.accountType === 2) {
                    //             return '<span style="color:red;">测试账号</span>'
                    //         } else if (d.accountType === 1) {
                    //             return '<span style="color:green;">正常账号</span>'
                    //         }else{
                    //             return ''
                    //         }
                    //     }, minWidth: 100,align:'center'},
                    // {field: 'leaderState', title: '是否是团长',
                    //     templet: function (d) {
                    //         if (d.leaderState === 1) {
                    //             return '<span style="color:green;">团长</span>'
                    //         }else if (d.leaderState === 3) {
                    //             return '<span">申请中</span>'
                    //         }else if (d.leaderState === 4) {
                    //             return '<span">普通用户(取消团长资格)</span>'
                    //         }else{
                    //             return '<span">普通用户</span>'
                    //         }
                    //     }, minWidth: 100,align:'center'},
                    // {field: 'accountStatus', title: '账号状态', templet: '#switchStatus', minWidth: 100,align:'center'},
                    {field: 'checkOrder', title: '核销员', templet: '#checkOrderSwitch', minWidth: 100,align:'center'},
                    {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return  ''
                                +'<button class="layui-btn layui-btn-normal layui-btn-xs febs-bg-red" lay-event="memberOut" shiro:hasPermission="user:update">注销</button>'
                                // + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="addLeader" shiro:hasPermission="user:update">设置为团长</button>'
                        },minWidth: 200,align:'center'}
                ]]
            });
        }
@@ -500,10 +482,8 @@
        function getQueryParams() {
            return {
                name: $searchForm.find('input[name="name"]').val().trim(),
                account: $searchForm.find('input[name="account"]').val().trim(),
                level: $searchForm.find("select[name='level']").val(),
                birthdayQuery: $searchForm.find("input[name='birthday']").val(),
                // level: $searchForm.find("select[name='level']").val(),
                phone: $searchForm.find('input[name="phone"]').val().trim(),
                checkOrder: $searchForm.find("select[name='checkOrder']").val(),
            };
        }
src/main/resources/templates/febs/views/modules/votesActivity/discountUpdate.html
@@ -46,6 +46,7 @@
                                        <label class="layui-form-label febs-form-item-require">类型:</label>
                                        <div class="layui-input-block">
                                            <select name="type">
                                                <option value="">请选择</option>
                                                <option value="1">普通活动</option>
                                                <option value="2">众筹活动</option>
                                                <option value="3">投票活动</option>
@@ -56,6 +57,7 @@
                                        <label class="layui-form-label febs-form-item-require">推荐首页:</label>
                                        <div class="layui-input-block">
                                            <select name="hotState">
                                                <option value="">请选择</option>
                                                <option value="0">不推荐</option>
                                                <option value="1">推荐</option>
                                            </select>
@@ -91,6 +93,7 @@
                                        <label class="layui-form-label febs-form-item-require">自主报名:</label>
                                        <div class="layui-input-block">
                                            <select name="addState">
                                                <option value="">请选择</option>
                                                <option value="0">不允许</option>
                                                <option value="1">允许</option>
                                            </select>
@@ -122,6 +125,7 @@
                                        <label class="layui-form-label febs-form-item-require">门票售卖:</label>
                                        <div class="layui-input-block">
                                            <select name="payState">
                                                <option value="">请选择</option>
                                                <option value="0">关闭</option>
                                                <option value="1">开启</option>
                                            </select>
@@ -354,28 +358,28 @@
            }
            form.val("activity-discount-update-form", {
                "id": activity.id || '',
                "name": activity.name || '',
                "type": activity.type || '',
                "joinCnt": activity.joinCnt || '',
                "startTime": activity.startTime || '',
                "endTime": activity.endTime || '',
                "phone": activity.phone || '',
                "address": activity.address || '',
                "payState": activity.payState || '',
                "payAmount": activity.payAmount || '',
                "orderCnt": activity.orderCnt || '',
                "hotState": activity.hotState || '',
                "voteCnt": activity.voteCnt || '',
                "addState": activity.addState || ''
                "id": activity.id,
                "name": activity.name,
                "type": activity.type,
                "joinCnt": activity.joinCnt,
                "startTime": activity.startTime,
                "endTime": activity.endTime,
                "phone": activity.phone,
                "address": activity.address,
                "payState": activity.payState,
                "payAmount": activity.payAmount,
                "orderCnt": activity.orderCnt,
                "hotState": activity.hotState,
                "voteCnt": activity.voteCnt,
                "addState": activity.addState,
            });
            $('#demoMax').append('<img src="' + activity.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">')
            $('#demoMax').append('<img src="' + activity.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
            $("#backImg").val(activity.backImg);
            $('#demo1Max').append('<img src="' + activity.indexImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">')
            $('#demo1Max').append('<img src="' + activity.indexImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
            $("#indexImg").val(activity.indexImg);
            var arr = [];
            arr.push(activity.categoryId)
            arr.push(activity.categoryId);
            activityGroup.setValue(arr);
            editor.txt.html(activity.textRemark);
src/main/resources/templates/febs/views/modules/votesActivity/optionList.html
@@ -16,7 +16,7 @@
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">活动</label>
                                        <div class="layui-input-inline">
                                            <select name="activityId" class="activity-type">
                                            <select name="activityId" class="activity-type-option">
                                                <option value="">请选择</option>
                                            </select>
                                        </div>
@@ -111,7 +111,7 @@
            var data = res.data;
            for (let k in data)
            {
                $(".activity-type").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>");
                $(".activity-type-option").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
src/main/resources/templates/index.html
@@ -3,7 +3,7 @@
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="utf-8">
    <title>blnka 权限系统</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">