From 6659afe6e6982bdf641b44a54b78b39bbf206971 Mon Sep 17 00:00:00 2001 From: hupeng Date: Tue, 15 Jan 2019 18:31:56 +0800 Subject: [PATCH] =?UTF-8?q?[=E9=9C=80=E6=B1=82][1000201]:=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=8F=91=E6=94=BE=E4=BC=9A=E5=91=98=E5=81=9C=E8=BD=A6?= =?UTF-8?q?=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxCouponSendController.java | 7 +- .../controller/WxLevelConfigController.java | 33 ++--- .../iformall/schedule/CouponSendSchedule.java | 135 ++++++++++++++++++ .../com/iformall/domain/po/WxCouponSend.java | 11 -- .../com/iformall/domain/po/WxLevelConfig.java | 23 +++ .../iformall/domain/vo/WxCouponSendVo.java | 70 +++++++++ .../enums/EnumCouponSendSendType.java | 3 +- .../mapper/WxCUserBasicInfoMapper.java | 2 + .../iformall/mapper/WxCouponSendMapper.java | 4 +- .../iformall/service/WxCouponSendService.java | 3 +- .../service/WxLevelConfigService.java | 7 + .../service/impl/WxCouponSendServiceImpl.java | 7 +- .../impl/WxLevelConfigServiceImpl.java | 33 ++++- .../service/impl/WxOrderServiceImpl.java | 24 +--- .../mapper/WxCUserBasicInfoMapper.xml | 22 +++ .../resources/mapper/WxCouponSendMapper.xml | 36 +++-- .../resources/mapper/WxLevelConfigMapper.xml | 3 +- 17 files changed, 352 insertions(+), 71 deletions(-) create mode 100644 mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxCouponSendVo.java diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java b/mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java index 791e5b856..311adfd4a 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/WxCouponSendController.java @@ -6,6 +6,7 @@ import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxCouponSend; +import com.iformall.domain.vo.WxCouponSendVo; import com.iformall.enums.EnumCouponSendStatus; import com.iformall.enums.EnumCouponSendType; import com.iformall.enums.EnumCouponStatus; @@ -46,9 +47,9 @@ public class WxCouponSendController extends BaseController { wxCouponSend.setTenantId(getTenantId()); wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode()); wxCouponSend.setSortColumns(WxCouponSend.Field.CreateDate_DESC); - final PageInfo page = wxCouponSendService.listAsPage(wxCouponSend, pageNum, pageSize); + final PageInfo page = wxCouponSendService.listAsPage(wxCouponSend, pageNum, pageSize); - for (WxCouponSend cs:page.getList()) + for (WxCouponSendVo cs:page.getList()) cs.setSendCount(wxCouponActionLogService.getCountByChannelId(getTenantId(), cs.getSendType(), cs.getId())); return new ResultData(page); @@ -63,7 +64,7 @@ public class WxCouponSendController extends BaseController { } wxCouponSend.setTenantId(getTenantId()); wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode()); - List wxCouponSendList = wxCouponSendService.listAsPage(wxCouponSend, 1, 1).getList(); + List wxCouponSendList = wxCouponSendService.listAsPage(wxCouponSend, 1, 1).getList(); if (wxCouponSendList != null && wxCouponSendList.size() > 0) { return new ResultData(ErrorCode.COUPON_SEND_IS_EXISTED); } diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/WxLevelConfigController.java b/mallinkAdmin/src/main/java/com/iformall/controller/WxLevelConfigController.java index 92255c819..d021dcb67 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/WxLevelConfigController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/WxLevelConfigController.java @@ -51,8 +51,6 @@ public class WxLevelConfigController extends BaseController { @PostMapping("add") public ResultData add(@RequestBody List levelConfigs) { logger.debug("[" + getIpAddr() + "] WxLevelConfigController::add"); - //Assert.notNull(wxLevelConfig.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); String tenantId = getTenantId(); try { wxLevelConfigService.batchSave(tenantId, levelConfigs); @@ -63,31 +61,34 @@ public class WxLevelConfigController extends BaseController { return new ResultData(); } -// @ApiOperation("根据id更新接口") -// @PostMapping("update") -// public ResultData update(@RequestBody WxLevelConfig wxLevelConfig) { -// wxLevelConfig.setTenantId(getTenantId()); -// wxLevelConfigService.saveOrUpdate(wxLevelConfig); -// return new ResultData(); -// } + @ApiOperation("更改会员权益") + @PostMapping("updateCapabilities") + public ResultData updateCapabilities(@RequestBody List levelConfigs) { + logger.debug("[" + getIpAddr() + "] WxLevelConfigController::add"); + String tenantId = getTenantId(); + try { + wxLevelConfigService.batchUpdateCapabilities(tenantId, levelConfigs); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.DB_FAIL); + } + return new ResultData(); + } @ApiOperation("根据id删除接口") @PostMapping("/del") -// @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) public ResultData delete(@RequestBody WxLevelConfig wxLevelConfig) { logger.debug("[" + getIpAddr() + "] WxLevelConfigController::delete"); wxLevelConfigService.deleteById(wxLevelConfig.getId()); return new ResultData(Result.SUCCESS, "删除成功", null); } - @ApiOperation("根据id查询接口") - @GetMapping("/findById") - @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) + @ApiOperation("根据id查询接口") + @GetMapping("/findById") + @ApiImplicitParam(name="id",value="id",dataType="Long", paramType = "query",required=true) public ResultData findById(Long id) { logger.debug("[" + getIpAddr() + "] WxLevelConfigController::findById"); return new ResultData(Result.SUCCESS,"查询成功",wxLevelConfigService.getById(id)); } - - - + } diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java new file mode 100644 index 000000000..9cab3956a --- /dev/null +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponSendSchedule.java @@ -0,0 +1,135 @@ +package com.iformall.schedule; + +import com.alibaba.fastjson.JSONObject; +import com.iformall.domain.dto.WxCUserBasicInfoDto; +import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponSendVo; +import com.iformall.enums.EnumCouponSendSendType; +import com.iformall.enums.EnumCouponSendStatus; +import com.iformall.mapper.*; +import com.iformall.service.WxCouponActionLogService; +import com.iformall.service.WxCouponSendService; +import com.iformall.service.WxLevelConfigService; +import com.iformall.service.WxOrderService; +import io.swagger.models.auth.In; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class CouponSendSchedule { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxMallMapper wxMallMapper; + + @Autowired + private WxLevelConfigMapper WxLevelConfigMapper; + + @Autowired + private WxLevelConfigService wxLevelConfigService; + + @Autowired + private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; + + @Autowired + private WxCouponSendMapper wxCouponSendMapper; + + @Autowired + private WxOrderService wxOrderService; + + @Autowired + private WxCouponActionLogService wxCouponActionLogService; + + + @Scheduled(cron = "0 0 6 1 * ?") // 每月1号发放会员的权益券 + //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 + public void couponSendSchedule() { + + List mallList = wxMallMapper.findList(new WxMall()); + + if (mallList.size()==0) { + logger.info("定时发券: No Mall info found"); + return; + } + + mallList.stream().forEach(mall-> { + + WxLevelConfig wxLevelConfig = new WxLevelConfig(); + wxLevelConfig.setTenantId(mall.getTenantId()); + List levelConfigList = WxLevelConfigMapper.findList(wxLevelConfig); + levelConfigList = levelConfigList.stream() + .sorted(Comparator.comparing(WxLevelConfig::getPoints)) + .collect(Collectors.toList()); + + for (int i = 0; i < levelConfigList.size(); i++) { + WxLevelConfig l = levelConfigList.get(i); + if (l.getCapability() == null) + continue; + Integer levelStartScore = l.getPoints(); + Integer levelEndScore = levelConfigList.size() < i+1? levelConfigList.get(i+1).getPoints() : null; + + JSONObject jo = null; + Long result = null; + try { + jo = JSONObject.parseObject(l.getCapability()); + result = wxLevelConfigService.getCapabilitiesOfSendCarConpon(jo); + } catch (Exception e) { + logger.error("定时发券: 不能解析发券规则 levelId=" + l.getId() + e.getMessage()); + continue; + } + Long sendCount = result; + if (sendCount > 0) { + WxCouponSend wxCouponSend = new WxCouponSend(); + wxCouponSend.setTenantId(l.getTenantId()); + wxCouponSend.setSendType(EnumCouponSendSendType.TIMED.getCode()); + wxCouponSend.setStatus(EnumCouponSendStatus.VALID.getCode()); + List couponSendList = wxCouponSendMapper.findListVo(wxCouponSend); + couponSendList.stream().forEach(cs->{ + if (cs.getRemainInventory() < sendCount){ + logger.error("定时发券:库存不足 levelId="+ l.getId() +"couponId="+ cs.getCouponId()); + return; //下一个券 + } + WxCUserBasicInfoDto wxCUserBasicInfoDto = new WxCUserBasicInfoDto(); + wxCUserBasicInfoDto.setTenantId(l.getTenantId()); + wxCUserBasicInfoDto.setLevelStartScore(levelStartScore); + wxCUserBasicInfoDto.setLevelEndScore(levelEndScore); + List wxCUserBasicInfoList = wxCUserBasicInfoMapper.findListByScore(wxCUserBasicInfoDto); + + wxCUserBasicInfoList.stream().forEach(cu->{ + if (cs.getRemainInventory() < sendCount){ + logger.error("定时发券:库存不足 levelId="+ l.getId() +"couponId="+ cs.getCouponId()+"userId="+cu.getId()); + return; //下一个券 + } + + for (int count = 0; count findListByScore(WxCUserBasicInfoDto dto); + long findCount(WxCUserBasicInfoDto dto); List findVoList(WxCUserBasicInfo wxCUserBasicInfo); diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponSendMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponSendMapper.java index 272b12675..5673bf4bc 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponSendMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponSendMapper.java @@ -3,14 +3,14 @@ package com.iformall.mapper; import java.util.*; import com.iformall.common.CommonMapper; import com.iformall.domain.po.WxCouponSend; +import com.iformall.domain.vo.WxCouponSendVo; public interface WxCouponSendMapper extends CommonMapper { - List findList(WxCouponSend wxCouponSend); + List findListVo(WxCouponSend wxCouponSend); void updateStatusByCouponId(WxCouponSend wxCouponSend); - void offExpiriedCouponSendBySendEndTime(); void offExpiriedCouponSendByCouponStatus(); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponSendService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponSendService.java index 109eff842..29736170b 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponSendService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponSendService.java @@ -2,6 +2,7 @@ package com.iformall.service; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxCouponSend; +import com.iformall.domain.vo.WxCouponSendVo; import com.iformall.enums.EnumCouponSendSendType; public interface WxCouponSendService { @@ -14,7 +15,7 @@ public interface WxCouponSendService { * @param pageSize * @return */ - PageInfo listAsPage(WxCouponSend record, Integer pageIndex, Integer pageSize); + PageInfo listAsPage(WxCouponSend record, Integer pageIndex, Integer pageSize); /** * 根据Id获得实体 diff --git a/mallinkService/src/main/java/com/iformall/service/WxLevelConfigService.java b/mallinkService/src/main/java/com/iformall/service/WxLevelConfigService.java index 5bc16ea7c..c979a3ff6 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxLevelConfigService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxLevelConfigService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxLevelConfig; @@ -7,6 +8,7 @@ import java.util.List; public interface WxLevelConfigService { + public final static String CAPABILITY_SEND_CAR_COUPON = "carCouponCount"; /** * 根据实体查询分页列表 * @@ -45,6 +47,11 @@ public interface WxLevelConfigService { void batchSave(String tenantId, List records); + /** + * 批量更新 + */ + void batchUpdateCapabilities(String tenantId, List records); + Long getCapabilitiesOfSendCarConpon(JSONObject jo); /** * 根据Id删除实体 * diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java index fae234e26..464ab2112 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java @@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxCouponSendVo; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.WxCouponOrderMapper; @@ -44,8 +45,8 @@ public class WxCouponSendServiceImpl implements WxCouponSendService { @Override - public PageInfo listAsPage(WxCouponSend record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponSendMapper.findList(record)); + public PageInfo listAsPage(WxCouponSend record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponSendMapper.findListVo(record)); } @Override @@ -160,7 +161,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService { wxCouponSendQuery.setSendType(type.getCode()); wxCouponSendQuery.setStatus(EnumCouponSendStatus.VALID.getCode()); - List wxCouponSends = wxCouponSendMapper.findList(wxCouponSendQuery); + List wxCouponSends = wxCouponSendMapper.findListVo(wxCouponSendQuery); for (WxCouponSend send : wxCouponSends) { boolean checkLimit = false; // 检查疲劳度 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxLevelConfigServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxLevelConfigServiceImpl.java index d5e9b43fc..e629ac1b1 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxLevelConfigServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxLevelConfigServiceImpl.java @@ -1,5 +1,6 @@ package com.iformall.service.impl; +import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxLevelConfig; @@ -23,7 +24,16 @@ public class WxLevelConfigServiceImpl implements WxLevelConfigService { @Override public PageInfo listAsPage(WxLevelConfig record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxLevelConfigMapper.findList(record)); + PageInfo page = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxLevelConfigMapper.findList(record)); + page.getList().stream().forEach(l->{ + if (l.getCapability()!= null){ + JSONObject jo = JSONObject.parseObject(l.getCapability()); + l.setCount(jo.getLong(CAPABILITY_SEND_CAR_COUPON)); + }else { + l.setCount(0L); + } + }); + return page; } @Override @@ -70,6 +80,27 @@ public class WxLevelConfigServiceImpl implements WxLevelConfigService { } } + public final static String CAPABILITY_SEND_CAR_COUPON = "carCouponCount"; + + @Override + public void batchUpdateCapabilities(String tenantId, List records) { + records.stream() + .filter(l->l.getId() == null && l.getCount() != null) + .forEach(l->{ + l.setUpdateDate(new Date()); + JSONObject jo = new JSONObject(); + jo.put(CAPABILITY_SEND_CAR_COUPON,l.getCount()); + l.setCapability(jo.toJSONString()); + wxLevelConfigMapper.updateByPrimaryKeySelective(l); + }); + } + + @Override + public Long getCapabilitiesOfSendCarConpon(JSONObject jo) { + return jo.getLong(CAPABILITY_SEND_CAR_COUPON); + } + + @Override public void deleteById(Long id) { wxLevelConfigMapper.deleteByPrimaryKey(id); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 8edb87d17..fb170ff00 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -549,28 +549,18 @@ public class WxOrderServiceImpl implements WxOrderService { private WxCouponOrder createCouponOrder(WxCUser user, WxOrder order, WxCoupon coupon) { Date curr = new Date(); Date valid_date = null; - if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())){ + if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode()) || + coupon.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())){ valid_date = coupon.getValidEndDate(); } else { Calendar calendar = Calendar.getInstance(); calendar.setTime(curr); - if (!coupon.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())) { - // 普通券精确到天 - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.add(Calendar.DAY_OF_MONTH, 1+coupon.getValidDays()); - valid_date = calendar.getTime(); - } else { - // 停车券过期日期到月 - calendar.set(Calendar.DAY_OF_MONTH, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.add(Calendar.MONTH, 1); - valid_date = calendar.getTime(); - } + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.add(Calendar.DAY_OF_MONTH, 1+coupon.getValidDays()); + valid_date = calendar.getTime(); } boolean isCard = false; // 检查是否是储值卡 diff --git a/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml index 6da85c9d7..5b2408c5e 100644 --- a/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml @@ -181,6 +181,28 @@ + + - select from wx_coupon_send + diff --git a/mallinkService/src/main/resources/mapper/WxLevelConfigMapper.xml b/mallinkService/src/main/resources/mapper/WxLevelConfigMapper.xml index 28bd89a36..314127883 100644 --- a/mallinkService/src/main/resources/mapper/WxLevelConfigMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxLevelConfigMapper.xml @@ -9,10 +9,11 @@ + - `id`, `tenant_id`, `points`, `level`, `description`, `create_date`, `discount_enable` + `id`, `tenant_id`, `points`, `level`, `description`, `create_date`, `discount_enable`, `capability`