定义接口 UserExpireCheckProcessor
package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;
import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
/**
* @Author ziyang
* @Date 2022/2/8
*/
public interface UserExpireCheckProcessor {
/**
* 获取渠道
*
* @return 渠道
*/
String getChannel();
/**
* 校验
*
* @param context
* @param param
* @return
*/
String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param);
}
零售通策略类 LSTUserExpireCheckProcessor
package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;
import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.stereotype.Service;
/**
* @Author ziyang
* @Date 2022/2/8
*/
@Service
public class LSTUserExpireCheckProcessor implements UserExpireCheckProcessor {
@Override
public String getChannel() {
return DeviceChannelTypeEnum.LST.name();
}
@Override
public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
return PosAccountStatusEnum.READY.name();
}
}
如意策略类 RuyiUserExpireCheckProcessor
package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;
import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.common.utils.DateUtil;
import com.alibaba.lst.pos.dao.entity.ruyi.account.RuyiAccountStoreRelationDO;
import com.alibaba.lst.pos.dao.facade.ruyi.account.RuyiAccountStoreRelationDAOFacade;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.Date;
/**
* @Author ziyang
* @Date 2022/2/8
*/
@Service
public class RuyiUserExpireCheckProcessor implements UserExpireCheckProcessor {
@Autowired
private RuyiAccountStoreRelationDAOFacade ruyiAccountStoreRelationDAOFacade;
@Override
public String getChannel() {
return DeviceChannelTypeEnum.RUYI.name();
}
@Override
public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
// 加个兼容逻辑
// 新渠道不收费,但是防止老版本会受expireTime影响
//查询账号 (如果有主子账号需要改造)
RuyiAccountStoreRelationDO ruyiAccountStoreRelationDO = ruyiAccountStoreRelationDAOFacade.
queryOwnerTypeAndDirectControlRuyiAccountStoreRelationByOwnerId(param.getOwnerId());
// 增加一年
Calendar calendar = Calendar.getInstance();
if (ruyiAccountStoreRelationDO.getExpireDate() == null) {
Date today = DateUtil.getDateIntegralPoint(new Date());
calendar.setTime(today);
} else {
calendar.setTime(ruyiAccountStoreRelationDO.getExpireDate());
}
calendar.add(Calendar.DATE, AccountConsts.ONE_YEAR_DAYS);
ruyiAccountStoreRelationDO.setExpireDate(calendar.getTime());
ruyiAccountStoreRelationDAOFacade.update(ruyiAccountStoreRelationDO);
return PosAccountStatusEnum.READY.name();
}
}
优米策略类 SunmiUserExpireCheckProcessor
package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;
import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.api.param.software.ServiceOrderBatchQueryParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.dao.entity.software.RuyiServiceOrderDO;
import com.alibaba.lst.pos.service.biz.account.ModuleBizImpl;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import com.alibaba.lst.pos.service.biz.software.ServiceOrderBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static com.alibaba.lst.pos.service.biz.account.ModuleBizImpl.BASE_MODULE_CODE;
/**
* @Author ziyang
* @Date 2022/2/8
*/
@Service
public class SunmiUserExpireCheckProcessor implements UserExpireCheckProcessor {
@Autowired
private ModuleBizImpl moduleBiz;
@Autowired
private ServiceOrderBiz serviceOrderBiz;
@Override
public String getChannel() {
return DeviceChannelTypeEnum.SUNMI.name();
}
@Override
public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
Set<String> userModuleList = moduleBiz.getUserModuleList(param.getOwnerId(), context.getDeviceDetailDTO());
context.setModuleList(new ArrayList<>(userModuleList));
if (userModuleList.contains(BASE_MODULE_CODE)) {
return PosAccountStatusEnum.READY.name();
}
// 查询一下,如果曾经有订单,则返回需要续费
ServiceOrderBatchQueryParam serviceOrderBatchQueryParam = new ServiceOrderBatchQueryParam();
serviceOrderBatchQueryParam.setOwnerId(param.getOwnerId());
serviceOrderBatchQueryParam.setChannelCode(context.getChannelInfo().name());
List<RuyiServiceOrderDO> ruyiServiceOrderDOS = serviceOrderBiz.batchQueryServiceOrder(serviceOrderBatchQueryParam);
if (!ruyiServiceOrderDOS.isEmpty()) {
return PosAccountStatusEnum.NEED_RENEW.name();
}
return PosAccountStatusEnum.NEED_PAY.name();
}
}
定义一个工厂类
package com.alibaba.lst.pos.service.biz.ruyi.account.processor.factory;
import com.alibaba.lst.pos.service.biz.ruyi.account.processor.user.UserExpireCheckProcessor;
import com.alibaba.lst.pos.service.biz.ruyi.account.processor.vendor.VendorActiveCheckProcessor;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @Author xuzhiqiang
* @Date 2022/2/8
*
* 使用策略模式 + 工厂模式
* 登录是用户角色的判断操作
*
* 1:定义接口 UserExpireCheckProcessor
*
* 2:不同策略的类 实现接口UserExpireCheckProcessor 这里有策略
* LSTUserExpireCheckProcessor、RuyiUserExpireCheckProcessor、SunmiUserExpireCheckProcessor
* 3:创建一个工厂类RuyiAccountExpireCheckProcessorFactory
* 工厂类中定义一个map 用来保存所有的策略
* 然后使用@Autowired注解用spring自动注入 spring会帮我们把map添加
* 4:@Autowired
* private RuyiAccountExpireCheckProcessorFactory ruyiAccountExpireCheckProcessorFactory;
* 注入工厂类
* 5:VendorActiveCheckProcessor vendorActiveCheckProcessor = vendorActiveCheckProcessorFactory.getProcessor(channelInfo.name());
* boolean vendorActiveCheckPass = vendorActiveCheckProcessor.check(param);
*
*/
@Service
public class RuyiAccountExpireCheckProcessorFactory {
/**
* @see com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum
*/
private Map<String, UserExpireCheckProcessor> userExpireCheckProcessorMap;
@Autowired
public void setUserExpireCheckProcessorMap(List<UserExpireCheckProcessor> userExpireCheckProcessorList) {
Map<String, UserExpireCheckProcessor> map = Maps.newHashMap();
if (CollectionUtils.isNotEmpty(userExpireCheckProcessorList)) {
for (UserExpireCheckProcessor processor : userExpireCheckProcessorList) {
map.put(processor.getChannel(), processor);
}
}
this.userExpireCheckProcessorMap = map;
}
public UserExpireCheckProcessor getProcessor(String channelCode) {
return userExpireCheckProcessorMap.get(channelCode);
}
}
使用