935090232@qq.com
2022-04-20 446868d70ffeecaeeffb3bed900c0be97ecadbab
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java
@@ -1,158 +1,257 @@
package com.matrix.system.shopXcx.api.action;
import com.matrix.biz.bean.BizUser;
import com.matrix.biz.service.BizUserService;
import com.matrix.component.redis.RedisUserLoginUtils;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.init.UserCacheManager;
import com.matrix.component.tools.HttpCurlUtil;
import com.matrix.component.wechat.externalInterface.weixinUtil.WeixinServiceUtil;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.web.BaseAction;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.activity.dao.ActivitySignReceiveRecordDao;
import com.matrix.system.common.bean.BusParameterSettings;
import com.matrix.system.common.dao.BusParameterSettingsDao;
import com.matrix.system.common.interceptor.HostInterceptor;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.fenxiao.constant.FenxiaoSettingConstant;
import com.matrix.system.fenxiao.dao.ShopSalesmanApplyDao;
import com.matrix.system.fenxiao.dao.ShopSalesmanGradeDao;
import com.matrix.system.fenxiao.entity.ShopSalesmanApply;
import com.matrix.system.fenxiao.entity.ShopSalesmanGrade;
import com.matrix.system.fenxiao.service.ShopSalesmanApplyService;
import com.matrix.system.hive.bean.SysVipInfo;
import com.matrix.system.hive.dao.MoneyCardUseDao;
import com.matrix.system.hive.dao.SysVipInfoDao;
import com.matrix.system.hive.service.SysVipInfoService;
import com.matrix.system.score.dao.ScoreVipDetailDao;
import com.matrix.system.shopXcx.api.WeChatApiTools;
import com.matrix.system.shopXcx.api.dto.XcxUserSaveUserInfoDto;
import com.matrix.system.shopXcx.dao.ShopCouponRecordDao;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.Date;
/**
 * @description (用户表)
 * @author jyy
 * @description (用户表)
 * @date 2019-05-31 10:03
 */
@Controller
@RequestMapping(value = "wxapi/user")
public class WxUserAction extends BaseAction {
   @Autowired
   private BizUserService bizUserService;
    @Autowired
    private SysVipInfoService sysVipInfoService;
    @Autowired
    private SysVipInfoDao sysVipInfoDao;
   @Autowired
   private RedisUserLoginUtils redisUserLoginUtils;
    @Autowired
    private ShopSalesmanApplyService shopSalesmanApplyService;
    @Autowired
    BusParameterSettingsDao busParameterSettingsDao;
    @Autowired
    private UserCacheManager userCacheManager;
    @Autowired
    ShopSalesmanApplyDao salesmanApplyDao;
   @Autowired
   WeChatApiTools weChatApiTools;
    @Autowired
    WeChatApiTools weChatApiTools;
    @Autowired
    private ScoreVipDetailDao scoreVipDetailDao;
    @Autowired
    private MoneyCardUseDao moneyCardUseDao;
   @Autowired
   private WeixinServiceUtil weixinServiceUtil;
    @Autowired
    ShopCouponRecordDao shopCouponRecordDao;
   @Value("${debug}")
   private String isDebug;
    @Autowired
    ActivitySignReceiveRecordDao activitySignReceiveRecordDao;
    @Value("${debug}")
    private String isDebug;
   /**
    * 小程序登录
    *
    * @author JIANGYOUYAO
    * @email 935090232@qq.com
    * @date 2018年5月23日
    * @param code
    * @return
    * @throws Exception
    */
   @RequestMapping(value = "/login/{keys}")
   public @ResponseBody
    /**
     * 小程序登录
     *
     * @param code
     * @return
     * @throws Exception
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2018年5月23日
     */
    @RequestMapping(value = "/login/{keys}")
    public @ResponseBody
    AjaxResult wxLogin(@PathVariable("keys") String code) throws Exception {
      AjaxResult res = new AjaxResult();
      LogUtil.info("code:{}" + code);
      if (StringUtils.isNotBlank(code)) {
         String requrl = weChatApiTools.getXcxLoginUrl(code, HostInterceptor.getCompanyId());
         String reslutData = HttpCurlUtil.sendGetHttp(requrl, null);
         JSONObject json = JSONObject.fromObject(reslutData);
         LogUtil.debug("微信登录获取到登录信息={}", json);
        AjaxResult res = new AjaxResult();
        LogUtil.info("code:{}" + code);
        if (StringUtils.isNotBlank(code)) {
            String requrl = weChatApiTools.getXcxLoginUrl(code, HostInterceptor.getCompanyId());
            String reslutData = HttpCurlUtil.sendGetHttp(requrl, null);
            JSONObject json = JSONObject.fromObject(reslutData);
            LogUtil.debug("微信登录获取到登录信息={}", json);
         if(json.containsKey("errcode")){
            res.setStatus(AjaxResult.STATUS_FAIL);
            res.setInfo("自动登录失败");
            LogUtil.debug("微信登录获取到异常信息errcode");
            return res;
         }
            if (json.containsKey("errcode")) {
                res.setStatus(AjaxResult.STATUS_FAIL);
                res.setInfo("自动登录失败");
                LogUtil.debug("微信登录获取到异常信息errcode");
                return res;
            }
         String openId = json.getString("openid");
         String sessionKey = json.getString("session_key");
         LogUtil.debug("openId={},sessionKey={}", openId, sessionKey);
         // 查询用户是否存在
         BizUser bizUser = null;
         synchronized(this){
            bizUser = bizUserService.findByOpenId(openId);
            if (bizUser == null) {
               // 新增用户
               bizUser = new BizUser();
               bizUser.setSessionKey(sessionKey);
               bizUser.setIsSales(BizUser.NOT_SALES);
               bizUser.setOpenId(openId);
               bizUser.setLastLoginTime(new Date());
               bizUser.setUserType(AppConstance.USER_TYPE_CUSTOMER);
               bizUser.setCompanyId(HostInterceptor.getCompanyId());
               bizUserService.add(bizUser);
            String openId = json.getString("openid");
            String sessionKey = json.getString("session_key");
            LogUtil.debug("openId={},sessionKey={}", openId, sessionKey);
            // 查询用户是否存在
            SysVipInfo sysVipInfo = null;
            synchronized (this) {
                sysVipInfo = sysVipInfoService.findByOpenId(openId);
                if (sysVipInfo == null) {
                    // 新增用户
                    sysVipInfo = new SysVipInfo();
                    sysVipInfo.setIsSales(SysVipInfo.NOT_SALES);
                    sysVipInfo.setOpenId(openId);
                    sysVipInfo.setSessionKey(sessionKey);
                    sysVipInfo.setCompanyId(HostInterceptor.getCompanyId());
                    sysVipInfo.setArrivalWay("微商城");
                    sysVipInfo.setVipName("微信用户");
                    sysVipInfo.setVipState(Dictionary.VIP_STATE_HY);
                    sysVipInfo.setVipType(Dictionary.VIP_TYPE_NOCARD);
                    sysVipInfo.setIsDeal(SysVipInfo.UNDEAL_VIP);
                    sysVipInfo.setVipNo(openId);
                    sysVipInfoService.add(sysVipInfo);
            } else {
               bizUser.setSessionKey(sessionKey);
               bizUser.setLastLoginTime(new Date());
               // 更新用户sessionKey
               bizUserService.modifyByModel(bizUser);
            }
         }
         // 存放redis
         String token = redisUserLoginUtils.saveUserInfo(bizUser);
         LogUtil.info("用户token={}", token);
         res.putInMap("token", token);
         res.putInMap("userInfo", bizUser);
         res.setStatus(AjaxResult.STATUS_SUCCESS);
      } else {
         res.setStatus(AjaxResult.STATUS_FAIL);
         res.setInfo("自动登录失败");
      }
      return res;
   }
                } else {
                    sysVipInfo.setSessionKey(sessionKey);
                    sysVipInfoDao.update(sysVipInfo);
                }
            }
            // 存放redis
            sysVipInfo.setLevelCard(null);
            String token = userCacheManager.saveUserInfo(sysVipInfo);
            LogUtil.info("用户token={}", token);
            res.putInMap("token", token);
            res.putInMap("userInfo", sysVipInfo);
            res.setStatus(AjaxResult.STATUS_SUCCESS);
        } else {
            res.setStatus(AjaxResult.STATUS_FAIL);
            res.setInfo("自动登录失败");
        }
        return res;
    }
   /**
    * 查询用户信息
    */
   @RequestMapping(value = "/findUserInfo")
   public @ResponseBody
    @Autowired
    ShopSalesmanGradeDao shopSalesmanGradeDao;
    /**
     * 查询用户信息
     */
    @RequestMapping(value = "/findUserInfo")
    public @ResponseBody
    AjaxResult findUserInfo() {
      BizUser loginUser = redisUserLoginUtils.getLoginUser(BizUser.class);
      String openId = loginUser.getOpenId();
      BizUser bizUser = bizUserService.findByOpenId(openId);
      AjaxResult res = new AjaxResult();
      res.putInMap("userInfo", bizUser);
      res.setStatus(AjaxResult.STATUS_SUCCESS);
      return res;
   }
        AjaxResult res = new AjaxResult();
        SysVipInfo loginUser = userCacheManager.getLoginUser();
        SysVipInfo sysVipInfo = sysVipInfoService.findById(loginUser.getId());
        if (sysVipInfo != null) {
            if (SysVipInfo.VALID_FLAG_Y == sysVipInfo.getValidFlag()) {
                sysVipInfo.setBalance(moneyCardUseDao.selectVipCardTotalMoney(loginUser.getId()));
                sysVipInfo.setPointAll(scoreVipDetailDao.selectUserTotalScore(loginUser.getId()));
            } else {
                sysVipInfo.setBalance(0D);
                sysVipInfo.setPointAll(0);
            }
            res.putInMap("couponCount", shopCouponRecordDao.countUnuseCouponRecord(loginUser.getId()));
            res.putInMap("prizeCount", activitySignReceiveRecordDao.getSignAwardReceiveCount(loginUser.getId(), loginUser.getCompanyId()));
            res.putInMap("userInfo", sysVipInfo);
            //查询会员等级
            if (sysVipInfo.getSalesmanGrade() != null) {
                ShopSalesmanGrade shopSalesmanGrade = shopSalesmanGradeDao.selectById(sysVipInfo.getSalesmanGrade());
                res.putInMap("vipLevel", shopSalesmanGrade.getName());
            } else if (sysVipInfo.getVipLevel() != null) {
                res.putInMap("vipLevel", sysVipInfo.getVipLevel().getLevelName());
            } else {
                res.putInMap("vipLevel", "初级会员");
            }
        }
        res.setStatus(AjaxResult.STATUS_SUCCESS);
        return res;
    }
    /**
     * 根据OpenID查询用户信息
     */
    @GetMapping(value = "/findUserInfo/{openId}")
    public @ResponseBody
    AjaxResult findUserInfo(@PathVariable String openId) {
        SysVipInfo sysVipInfo = sysVipInfoService.findByOpenId(openId);
        SysVipInfo bizUserQuery = new SysVipInfo();
        bizUserQuery.setNickName(sysVipInfo.getNickName());
        bizUserQuery.setAvatarUrl(sysVipInfo.getAvatarUrl());
        bizUserQuery.setOpenId(openId);
        return AjaxResult.buildSuccessInstance(bizUserQuery);
    }
   /**
    * 接收用户信息
    */
   @RequestMapping(value = "/saveUserInfo")
   public @ResponseBody
    AjaxResult saveUserInfo(@RequestBody BizUser bizUser) {
    /**
     * 接收用户信息
     */
    @PostMapping(value = "/saveUserInfo")
    public @ResponseBody
    AjaxResult saveUserInfo(@RequestBody XcxUserSaveUserInfoDto xcxUserSaveUserInfoDto) {
      BizUser loginUser = redisUserLoginUtils.getLoginUser(BizUser.class);
      bizUser.setUserId(loginUser.getUserId());
      // TODO 赋值操作
      int i = bizUserService.saveUserInfo(bizUser);
        SysVipInfo loginUser = userCacheManager.getLoginUser();
        SysVipInfo sysVipInfo = new SysVipInfo();
        sysVipInfo.setId(loginUser.getId());
      if (i == 0) {
         return new AjaxResult(AjaxResult.STATUS_FAIL, "更新失败");
      }
      return new AjaxResult(AjaxResult.STATUS_SUCCESS, Collections.singletonList(bizUser));
   }
        BeanUtil.copyProperties(xcxUserSaveUserInfoDto, sysVipInfo);
        sysVipInfo.setPhone(xcxUserSaveUserInfoDto.getPhoneNumber());
        if (StringUtils.isBlank(loginUser.getVipName()) || loginUser.getVipName().equals("微信用户")) {
            sysVipInfo.setVipName(xcxUserSaveUserInfoDto.getNickName());
        }
        if (StringUtils.isBlank(loginUser.getSex())) {
            sysVipInfo.setSex(xcxUserSaveUserInfoDto.getGender() == 1 ? "男" : "女");
        }
        int i = sysVipInfoDao.update(sysVipInfo);
        checkNeedToBeSalesman(sysVipInfo, loginUser);
        if (i == 0) {
            return new AjaxResult(AjaxResult.STATUS_FAIL, "更新失败");
        }
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, Collections.singletonList(sysVipInfo));
    }
    void checkNeedToBeSalesman(SysVipInfo sysVipInfo, SysVipInfo loginUser) {
        //查询是否需要自动成为分销员
        if ((loginUser.getIsSales() == null || loginUser.getIsSales() == 2)
                && StringUtils.isNotBlank(sysVipInfo.getNickName())) {//目前还不是分销员
            BusParameterSettings fxSwith = busParameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_SWITCH, HostInterceptor.getCompanyId());
            if (fxSwith!=null && "1".equals(fxSwith.getParamValue())) {//开启分销
                BusParameterSettings applyWay = busParameterSettingsDao.selectCompanyParamByCode(FenxiaoSettingConstant.FX_APPLY_WAY, loginUser.getCompanyId());
                if (applyWay.getParamValue().equals(FenxiaoSettingConstant.FX_APPLY_WAY_AUTO)) {//自动成为分销员
                    QueryWrapper<ShopSalesmanApply> queryWrapper = new QueryWrapper<>();
                    queryWrapper.eq("user_id", loginUser.getId());
                    queryWrapper.eq("apply_status", ShopSalesmanApply.APPLY_STATUS_DSH);
                    ShopSalesmanApply shopSalesmanApply = salesmanApplyDao.selectOne(queryWrapper);
                    if (shopSalesmanApply == null) {//没有待审核记录
                        shopSalesmanApplyService.applyToBeAnSalesman(loginUser.getId(), null, null, 2);
                    }
                }
            }
        }
    }
}