Commit 27dbf3e1 authored by 邓吉芬's avatar 邓吉芬

1. 添加商户信息

2. 支持人本超市抽奖,改造接口
3. 修改相关业务代码
parent fa87c65e
......@@ -2,6 +2,9 @@ package com.miya.draw.controller;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Sets;
import com.miya.draw.xxljob.RbcsDrawResultSyncJob;
import com.miya.draw.xxljob.RbcsTradeSyncJob;
import com.miya.draw.xxljob.TradeSyncJob;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -9,11 +12,9 @@ import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Objects;
import java.util.Set;
......@@ -88,4 +89,19 @@ public class RedisController {
return keys;
}
@Resource
private RbcsDrawResultSyncJob rbcsDrawResultSyncJob;
@Resource
private RbcsTradeSyncJob rbcsTradeSyncJob;
@Resource
private TradeSyncJob tradeSyncJob;
@GetMapping("job")
public void test() throws Exception {
rbcsDrawResultSyncJob.execute(null);
}
}
......@@ -29,6 +29,9 @@ public class Activity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "商户Id")
private Long mchId;
@ApiModelProperty(value = "活动名称")
private String name;
......@@ -59,6 +62,9 @@ public class Activity implements Serializable {
@ApiModelProperty(value = "0 不限制门店 1限制门店")
private Integer activityStoreStatus;
@ApiModelProperty(value = "0 不限商品 1限制商品 2剔除商品")
private Integer activityGoodsStatus;
@ApiModelProperty(value = "开始时间")
private Date startTime;
......
......@@ -27,6 +27,9 @@ public class SyncRecord implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "商户Id")
private Long mchId;
@ApiModelProperty(value = "上次同步到的时间")
private LocalDateTime lastSyncTime;
......
......@@ -28,6 +28,10 @@ public class SyncTrade implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "商户Id")
private Long mchId;
@ApiModelProperty(value = "十足同步表的主键")
private Long billNo;
......
package com.miya.draw.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author :djf
* @date :2022-12-09
* @description:
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="trade_rbcs对象", description="")
public class TradeRbcs implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "序号")
@TableId(value = "billno", type = IdType.AUTO)
private Integer billno;
@ApiModelProperty(value = "交易ID")
@TableField("tradeIdId")
private String tradeidid;
@ApiModelProperty(value = "流水id")
private String uuid;
@ApiModelProperty(value = "门店号")
@TableField("storeId")
private String storeid;
@ApiModelProperty(value = "门店名称")
@TableField("storeName")
private String storename;
@ApiModelProperty(value = "小票号")
@TableField("tradeNo")
private String tradeno;
@ApiModelProperty(value = "POS机号")
@TableField("posNo")
private String posno;
@ApiModelProperty(value = "交易类型")
private String type;
@ApiModelProperty(value = "交易时间")
@TableField("tranTime")
private LocalDateTime trantime;
@ApiModelProperty(value = "货号")
private String code;
@ApiModelProperty(value = "条码")
private String barcode;
@ApiModelProperty(value = "商品名称")
private String name;
@ApiModelProperty(value = "品牌")
@TableField("brandCode")
private String brandcode;
@ApiModelProperty(value = "类别")
@TableField("categoryCode")
private String categorycode;
@ApiModelProperty(value = "包装规格")
@TableField("qpcStr")
private String qpcstr;
@ApiModelProperty(value = "价格")
private BigDecimal price;
@ApiModelProperty(value = "数量")
private Integer qty;
@ApiModelProperty(value = "原总金额")
@TableField("stdAmount")
private BigDecimal stdamount;
@ApiModelProperty(value = "优惠金额")
@TableField("favAmount")
private BigDecimal favamount;
@ApiModelProperty(value = "会员id")
@TableField("memberId")
private String memberid;
@ApiModelProperty(value = "手机号")
@TableField("identityId")
private String identityid;
@ApiModelProperty(value = "插入时间")
private LocalDateTime sendtime;
@ApiModelProperty(value = "更新状态")
private String status;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatetime;
}
package com.miya.draw.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author :djf
* @date :2022-12-12
* @description:
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="winner_rbcs对象", description="")
public class WinnerRbcs implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId(value = "winner_id", type = IdType.AUTO)
private Long winnerId;
@ApiModelProperty(value = "账号名称")
private String accountName;
@ApiModelProperty(value = "账户手机")
private String accountPhone;
@ApiModelProperty(value = "奖品id")
private Long prizeId;
@ApiModelProperty(value = "奖品名称")
private String prizeName;
@ApiModelProperty(value = "奖品类型 1实物 2虚拟")
private Integer prizeType;
@ApiModelProperty(value = "收件人姓名")
private String consigneeName;
@ApiModelProperty(value = "收件人手机")
private String consigneePhone;
@ApiModelProperty(value = "收件人地址")
private String consigneeAddress;
@ApiModelProperty(value = "收件人身份证号")
private String consigneeIdcard;
@ApiModelProperty(value = "同步id 用于后续更新")
private Long syncId;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
}
......@@ -8,17 +8,19 @@ import lombok.Getter;
* @description:活动限制门店状态
*/
@Getter
public enum ActivityStoreStatusEnum {
public enum ActivityStoreAndGoodsStatusEnum {
NO_CONFINE(0,"不限制"),
CONFINE(1,"限制");
CONFINE(1,"限制"),
ELIMINATE(2,"剔除");
private int code;
private String name;
ActivityStoreStatusEnum(int code, String name) {
ActivityStoreAndGoodsStatusEnum(int code, String name) {
this.code = code;
this.name = name;
}
......
......@@ -87,19 +87,11 @@ public class DrawManagerImpl implements IDrawManager {
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
Integer maxDrawCountLimit = activity.getDrawMaxCount();
Long mchId = activity.getMchId();
//获取已抽奖信息
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(request.getPhone(), activity.getId(), start, end);
List<String> goodCodeList = activityGoodsService.listAllActivityGoods(activity.getId());
//获取订单信息
List<SyncTrade> buyGoodList;
if(activity.getActivityStoreStatus() == ActivityStoreStatusEnum.NO_CONFINE.getCode() ){
buyGoodList = syncTradeService.listCanDrawGoods(request.getPhone(), start, end, null, goodCodeList);
}else{
List<String> storeIdList = activityStoreService.listAllActivityStoreId(activity.getId());
buyGoodList = syncTradeService.listCanDrawGoods(request.getPhone(), start, end, storeIdList, goodCodeList);
}
List<SyncTrade> buyGoodList = getTradeInfo(request.getPhone(), start, end,activity);
BigDecimal buyTotal = gainBuyTotal(buyGoodList);
Long purchasedAmount = buyTotal.multiply(BigDecimal.valueOf(100)).longValue();
Integer drawCountTotal =0;
......@@ -210,18 +202,8 @@ public class DrawManagerImpl implements IDrawManager {
LocalDateTime start = nowTime.minusDays(activity.getValidTime()-1);
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
List<SyncTrade> buyGoodList;
if(activity.getActivityStoreStatus() == ActivityStoreStatusEnum.NO_CONFINE.getCode() ){
buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, null, activityGoodsService.listAllActivityGoods(activityId));
}else{
//限制门店的情况
List<String> storeCodeList =activityStoreService.listAllActivityStoreId(activityId);
if (CollectionUtils.isEmpty(storeCodeList)) {
buyGoodList = Lists.newArrayList();
}else{
buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, storeCodeList, activityGoodsService.listAllActivityGoods(activityId));
}
}
Long mchId = activity.getMchId();
List<SyncTrade> buyGoodList = getTradeInfo(phone,start,end,activity);
int drawCountTotal =0;
//3 判断抽奖方式
//足量抽奖
......@@ -301,6 +283,32 @@ public class DrawManagerImpl implements IDrawManager {
}
/**
* 获取参与活动用户的订单数据
* @return
*/
public List<SyncTrade> getTradeInfo(String phone, LocalDateTime start,LocalDateTime end,Activity activity ){
Long mchId = activity.getMchId();
Long activityId = activity.getId();
/**
* 活动商品
*/
List<String> listAllActivityGoods = null;
List<String> storeCodeList = null;
//限制商品时获取限制或要剔除的商品
if(activity.getActivityGoodsStatus() == ActivityStoreAndGoodsStatusEnum.CONFINE.getCode() ||
activity.getActivityGoodsStatus() == ActivityStoreAndGoodsStatusEnum.ELIMINATE.getCode()){
listAllActivityGoods = activityGoodsService.listAllActivityGoods(activityId);
}
if(activity.getActivityStoreStatus() == ActivityStoreAndGoodsStatusEnum.CONFINE.getCode() ||
activity.getActivityStoreStatus() == ActivityStoreAndGoodsStatusEnum.ELIMINATE.getCode()){
storeCodeList = activityStoreService.listAllActivityStoreId(activityId);
}
return syncTradeService.listCanDrawGoods(mchId,phone, start, end, storeCodeList, listAllActivityGoods,activity);
}
/**
* 用户限中奖品后重新获取奖品List
* 1. 获取限制的奖品Id
......
......@@ -18,12 +18,12 @@ import java.util.List;
public interface SyncTradeMapper extends BaseMapper<SyncTrade> {
@Select("<script>"
+ "INSERT INTO sync_trade (bill_no,trade_id_id, uuid, type, pos_no, phone, member_id, trade_no, store_id, store_name, tran_time, code, name, barcode, price, qty, std_amount, fav_amount ) VALUES "
+ "INSERT INTO sync_trade (mch_id,bill_no,trade_id_id, uuid, type, pos_no, phone, member_id, trade_no, store_id, store_name, tran_time, code, name, barcode, price, qty, std_amount, fav_amount ) VALUES "
+ "<foreach item='item' collection='list' separator=',' >"
+ "(#{item.billNo},#{item.tradeIdId},#{item.uuid},#{item.type},#{item.posNo},#{item.phone},#{item.memberId},#{item.tradeNo},#{item.storeId},#{item.storeName},#{item.tranTime},#{item.code},#{item.name},#{item.barcode},#{item.price},#{item.qty},#{item.stdAmount},#{item.favAmount})"
+ "(#{item.mchId},#{item.billNo},#{item.tradeIdId},#{item.uuid},#{item.type},#{item.posNo},#{item.phone},#{item.memberId},#{item.tradeNo},#{item.storeId},#{item.storeName},#{item.tranTime},#{item.code},#{item.name},#{item.barcode},#{item.price},#{item.qty},#{item.stdAmount},#{item.favAmount})"
+ "</foreach>"
+ " ON DUPLICATE KEY UPDATE "
+ "store_id = VALUES(store_id), tran_time = VALUES(tran_time),code=VALUES(code),barcode=VALUES(barcode),std_amount = VALUES(std_amount),fav_amount = VALUES(fav_amount) "
+ "mch_id =VALUES(mch_id), store_id = VALUES(store_id), tran_time = VALUES(tran_time),code=VALUES(code),barcode=VALUES(barcode),std_amount = VALUES(std_amount),fav_amount = VALUES(fav_amount) "
+ "</script>")
Integer saveOrUpdateBatchByUniqKey(@Param("list") List<SyncTrade> syncTrades);
}
package com.miya.draw.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.miya.draw.entity.TradeRbcs;
/**
* @author :djf
* @date :2022-12-09
* @description:人本超市订单
*/
public interface TradeRbcsMapper extends BaseMapper<TradeRbcs> {
}
package com.miya.draw.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.miya.draw.entity.Winner;
import com.miya.draw.entity.WinnerRbcs;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author :djf
* @date :2022-12-12
* @description:
*/
public interface WinnerRbcsMapper extends BaseMapper<WinnerRbcs> {
@Select("<script>"
+ "INSERT INTO winner_rbcs(account_name, account_phone, prize_id, prize_type, prize_name, consignee_name, consignee_phone, consignee_address, consignee_idcard, sync_id) VALUES "
+ "<foreach item='item' collection='list' separator=',' >"
+ "(#{item.accountName},#{item.accountPhone},#{item.prizeId},#{item.prizeType},#{item.prizeName},#{item.consigneeName},#{item.consigneePhone},#{item.consigneeAddress},#{item.consigneeIdcard},#{item.syncId})"
+ "</foreach>"
+ " ON DUPLICATE KEY UPDATE "
+ "consignee_name = VALUES(consignee_name), consignee_phone = VALUES(consignee_phone),consignee_address=VALUES(consignee_address),consignee_idcard=VALUES(consignee_idcard) "
+ "</script>")
Integer saveOrUpdateBatchByDulpKe(@Param("list") List<Winner> winnerList);
}
......@@ -10,6 +10,10 @@ import lombok.Data;
@Data
public class SyncTradeConfigModel {
/**
* 商户Id
*/
private Long mchId;
/**
* 每次读取多少条
*/
......
......@@ -2,6 +2,8 @@ package com.miya.draw.service;
import com.miya.draw.entity.Activity;
import java.util.List;
/**
* @author :djf
* @date :2022-10-25
......@@ -15,4 +17,11 @@ public interface IActivityService {
* @return
*/
Activity getById(Long id);
/**
* 根据商户获取活动Id
* @param mchId
* @return
*/
List<Long> getActivityIdByMchId(Long mchId);
}
package com.miya.draw.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.miya.draw.entity.Activity;
import com.miya.draw.entity.SyncTrade;
import java.time.LocalDateTime;
......@@ -26,7 +27,7 @@ public interface ISyncTradeService extends IService<SyncTrade> {
* @param goodCodeList 参加活动的商品
* @return
*/
List<SyncTrade> listCanDrawGoods(String phone, LocalDateTime start, LocalDateTime end, List<String> storeIdList, List<String> goodCodeList);
List<SyncTrade> listCanDrawGoods(Long mchId, String phone, LocalDateTime start, LocalDateTime end, List<String> storeIdList, List<String> goodCodeList, Activity activity);
/**
* 按唯一键进行批量更新
......
package com.miya.draw.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.miya.draw.entity.SyncTrade;
import com.miya.draw.entity.TradeRbcs;
import java.util.List;
/**
* @author :djf
* @date :2022-12-09
* @description:人本超市服务类
*/
public interface ITradeRbcsService extends IService<TradeRbcs> {
/**
* 获取订单的同步数据
* @param maxId
* @param maxSize
* @return
*/
List<TradeRbcs> listByNeedSize(Long maxId, Integer maxSize);
/**
* 修改同步状态
* @param syncTrades
*/
boolean updateBatchByIdNoTrans(List<SyncTrade> syncTrades);
}
package com.miya.draw.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.miya.draw.entity.Winner;
import com.miya.draw.entity.WinnerRbcs;
import java.util.List;
/**
* @author :djf
* @date :2022-12-12
* @description:人本超市中奖信息
*/
public interface IWinnerRbcsService extends IService<WinnerRbcs> {
/**
*
* @param winnerList
*/
Integer saveOrUpdateBatchByDulpKey(List<Winner> winnerList);
}
......@@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author :djf
......@@ -27,4 +28,15 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> i
wrapper.eq(Activity::getId,id);
return baseMapper.selectOne(wrapper);
}
@Override
public List<Long> getActivityIdByMchId(Long mchId) {
LambdaQueryWrapper<Activity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Activity::getMchId,mchId);
List<Activity> list = baseMapper.selectList(wrapper);
if(CollectionUtils.isEmpty(list)){
return null;
}
return list.stream().map(Activity::getId).collect(Collectors.toList());
}
}
package com.miya.draw.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miya.draw.entity.SyncTrade;
import com.miya.draw.entity.Trade;
import com.miya.draw.entity.TradeRbcs;
import com.miya.draw.mapper.TradeRbcsMapper;
import com.miya.draw.service.ITradeRbcsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* @author :djf
* @date :2022-12-09
* @description:人本超市订单
*/
@Service
@DS("db2")
@Slf4j
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class ITradeRbcsServiceImpl extends ServiceImpl<TradeRbcsMapper, TradeRbcs> implements ITradeRbcsService{
@Resource
private TradeRbcsMapper tradeRbcsMapper;
@Override
public List<TradeRbcs> listByNeedSize(Long maxId, Integer maxSize) {
LambdaQueryWrapper<TradeRbcs> wrapper = new LambdaQueryWrapper();
wrapper.gt(TradeRbcs::getBillno, maxId);
// wrapper.ge(Trade::getTrantime, LocalDateTimeUtil.beginOfDay(LocalDateTime.now()));
wrapper.isNotNull(TradeRbcs::getIdentityid);
wrapper.last("limit " + maxSize);
return tradeRbcsMapper.selectList(wrapper);
}
@Override
public boolean updateBatchByIdNoTrans(List<SyncTrade> syncTrades) {
// 更新十足数据库出错了也就出错了
List<TradeRbcs> batchTrade = new ArrayList<>();
TradeRbcs trade;
try {
for (SyncTrade syncTrade : syncTrades) {
trade = new TradeRbcs();
trade.setBillno(Math.toIntExact(syncTrade.getBillNo()));
trade.setStatus("Y");
trade.setUpdatetime(LocalDateTime.now());
batchTrade.add(trade);
}
return updateBatchById(batchTrade);
} catch (Exception e) {
log.error("回调更新十足数据库状态出错:{} list={}", e.getMessage(), JSON.toJSON(syncTrades));
}
return false;
}
}
package com.miya.draw.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miya.draw.entity.Winner;
import com.miya.draw.entity.WinnerRbcs;
import com.miya.draw.mapper.WinnerMapper;
import com.miya.draw.mapper.WinnerRbcsMapper;
import com.miya.draw.service.IWinnerRbcsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author :djf
* @date :2022-12-12
* @description:
*/
@Service
@Slf4j
@DS("db2")
public class IWinnerRbcsServiceImpl extends ServiceImpl<WinnerRbcsMapper, WinnerRbcs> implements IWinnerRbcsService {
@Resource
private WinnerRbcsMapper winnerRbcsMapper;
@Override
public Integer saveOrUpdateBatchByDulpKey(List<Winner> winnerList) {
return winnerRbcsMapper.saveOrUpdateBatchByDulpKe(winnerList);
}
}
\ No newline at end of file
......@@ -2,7 +2,9 @@ package com.miya.draw.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Lists;
import com.miya.draw.entity.Activity;
import com.miya.draw.entity.SyncTrade;
import com.miya.draw.enums.ActivityStoreAndGoodsStatusEnum;
import com.miya.draw.mapper.SyncTradeGoodMapper;
import com.miya.draw.mapper.SyncTradeMapper;
import com.miya.draw.service.ISyncTradeService;
......@@ -34,15 +36,28 @@ public class SyncTradeServiceImpl extends ServiceImpl<SyncTradeMapper, SyncTrade
private SyncTradeMapper syncTradeMapper;
@Override
public List<SyncTrade> listCanDrawGoods(String phone, LocalDateTime start, LocalDateTime end, List<String> storeIdList, List<String> goodCodeList) {
public List<SyncTrade> listCanDrawGoods(Long mchId, String phone, LocalDateTime start, LocalDateTime end, List<String> storeIdList, List<String> goodCodeList, Activity activity) {
if (CollectionUtils.isEmpty(goodCodeList)) {
return Lists.newArrayList();
}
LambdaQueryWrapper<SyncTrade> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SyncTrade::getPhone, phone)
.between(SyncTrade::getTranTime, start, end)
.in(CollectionUtils.isNotEmpty(storeIdList),SyncTrade::getStoreId, storeIdList)
.in(SyncTrade::getCode, goodCodeList);
wrapper.eq(SyncTrade::getMchId,mchId)
.eq(SyncTrade::getPhone, phone)
.between(SyncTrade::getTranTime, start, end);
//限制门店
if(activity.getActivityStoreStatus() == ActivityStoreAndGoodsStatusEnum.CONFINE.getCode()){
wrapper.in(SyncTrade::getStoreId,storeIdList);
//剔除门店
}else if(activity.getActivityStoreStatus() == ActivityStoreAndGoodsStatusEnum.ELIMINATE.getCode()){
wrapper.notIn(SyncTrade::getStoreId,storeIdList);
}
//限制商品
if(activity.getActivityGoodsStatus() == ActivityStoreAndGoodsStatusEnum.CONFINE.getCode()){
wrapper.in(SyncTrade::getCode,storeIdList);
//剔除商品
}else if(activity.getActivityGoodsStatus() == ActivityStoreAndGoodsStatusEnum.ELIMINATE.getCode()){
wrapper.notIn(SyncTrade::getCode,goodCodeList);
}
return syncTradeMapper.selectList(wrapper);
}
......
......@@ -8,6 +8,7 @@ import com.miya.draw.enums.PrizeTypeEnum;
import com.miya.draw.enums.YesOrNoEnum;
import com.miya.draw.model.SyncTradeConfigModel;
import com.miya.draw.service.IAccountPrizeService;
import com.miya.draw.service.IActivityService;
import com.miya.draw.service.IWinnerService;
import com.miya.draw.util.OrikaUtil;
import com.xxl.job.core.biz.model.ReturnT;
......@@ -45,9 +46,14 @@ public class DrawResultSyncJob extends IJobHandler {
*/
private Integer maxSize = 500;
private Long mchId = 14229L;
@Autowired
private IAccountPrizeService accountPrizeService;
@Autowired
private IActivityService activityService;
@Autowired
private IWinnerService winnerService;
......@@ -58,10 +64,17 @@ public class DrawResultSyncJob extends IJobHandler {
if (StringUtils.isNotBlank(s)) {
SyncTradeConfigModel model = JSON.parseObject(s, SyncTradeConfigModel.class);
maxSize = model.getMaxSize();
mchId = model.getMchId();
}
List<Long> activityIds = activityService.getActivityIdByMchId(mchId);
if(CollectionUtils.isEmpty(activityIds)){
XxlJobLogger.log("该商户没有抽奖活动");
return null;
}
LambdaQueryWrapper<AccountPrize> wrapper = new LambdaQueryWrapper();
wrapper.ne(AccountPrize::getPrizeType, PrizeTypeEnum.NO_COUPON.getCode());
wrapper.eq(AccountPrize::getSyncStatus, YesOrNoEnum.NO);
wrapper.in(AccountPrize::getActivityId,activityIds);
wrapper.orderByDesc(AccountPrize::getId);
wrapper.last("limit " + maxSize);
List<AccountPrize> accountPrizeList = accountPrizeService.list(wrapper);
......
package com.miya.draw.xxljob;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.miya.draw.entity.AccountPrize;
import com.miya.draw.entity.Winner;
import com.miya.draw.enums.PrizeTypeEnum;
import com.miya.draw.enums.YesOrNoEnum;
import com.miya.draw.model.SyncTradeConfigModel;
import com.miya.draw.service.IAccountPrizeService;
import com.miya.draw.service.IActivityService;
import com.miya.draw.service.IWinnerRbcsService;
import com.miya.draw.service.IWinnerService;
import com.miya.draw.util.OrikaUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* 十足抽奖结果同步
*
* @author jack
*/
@Slf4j
@JobHandler("rbcsDrawResultSyncJob")
@Component
public class RbcsDrawResultSyncJob extends IJobHandler {
static {
OrikaUtil.classMap(AccountPrize.class, Winner.class)
.field("id", "syncId")
.byDefault().register();
}
/**
* 一次最多取多少数据
*/
private Integer maxSize = 500;
private Long mchId = 14230L;
@Autowired
private IAccountPrizeService accountPrizeService;
@Autowired
private IActivityService activityService;
@Autowired
private IWinnerRbcsService winnerRbcsService;
@Override
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("向十足同步开始:{}" + LocalDateTime.now().toString());
log.info("向十足同步开始:{}" + LocalDateTime.now().toString());
if (StringUtils.isNotBlank(s)) {
SyncTradeConfigModel model = JSON.parseObject(s, SyncTradeConfigModel.class);
maxSize = model.getMaxSize();
mchId = model.getMchId();
}
List<Long> activityIds = activityService.getActivityIdByMchId(mchId);
if(CollectionUtils.isEmpty(activityIds)){
XxlJobLogger.log("该商户没有抽奖活动");
return null;
}
LambdaQueryWrapper<AccountPrize> wrapper = new LambdaQueryWrapper();
wrapper.ne(AccountPrize::getPrizeType, PrizeTypeEnum.NO_COUPON.getCode());
wrapper.eq(AccountPrize::getSyncStatus, YesOrNoEnum.NO);
wrapper.in(AccountPrize::getActivityId,activityIds);
wrapper.orderByDesc(AccountPrize::getId);
wrapper.last("limit " + maxSize);
List<AccountPrize> accountPrizeList = accountPrizeService.list(wrapper);
if (CollectionUtils.isNotEmpty(accountPrizeList)) {
XxlJobLogger.log("同步内容:{}", accountPrizeList.stream().map(AccountPrize::getId).collect(Collectors.toList()));
log.info("同步内容:{}", accountPrizeList.stream().map(AccountPrize::getId).collect(Collectors.toList()));
List<Winner> winnerList = OrikaUtil.convertList(accountPrizeList, Winner.class);
winnerRbcsService.saveOrUpdateBatchByDulpKey(winnerList);
accountPrizeList.forEach(
accountPrize -> accountPrize.setSyncStatus(YesOrNoEnum.YES.getCode())
);
accountPrizeService.updateBatchById(accountPrizeList);
}
XxlJobLogger.log("向十足同步结束:" + LocalDateTime.now().toString());
log.info("向十足同步结束:" + LocalDateTime.now().toString());
return ReturnT.SUCCESS;
}
}
package com.miya.draw.xxljob;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Lists;
import com.miya.draw.entity.SyncRecord;
import com.miya.draw.entity.SyncTrade;
import com.miya.draw.entity.Trade;
import com.miya.draw.entity.TradeRbcs;
import com.miya.draw.model.SyncTradeConfigModel;
import com.miya.draw.service.ISyncRecordService;
import com.miya.draw.service.ISyncTradeService;
import com.miya.draw.service.ITradeRbcsService;
import com.miya.draw.service.ITradeService;
import com.miya.draw.util.OrikaUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author :djf
* @date :2022-12-08
* @description:人本超市订单数据同步
*/
@Slf4j
@JobHandler("rbcsTradeSyncJob")
@Component
public class RbcsTradeSyncJob extends IJobHandler {
static {
OrikaUtil.classMap(TradeRbcs.class, SyncTrade.class)
.field("billno", "billNo")
.field("tradeidid", "tradeIdId")
.field("storeid", "storeId")
.field("storename", "storeName")
.field("tradeno", "tradeNo")
.field("posno", "posNo")
.field("trantime", "tranTime")
.field("stdamount", "stdAmount")
.field("favamount", "favAmount")
.field("memberid", "memberId")
.field("identityid", "phone")
.byDefault().register();
}
@Autowired
private ITradeRbcsService tradeRbcsService;
@Autowired
private ISyncTradeService syncTradeService;
@Autowired
private ISyncRecordService syncRecordService;
/**
* 一次最多取多少数据
*/
private Integer maxSize = 2000;
/**
* 每次存多少条数据
*/
private Integer writeUnit = 500;
/**
* 商户Id
*/
private Long mchId =14230L;
@Override
@Transactional(rollbackFor = Exception.class)
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("十足同步开始:" + LocalDateTime.now().toString());
if (StringUtils.isNotBlank(s)) {
SyncTradeConfigModel model = JSON.parseObject(s, SyncTradeConfigModel.class);
maxSize = model.getMaxSize();
writeUnit = model.getWriteUnit();
mchId = model.getMchId();
}
LambdaQueryWrapper<SyncRecord> wrapper = new LambdaQueryWrapper();
wrapper.eq(SyncRecord::getMchId,mchId);
wrapper.orderByDesc(SyncRecord::getId);
wrapper.last("LIMIT 1");
SyncRecord syncRecord = syncRecordService.getOne(wrapper);
Long maxId = Objects.isNull(syncRecord) ? 0 : syncRecord.getLastSyncId();
List<TradeRbcs> tradeList = tradeRbcsService.listByNeedSize(maxId, maxSize);
List<SyncTrade> syncTradeList = OrikaUtil.convertList(tradeList, SyncTrade.class);
// 升序
syncTradeList = syncTradeList.stream().sorted(Comparator.comparing(SyncTrade::getBillNo))
.collect(Collectors.toList());
Long finalMchId = mchId;
syncTradeList.forEach(trade->trade.setMchId(finalMchId));
// 分割
List<List<SyncTrade>> syncTradeParts = Lists.partition(syncTradeList, writeUnit);
if (Objects.isNull(syncRecord)) {
syncRecord = new SyncRecord();
}
for (List<SyncTrade> syncTrades : syncTradeParts) {
// 批量更新
syncTradeService.saveOrUpdateBatchByUniqKey(syncTrades);
// 更新记录
SyncTrade last = syncTrades.get(syncTrades.size() - 1);
syncRecord.setMchId(mchId);
syncRecord.setLastSyncId(last.getBillNo());
syncRecord.setLastSyncTime(last.getTranTime());
syncRecord.setUpdateTime(LocalDateTime.now());
syncRecordService.saveOrUpdate(syncRecord);
// 回写十足库
tradeRbcsService.updateBatchByIdNoTrans(syncTrades);
}
XxlJobLogger.log("十足同步结束:" + LocalDateTime.now().toString());
return ReturnT.SUCCESS;
}
}
......@@ -71,27 +71,34 @@ public class TradeSyncJob extends IJobHandler {
* 每次存多少条数据
*/
private Integer writeUnit = 500;
/**
* 商户Id
*/
private Long mchId =14229L;
@Override
@Transactional(rollbackFor = Exception.class)
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("十足同步开始:" + LocalDateTime.now().toString());
LambdaQueryWrapper<SyncRecord> wrapper = new LambdaQueryWrapper();
wrapper.orderByDesc(SyncRecord::getId);
wrapper.last("LIMIT 1");
SyncRecord syncRecord = syncRecordService.getOne(wrapper);
Long maxId = Objects.isNull(syncRecord) ? 0 : syncRecord.getLastSyncId();
if (StringUtils.isNotBlank(s)) {
SyncTradeConfigModel model = JSON.parseObject(s, SyncTradeConfigModel.class);
maxSize = model.getMaxSize();
writeUnit = model.getWriteUnit();
mchId = model.getMchId();
}
LambdaQueryWrapper<SyncRecord> wrapper = new LambdaQueryWrapper();
wrapper.eq(SyncRecord::getMchId,mchId);
wrapper.orderByDesc(SyncRecord::getId);
wrapper.last("LIMIT 1");
SyncRecord syncRecord = syncRecordService.getOne(wrapper);
Long maxId = Objects.isNull(syncRecord) ? 0 : syncRecord.getLastSyncId();
List<Trade> tradeList = tradeService.ListNeedSyncTrade(maxId, maxSize);
List<SyncTrade> syncTradeList = OrikaUtil.convertList(tradeList, SyncTrade.class);
// 升序
syncTradeList = syncTradeList.stream().sorted(Comparator.comparing(SyncTrade::getBillNo))
.collect(Collectors.toList());
Long finalMchId = mchId;
syncTradeList.forEach(trade->trade.setMchId(finalMchId));
// 分割
List<List<SyncTrade>> syncTradeParts = Lists.partition(syncTradeList, writeUnit);
if (Objects.isNull(syncRecord)) {
......@@ -101,9 +108,9 @@ public class TradeSyncJob extends IJobHandler {
for (List<SyncTrade> syncTrades : syncTradeParts) {
// 批量更新
syncTradeService.saveOrUpdateBatchByUniqKey(syncTrades);
// 更新记录
SyncTrade last = syncTrades.get(syncTrades.size() - 1);
syncRecord.setMchId(mchId);
syncRecord.setLastSyncId(last.getBillNo());
syncRecord.setLastSyncTime(last.getTranTime());
syncRecord.setUpdateTime(LocalDateTime.now());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment