Просмотр исходного кода

Merge branch 'release_real_202101' of https://git.malls.iformall.com/server/formallProject into release_real_202101

release_toaliyun_real
zhengfangyuan 5 лет назад
Родитель
Сommit
d554898e9a
23 измененных файлов: 2688 добавлений и 57 удалений
  1. +0
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101140001__memberImport.sql
  2. +1
    -1
      mallinkAdmin/src/main/resources/db/migration/V202101190001__wx_score_rules.sql
  3. +1999
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101210001__wx_c_user_basic_sign.sql
  4. +8
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101250001__user_sign_update_wx_score_rules.sql
  5. +161
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxCUserBasicSignController.java
  6. +1
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
  7. +2
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  8. +7
    -0
      mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java
  9. +67
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxCUserBasicSign.java
  10. +5
    -4
      mallinkService/src/main/java/com/iformall/domain/po/WxScoreRules.java
  11. +6
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java
  12. +13
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicSignMapper.java
  13. +2
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java
  14. +28
    -0
      mallinkService/src/main/java/com/iformall/service/WxCUserBasicSignService.java
  15. +1
    -0
      mallinkService/src/main/java/com/iformall/service/WxCreditHistoryService.java
  16. +204
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicSignServiceImpl.java
  17. +8
    -8
      mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java
  18. +37
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java
  19. +16
    -39
      mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java
  20. +4
    -2
      mallinkService/src/main/java/com/iformall/utils/CreditUtil.java
  21. +15
    -0
      mallinkService/src/main/java/com/iformall/utils/DateUtils.java
  22. +91
    -0
      mallinkService/src/main/resources/mapper/WxCUserBasicSignMapper.xml
  23. +12
    -0
      mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml

mallinkAdmin/src/main/resources/db/migration/V202101400001__memberImport.sql → mallinkAdmin/src/main/resources/db/migration/V202101140001__memberImport.sql Просмотреть файл


mallinkAdmin/src/main/resources/db/migration/V202101900001__wx_score_rules.sql → mallinkAdmin/src/main/resources/db/migration/V202101190001__wx_score_rules.sql Просмотреть файл

@@ -1,5 +1,5 @@
INSERT INTO `mallink`.`wx_score_rules`(`id`, `tenant_id`, `type`, `scale`)
select CEILING(RAND()*90000000000+10000000000),`tenant_id`,4,`scale` from wx_score_rules where type = 2 and scale > 10;

--集团版手动处理,(集团版不存在这类数据,子集团数据与原集团规则相等)
--集团版手动处理,(集团版不存在这类数据,子集团生日倍率数据与原集团规则相等)
--目前集团版(1008-1020-----1028)(1026-1027-----1025)

+ 1999
- 0
mallinkAdmin/src/main/resources/db/migration/V202101210001__wx_c_user_basic_sign.sql
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 8
- 0
mallinkAdmin/src/main/resources/db/migration/V202101250001__user_sign_update_wx_score_rules.sql Просмотреть файл

@@ -0,0 +1,8 @@
update wx_score_rules set rules = concat(SUBSTRING(rules,1,char_length(rules)-1),
",{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
RIGHT(rules,1)) where type = 2

--type=2 积分规则,每日登陆去掉-- 缓存--缓存--缓存

+ 161
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxCUserBasicSignController.java Просмотреть файл

@@ -0,0 +1,161 @@
package com.iformall.controller;

import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.enums.EnumScoreType;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserBasicSignService;
import com.iformall.service.WxCreditHistoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/userSign")
@Api(description = "签到接口")
public class WxCUserBasicSignController extends BaseController {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxCUserBasicSignService wxCUserBasicSignService;

@ApiOperation("用户签到列表")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name="pageNum",value="页数",dataType="int", paramType = "query",required=true),
@ApiImplicitParam(name="pageSize",value="每页条数",dataType="int", paramType = "query",required=true)})
public ResultData list(@ModelAttribute WxCUserBasicSign wxCUserBasicSign, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::list");
if (null == wxCUserBasicSign){
wxCUserBasicSign = new WxCUserBasicSign();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
final PageInfo<WxCUserBasicSign> page = wxCUserBasicSignService.listAsPage(wxCUserBasicSign, pageNum, pageSize);
return new ResultData(page);
}

@ApiOperation("签到")
@PostMapping("signIn")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signIn(@RequestBody WxCUserBasicSign wxCUserBasicSign) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
if (null == wxCUserBasicSign){
wxCUserBasicSign = new WxCUserBasicSign();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);

WxCUserBasicSign todaySign = wxCUserBasicSignService.getTodaySignIn(wxCUserBasicSign);
if(todaySign == null){
try {
todaySign = wxCUserBasicSignService.signIn(wxCUserBasicSign);
}catch(Exception e){
return new ResultData(ErrorCode.SYS_SERVER_ERROR);
}
if(todaySign == null){
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"type");
}
return new ResultData(todaySign);
}else{
return new ResultData(ErrorCode.MEM_IS_SIGNIN,todaySign);
}

}

@ApiOperation("签到状态")
@GetMapping("signInStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signInStatus() {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign();
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign);
return new ResultData(map);
}

@ApiOperation("签到领取")
@PostMapping("signInCredit")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signInCredit(@RequestBody WxCreditHistory wxCreditHistory) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
if (null == wxCreditHistory){
wxCreditHistory = new WxCreditHistory();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign();
wxCUserBasicSign.setTenantId(getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign);
int continueMonthSign = map.get("continueMonthSign");//本月连续签到天数
int signInSevenDay = map.get("signInSevenDay");//7日连续奖励
int signInFTDay = map.get("signInFTDay");//14日连续奖励
int signInTEDay = map.get("signInTEDay");//28日连续奖励

if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_SEVENDAY.getCode())){
if(continueMonthSign >= 7 && signInSevenDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_SEVENDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_FTDAY.getCode())){
if(continueMonthSign >= 14 && signInFTDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_FTDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_TEDAY.getCode())){
if(continueMonthSign >= 28 && signInTEDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_TEDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else{
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"creditType");
}

}

}

+ 1
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java Просмотреть файл

@@ -1014,7 +1014,7 @@ public class WxUserGrantController extends BaseController {
wxCUserBasicInfoService.updateQrCode(wxCUserBasicInfo);
}
}
RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, Constant.S_D_EXPIRE);
RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, 0);

} catch (Exception e) {
logger.error("getUserinfoQrCode error.",e);


+ 2
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java Просмотреть файл

@@ -396,6 +396,8 @@ public enum ErrorCode{
CREDIT_NOT_ENOUGH(13101, "积分不够扣减值"),
USER_NOT_MEMBER(13102, "该用户不是小程序会员"),
OUT_OF_CREDIT(13103, "超出最大积分"),
MEM_IS_SIGNIN(13104, "该用户已签到"),
MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"),


/**


+ 7
- 0
mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java Просмотреть файл

@@ -76,6 +76,13 @@ public class BaseMyBatisConfiguration {
basicInfoSharding.setRule(EnumShardingRule.HASH.getCode());
shardingList.add(basicInfoSharding);

ShardingSphere basicSignSharding = new ShardingSphere();
basicSignSharding.setColumn("tenant_id");
basicSignSharding.setTableName("wx_c_user_basic_sign");
basicSignSharding.setCount(100);
basicSignSharding.setRule(EnumShardingRule.HASH.getCode());
shardingList.add(basicSignSharding);

ShardingSphere wxbasicChildSharding = new ShardingSphere();
wxbasicChildSharding.setColumn("tenant_id");
wxbasicChildSharding.setTableName("wx_c_user_basic_child");


+ 67
- 0
mallinkService/src/main/java/com/iformall/domain/po/WxCUserBasicSign.java Просмотреть файл

@@ -0,0 +1,67 @@
package com.iformall.domain.po;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.iformall.domain.po.base.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.util.Date;

@TableName(value = "wx_c_user_basic_sign")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class WxCUserBasicSign extends TenantEntity {

@TableField(exist = false)
public static final Integer SIGNIN_TYPE = 1;

protected Long id;

@io.swagger.annotations.ApiModelProperty(value="userId",name="userId")
private Long userId;

@io.swagger.annotations.ApiModelProperty(value="1:签到",name="type")
private Integer type;

@io.swagger.annotations.ApiModelProperty(value="签到时间",name="signinDate")
private Date signinDate;
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate")
private Date createDate;
@io.swagger.annotations.ApiModelProperty(value="修改时间",name="updateDate")
private Date updateDate;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月连续签到天数",name="continueMonthSign")
private Integer continueMonthSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月累计签到天数",name="countMonthSign")
private Integer countMonthSign;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年连续签到天数",name="continueYearSign")
private Integer continueYearSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年累计签到天数",name="countYearSign")
private Integer countYearSign;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间连续签到天数",name="continueSign")
private Integer continueSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间累计签到天数",name="countSign")
private Integer countSign;

@io.swagger.annotations.ApiModelProperty(value="备注",name="mark")
private String mark;


@TableField(exist = false)
private Date startDate;

@TableField(exist = false)
private Date endDate;

@TableField(exist = false)
private Integer begin;

@TableField(exist = false)
private Integer limit;

}

+ 5
- 4
mallinkService/src/main/java/com/iformall/domain/po/WxScoreRules.java Просмотреть файл

@@ -48,7 +48,6 @@ public class WxScoreRules extends BaseTenantEntity {
" {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" +
"]}," +
"{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," +
"{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," +
"{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," +
"{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" +
"]";
@@ -56,7 +55,7 @@ public class WxScoreRules extends BaseTenantEntity {
@TableField(exist = false)
private static final String creditDefaultRules =
"[" +
"{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," +
// "{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," +
"{\"id\":2,\"childs\":[" +
" {\"businessId\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," +
" {\"businessId\":2,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," +
@@ -71,10 +70,12 @@ public class WxScoreRules extends BaseTenantEntity {
" {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" +
"]}," +
"{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," +
"{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," +
"{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," +
"{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}," +
"{\"id\":8,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" +
"{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"]";

@TableField(exist = false)


+ 6
- 1
mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java Просмотреть файл

@@ -20,7 +20,12 @@ public enum EnumScoreType {
ACTIVITY_JOIN(13, "活动报名"),
CLEAN_CREDIT(14, "积分清零计划"),
GAME_LES_CREDIT(15, "游戏消耗积分"),
GAME_ADD_CREDIT(16, "游戏奖励积分"),;
GAME_ADD_CREDIT(16, "游戏奖励积分"),

SIGN_IN_DAY(17, "每日签到"),
SIGN_IN_SEVENDAY(18, "连续签到7天"),
SIGN_IN_FTDAY(19, "连续签到14天"),
SIGN_IN_TEDAY(20, "连续签到28天"),;

public static EnumScoreType getEnum(Integer code) {
for (EnumScoreType value : values()) {


+ 13
- 0
mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicSignMapper.java Просмотреть файл

@@ -0,0 +1,13 @@
package com.iformall.mapper;

import com.iformall.common.CommonMapper;
import com.iformall.domain.po.WxCUserBasicSign;

import java.util.List;

public interface WxCUserBasicSignMapper extends CommonMapper<WxCUserBasicSign, Long> {
List<WxCUserBasicSign> findList(WxCUserBasicSign record);

WxCUserBasicSign getLastSignIn(WxCUserBasicSign record);
}

+ 2
- 0
mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java Просмотреть файл

@@ -41,4 +41,6 @@ public interface WxCreditHistoryMapper extends CommonMapper<WxCreditHistory, Lon
Integer getLesCreditSummary(WxCreditHistory wxCreditHistory);

List<MerchantCreditRankingVo> merchantCreditRanking(WxCreditHistory record);

int monthCount(WxCreditHistory record);
}

+ 28
- 0
mallinkService/src/main/java/com/iformall/service/WxCUserBasicSignService.java Просмотреть файл

@@ -0,0 +1,28 @@
package com.iformall.service;

import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.enums.EnumScoreType;

import java.util.Map;

public interface WxCUserBasicSignService {

/**
* 根据实体查询分页列表
*
* @param record
* @param pageIndex
* @param pageSize
* @return
*/
PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize);

WxCUserBasicSign signIn(WxCUserBasicSign record);

WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record);

Map<String,Integer> getLastSignIn(WxCUserBasicSign record);

void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType);
}

+ 1
- 0
mallinkService/src/main/java/com/iformall/service/WxCreditHistoryService.java Просмотреть файл

@@ -85,4 +85,5 @@ public interface WxCreditHistoryService {
Integer getLesCreditSummary(WxCreditHistory wxCreditHistory);

PageInfo<MerchantCreditRankingVo> listAsPageMcrv(WxCreditHistory record, Integer pageIndex, Integer pageSize);

}

+ 204
- 0
mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicSignServiceImpl.java Просмотреть файл

@@ -0,0 +1,204 @@
package com.iformall.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.iformall.common.IdWorker;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.enums.EnumScoreType;
import com.iformall.enums.EnumUserType;
import com.iformall.mapper.WxCUserBasicSignMapper;
import com.iformall.mapper.WxCreditHistoryMapper;
import com.iformall.service.WxCUserBasicSignService;
import com.iformall.service.WxCreditHistoryService;
import com.iformall.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import static java.util.Calendar.DAY_OF_MONTH;

@Service
@Slf4j
public class WxCUserBasicSignServiceImpl implements WxCUserBasicSignService {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
WxCUserBasicSignMapper wxCUserBasicSignMapper;

@Autowired
WxCreditHistoryService wxCreditHistoryService;

@Autowired
WxCreditHistoryMapper wxCreditHistoryMapper;

@Override
public PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCUserBasicSignMapper.findList(record));
}

@Transactional(rollbackFor = {Exception.class})
@Override
public WxCUserBasicSign signIn(WxCUserBasicSign record) {
if(record.getType() == null){
record.setType(WxCUserBasicSign.SIGNIN_TYPE);
}

final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());

Date today = new Date();
record.setCreateDate(today);
record.setUpdateDate(today);

if(record.getType().equals(WxCUserBasicSign.SIGNIN_TYPE)){
record.setSigninDate(DateUtils.getDateZero(today));
WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record);
if(lastSignIn == null){

record.setContinueMonthSign(1);
record.setCountMonthSign(1);
record.setContinueYearSign(1);
record.setCountYearSign(1);
record.setContinueSign(1);
record.setCountSign(1);
wxCUserBasicSignMapper.insert(record);
}else{
long daysL = DateUtils.startToEnd(lastSignIn.getSigninDate(), today);
int daysI = new Long(daysL).intValue();
if(daysI == 0){
return lastSignIn;
}

record.setCountSign(lastSignIn.getCountSign() + 1);
if(daysI == 1){
record.setContinueSign(lastSignIn.getContinueSign() + 1);
}else{
record.setContinueSign(1);
}

if(DateUtils.getYear(today) == DateUtils.getYear(lastSignIn.getSigninDate())){
record.setCountYearSign(lastSignIn.getCountYearSign() + 1);
if(daysI == 1){
record.setContinueYearSign(lastSignIn.getContinueYearSign() + 1);
}else{
record.setContinueYearSign(1);
}
if(DateUtils.getMonth(today) == DateUtils.getMonth(lastSignIn.getSigninDate())){
record.setCountMonthSign(lastSignIn.getCountMonthSign() + 1);
if(daysI == 1){
record.setContinueMonthSign(lastSignIn.getContinueMonthSign() + 1);
}else{
record.setContinueMonthSign(1);
}
}else{
record.setCountMonthSign(1);
record.setContinueMonthSign(1);
}
}else{
record.setContinueMonthSign(1);
record.setCountMonthSign(1);
record.setContinueYearSign(1);
record.setCountYearSign(1);
}
wxCUserBasicSignMapper.insert(record);
}
signInCreditHistory(record,EnumScoreType.SIGN_IN_DAY);
return record;
}else{
//补签
return null;
}
}

@Override
public WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date today = calendar.getTime();//今天零点
calendar.set(DAY_OF_MONTH,calendar.get(DAY_OF_MONTH) +1);
Date tomorrow =calendar.getTime();//明天零点

record.setStartDate(today);
record.setEndDate(tomorrow);
List<WxCUserBasicSign> list = wxCUserBasicSignMapper.findList(record);
if(list != null && list.size() == 1){
return list.get(0);
}else if(list.size() > 1){
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String todayString = format.format(today);
logger.error("用户签到数据异常{}"+record.getUserId()+"时间{}"+todayString);
return list.get(0);
}
return null;
}

@Override
public Map<String,Integer> getLastSignIn(WxCUserBasicSign record) {
Map<String,Integer> map = new HashMap<>();
WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record);
if(lastSignIn != null && DateUtils.isSameMonth(lastSignIn.getSigninDate(),new Date())){
//本月连续签到天数
map.put("continueMonthSign",lastSignIn.getContinueMonthSign());
}else{
map.put("continueMonthSign",0);
}
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCUserId(record.getUserId());
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_DAY.getCode());
//每日签到
if(wxCreditHistoryMapper.loginCount(wxCreditHistory) > 0){
map.put("signInDay",1);
}else{
map.put("signInDay",0);
}
//7日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_SEVENDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInSevenDay",1);
}else{
map.put("signInSevenDay",0);
}
//14日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_FTDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInFTDay",1);
}else{
map.put("signInFTDay",0);
}
//28日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_TEDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInTEDay",1);
}else{
map.put("signInTEDay",0);
}
return map;
}

@Override
public void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType){
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setCUserId(record.getUserId());
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCreateDate(new Date());
wxCreditHistory.setCreditType(enumScoreType.getCode());
wxCreditHistory.setChangePurpose(enumScoreType.getMessage());
wxCreditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode());
wxCreditHistory.setOperatorId(record.getUserId());
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,null);
}

}

+ 8
- 8
mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java Просмотреть файл

@@ -273,14 +273,14 @@ public class WxCUserServiceImpl implements WxCUserService {
logger.error("c_user 成长值 " + e.getMessage());
}
// 积分
try {
credit = addCredit(user, EnumScoreType.LOGIN);
logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit);
} catch (MallinkException e) {
logger.error("c_user 积分 " + e.getMessage());
} catch (Exception e) {
logger.error("c_user 积分 " + e.getMessage());
}
// try {
// credit = addCredit(user, EnumScoreType.LOGIN);
// logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit);
// } catch (MallinkException e) {
// logger.error("c_user 积分 " + e.getMessage());
// } catch (Exception e) {
// logger.error("c_user 积分 " + e.getMessage());
// }

// 用户登陆后 更新最后一次活跃时间
if (user.getUserId() != null) {


+ 37
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java Просмотреть файл

@@ -391,7 +391,8 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
private int creditIncrement(WxCreditHistory record) {
//查找C端用户的成长值
if (record.getCreditType() == EnumScoreType.LOGIN.getCode()) {
return loginAddCredit(record);
// return loginAddCredit(record);//登陆加积分取消
return 0;
}
if (record.getCreditType() == EnumScoreType.BIND_CAR.getCode()) {
return bindCarAddCredit(record);
@@ -430,6 +431,19 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
return record.getCreditNum();
}

if (record.getCreditType() == EnumScoreType.SIGN_IN_DAY.getCode()) {
return signinCredit(record);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_SEVENDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_SEVENDAY);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_FTDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_FTDAY);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_TEDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_TEDAY);
}

return 0;
}

@@ -449,6 +463,28 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
return wxScoreRules.getRule(EnumScoreType.LOGIN, WxScoreRules.SCORE);
}

private int signinCredit(WxCreditHistory record) {
//如果当天已经登录过则跳过
if (wxCreditHistoryMapper.loginCount(record) > 0) {
return 0;
}
// 1. 获取当前租户下积分的增加规则
WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId());
// 2. 增长的积分
return wxScoreRules.getRule(EnumScoreType.SIGN_IN_DAY, WxScoreRules.SCORE);
}

private int signinMonthCredit(WxCreditHistory record,EnumScoreType enumScoreType) {
//
if (wxCreditHistoryMapper.monthCount(record) > 0) {
return 0;
}
// 1. 获取当前租户下积分的增加规则
WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId());
// 2. 增长的积分
return wxScoreRules.getRule(enumScoreType, WxScoreRules.SCORE);
}

private int bindCarAddCredit(WxCreditHistory record) {
if (wxCreditHistoryMapper.countList(record) > 0) {
return 0;


+ 16
- 39
mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java Просмотреть файл

@@ -52,50 +52,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService {
public void wxScoreRulesInit(String tenantId) {
WxScoreRules wxScoreRules = new WxScoreRules();
wxScoreRules.setTenantId(tenantId);
wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," +
" {\"id\": 2, \"score\": null, \"childs\": " +
"[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," +
" {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]");
wxScoreRules.setRules(WxScoreRules.getCreditDefaultRules());
wxScoreRules.setCreateDate(new Date());
wxScoreRules.setUpdateDate(new Date());
wxScoreRules.setType(2);
wxScoreRules.setClearYear(1);
wxScoreRules.setScale(10);
wxScoreRules.setType(EnumScoreRules.CREDIT.getCode());
wxScoreRules.setCreditLocked(1);
wxScoreRulesMapper.insert(wxScoreRules);
wxScoreRules = new WxScoreRules();
wxScoreRules.setTenantId(tenantId);
wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," +
" {\"id\": 2, \"score\": 0, \"childs\": " +
"[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," +
" {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]");
wxScoreRules.setRules(WxScoreRules.getScoreDefaultRules());
wxScoreRules.setCreateDate(new Date());
wxScoreRules.setUpdateDate(new Date());
wxScoreRules.setType(1);
wxScoreRules.setType(EnumScoreRules.SCORE.getCode());
wxScoreRules.setCreditLocked(0);
wxScoreRulesMapper.insert(wxScoreRules);
}
@@ -145,9 +113,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService {
//当成长值或积分规则新增时,将新增的数据一并返回给接口调用端
private String getScoreRulesNew(String scoreRules,EnumScoreRules enumScoreRules){
//getJSONObject(1) 为EnumScoreType.CONSUMPTION(2, "消费")的下标值
JSONArray jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs");
String defaultRules = enumScoreRules.equals(EnumScoreRules.SCORE) ? WxScoreRules.getScoreDefaultRules() : WxScoreRules.getCreditDefaultRules();
JSONArray jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs");
JSONArray jsonArrayOld = new JSONArray();
JSONArray jsonArrayDefault = new JSONArray();
if(enumScoreRules.equals(EnumScoreRules.SCORE)){
jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs");
String defaultRules = WxScoreRules.getScoreDefaultRules();
jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs");
}else if(enumScoreRules.equals(EnumScoreRules.CREDIT)){
jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(0).getJSONArray("childs");
String defaultRules = WxScoreRules.getCreditDefaultRules();
jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(0).getJSONArray("childs");
}

if (jsonArrayOld.size() < jsonArrayDefault.size()) {
JSONArray childsJsonArray = new JSONArray();
JSONObject otherJSONObject = new JSONObject();


+ 4
- 2
mallinkService/src/main/java/com/iformall/utils/CreditUtil.java Просмотреть файл

@@ -104,8 +104,10 @@ public class CreditUtil {
if(Objects.nonNull(wxCUserBasicInfo.getScoreDate())){
int scoreYear = DateUtils.getYear(wxCUserBasicInfo.getScoreDate());
int year = DateUtils.getYear(new Date());
if(scoreYear == year && DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){
birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService);
if(scoreYear == year){
if(DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){
birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService);
}
}else{
if (Objects.nonNull(wxCUserBasicInfo.getBirthdate()) && DateUtils.isBirthdays(wxCUserBasicInfo.getBirthdate())) {
birthdayScale = getBirthdayScoreScale(tenantId,wxScoreRulesService);


+ 15
- 0
mallinkService/src/main/java/com/iformall/utils/DateUtils.java Просмотреть файл

@@ -1362,4 +1362,19 @@ public class DateUtils {
return false;
}

/**
* 获取当前日期零点<br>
*
* @param date
* @return 获取当前日期零点
*/
public static Date getDateZero(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}

}

+ 91
- 0
mallinkService/src/main/resources/mapper/WxCUserBasicSignMapper.xml Просмотреть файл

@@ -0,0 +1,91 @@
<?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.iformall.mapper.WxCUserBasicSignMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.WxCUserBasicSign">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" />
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/>
<result column="user_id" jdbcType="BIGINT" property="userId" />

<result column="type" jdbcType="INTEGER" property="type" />

<result column="signin_date" jdbcType="TIMESTAMP" property="signinDate"/>
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>

<result column="continue_month_sign" jdbcType="INTEGER" property="continueMonthSign" />
<result column="count_month_sign" jdbcType="INTEGER" property="countMonthSign" />

<result column="continue_year_sign" jdbcType="INTEGER" property="continueYearSign" />
<result column="count_year_sign" jdbcType="INTEGER" property="countYearSign" />

<result column="continue_sign" jdbcType="INTEGER" property="continueSign" />
<result column="count_sign" jdbcType="INTEGER" property="countSign" />

<result column="mark" jdbcType="VARCHAR" property="mark" />

</resultMap>

<sql id="allColumns">
`id`,`tenant_id`,`parent_tenant_id`,`user_id`,`type`,`signin_date`,`create_date`,`update_date`,
`continue_month_sign`,`count_month_sign`,`continue_year_sign`,`count_year_sign`,
`continue_sign`,`count_sign`,`mark`
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1
<if test=" null != id ">
and `id` = #{id}
</if>
<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>
<if test=" null != userId ">
and `user_id` = #{userId}
</if>
<if test=" null != type ">
and `type` = #{type}
</if>

<if test=" null != startDate ">
and `signin_date` &gt;= #{startDate}
</if>
<if test=" null != endDate">
and `signin_date` &lt; #{endDate}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
order by `signin_date` desc

</sql>

<select id="findList" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap">
select <include refid="allColumns" />
from wx_c_user_basic_sign
<include refid="dynamicWhereConditions" />
</select>

<select id="getLastSignIn" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap">
select <include refid="allColumns" />,max(`signin_date`) from wx_c_user_basic_sign
where 1 = 1
<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>
<if test=" null != userId ">
and `user_id` = #{userId}
</if>
group by user_id
</select>

</mapper>

+ 12
- 0
mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml Просмотреть файл

@@ -184,6 +184,18 @@
and DATEDIFF(`create_date`,now())=0
</select>

<select id="monthCount" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer">
select COUNT(0) from wx_credit_history
where 1=1
<if test=" null != cUserId ">
and `c_user_id` = #{cUserId}
</if>
<if test=" null != creditType ">
and `credit_type` = #{creditType}
</if>
and DATE_FORMAT(`create_date`,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m');
</select>

<select id="countTodayList" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer">
select count(0)
from wx_credit_history


Загрузка…
Отмена
Сохранить