admin
2020-11-30 4d756db62a276bc9521c769f3842964671666471
抽奖服务完善
21个文件已修改
3个文件已添加
709 ■■■■ 已修改文件
service-lucky/src/main/java/com/ks/lucky/dao/LuckyActivityAwardMaterialDao.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/dao/LuckySponsorAdDao.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityAwardResultExtraMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityAwardResultMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityJoinRecordMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityOpenInfoMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/AppManager.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityAwardResultManager.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityJoinManager.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityManager.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityOpenInfoManager.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckySponsorAdManager.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardMaterialServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardResultServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityOpenInfoServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityOpenServiceImpl.java 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivitySponsorInfoServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckySponsorServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/util/LuckyRunUtil.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/resources/mapper/LuckyActivityAwardResultExtraMapper.xml 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/test/java/com/ks/MyBatisTest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/test/java/com/ks/lucky/DaoTest.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lucky/src/main/java/com/ks/lucky/dao/LuckyActivityAwardMaterialDao.java
@@ -15,20 +15,19 @@
    /**
     * 更新
     *
     * @param material
     * @param bean
     */
    public void updateSelective(LuckyActivityAwardMaterial material) {
    public void updateSelective(LuckyActivityAwardMaterial bean) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(material.getId()));
        query.addCriteria(Criteria.where("id").is(bean.getId()));
        Update update = new Update();
        if (material.getType() != null) {
            update.set("type", material.getType());
        if (bean.getType() != null) {
            update.set("type", bean.getType());
        }
        if (material.getImgList() != null) {
            update.set("imgList", material.getImgList());
        if (bean.getImgList() != null) {
            update.set("imgList", bean.getImgList());
        }
        update.set("updateTime", new Date());
        update(query, update);
    }
}
service-lucky/src/main/java/com/ks/lucky/dao/LuckySponsorAdDao.java
@@ -3,13 +3,41 @@
import com.ks.lib.common.dao.MongodbBaseDao;
import com.ks.lucky.pojo.DO.LuckySponsorAd;
import com.ks.lucky.query.LuckySponsorAdQuery;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Repository
public class LuckySponsorAdDao extends MongodbBaseDao<LuckySponsorAd> {
    public void updateSelective(LuckySponsorAd bean) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(bean.getId()));
        Update update = new Update();
        if (bean.getAdType() != null) {
            update.set("adType", bean.getAdType());
        }
        if (bean.getSponsorId() != null) {
            update.set("sponsorId", bean.getSponsorId());
        }
        if (bean.getState() != null) {
            update.set("state", bean.getState());
        }
        if (bean.getStateDesc() != null) {
            update.set("stateDesc", bean.getStateDesc());
        }
        if (bean.getVerifyTime() != null) {
            update.set("verifyTime", bean.getVerifyTime());
        }
        if (bean.getVerifySuccessTime() != null) {
            update.set("verifySuccessTime", bean.getVerifySuccessTime());
        }
        update.set("updateTime", new Date());
        update(query, update);
    }
    public List<LuckySponsorAd> list(LuckySponsorAdQuery query) {
@@ -20,10 +48,6 @@
        return 0;
    }
    public void updateSelective(LuckySponsorAd ad) {
    }
    public List<LuckySponsorAd> list(List<String> ids) {
        return null;
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityAwardResultExtraMapper.java
@@ -6,4 +6,6 @@
public interface LuckyActivityAwardResultExtraMapper extends BaseMapper<LuckyActivityAwardResultExtra> {
    LuckyActivityAwardResultExtra selectByAwardResultId(Long resultId);
}
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityAwardResultMapper.java
@@ -13,4 +13,9 @@
    long count(@Param("query") ActivityAwardResultQuery query);
    LuckyActivityAwardResult selectByPrimaryKeyForUpdate(Long id);
    int setStateByActivityId(Long activityId,Integer state,String stateDesc);
}
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityJoinRecordMapper.java
@@ -10,6 +10,8 @@
    List<LuckyActivityJoinRecord> list(ActivityJoinRecordQuery query);
    long count(ActivityJoinRecordQuery query);
    void addWeight(Long id, int weight);
}
service-lucky/src/main/java/com/ks/lucky/mapper/LuckyActivityOpenInfoMapper.java
@@ -5,4 +5,5 @@
public interface LuckyActivityOpenInfoMapper extends BaseMapper<LuckyActivityOpenInfo> {
    LuckyActivityOpenInfo selectByActivityId(Long activityId);
}
service-lucky/src/main/java/com/ks/lucky/service/impl/AppManager.java
@@ -18,4 +18,9 @@
        }
        return null;
    }
    public AppInfo getAppDetail(Long appId) {
        AppInfo info = appService.getAppDetail(appId);
        return info;
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityAwardResultManager.java
New file
@@ -0,0 +1,165 @@
package com.ks.lucky.service.impl;
import com.alipay.api.AlipayApiException;
import com.google.gson.Gson;
import com.ks.app.entity.AppAlipayInfoWithBLOBs;
import com.ks.app.entity.AppInfo;
import com.ks.lucky.exception.LuckyActivityAwardException;
import com.ks.lucky.exception.LuckyActivityAwardResultException;
import com.ks.lucky.mapper.LuckyActivityAwardResultExtraMapper;
import com.ks.lucky.mapper.LuckyActivityAwardResultMapper;
import com.ks.lucky.pojo.DO.LuckyActivityAwardResult;
import com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra;
import com.ks.lucky.pojo.DO.LuckyActivityAwards;
import com.ks.lucky.pojo.DTO.ActivityAwardParams;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.alipay.AlipayUtil;
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
import org.yeshi.utils.entity.alipay.AlipayCertInfo;
import org.yeshi.utils.entity.alipay.AlipayTransferAccount;
import org.yeshi.utils.entity.alipay.AlipayTransferInfo;
import org.yeshi.utils.exception.AlipayTransferException;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
 * 奖项管理
 */
@Component
public class LuckyActivityAwardResultManager {
    @Resource
    private LuckyActivityAwardManager luckyActivityAwardManager;
    @Resource
    private AppManager appManager;
    @Resource
    private LuckyActivityAwardResultMapper luckyActivityAwardResultMapper;
    @Resource
    private LuckyActivityAwardResultExtraMapper luckyActivityAwardResultExtraMapper;
    /**
     * 添加记录
     *
     * @param uids
     * @param activityId
     * @param awardId
     */
    @Transactional(rollbackFor = Exception.class)
    public void addRecord(Set<String> uids, Long activityId, long awardId) {
        for (String uidStr : uids) {
            long appId = Long.parseLong(uidStr.split("#")[0]);
            String uid = uidStr.split("#")[1];
            LuckyActivityAwardResult result = new LuckyActivityAwardResult();
            result.setState(LuckyActivityAwardResult.STATE_NOT_SHOW);
            result.setStateDesc("未显示");
            result.setActivityId(activityId);
            result.setAwardId(awardId);
            result.setAppId(appId);
            result.setUid(uid);
            result.setCreateTime(new Date());
            luckyActivityAwardResultMapper.insertSelective(result);
            LuckyActivityAwardResultExtra extra = new LuckyActivityAwardResultExtra();
            extra.setAwardResultId(result.getId());
            extra.setCreateTime(new Date());
            luckyActivityAwardResultExtraMapper.insertSelective(extra);
        }
    }
    /**
     * 发奖
     *
     * @param result
     * @throws LuckyActivityAwardException
     */
    @Transactional(rollbackFor = Exception.class)
    public void sendAward(LuckyActivityAwardResult result, LuckyActivityAwardResultExtra extra) throws LuckyActivityAwardException, LuckyActivityAwardResultException {
        LuckyActivityAwards awards = luckyActivityAwardManager.getAwardDetail(result.getAwardId());
        if (awards == null) {
            throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "奖项不存在");
        }
        String paramsStr = awards.getAwardParams();
        ActivityAwardParams params = new Gson().fromJson(paramsStr, ActivityAwardParams.class);
        AppInfo app = appManager.getAppDetail(result.getAppId());
        if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.alipayRedPackage) {
            //发支付宝红包
            AppAlipayInfoWithBLOBs alipayInfo = app.getAlipayInfo();
            if (alipayInfo == null) {
                throw new LuckyActivityAwardResultException(LuckyActivityAwardResultException.CODE_NOT_EXIST, "支付宝信息不存在");
            }
            //参数不完整
            if (extra == null || extra.getRedPackage() == null || StringUtil.isNullOrEmpty(extra.getAlipyUid())) {
                throw new LuckyActivityAwardResultException(LuckyActivityAwardResultException.CODE_PARAMS_NOT_ENOUGH, "参数不完整,缺少alipayUid与redPackage参数");
            }
            String orderId = alipayInfo.getAlipayAppId() + "_award_" + result.getId();
            BigDecimal money = extra.getRedPackage();
            String alipayUid = extra.getAlipyUid();
            try {
                sendAlipayRedPackage(orderId, alipayUid, "", money, alipayInfo);
            } catch (AlipayTransferException e) {
                throw new LuckyActivityAwardResultException(e.getCode(), e.getMsg());
            } catch (AlipayApiException e) {
                throw new LuckyActivityAwardResultException(1, e.getErrMsg());
            }
            LuckyActivityAwardResult update = new LuckyActivityAwardResult();
            update.setId(result.getId());
            update.setState(LuckyActivityAwardResult.STATE_RECIEVED);
            update.setStateDesc("已领取");
            update.setUpdateTime(new Date());
        } else if (params.getType() == ActivityAwardParams.ActivityAwardTypeEnum.wxRedPackage) {
            //TODO 微信发红包
        }
    }
    /**
     * 发支付宝红包
     */
    private void sendAlipayRedPackage(String outBizNo, String alipayUid, String orderTitle, BigDecimal money, AppAlipayInfoWithBLOBs alipayInfo) throws AlipayTransferException, AlipayApiException {
        InputStream appCert = new ByteArrayInputStream(alipayInfo.getAlipayAppCertPublicKey());
        InputStream publicCert = new ByteArrayInputStream(alipayInfo.getAlipayPublicCert());
        InputStream rootCert = new ByteArrayInputStream(alipayInfo.getAlipayRootCert());
        AlipayAppInfo appInfo = new AlipayAppInfo(alipayInfo.getAlipayAppId(), alipayInfo.getAlipayPrivateKey(), new AlipayCertInfo(appCert, publicCert, rootCert));
        AlipayTransferInfo transferInfo = new AlipayTransferInfo();
        transferInfo.setAccount(new AlipayTransferAccount(alipayUid));
        transferInfo.setMoney(money);
        transferInfo.setOrderTitle(orderTitle);
        transferInfo.setPayerName("*");
        transferInfo.setOutBizNo(outBizNo);
        transferInfo.setProductCode(AlipayTransferInfo.AlipayProductCodeEnum.STD_RED_PACKET);
        transferInfo.setBizScene(AlipayTransferInfo.AlipayBizSceneEnum.DIRECT_TRANSFER);
        AlipayUtil.alipayFundTransUniTransfer(appInfo, transferInfo);
    }
    @Transactional
    public void setResultShow(Long activityId) {
        luckyActivityAwardResultMapper.setStateByActivityId(activityId, LuckyActivityAwardResult.STATE_NOT_RECIEVE, "等待领取");
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityJoinManager.java
@@ -14,7 +14,9 @@
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 活动奖项管理
@@ -37,5 +39,31 @@
        return null;
    }
    /**
     * 获取参与数据
     * @param activityId
     * @return
     */
    public Map<String, Integer> getJoinData(Long activityId) {
        Map<String, Integer> map = new HashMap<>();
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.activityId = activityId;
        long count = luckyActivityJoinRecordMapper.count(query);
        int pageSize = 200;
        int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
        for (int i = 0; i < page; i++) {
            query.start = i * pageSize;
            query.count = query.start + pageSize > count ? (int) (count - query.start) : pageSize;
            List<LuckyActivityJoinRecord> list = luckyActivityJoinRecordMapper.list(query);
            if (list != null) {
                for (LuckyActivityJoinRecord record : list) {
                    //APPID与用户ID采用#链接
                    map.put(record.getAppId() + "#" + record.getUid(), record.getWeight());
                }
            }
        }
        return map;
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityManager.java
@@ -114,4 +114,15 @@
    }
    /**
     * 按主键查询
     *
     * @param id
     * @return
     */
    public LuckyActivity selectByPrimaryKey(Long id) {
        return luckyActivityMapper.selectByPrimaryKey(id);
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckyActivityOpenInfoManager.java
@@ -1,8 +1,13 @@
package com.ks.lucky.service.impl;
import com.ks.lucky.exception.LuckyActivityOpenInfoException;
import com.ks.lucky.mapper.LuckyActivityOpenInfoMapper;
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Date;
/**
 * 活动开奖信息管理
@@ -10,26 +15,35 @@
@Component
public class LuckyActivityOpenInfoManager {
    @Resource
    private LuckyActivityOpenInfoMapper luckyActivityOpenInfoMapper;
    /**
     * 添加开奖信息
     *
     * @param OpenInfo
     * @param openInfo
     * @throws LuckyActivityOpenInfoException
     */
    public void addOpenInfo(LuckyActivityOpenInfo OpenInfo) throws LuckyActivityOpenInfoException {
    @Validated
    public Long addOpenInfo(LuckyActivityOpenInfo openInfo) throws LuckyActivityOpenInfoException {
        if (openInfo.getCreateTime() == null) {
            openInfo.setCreateTime(new Date());
        }
        luckyActivityOpenInfoMapper.insertSelective(openInfo);
        return openInfo.getId();
    }
    /**
     * 修改开奖信息
     *
     * @param OpenInfo
     * @param openInfo
     * @throws LuckyActivityOpenInfoException
     */
    public void updateOpenInfo(LuckyActivityOpenInfo OpenInfo) throws LuckyActivityOpenInfoException {
    public void updateOpenInfo(LuckyActivityOpenInfo openInfo) throws LuckyActivityOpenInfoException {
        openInfo.setUpdateTime(new Date());
        luckyActivityOpenInfoMapper.updateByPrimaryKeySelective(openInfo);
    }
@@ -42,7 +56,7 @@
    public LuckyActivityOpenInfo getOpenInfo(Long activityId) {
        return null;
        return luckyActivityOpenInfoMapper.selectByActivityId(activityId);
    }
    /**
@@ -53,7 +67,7 @@
     */
    public LuckyActivityOpenInfo getOpenInfoDetail(Long id) {
        return null;
        return luckyActivityOpenInfoMapper.selectByPrimaryKey(id);
    }
    /**
@@ -63,7 +77,7 @@
     */
    public void deleteOpenInfo(Long id) {
        luckyActivityOpenInfoMapper.deleteByPrimaryKey(id);
    }
service-lucky/src/main/java/com/ks/lucky/service/impl/LuckySponsorAdManager.java
@@ -25,9 +25,4 @@
    private LuckySponsorAdDao luckySponsorAdDao;
}
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardMaterialServiceImpl.java
@@ -1,6 +1,5 @@
package com.ks.lucky.service.impl.remote;
import com.aliyun.tea.Validation;
import com.ks.lucky.dao.LuckyActivityAwardMaterialDao;
import com.ks.lucky.exception.LuckyActivityAwardMaterialException;
import com.ks.lucky.pojo.DO.LuckyActivityAwardMaterial;
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardResultServiceImpl.java
@@ -1,11 +1,20 @@
package com.ks.lucky.service.impl.remote;
import com.ks.lucky.exception.LuckyActivityAwardException;
import com.ks.lucky.exception.LuckyActivityAwardResultException;
import com.ks.lucky.exception.LuckyActivityException;
import com.ks.lucky.mapper.LuckyActivityAwardResultExtraMapper;
import com.ks.lucky.mapper.LuckyActivityAwardResultMapper;
import com.ks.lucky.pojo.DO.LuckyActivity;
import com.ks.lucky.pojo.DO.LuckyActivityAwardResult;
import com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra;
import com.ks.lucky.query.ActivityAwardResultQuery;
import com.ks.lucky.remote.service.LuckyActivityAwardResultService;
import com.ks.lucky.service.impl.AppManager;
import com.ks.lucky.service.impl.LuckyActivityAwardResultManager;
import com.ks.lucky.service.impl.LuckyActivityManager;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@@ -17,7 +26,16 @@
    private LuckyActivityAwardResultMapper luckyActivityAwardResultMapper;
    @Resource
    private LuckyActivityAwardResultExtraMapper luckyActivityAwardResultExtraMapper;
    @Resource
    private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
    @Resource
    private AppManager appManager;
    @Resource
    private LuckyActivityManager luckyActivityManager;
    @Override
@@ -41,8 +59,39 @@
        return null;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void recieveAward(String appKey, String uid, Long activityId) {
        //TODO 领奖
    public void recieveAward(String appKey, String uid, Long activityId) throws LuckyActivityException, LuckyActivityAwardException, LuckyActivityAwardResultException {
        //----------验证开始-----------
        Long appId = appManager.getAppId(appKey);
        LuckyActivity activity = luckyActivityManager.selectByPrimaryKey(activityId);
        if (activity == null) {
            //不存在
            throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
        }
        if (activity.getState() != LuckyActivity.STATE_OPENED) {
            throw new LuckyActivityAwardException(1, "活动尚未开奖");
        }
        ActivityAwardResultQuery query = new ActivityAwardResultQuery();
        query.uid = uid;
        query.appId = appId;
        query.activityId = activityId;
        List<LuckyActivityAwardResult> list = luckyActivityAwardResultMapper.list(query);
        if (list == null || list.size() == 0) {
            throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "尚未中奖");
        }
        Long id = list.get(0).getId();
        LuckyActivityAwardResult result = luckyActivityAwardResultMapper.selectByPrimaryKeyForUpdate(id);
        if (result.getState() != LuckyActivityAwardResult.STATE_NOT_RECIEVE) {
            throw new LuckyActivityAwardException(1, "尚未处于可领取状态");
        }
        LuckyActivityAwardResultExtra extra = luckyActivityAwardResultExtraMapper.selectByAwardResultId(result.getId());
        //----------验证结束-----------
        //发奖
        luckyActivityAwardResultManager.sendAward(result, extra);
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityAwardServiceImpl.java
@@ -16,8 +16,9 @@
    private LuckyActivityAwardManager luckyActivityAwardManager;
    @Override
    public void addAward(LuckyActivityAwards award) throws LuckyActivityAwardException {
    public Long addAward(LuckyActivityAwards award) throws LuckyActivityAwardException {
        luckyActivityAwardManager.addAward(award);
        return award.getId();
    }
    @Override
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityOpenInfoServiceImpl.java
@@ -3,32 +3,40 @@
import com.ks.lucky.exception.LuckyActivityOpenInfoException;
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
import com.ks.lucky.remote.service.LuckyActivityOpenInfoService;
import com.ks.lucky.service.impl.LuckyActivityOpenInfoManager;
import org.apache.dubbo.config.annotation.Service;
import javax.annotation.Resource;
@Service(version = "1.0")
public class LuckyActivityOpenInfoServiceImpl implements LuckyActivityOpenInfoService {
    @Override
    public void addOpenInfo(LuckyActivityOpenInfo OpenInfo) throws LuckyActivityOpenInfoException {
    @Resource
    private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
    @Override
    public Long addOpenInfo(LuckyActivityOpenInfo openInfo) throws LuckyActivityOpenInfoException {
        luckyActivityOpenInfoManager.addOpenInfo(openInfo);
        return openInfo.getId();
    }
    @Override
    public void updateOpenInfo(LuckyActivityOpenInfo OpenInfo) throws LuckyActivityOpenInfoException {
    public void updateOpenInfo(LuckyActivityOpenInfo openInfo) throws LuckyActivityOpenInfoException {
        luckyActivityOpenInfoManager.updateOpenInfo(openInfo);
    }
    @Override
    public LuckyActivityOpenInfo getOpenInfo(Long activityId) {
        return null;
        return luckyActivityOpenInfoManager.getOpenInfo(activityId);
    }
    @Override
    public LuckyActivityOpenInfo getOpenInfoDetail(Long id) {
        return null;
        return luckyActivityOpenInfoManager.getOpenInfoDetail(id);
    }
    @Override
    public void deleteOpenInfo(Long id) {
        luckyActivityOpenInfoManager.deleteOpenInfo(id);
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityOpenServiceImpl.java
@@ -1,36 +1,130 @@
package com.ks.lucky.service.impl.remote;
import com.ks.lucky.exception.LuckyActivityAwardException;
import com.ks.lucky.exception.LuckyActivityException;
import com.ks.lucky.mapper.LuckyActivityMapper;
import com.ks.lucky.pojo.DO.LuckyActivity;
import com.ks.lucky.pojo.DO.LuckyActivityAwards;
import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo;
import com.ks.lucky.remote.service.LuckyActivityOpenService;
import com.ks.lucky.service.impl.LuckyActivityAwardManager;
import com.ks.lucky.service.impl.LuckyActivityAwardResultManager;
import com.ks.lucky.service.impl.LuckyActivityJoinManager;
import com.ks.lucky.service.impl.LuckyActivityOpenInfoManager;
import com.ks.lucky.util.LuckyRunUtil;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service(version = "1.0")
public class LuckyActivityOpenServiceImpl implements LuckyActivityOpenService {
    @Override
    public List<LuckyActivity> listValidActivity(String appKey, int page, int pageSize) {
        return null;
    @Resource
    private LuckyActivityAwardManager luckyActivityAwardManager;
    @Resource
    private LuckyActivityMapper luckyActivityMapper;
    @Resource
    private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
    @Resource
    private LuckyActivityJoinManager luckyActivityJoinManager;
    @Resource
    private LuckyActivityAwardResultManager luckyActivityAwardResultManager;
    /**
     * 是否可以开奖了
     *
     * @param activity
     * @return
     */
    private boolean canOpen(LuckyActivity activity) throws LuckyActivityException {
        long now = System.currentTimeMillis();
        if (activity.getState() != LuckyActivity.STATE_FINISH) {
            throw new LuckyActivityException(1, "活动尚未结束");
    }
    @Override
    public long countValidActivity(String appKey) {
        return 0;
        LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activity.getId());
        //未达到最低开奖人数
        if (activity.getCurrentPersonCount() < openInfo.getMinPersonCount()) {
            throw new LuckyActivityException(2, "尚未达到最低开奖人数");
    }
    @Override
    public void createActivity(LuckyActivity activity) throws LuckyActivityException {
        //到达最低开奖人数就开奖
        if (activity.getPreOpenTime() != null) {
            if (activity.getPreOpenTime().getTime() > now) {
                throw new LuckyActivityException(2, "尚未达到开奖时间");
            }
        }
        return true;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public LuckyActivity getActivityDetail(Long id) {
        return null;
    public void preOpenAward(Long activityId) throws LuckyActivityException, LuckyActivityAwardException {
        //判断活动状态
        LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
        if (activity == null) {
            throw new LuckyActivityException(LuckyActivityException.CODE_NOT_EXIST, "活动不存在");
    }
    @Override
    public void updateActivity(LuckyActivity activity) throws LuckyActivityException {
        //判断是否达到开奖条件
        canOpen(activity);
        //------------计算开奖-------------
        //获取奖项数据
        List<LuckyActivityAwards> awardsList = luckyActivityAwardManager.getAwardList(activityId);
        if (awardsList == null || awardsList.size() == 0) {
            throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "无奖项信息");
    }
        //获取用户数据
        Map<String, Integer> data = luckyActivityJoinManager.getJoinData(activityId);
        for (LuckyActivityAwards awards : awardsList) {
            //获取中奖用户ID
            Set<String> uids = LuckyRunUtil.compute(data, awards.getCount());
            //保存开奖结果
            luckyActivityAwardResultManager.addRecord(uids, awards.getActivityId(), awards.getId());
        }
        //更新状态
        LuckyActivity update = new LuckyActivity();
        update.setId(activityId);
        update.setState(LuckyActivity.STATE_PRE_OPEND);
        update.setStateRemarks("预开奖成功");
        update.setUpdateTime(new Date());
        luckyActivityMapper.updateByPrimaryKeySelective(update);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void showOpenAward(Long activityId) throws LuckyActivityException {
        LuckyActivity activity = luckyActivityMapper.selectByPrimaryKeyForUpdate(activityId);
        if (activity.getState() != LuckyActivity.STATE_PRE_OPEND) {
            throw new LuckyActivityException(1, "尚未开奖");
        }
        LuckyActivity update = new LuckyActivity();
        update.setId(activityId);
        update.setUpdateTime(new Date());
        update.setState(LuckyActivity.STATE_OPENED);
        update.setStateRemarks("已开奖");
        luckyActivityMapper.updateByPrimaryKeySelective(update);
        luckyActivityAwardResultManager.setResultShow(activityId);
    }
}
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityServiceImpl.java
@@ -85,28 +85,9 @@
    @Validated
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createActivity(LuckyActivity activity) throws LuckyActivityException {
        if (activity.getAwardsList() == null || activity.getAwardsList().size() == 0) {
            throw new LuckyActivityException(LuckyActivityException.CODE_PARAMS_NOT_ENOUGH, "请设置奖项信息");
        }
        if (activity.getOpenInfo() == null) {
            throw new LuckyActivityException(LuckyActivityException.CODE_PARAMS_NOT_ENOUGH, "请设置开奖信息");
        }
        if (activity.getSponsorInfo() == null) {
            throw new LuckyActivityException(LuckyActivityException.CODE_PARAMS_NOT_ENOUGH, "请设置赞助信息");
        }
//        luckyActivityOpenInfoManager.addOpenInfo(activity.getOpenInfo());
//
//
//        luckyActivitySponsorInfoManager.addOpenInfo();
        //TODO 添加其他信息
    public Long createActivity(LuckyActivity activity) throws LuckyActivityException {
        luckyActivityMapper.insertSelective(activity);
        return activity.getId();
    }
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivitySponsorInfoServiceImpl.java
@@ -16,8 +16,9 @@
    @Override
    public void addSponsorInfo(LuckyActivitySponsorInfo sponsorInfo) throws LuckyActivitySponsorInfoException {
    public Long addSponsorInfo(LuckyActivitySponsorInfo sponsorInfo) throws LuckyActivitySponsorInfoException {
        luckyActivitySponsorInfoManager.addSponsorInfo(sponsorInfo);
        return sponsorInfo.getId();
    }
    @Override
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckySponsorServiceImpl.java
@@ -53,7 +53,7 @@
    @Validated
    @Override
    public void addSponsor(LuckySponsors sponsor) throws LuckySponsorException {
    public Long addSponsor(LuckySponsors sponsor) throws LuckySponsorException {
        LuckySponsorQuery query = new LuckySponsorQuery();
        query.account = sponsor.getAccount();
        List<LuckySponsors> list = luckySponsorsMapper.list(query);
@@ -68,6 +68,7 @@
        sponsor.setState(LuckySponsors.STATE_NORMAL);
        luckySponsorsMapper.insertSelective(sponsor);
        return sponsor.getId();
    }
    @Override
service-lucky/src/main/java/com/ks/lucky/util/LuckyRunUtil.java
@@ -8,24 +8,31 @@
public class LuckyRunUtil {
    private static Set<Long> run(Map<Long, Integer> map, int number) {
    /**
     * 计算开奖的人
     *
     * @param map
     * @param number
     * @return
     */
    public static Set<String> compute(Map<String, Integer> map, int number) {
        List<Long> mList = new ArrayList<>();
        for (Iterator<Long> its = map.keySet().iterator(); its.hasNext(); ) {
            Long uid = its.next();
        List<String> mList = new ArrayList<>();
        for (Iterator<String> its = map.keySet().iterator(); its.hasNext(); ) {
            String uid = its.next();
            int c = map.get(uid);
            for (int i = 0; i < c; i++) {
                mList.add(uid);
            }
        }
        Set<Long> luckyUids = new HashSet<>();
        Set<String> luckyUids = new HashSet<>();
        for (int i = 0; i < number; i++) {
            if (mList.size() == 0)
                break;
            long startTime = System.currentTimeMillis();
            int p = (int) (mList.size() * Math.random());
            long uid = mList.get(p);
            String uid = mList.get(p);
            luckyUids.add(uid);
            //移除列表右面的相同uid
@@ -35,7 +42,7 @@
            //查询相同uid的列表左侧起点
            for (int j = p - 1; j >= 0; j--) {
                if (mList.get(j).longValue() != uid) {
                if (!mList.get(j).equalsIgnoreCase(uid)) {
                    p = j + 1;
                    break;
                } else if (j == 0) {
service-lucky/src/main/resources/mapper/LuckyActivityAwardResultExtraMapper.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ks.lucky.mapper.LuckyActivityAwardResultExtraMapper">
  <resultMap id="BaseResultMap" type="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">
    <id column="id" jdbcType="BIGINT" property="id" />
@@ -7,100 +8,55 @@
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="phone" jdbcType="VARCHAR" property="phone" />
    <result column="address" jdbcType="VARCHAR" property="address" />
        <result column="red_package" jdbcType="DICIMAL" property="redPackage"/>
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
        <result column="alipay_uid" property="alipyUid" jdbcType="VARCHAR"/>
  </resultMap>
  <sql id="Base_Column_List">
    id, award_result_id, name, phone, address, create_time
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    select
    <sql id="Base_Column_List">id, award_result_id,red_package, name, phone, address, create_time,alipay_uid</sql>
    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">select
    <include refid="Base_Column_List" />
    from lucky_activity_award_result_extra
    where id = #{id,jdbcType=BIGINT}
        from lucky_activity_award_result_extra where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    delete from lucky_activity_award_result_extra
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">
    insert into lucky_activity_award_result_extra (id, award_result_id, name,
      phone, address, create_time
      )
    values (#{id,jdbcType=BIGINT}, #{awardResultId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR},
      #{phone,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}
      )
  </insert>
  <insert id="insertSelective" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">
    insert into lucky_activity_award_result_extra
    <delete id="deleteByPrimaryKey"
            parameterType="java.lang.Long">delete from lucky_activity_award_result_extra where id = #{id,jdbcType=BIGINT}</delete>
    <insert id="insert"
            parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">insert into lucky_activity_award_result_extra (id, award_result_id, name, phone, address, create_time,red_package,alipay_uid) values (#{id,jdbcType=BIGINT}, #{awardResultId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},#{redPackage,jdbcType=DECIMAL} ,#{alipyUid,jdbcType=VARCHAR})</insert>
    <insert id="insertSelective" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">insert into
        lucky_activity_award_result_extra
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="awardResultId != null">
        award_result_id,
      </if>
      <if test="name != null">
        name,
      </if>
      <if test="phone != null">
        phone,
      </if>
      <if test="address != null">
        address,
      </if>
      <if test="createTime != null">
        create_time,
      </if>
            <if test="id != null">id,</if>
            <if test="awardResultId != null">award_result_id,</if>
            <if test="name != null">name,</if>
            <if test="phone != null">phone,</if>
            <if test="address != null">address,</if>
            <if test="createTime != null">create_time,</if>
            <if test="redPackage != null">red_package,</if>
            <if test="alipyUid != null">alipay_uid,</if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="awardResultId != null">
        #{awardResultId,jdbcType=BIGINT},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="phone != null">
        #{phone,jdbcType=VARCHAR},
      </if>
      <if test="address != null">
        #{address,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
            <if test="id != null">#{id,jdbcType=BIGINT},</if>
            <if test="awardResultId != null">#{awardResultId,jdbcType=BIGINT},</if>
            <if test="name != null">#{name,jdbcType=VARCHAR},</if>
            <if test="phone != null">#{phone,jdbcType=VARCHAR},</if>
            <if test="address != null">#{address,jdbcType=VARCHAR},</if>
            <if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if>
            <if test="redPackage != null">#{redPackage,jdbcType=DECIMAL},</if>
            <if test="alipyUid != null">#{alipyUid,jdbcType=VARCHAR},</if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">
    update lucky_activity_award_result_extra
    <update id="updateByPrimaryKeySelective" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">update
        lucky_activity_award_result_extra
    <set>
      <if test="awardResultId != null">
        award_result_id = #{awardResultId,jdbcType=BIGINT},
      </if>
      <if test="name != null">
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="phone != null">
        phone = #{phone,jdbcType=VARCHAR},
      </if>
      <if test="address != null">
        address = #{address,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        create_time = #{createTime,jdbcType=TIMESTAMP},
      </if>
            <if test="awardResultId != null">award_result_id = #{awardResultId,jdbcType=BIGINT},</if>
            <if test="name != null">name = #{name,jdbcType=VARCHAR},</if>
            <if test="phone != null">phone = #{phone,jdbcType=VARCHAR},</if>
            <if test="address != null">address = #{address,jdbcType=VARCHAR},</if>
            <if test="createTime != null">create_time = #{createTime,jdbcType=TIMESTAMP},</if>
            <if test="redPackage != null">red_package = #{redPackage,jdbcType=DECIMAL},</if>
            <if test="alipyUid !=null">alipay_uid =#{alipyUid,jdbcType=VARCHAR},</if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">
    update lucky_activity_award_result_extra
    set award_result_id = #{awardResultId,jdbcType=BIGINT},
      name = #{name,jdbcType=VARCHAR},
      phone = #{phone,jdbcType=VARCHAR},
      address = #{address,jdbcType=VARCHAR},
      create_time = #{createTime,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=BIGINT}
  </update>
    <update id="updateByPrimaryKey"
            parameterType="com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra">update lucky_activity_award_result_extra set award_result_id = #{awardResultId,jdbcType=BIGINT}, name = #{name,jdbcType=VARCHAR}, phone = #{phone,jdbcType=VARCHAR}, address = #{address,jdbcType=VARCHAR}, create_time = #{createTime,jdbcType=TIMESTAMP}, red_package = #{redPackage,jdbcType=DECIMAL} ,alipay_uid =#{alipyUid,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT}</update>
</mapper>
service-lucky/src/test/java/com/ks/MyBatisTest.java
New file
@@ -0,0 +1,13 @@
package com.ks;
import com.ks.lucky.pojo.DO.LuckyActivityAwardResultExtra;
import org.junit.jupiter.api.Test;
import org.yeshi.utils.mybatis.ColumnParseUtil;
public class MyBatisTest {
    @Test
    public void test(){
        ColumnParseUtil.parseColumn(LuckyActivityAwardResultExtra.class,"D:\\workspace\\DayBuy\\service-lucky\\src\\main\\resources\\mapper\\LuckyActivityAwardResultExtraMapper.xml");
    }
}
service-lucky/src/test/java/com/ks/lucky/DaoTest.java
New file
@@ -0,0 +1,18 @@
package com.ks.lucky;
import com.ks.lucky.pojo.DO.LuckyActivityAwardMaterial;
import com.ks.lucky.pojo.DO.LuckySponsorAd;
import org.junit.jupiter.api.Test;
import org.yeshi.utils.mongo.MongoDaoUtil;
public class DaoTest {
    @Test
    public void test1() {
        System.out.println(MongoDaoUtil.createUpdateSelective(LuckySponsorAd.class));
    }
}