package com.xzx.gc.order.service;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.lang.Snowflake;
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.xzx.gc.common.Result;
|
import com.xzx.gc.common.constant.Constants;
|
import com.xzx.gc.common.constant.OrderEnum;
|
import com.xzx.gc.common.utils.BusinessUtil;
|
import com.xzx.gc.common.utils.JGPushUtil;
|
import com.xzx.gc.common.utils.RedisUtil;
|
import com.xzx.gc.common.utils.SecurityUtil;
|
import com.xzx.gc.common.utils.gdmap.GdMapUtil;
|
import com.xzx.gc.entity.CoreUser;
|
import com.xzx.gc.entity.Fence;
|
import com.xzx.gc.entity.OtherUserInfo;
|
import com.xzx.gc.entity.UserInfo;
|
import com.xzx.gc.model.admin.*;
|
import com.xzx.gc.order.mapper.*;
|
import com.xzx.gc.util.ChineseToSpell;
|
import com.xzx.gc.util.SessionUtil;
|
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import tk.mybatis.mapper.entity.Example;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Service
|
@Transactional
|
public class UserService {
|
|
@Autowired
|
private UserMapper userMapper;
|
|
@Autowired
|
private BusinessUtil businessUtil;
|
|
@Autowired
|
private OtherUserService otherUserService;
|
|
@Autowired
|
private HttpServletRequest request;
|
|
@Autowired
|
private AddressLevelService addressLevelService;
|
|
@Autowired
|
private FenceService fenceService;
|
|
@Autowired
|
private AddressService addressService;
|
|
@Autowired
|
private AddressMapper addressMapper;
|
|
@Autowired
|
private OrderMapper orderMapper;
|
|
@Autowired
|
private OrderDetailMapper orderDetailMapper;
|
|
@Autowired
|
private OrderItemInfoMapper orderItemInfoMapper;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
@Autowired
|
private SessionUtil sessionUtil;
|
|
@Autowired
|
private JGPushUtil jgPushUtil;
|
|
@Autowired
|
private AccountMapper accountMapper;
|
|
public UserInfo findByMobile(String mobilePhone){
|
UserInfo userInfo = new UserInfo();
|
userInfo.setMobilePhone(mobilePhone);
|
userInfo.setDelFlag(Constants.DEL_NOT_FLAG);
|
userInfo.setIsProhibit(false);
|
UserInfo userInfo1 = userMapper.selectOne(userInfo);
|
return userInfo1;
|
}
|
|
|
|
|
public UserInfo findById(String userId){
|
return userMapper.selectByPrimaryKey(userId);
|
}
|
|
|
public List<UserInfo> findForBidden(){
|
UserInfo userInfo = new UserInfo();
|
userInfo.setDelFlag(Constants.DEL_NOT_FLAG);
|
List<UserInfo> userInfo1 = userMapper.select(userInfo);
|
return userInfo1;
|
}
|
|
public List<UserInfo> findForBiddenByTime(){
|
Example example=new Example(UserInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("delFlag",Constants.DEL_NOT_FLAG);
|
criteria.andCondition("DATE_FORMAT(regist_time,'%Y-%m-%d')=date_sub(CURRENT_DATE(), interval 1 day)");
|
List<UserInfo> userInfo1 = userMapper.selectByExample(example);
|
return userInfo1;
|
}
|
|
public List<UserInfo> findHaveAddr(){
|
return userMapper.findHaveAddr();
|
}
|
|
public List<UserInfo> findByIds(List<String> ids){
|
if(CollUtil.isEmpty(ids)){
|
return new ArrayList<>();
|
}else {
|
Example example = new Example(UserInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andIn("userId", ids);
|
criteria.andEqualTo("delFlag", Constants.DEL_NOT_FLAG);
|
criteria.andEqualTo("isProhibit", Constants.DEL_NOT_FLAG);
|
List<UserInfo> userInfos = userMapper.selectByExample(example);
|
return userInfos;
|
}
|
}
|
|
|
public void update(UserInfo userInfo){
|
userMapper.updateByPrimaryKeySelective(userInfo);
|
}
|
|
|
public void updatePartnerId(String userId,String partnerId){
|
UserInfo byId = findById(userId);
|
if(StrUtil.isBlank(byId.getPartnerId())){
|
UserInfo userInfo=new UserInfo();
|
userInfo.setUserId(byId.getUserId());
|
userInfo.setPartnerId(partnerId);
|
update(userInfo);
|
}else {
|
userMapper.updatePartnerId(userId, partnerId);
|
}
|
}
|
|
/**
|
* 查询手机号码
|
* @param userId
|
* @param type 类型 0普通用户 1平台用户
|
* @return
|
*/
|
public String findOtherByUserId(String userId,int type){
|
if (businessUtil.isApp(request.getHeader("clientType"))) {
|
OtherUserInfo byId = otherUserService.findById(userId);
|
if(byId!=null)return byId.getMobilePhone();
|
}else{
|
UserInfo byId = findById(userId);
|
if(byId!=null)return byId.getMobilePhone();
|
}
|
return "未知";
|
}
|
|
public List<UserModel> queryUserByPhoneNormal(String phone, String normal){
|
String nickName="";
|
if(!StringUtils.isEmpty(phone)){
|
nickName = com.xzx.gc.common.utils.StringUtils.decode(phone);
|
}
|
List<UserModel> userModel = userMapper.queryUserByUsertypeList(phone, "1", "0",normal,nickName);
|
return userModel;
|
}
|
|
public UserModel insertUserInfo(OrderModel orderModel, List<String> keys, String isNomal){
|
String orderType = orderModel.getOrderType();
|
UserModel userModel = new UserModel();
|
Snowflake snowflake = IdUtil.getSnowflake(0, 3);
|
String orderId= com.xzx.gc.util.DateUtil.generate("DD", 1);
|
userModel.setOrderId(orderId);
|
String townCode =addressLevelService.findByLevle3Name(orderModel.getTownshipId());
|
String eleId1 = checkGaodeEleId(orderModel.getLongitude(),orderModel.getLatitude(),orderId,keys.get(0));
|
Fence tEId = fenceService.findByGidForbidden(eleId1);
|
if(null!=tEId){
|
eleId1=tEId.getId().toString();
|
}else{
|
List<String> townList = fenceService.queryOrderTownListByArea(townCode,null);
|
if(townList.size()>0){
|
eleId1 = townList.get(0);
|
}
|
}
|
|
userModel.setUserType("1");
|
userModel.setMobilePhone(orderModel.getMobilePhone());
|
if(!StringUtils.isEmpty(orderModel.getNickName())){
|
userModel.setNickName(new String(Base64.encodeBase64(orderModel.getNickName().getBytes())));
|
}
|
if(isNomal.equals("0")){
|
String salt = RandomUtil.randomString(16);
|
String pass = SecurityUtil.encrypt(salt,"123456");
|
userModel.setSalt(salt);
|
userModel.setPassword(pass);
|
userModel.setOrderNum(0);
|
userModel.setDelFlag("0");
|
}
|
//添加地址
|
String proviceId =addressLevelService.findIdByName("1",orderModel.getProvinceId());
|
String cityId =addressLevelService.findIdByName("2",orderModel.getCityId());
|
String townId =addressLevelService.findIdByName("3",orderModel.getTownshipId());
|
|
if(null==proviceId){
|
proviceId = orderModel.getProvinceId();
|
}
|
if(null==cityId){
|
cityId = orderModel.getCityId();
|
}
|
if(null==townId){
|
townId = orderModel.getTownshipId();
|
}
|
userModel.setProvince(ChineseToSpell.getPingYin(orderModel.getProvinceId()));
|
userModel.setCity(ChineseToSpell.getPingYin(orderModel.getCityId()));
|
|
userModel.setLongitude(orderModel.getLongitude());
|
userModel.setLatitude(orderModel.getLatitude());
|
//判断是否为第一次电话下单用户
|
String userType = "1";
|
UserModel oldUserModel = new UserModel();
|
if(isNomal.equals("0")){
|
|
oldUserModel =userMapper.queryUserByUsertype(orderModel.getMobilePhone(), userType,"0","3",null);
|
}else{
|
oldUserModel =userMapper.queryUserByUsertype(orderModel.getMobilePhone(), userType,"0",null,null);
|
}
|
if(oldUserModel != null){
|
userModel.setRegistType(oldUserModel.getRegistType());
|
userModel.setUserId(oldUserModel.getUserId());
|
userMapper.updateUserInfo(userModel);
|
//更改用户合伙人
|
updatePartnerId(oldUserModel.getUserId(),oldUserModel.getPartnerId());
|
|
//删除用户老地址
|
addressService.deleteByUserId(oldUserModel.getUserId());
|
if(null!=orderModel.getOrderId()&&!"".equals(orderModel.getOrderId())){
|
|
}else{
|
orderModel.setOrderId(orderId);
|
}
|
orderModel.setUserId(oldUserModel.getUserId());
|
UserAddressModel userAddressModel = insertUserAddress(orderModel,oldUserModel.getUserId(),cityId,proviceId,townId);
|
orderModel.setAddressId(userAddressModel.getAddressId());
|
orderModel.setCreateUserId(userModel.getNickName());
|
//添加订单,订单详情,订单物品表
|
insertOrder(orderModel,eleId1);
|
//发队列 和更新redis缓存
|
sendOperationLog(orderModel);
|
// String tag=Constants.GRAB_ORDER_TAG;
|
// //极光推送发抢单
|
// if(OrderEnum.家电回收.getValue().equals(orderType)){
|
// tag=Constants.GRAB_ORDER_HOME_TAG;
|
// }
|
// jgPushUtil.pushNewOrder(tag,townId);
|
|
//}
|
}else{
|
String userId= com.xzx.gc.util.DateUtil.generate("YH", 3);
|
userModel.setUserId(userId);
|
userModel.setPartnerId(orderModel.getPartnerId());
|
if(userMapper.insertUserInfo(userModel)>0){
|
//新建普通用户账号
|
String id="ZH"+snowflake.nextIdStr();
|
String value = "0";
|
orderModel.setOrderId(orderId);
|
String point = orderModel.getLongitude()+","+orderModel.getLatitude();
|
//判断是否在围栏中
|
boolean bool = false;
|
if(null!=eleId1&&!"".equals(eleId1)){
|
bool = true;
|
}else{
|
String gid="";
|
for (String key:keys){
|
gid = checkElectricByLocations(orderId,key,point);
|
if(StrUtil.isNotBlank(gid)){
|
bool = true;
|
break;
|
}
|
}
|
if(!bool){
|
return null;
|
}
|
//查询电子围栏Id
|
//eleId = dao.queryEleIdByGid(gid);
|
}
|
accountMapper.addCuserAccountRole(id, orderModel.getMobilePhone(), userId,value);
|
UserAddressModel userAddressModel = insertUserAddress(orderModel,userId,cityId,proviceId,townId);
|
orderModel.setUserId(userId);
|
//添加订单,订单详情,订单物品表
|
orderModel.setAddressId(userAddressModel.getAddressId());
|
orderModel.setCreateUserId(userModel.getNickName());
|
|
insertOrder(orderModel,eleId1);
|
//发队列 和更新redis缓存
|
sendOperationLog(orderModel);
|
//极光推送发抢单
|
// jgPushUtil.pushNewOrder(townId);
|
}
|
}
|
|
return userModel;
|
}
|
|
|
private void sendOperationLog(OrderModel orderModel){
|
OrderOperationLogModel operationLogModel = new OrderOperationLogModel();
|
operationLogModel.setOrderId(orderModel.getOrderId());
|
operationLogModel.setOperateContent("创建订单");
|
operationLogModel.setOrderStatus("1");
|
operationLogModel.setOrderSecondStatus("1");
|
operationLogModel.setOperateTime(DateUtil.now());
|
CoreUser user = sessionUtil.getCurrentUser();
|
operationLogModel.setOperateUserId(String.valueOf(user.getId()));
|
redisUtil.set("xzx:order:status:"+orderModel.getOrderId(),"0");
|
}
|
|
private void insertOrder(OrderModel orderModel,String townId){
|
//String orderId=DateUtil.generate("DD", 1);
|
//orderModel.setOrderId(orderId);
|
orderModel.setReserveTime(orderModel.getReserveDay()+" "+orderModel.getReserveDate()+":00");
|
orderModel.setCreateUserId(orderModel.getUserId());
|
orderModel.setTownshipId(townId);
|
orderModel.setOrderStatus("1");
|
if(null!=orderModel.getStoreId()&&!"".equals(orderModel.getStoreId())){
|
orderMapper.addOrderInfoApi(orderModel);
|
|
}else{
|
orderModel.setStoreId(null);
|
orderMapper.addOrderInfoApi(orderModel);
|
|
}
|
|
orderDetailMapper.addOrderDetailApi(orderModel);
|
if(!StringUtils.isEmpty(orderModel.getItemIds())){
|
String itemIds = orderModel.getItemIds();
|
String[] items = itemIds.split(",");
|
List<OrderItemModel> list = new ArrayList<>();
|
for (String itemType:items) {
|
OrderItemModel itemModel = new OrderItemModel();
|
itemModel.setOrderId(orderModel.getOrderId());
|
itemModel.setItemType(itemType);
|
list.add(itemModel);
|
}
|
orderItemInfoMapper.addOrderItem(list);
|
}
|
}
|
|
/**
|
* 添加地址表
|
* @param orderModel
|
* @param userId
|
* @return
|
*/
|
private UserAddressModel insertUserAddress(OrderModel orderModel,String userId,String cityId,String proviceId,String townId){
|
//添加地址
|
UserAddressModel addressModel = new UserAddressModel();
|
addressModel.setAddressArea(orderModel.getAddressArea());
|
addressModel.setMobilePhone(orderModel.getMobilePhone());
|
addressModel.setCityId(cityId);
|
addressModel.setProvinceId(proviceId);
|
addressModel.setDetailAddress(orderModel.getDetailAddress());
|
addressModel.setLatitude(orderModel.getLatitude());
|
addressModel.setLongitude(orderModel.getLongitude());
|
addressModel.setTownshipId(townId);
|
addressModel.setUserId(userId);
|
addressModel.setRelaPhone(orderModel.getMobilePhone());
|
addressModel.setRelaName(orderModel.getNickName());
|
addressMapper.insertUserAddress(addressModel);
|
addressModel = addressMapper.queryUserAddressInfo(userId,orderModel.getMobilePhone());
|
return addressModel;
|
}
|
|
private String checkElectricByLocations(String orderId,String keys,String point){
|
Result inFence = GdMapUtil.isInFence(point + "," + DateUtil.currentSeconds(), GdMapUtil.getDiu(orderId),keys);
|
if(inFence.getCode()==0) {
|
//设置围栏id
|
return inFence.getData().toString();
|
}else {
|
return null;
|
}
|
|
}
|
|
|
public String checkGaodeEleId(String longitude,String latitude,String receiverId,String key){
|
|
Result inFence = GdMapUtil.isInFence(longitude + "," + latitude + "," + cn.hutool.core.date.DateUtil.currentSeconds(), GdMapUtil.getDiu(receiverId),key);
|
if(inFence.getCode()==0){
|
return inFence.getData().toString();
|
}
|
return null;
|
}
|
}
|