| 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;  | 
|     }  | 
| }  |