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 findForBidden(){ UserInfo userInfo = new UserInfo(); userInfo.setDelFlag(Constants.DEL_NOT_FLAG); List userInfo1 = userMapper.select(userInfo); return userInfo1; } public List 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 userInfo1 = userMapper.selectByExample(example); return userInfo1; } public List findHaveAddr(){ return userMapper.findHaveAddr(); } public List findByIds(List 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 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 queryUserByPhoneNormal(String phone, String normal){ String nickName=""; if(!StringUtils.isEmpty(phone)){ nickName = com.xzx.gc.common.utils.StringUtils.decode(phone); } List userModel = userMapper.queryUserByUsertypeList(phone, "1", "0",normal,nickName); return userModel; } public UserModel insertUserInfo(OrderModel orderModel, List 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 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 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; } }