diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOfflineActivityGrantController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOfflineActivityGrantController.java index 59c796489..2ef812b6f 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOfflineActivityGrantController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOfflineActivityGrantController.java @@ -4,9 +4,11 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.controller.base.BaseController; -import com.iformall.domain.po.WxOfflineActivityRecord; +import com.iformall.domain.po.*; import com.iformall.domain.po.base.BaseEntity.SortField; import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumOfflineActivityAwardsMoneyRule; +import com.iformall.enums.EnumOfflineActivityMerchantType; import com.iformall.enums.EnumOfflineActivityRecordStatus; import com.iformall.service.WxOfflineActivityGrantAwardService; import com.iformall.service.WxOfflineActivityRecordService; @@ -20,6 +22,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -71,5 +74,24 @@ public class WxOfflineActivityGrantController extends BaseController { return new ResultData(recordList); } + @ApiOperation("活动发放") + @PostMapping("grantAward") + public ResultData grantAward(@RequestBody WxOfflineActivityGrantAward wxOfflineActivityGrantAward) { + if(wxOfflineActivityGrantAward.getActivityId() == null){ + return new ResultData(Result.ERROR,"活动ID未空"); + } + if(wxOfflineActivityGrantAward.getRecordIds() == null || wxOfflineActivityGrantAward.getRecordIds().isEmpty()){ + return new ResultData(Result.ERROR,"请选择订单"); + } + if(StringUtil.isBlank(wxOfflineActivityGrantAward.getSignImg())){ + return new ResultData(Result.ERROR,"签名为空"); + } + TenantEntity tenantEntity = getTenantInfo(); + wxOfflineActivityGrantAward.updateTenantInfo(tenantEntity); + wxOfflineActivityGrantAward.setCreateBy(getUserId()); + wxOfflineActivityGrantAwardService.grantAward(wxOfflineActivityGrantAward); + return new ResultData(); + } + } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantAward.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantAward.java index 8df625d6b..2d55dc5e6 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantAward.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantAward.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; +import java.util.List; + import com.iformall.domain.po.base.TenantEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -33,6 +35,9 @@ public class WxOfflineActivityGrantAward extends TenantEntity{ @TableField(value = "activity_id") private Long activityId; + @TableField(exist = false) + private String activityName; + /** * 订单总金额 */ @@ -97,7 +102,7 @@ public class WxOfflineActivityGrantAward extends TenantEntity{ * 抽奖券编码 */ @TableField(value = "lottery_num") - private Object lotteryNum; + private String lotteryNum; /** * 抽奖券数量 @@ -109,5 +114,13 @@ public class WxOfflineActivityGrantAward extends TenantEntity{ * 周年庆抽奖编码 */ @TableField(value = "anniversary_lottery_num") - private Object anniversaryLotteryNum; + private String anniversaryLotteryNum; + + @TableField(exist = false) + private List recordIds; + @TableField(exist = false) + private List recordList; + + @TableField(exist = false) + private List activityItemList; } \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java index b2d182145..8836dab8d 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java @@ -56,7 +56,7 @@ public class WxOfflineActivityGrantItem extends TenantEntity { * 活动项名称 */ @TableField(value = "activity_item_name") - private Integer activityItemName; + private String activityItemName; /** * 活动项类型 @@ -94,6 +94,12 @@ public class WxOfflineActivityGrantItem extends TenantEntity { @TableField(value = "award_max_amount") private Integer awardMaxAmount; + /** + * 奖项计算规则 + */ + @TableField(value = "awards_item_rule") + private Integer awardsItemRule; + /** * 返现比例 */ diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantSettlement.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantSettlement.java index c8c580b36..73b20e091 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantSettlement.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantSettlement.java @@ -77,6 +77,13 @@ public class WxOfflineActivityGrantSettlement extends TenantEntity { @TableField(value = "grant_id") private Long grantId; + + /** + * 发放订单总金额 + */ + @TableField(value = "grant_money") + private Integer grantMoney; + /** * 发放总价值 */ @@ -111,13 +118,13 @@ public class WxOfflineActivityGrantSettlement extends TenantEntity { * 实际商管承担总金额 */ @TableField(value = "real_mall_share_price") - private BigDecimal realMallSharePrice; + private Integer realMallSharePrice; /** * 实际商户承担总金额 */ @TableField(value = "real_merchant_share_price") - private BigDecimal realMerchantSharePrice; + private Integer realMerchantSharePrice; /** * 创建时间 diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityItem.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityItem.java index 2be2632e5..192b233d5 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityItem.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityItem.java @@ -51,7 +51,7 @@ public class WxOfflineActivityItem extends TenantEntity { private Integer limitMoney; /** - * 奖项单价 + * 奖项价值(用来计算奖券数量) */ @TableField(value = "awards_item_price") private Integer awardsItemPrice; @@ -86,7 +86,16 @@ public class WxOfflineActivityItem extends TenantEntity { @TableField(value = "update_date") private Date updateDate; + /** + * 奖项集合 + */ @TableField(exist = false) private List activityAwardsItemList; + /** + * 发放奖项 + */ + @TableField(exist = false) + private List activityGrantItemList; + } \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityRecord.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityRecord.java index c2749348d..8290b3195 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityRecord.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityRecord.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -159,6 +160,17 @@ public class WxOfflineActivityRecord extends TenantEntity { @TableField(exist = false) private Date auditTimeEnd; + @TableField(exist = false) + private Long sendByName; + @TableField(exist = false) + private Date sendTimeBegin; + @TableField(exist = false) + private Date sendTimeEnd; + @TableField(exist = false) private Long activityId; + + @TableField(exist = false) + private BigDecimal orderRatio; + } \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantItemMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantItemMapper.java index 07b70c38f..90b7f2d4e 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantItemMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantItemMapper.java @@ -4,6 +4,8 @@ import com.iformall.common.CommonMapper; import com.iformall.domain.po.WxOfflineActivityGrantItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @author xiaohu * @description 针对表【wx_offline_activity_grant_item(线下活动发放奖励)】的数据库操作Mapper @@ -12,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface WxOfflineActivityGrantItemMapper extends CommonMapper { + void insertList(List rantItemList); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantSettlementMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantSettlementMapper.java index 4e6658dc0..93b8c66c4 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantSettlementMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityGrantSettlementMapper.java @@ -4,6 +4,8 @@ import com.iformall.common.CommonMapper; import com.iformall.domain.po.WxOfflineActivityGrantSettlement; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @author xiaohu * @description 针对表【wx_offline_activity_grant_settlement(线下活动发放奖励结算)】的数据库操作Mapper @@ -12,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface WxOfflineActivityGrantSettlementMapper extends CommonMapper { + void insertList(List settlementList); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordGrantMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordGrantMapper.java index e1082caec..6625643f7 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordGrantMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordGrantMapper.java @@ -5,6 +5,8 @@ import com.iformall.domain.po.WxOfflineActivityRecordGrant; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * @author xiaohu * @description 针对表【wx_offline_activity_record_grant(线下活动参与登记与发放关联表)】的数据库操作Mapper @@ -15,6 +17,7 @@ public interface WxOfflineActivityRecordGrantMapper extends CommonMapper recordGrantList); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordMapper.java index 44dd1192a..8d36ccb6f 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOfflineActivityRecordMapper.java @@ -23,6 +23,8 @@ public interface WxOfflineActivityRecordMapper extends CommonMapper auditStatusStatistics(WxOfflineActivityRecord wxOfflineActivityRecord); void updateAuditStatus(WxOfflineActivityRecord record); + + WxOfflineActivityRecord selectLimitOne(WxOfflineActivityRecord wxOfflineActivityRecord); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantAwardService.java b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantAwardService.java index 90cf05b2c..a9097c5fc 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantAwardService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantAwardService.java @@ -17,4 +17,6 @@ public interface WxOfflineActivityGrantAwardService { Map getRecordStatistics(Long activityId, WxOfflineActivityRecord wxOfflineActivityRecord); List getRecordList(Long activityId, WxOfflineActivityRecord wxOfflineActivityRecord); + + void grantAward(WxOfflineActivityGrantAward wxOfflineActivityGrantAward); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantItemService.java b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantItemService.java index b25751e15..ec98eb2f4 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantItemService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantItemService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import com.iformall.domain.po.WxOfflineActivityGrantAward; import com.iformall.domain.po.WxOfflineActivityGrantItem; import com.baomidou.mybatisplus.extension.service.IService; @@ -10,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface WxOfflineActivityGrantItemService { + void insertFromGrantAward(WxOfflineActivityGrantAward wxOfflineActivityGrantAward); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantSettlementService.java b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantSettlementService.java index 87ba6a884..8db5e3cb9 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantSettlementService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityGrantSettlementService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import com.iformall.domain.po.WxOfflineActivityGrantAward; import com.iformall.domain.po.WxOfflineActivityGrantSettlement; import com.baomidou.mybatisplus.extension.service.IService; @@ -10,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface WxOfflineActivityGrantSettlementService { + void settlement(WxOfflineActivityGrantAward wxOfflineActivityGrantAward); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityRecordGrantService.java b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityRecordGrantService.java index b7b103304..f7647467c 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityRecordGrantService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOfflineActivityRecordGrantService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import com.iformall.domain.po.WxOfflineActivityGrantAward; import com.iformall.domain.po.WxOfflineActivityRecordGrant; import com.baomidou.mybatisplus.extension.service.IService; @@ -10,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface WxOfflineActivityRecordGrantService{ + void insertFromGrantAward(WxOfflineActivityGrantAward wxOfflineActivityGrantAward); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java index e46313296..8e0f15c96 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java @@ -1,24 +1,29 @@ package com.iformall.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.iformall.common.IdWorker; +import com.iformall.common.Result; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.OfflineActivityRecordStatistics; +import com.iformall.enums.EnumOfflineActivityAwardsRule; import com.iformall.enums.EnumOfflineActivityRecordStatus; +import com.iformall.enums.EnumOfflineActivityStatus; +import com.iformall.enums.EnumOfflineActivityType; +import com.iformall.exception.MallinkException; import com.iformall.mapper.WxOfflineActivityMapper; import com.iformall.mapper.WxOfflineActivityRecordGrantMapper; import com.iformall.mapper.WxOfflineActivityRecordMapper; -import com.iformall.service.MallUserInfoService; -import com.iformall.service.WxMerchantService; -import com.iformall.service.WxOfflineActivityGrantAwardService; +import com.iformall.service.*; import com.iformall.mapper.WxOfflineActivityGrantAwardMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author xiaohu @@ -40,6 +45,18 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity @Autowired WxOfflineActivityRecordGrantMapper wxOfflineActivityRecordGrantMapper; + @Autowired + WxOfflineActivityGrantItemService wxOfflineActivityGrantItemService; + + @Autowired + WxOfflineActivityRecordGrantService wxOfflineActivityRecordGrantService; + + @Autowired + WxOfflineActivityItemService wxOfflineActivityItemService; + + @Autowired + WxOfflineActivityGrantSettlementService wxOfflineActivityGrantSettlementService; + @Autowired WxMerchantService wxMerchantService; @Autowired @@ -53,20 +70,30 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } wxOfflineActivityRecord.setCreateDateBegin(activity.getStartTime()); wxOfflineActivityRecord.setCreateDateEnd(activity.getEndTime()); - List recordStatistics = wxOfflineActivityRecordMapper.auditStatusStatistics(wxOfflineActivityRecord); - + WxOfflineActivityRecord limitOne = wxOfflineActivityRecordMapper.selectLimitOne(wxOfflineActivityRecord); Map result = new HashMap<>(); Integer audting = 0, audi_success = 0, audt_fail = 0,sum_success = 0, sum_fail = 0; - for(OfflineActivityRecordStatistics statistics : recordStatistics){ - if(EnumOfflineActivityRecordStatus.AUDTING.getCode().equals(statistics.getAuditStatus())){ - audting = statistics.getCount(); - } else if (EnumOfflineActivityRecordStatus.AUDI_SUCCESS.getCode().equals(statistics.getAuditStatus())) { - audi_success = statistics.getCount(); - sum_success = statistics.getSumMoney(); - } else if (EnumOfflineActivityRecordStatus.AUDT_FAIL.getCode().equals(statistics.getAuditStatus())) { - audt_fail = statistics.getCount(); + if (limitOne == null) { + result.put("cus_name","查无此人"); + result.put("cus_phone",wxOfflineActivityRecord.getCusPhone()); + }else{ + result.put("cus_name",limitOne.getCusName()); + result.put("cus_phone",limitOne.getCusPhone()); + + List recordStatistics = wxOfflineActivityRecordMapper.auditStatusStatistics(wxOfflineActivityRecord); + + for(OfflineActivityRecordStatistics statistics : recordStatistics){ + if(EnumOfflineActivityRecordStatus.AUDTING.getCode().equals(statistics.getAuditStatus())){ + audting = statistics.getCount(); + } else if (EnumOfflineActivityRecordStatus.AUDI_SUCCESS.getCode().equals(statistics.getAuditStatus())) { + audi_success = statistics.getCount(); + sum_success = statistics.getSumMoney(); + } else if (EnumOfflineActivityRecordStatus.AUDT_FAIL.getCode().equals(statistics.getAuditStatus())) { + audt_fail = statistics.getCount(); + } } } + result.put("audting",audting); result.put("audi_success",audi_success); result.put("sum_success",sum_success); @@ -84,11 +111,11 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity wxOfflineActivityRecord.setCreateDateBegin(activity.getStartTime()); wxOfflineActivityRecord.setCreateDateEnd(activity.getEndTime()); List recordList = wxOfflineActivityRecordMapper.findList(wxOfflineActivityRecord); - handleRecordList(wxOfflineActivityRecord,activity,recordList); + handlerRecordList(wxOfflineActivityRecord,activity,recordList); return recordList; } - private void handleRecordList(TenantEntity tenantEntity, WxOfflineActivity activity, List recordList) { + private void handlerRecordList(TenantEntity tenantEntity, WxOfflineActivity activity, List recordList) { if (recordList == null || recordList.isEmpty()) { return; } @@ -112,6 +139,175 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } } + + @Override + @Transactional(rollbackFor = Exception.class) + public void grantAward(WxOfflineActivityGrantAward wxOfflineActivityGrantAward) { + + WxOfflineActivity activity = wxOfflineActivityMapper.selectById(wxOfflineActivityGrantAward.getActivityId(), wxOfflineActivityGrantAward.getTenantId()); + if(activity == null){ + throw new MallinkException(Result.ERROR, "未查询到活动"); + } + if(!EnumOfflineActivityStatus.ON_LINE.getCode().equals(activity.getStatus())){ + throw new MallinkException(Result.ERROR, "请检查活动状态"); + } + + handlerGrantData(activity,wxOfflineActivityGrantAward); + Date now = new Date(); + final IdWorker idWorker = IdWorker.get(); + wxOfflineActivityGrantAward.setId(idWorker.nextId()); + wxOfflineActivityGrantAward.setCreateDate(now); + wxOfflineActivityGrantAward.setUpdateDate(now); + wxOfflineActivityGrantAwardMapper.insert(wxOfflineActivityGrantAward); + + wxOfflineActivityRecordGrantService.insertFromGrantAward(wxOfflineActivityGrantAward); + + //处理奖项 + handlerGrantItem(activity,wxOfflineActivityGrantAward); + wxOfflineActivityGrantItemService.insertFromGrantAward(wxOfflineActivityGrantAward); + + //结算 + wxOfflineActivityGrantSettlementService.settlement(wxOfflineActivityGrantAward); + } + + private void handlerGrantData(WxOfflineActivity activity,WxOfflineActivityGrantAward wxOfflineActivityGrantAward){ + + List wxOfflineActivityRecords = wxOfflineActivityRecordMapper.selectBatchIds(wxOfflineActivityGrantAward.getRecordIds()); + if (wxOfflineActivityRecords == null || wxOfflineActivityRecords.isEmpty()) { + throw new MallinkException(Result.ERROR, "未查询到活动订单"); + } + if(wxOfflineActivityRecords.stream().map(WxOfflineActivityRecord::getCusPhone).distinct().count() != 1){ + throw new MallinkException(Result.ERROR, "请检查活动订单用户是否为同一人"); + } + for (WxOfflineActivityRecord record : wxOfflineActivityRecords) { + if(!EnumOfflineActivityRecordStatus.AUDI_SUCCESS.getCode().equals(record.getAuditStatus())){ + throw new MallinkException(Result.ERROR, "请检查活动订单审核状态"); + } + if(record.getCreateDate().before(activity.getStartTime()) || record.getCreateDate().after(activity.getEndTime())){ + throw new MallinkException(Result.ERROR, "请检查活动时间"); + } + } + wxOfflineActivityGrantAward.setRecordList(wxOfflineActivityRecords); + wxOfflineActivityGrantAward.setActivityName(activity.getName()); + wxOfflineActivityGrantAward.setCusName(wxOfflineActivityRecords.get(0).getCusName()); + wxOfflineActivityGrantAward.setCusPhone(wxOfflineActivityRecords.get(0).getCusPhone()); + wxOfflineActivityGrantAward.setOrderCount(wxOfflineActivityRecords.size()); + wxOfflineActivityGrantAward.setOrderMoneySum(wxOfflineActivityRecords.stream().mapToInt(WxOfflineActivityRecord::getOrderMoney).sum()); + } + + private void handlerGrantItem(WxOfflineActivity activity, WxOfflineActivityGrantAward wxOfflineActivityGrantAward){ + + List activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId()); + Map activityItemMap = activityItemList.stream().collect(Collectors.toMap(WxOfflineActivityItem::getId, Function.identity())); + + for (WxOfflineActivityItem grantActivityItem : wxOfflineActivityGrantAward.getActivityItemList()) { + if(grantActivityItem.getId() == null){ + throw new MallinkException(Result.ERROR, "请检查活动项参数"); + } + WxOfflineActivityItem activityItem = activityItemMap.get(grantActivityItem.getId()); + if(activityItem == null){ + throw new MallinkException(Result.ERROR, "请检查活动项参数"); + } + List activityGrantItemList = grantActivityItem.getActivityGrantItemList(); + if(activityGrantItemList == null || activityGrantItemList.isEmpty()){ + continue; + } + + Map awardsItemMap = activityItem.getActivityAwardsItemList().stream().collect(Collectors.toMap(WxOfflineActivityAwardsItem::getId, Function.identity())); + + for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) { + if(grantGrantItem.getAwardCount() == null){ + grantGrantItem.setAwardCount(1); + } + } + + if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())){ + + if(wxOfflineActivityGrantAward.getOrderMoneySum() < activityItem.getLimitMoney()){ + throw new MallinkException(Result.ERROR, "活动项"+activityItem.getName()+"金额不满足"); + } + //奖项限制数量 + int limitCount = wxOfflineActivityGrantAward.getOrderMoneySum() / activityItem.getAwardsItemPrice(); + if(activityItem.getAwardsItemLimit() < limitCount){ + limitCount = activityItem.getAwardsItemLimit(); + } + if(activityGrantItemList.stream().mapToInt(WxOfflineActivityGrantItem::getAwardCount).sum()>limitCount){ + throw new MallinkException(Result.ERROR, "活动项"+activityItem.getName()+"奖券超过限制"); + } + + + for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) { + if(grantGrantItem.getAwardItamId() == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId()); + if(awardsItem == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + + handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem); + } + + } + else if(EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){ + if(activityGrantItemList.size() != 1){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + WxOfflineActivityGrantItem grantGrantItem = activityGrantItemList.get(0); + if(grantGrantItem.getAwardItamId() == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId()); + if(awardsItem == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + if(wxOfflineActivityGrantAward.getOrderMoneySum() > awardsItem.getMaxAmount() + || wxOfflineActivityGrantAward.getOrderMoneySum() < awardsItem.getMinAmount()){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数(金额不在范围类)"); + } + + handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem); + + } + else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) { + if(activityGrantItemList.size() != 1){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + WxOfflineActivityGrantItem grantGrantItem = activityGrantItemList.get(0); + if(grantGrantItem.getAwardItamId() == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId()); + if(awardsItem == null){ + throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + } + + handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem); + + } + + } + } + + private void handlerGrantItem(WxOfflineActivityGrantItem grantGrantItem,WxOfflineActivity activity,WxOfflineActivityItem activityItem,WxOfflineActivityAwardsItem awardsItem){ +// grantGrantItem.setGrantId(wxOfflineActivityGrantAward.getId()); + grantGrantItem.setActivityId(activity.getId()); + grantGrantItem.setActivityName(activity.getName()); + grantGrantItem.setActivityItemId(activityItem.getId()); + grantGrantItem.setActivityItemName(activityItem.getName()); + grantGrantItem.setActivityItemType(activityItem.getType()); + grantGrantItem.setAwardItamId(awardsItem.getId()); + grantGrantItem.setAwardName(awardsItem.getName()); + grantGrantItem.setAwardGrade(awardsItem.getGrade()); + grantGrantItem.setAwardMinAmount(awardsItem.getMinAmount()); + grantGrantItem.setAwardMaxAmount(awardsItem.getMaxAmount()); + grantGrantItem.setAwardsItemRule(activityItem.getAwardsItemRule()); + grantGrantItem.setCashBackRatio(awardsItem.getCashBackRatio()); + grantGrantItem.setAwardPrice(awardsItem.getPrice()*grantGrantItem.getAwardCount()); + grantGrantItem.setMoneyRule(awardsItem.getMoneyRule()); + grantGrantItem.setMallShareRate(awardsItem.getMallShareRate()); + grantGrantItem.setMerchantShareRate(awardsItem.getMerchantShareRate()); + } } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java index 08c5e95ee..4f81fb9aa 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java @@ -1,11 +1,23 @@ package com.iformall.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxOfflineActivityGrantAward; import com.iformall.domain.po.WxOfflineActivityGrantItem; +import com.iformall.domain.po.WxOfflineActivityItem; +import com.iformall.enums.EnumOfflineActivityAwardsMoneyRule; +import com.iformall.enums.EnumOfflineActivityAwardsRule; +import com.iformall.enums.EnumOfflineActivityType; import com.iformall.service.WxOfflineActivityGrantItemService; import com.iformall.mapper.WxOfflineActivityGrantItemMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + /** * @author xiaohu * @description 针对表【wx_offline_activity_grant_item(线下活动发放奖励)】的数据库操作Service实现 @@ -14,6 +26,45 @@ import org.springframework.stereotype.Service; @Service public class WxOfflineActivityGrantItemServiceImpl implements WxOfflineActivityGrantItemService{ + @Autowired + private WxOfflineActivityGrantItemMapper wxOfflineActivityGrantItemMapper; + + @Override + public void insertFromGrantAward(WxOfflineActivityGrantAward wxOfflineActivityGrantAward) { + List rantItemList = new ArrayList<>(); + final IdWorker idWorker = IdWorker.get(); + Date now = new Date(); + for (WxOfflineActivityItem activityItem : wxOfflineActivityGrantAward.getActivityItemList()) { + if(activityItem.getActivityGrantItemList() == null){ + continue; + } + for (WxOfflineActivityGrantItem grantGrantItem : activityItem.getActivityGrantItemList()) { + grantGrantItem.setGrantId(wxOfflineActivityGrantAward.getId()); + grantGrantItem.setId(idWorker.nextId()); + grantGrantItem.updateTenantInfo(wxOfflineActivityGrantAward); + grantGrantItem.setCreateDate(now); + grantGrantItem.setUpdateDate(now); + if(EnumOfflineActivityType.CASHBACK.getCode().equals(grantGrantItem.getActivityItemType())){ + BigDecimal awardPrice = new BigDecimal(wxOfflineActivityGrantAward.getOrderMoneySum()).multiply(grantGrantItem.getCashBackRatio()); + if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(grantGrantItem.getAwardsItemRule())){ + grantGrantItem.setAwardPrice(awardPrice.setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); + } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(grantGrantItem.getAwardsItemRule())) { + int awardPriceYuan = awardPrice.divide(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + grantGrantItem.setAwardPrice(awardPriceYuan*100); + }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(grantGrantItem.getAwardsItemRule())){ + int awardPriceTen = awardPrice.divide(new BigDecimal(1000)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + grantGrantItem.setAwardPrice(awardPriceTen*1000); + } + } + grantGrantItem.setMallSharePrice(new BigDecimal(grantGrantItem.getAwardPrice()).multiply(grantGrantItem.getMallShareRate()).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); + grantGrantItem.setMerchantSharePrice(grantGrantItem.getAwardPrice() - grantGrantItem.getMallSharePrice()); + rantItemList.add(grantGrantItem); + } + } + wxOfflineActivityGrantItemMapper.insertList(rantItemList); + + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java index 4ea64a791..8167f692d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java @@ -1,11 +1,21 @@ package com.iformall.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.iformall.domain.po.WxOfflineActivityGrantSettlement; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.*; import com.iformall.service.WxOfflineActivityGrantSettlementService; import com.iformall.mapper.WxOfflineActivityGrantSettlementMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + /** * @author xiaohu * @description 针对表【wx_offline_activity_grant_settlement(线下活动发放奖励结算)】的数据库操作Service实现 @@ -14,6 +24,59 @@ import org.springframework.stereotype.Service; @Service public class WxOfflineActivityGrantSettlementServiceImpl implements WxOfflineActivityGrantSettlementService{ + @Autowired + private WxOfflineActivityGrantSettlementMapper wxOfflineActivityGrantSettlementMapper; + + @Override + public void settlement(WxOfflineActivityGrantAward wxOfflineActivityGrantAward) { + List settlementList = new ArrayList<>(); + final IdWorker idWorker = IdWorker.get(); + Date now = new Date(); + //获取订单占比(占比最少的订单用减法,尽量减少误差) + List recordDescList = wxOfflineActivityGrantAward.getRecordList().stream().sorted(Comparator.comparingInt(WxOfflineActivityRecord::getOrderMoney).reversed()).collect(Collectors.toList()); + int size = recordDescList.size() - 1; + BigDecimal lastRatio = BigDecimal.ONE; + for(int i=0; i recordGrantList = new ArrayList<>(); + wxOfflineActivityGrantAward.getRecordIds().forEach(recordId ->{ + WxOfflineActivityRecordGrant recordGrant = new WxOfflineActivityRecordGrant(); + recordGrant.updateTenantInfo(wxOfflineActivityGrantAward); + recordGrant.setActivityId(wxOfflineActivityGrantAward.getActivityId()); + recordGrant.setRecordId(recordId); + recordGrant.setGrantId(wxOfflineActivityGrantAward.getId()); + }); + + wxOfflineActivityRecordGrantMapper.insertList(recordGrantList); + } } diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantAwardMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantAwardMapper.xml index 3c0c995aa..bef2c6f97 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantAwardMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantAwardMapper.xml @@ -19,9 +19,9 @@ - + - + diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml index b8d898e2f..3a9c6641a 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml @@ -19,6 +19,7 @@ + @@ -36,9 +37,32 @@ grant_id,activity_id,activity_name, activity_item_id,activity_item_name,activity_item_type, award_itam_id,award_name,award_grade, - award_min_amount,award_max_amount,cash_back_ratio, + award_min_amount,award_max_amount,awards_item_rule,cash_back_ratio, award_price,award_count,money_rule, mall_share_rate,mall_share_price,merchant_share_rate, merchant_share_price,create_date,update_date + + + insert into wx_offline_activity_grant_item + (`id`,`tenant_id`,`parent_tenant_id`, + `grant_id`,`activity_id`,`activity_name`, + `activity_item_id`,`activity_item_name`,`activity_item_type`, + `award_itam_id`,`award_name`,`award_grade`, + `award_min_amount`,`award_max_amount`,`awards_item_rule`,`cash_back_ratio`, + `award_price`,`award_count`,`money_rule`, + `mall_share_rate`,`mall_share_price`,`merchant_share_rate`, + `merchant_share_price`,`create_date`,`update_date`) + values + + (#{item.id,jdbcType=BIGINT},#{item.tenantId,jdbcType=VARCHAR},#{item.parentTenantId,jdbcType=VARCHAR}, + #{item.grantId,jdbcType=BIGINT},#{item.activityId,jdbcType=BIGINT},#{item.activityName,jdbcType=VARCHAR}, + #{item.activityItemId,jdbcType=BIGINT},#{item.activityItemName,jdbcType=VARCHAR},#{item.activityItemType,jdbcType=INTEGER}, + #{item.awardItamId,jdbcType=BIGINT},#{item.awardName,jdbcType=VARCHAR},#{item.awardGrade,jdbcType=INTEGER}, + #{item.awardMinAmount,jdbcType=INTEGER},#{item.awardMaxAmount,jdbcType=INTEGER},#{item.awardsItemRule,jdbcType=INTEGER},#{item.cashBackRatio,jdbcType=DECIMAL}, + #{item.awardPrice,jdbcType=INTEGER},#{item.awardCount,jdbcType=INTEGER},#{item.moneyRule,jdbcType=INTEGER}, + #{item.mallShareRate,jdbcType=DECIMAL},#{item.mallSharePrice,jdbcType=INTEGER},#{item.merchantShareRate,jdbcType=DECIMAL}, + #{item.merchantSharePrice,jdbcType=INTEGER},#{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP}) + + diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantSettlementMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantSettlementMapper.xml index eba0b006c..dd10576e3 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantSettlementMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantSettlementMapper.xml @@ -16,13 +16,14 @@ + - - + + @@ -31,9 +32,30 @@ id,tenant_id,parent_tenant_id, record_id,order_no,order_money, merchant_id,activity_id,activity_item_id, - award_itam_id,grant_id,grant_price, + award_itam_id,grant_id,grant_money,grant_price, mall_share_price,merchant_share_price,order_ratio, real_grant_price,real_mall_share_price,real_merchant_share_price, create_date,update_date + + + insert into wx_offline_activity_grant_item + (id,tenant_id,parent_tenant_id, + record_id,order_no,order_money, + merchant_id,activity_id,activity_item_id, + award_itam_id,grant_id,grant_money,grant_price, + mall_share_price,merchant_share_price,order_ratio, + real_grant_price,real_mall_share_price,real_merchant_share_price, + create_date,update_date) + values + + (#{item.id,jdbcType=BIGINT},#{item.tenantId,jdbcType=VARCHAR},#{item.parentTenantId,jdbcType=VARCHAR}, + #{item.recordId,jdbcType=BIGINT},#{item.orderNo,jdbcType=VARCHAR},#{item.orderMoney,jdbcType=INTEGER}, + #{item.merchantId,jdbcType=BIGINT},#{item.activityId,jdbcType=BIGINT},#{item.activityItemId,jdbcType=BIGINT}, + #{item.awardItamId,jdbcType=BIGINT},#{item.grantId,jdbcType=BIGINT},#{item.grantMoney,jdbcType=INTEGER},#{item.grantPrice,jdbcType=INTEGER}, + #{item.mallSharePrice,jdbcType=INTEGER},#{item.merchantSharePrice,jdbcType=INTEGER},#{item.orderRatio,jdbcType=DECIMAL}, + #{item.realGrantPrice,jdbcType=INTEGER},#{item.realMallSharePrice,jdbcType=INTEGER},#{item.realMerchantSharePrice,jdbcType=INTEGER}, + #{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP}) + + diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordGrantMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordGrantMapper.xml index b3c7a757f..273eb2690 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordGrantMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordGrantMapper.xml @@ -23,4 +23,17 @@ where activity_id = #{activityId} and record_id = #{recordId} and tenant_id=#{tenantId} + + insert into wx_offline_activity_record_grant + (`tenant_id`,`parent_tenant_id`,`activity_id`,`record_id`,`grant_id`) + values + + (#{item.tenantId,jdbcType=VARCHAR}, + #{item.parentTenantId,jdbcType=VARCHAR}, + #{item.activityId,jdbcType=BIGINT}, + #{item.recordId,jdbcType=BIGINT}, + #{item.grantId,jdbcType=BIGINT}) + + + diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordMapper.xml index 89ff9f663..1737088bb 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityRecordMapper.xml @@ -113,6 +113,13 @@ + + + @@ -146,6 +153,10 @@ and `create_date` <= #{createDateEnd} + + and `audit_status` = #{auditStatus} + + GROUP BY audit_status