Browse Source

feat: 拓展企业微信登录;fix:订单取消拦截调整

muti_db
Yen 11 months ago
parent
commit
9005262482
  1. 77
      src/main/java/com/qs/serve/controller/WxSvcLoginApi.java
  2. 21
      src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java
  3. 2
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java
  4. 24
      src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java
  5. 3
      src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java
  6. 3
      src/main/java/com/qs/serve/modules/wx/service/WxUserService.java
  7. 64
      src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java

77
src/main/java/com/qs/serve/controller/WxSvcLoginApi.java

@ -14,18 +14,23 @@ import com.qs.serve.common.util.*;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.mapper.SysTenantMapper;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.wx.common.conf.WxCpConfig;
import com.qs.serve.modules.wx.entity.WxUser;
import com.qs.serve.modules.wx.entity.dto.WxLoginUser;
import com.qs.serve.modules.wx.service.WxUserService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpOAuth2Service;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.WxCpUserService;
import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
import me.chanjar.weixin.cp.bean.WxCpUser;
import org.jetbrains.annotations.NotNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
@ -55,6 +60,27 @@ public class WxSvcLoginApi {
private SysUserService sysUserService;
/**
* 企业微信登录
* @param wxLoginUser
* @param request
* @return
*/
@SysLog(title = "企业微信登录",biz = BizType.LOGIN,inter = InterType.API)
@PostMapping("/cp")
public R<?> loginCompanyApp(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){
WxUser wxUser = null;
try {
wxUser = wxUserService.login(wxLoginUser,request);
} catch (Exception e) {
log.warn(e.getMessage());
}
if(wxUser==null){
Assert.throwEx(HttpCode.WX_ERR);
}
Map<String, Object> objectMap = genTokenInfo(request, wxUser);
return R.ok(objectMap);
}
/**
* 小程序登陆(暂测试)
@ -65,37 +91,16 @@ public class WxSvcLoginApi {
@SysLog(title = "小程序登录",biz = BizType.LOGIN,inter = InterType.API)
@PostMapping("/ma")
public R<?> loginMicroApp(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){
Map<String,Object> objectMap = new HashMap<>();
WxUser wxUser = null;
try {
// wxUser = wxUserService.login(wxLoginUser);
wxUser = wxUserService.login(wxLoginUser,request);
} catch (Exception e) {
log.warn(e.getMessage());
}
if(wxUser==null){
Assert.throwEx(HttpCode.WX_ERR);
}
String token = IdUtil.fastSimpleUUID();
LoginUser loginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
objectMap.put("token",token);
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,wxUser.getId());
//后台管理员信息
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId());
String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", wxUser.getSysUserId());
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
Map<String, Object> objectMap = genTokenInfo(request, wxUser);
return R.ok(objectMap);
}
@ -108,16 +113,22 @@ public class WxSvcLoginApi {
@SysLog(title = "公众号登录",biz = BizType.LOGIN,inter = InterType.API)
@PostMapping("/mp")
public R<?> login(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){
Map<String,Object> objectMap = new HashMap<>();
WxUser wxUser = null;
try {
wxUser = wxUserService.login(wxLoginUser);
wxUser = wxUserService.login(wxLoginUser,request);
} catch (Exception e) {
log.warn(e.getMessage());
}
if(wxUser==null){
Assert.throwEx(HttpCode.WX_ERR);
}
Map<String, Object> objectMap = genTokenInfo(request, wxUser);
return R.ok(objectMap);
}
@NotNull
private Map<String, Object> genTokenInfo(HttpServletRequest request, WxUser wxUser) {
Map<String,Object> objectMap = new HashMap<>();
String token = IdUtil.fastSimpleUUID();
LoginUser loginUser = new LoginUser(wxUser.getId(), wxUser.getEmpName(),"",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
@ -139,13 +150,7 @@ public class WxSvcLoginApi {
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
//设置
// SysUser sysUser = sysUserService.getById(wxUser.getSysUserId());
// UserDetails userDetails = userDetailsService.buildLoginUser(sysUser);
// UsernamePasswordAuthenticationToken authentication =
// new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
// SecurityContextHolder.getContext().setAuthentication(authentication);
return R.ok(objectMap);
return objectMap;
}
/**

21
src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java

@ -6,10 +6,7 @@ import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.CollectionUtil;
import com.qs.serve.common.util.JsonUtil;
import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.bms.entity.BmsSupplier;
import com.qs.serve.modules.bms.entity.BmsSupplierAddress;
import com.qs.serve.modules.bms.mapper.BmsSupplierMapper;
@ -168,6 +165,15 @@ public class OmsOrderApi {
@PostMapping("/cancelOrder")
public R<?> cancelOrder(@RequestBody @Valid OmsCancelOrder omsOrderBo){
OmsOrder omsOrder = omsOrderService.getById(omsOrderBo.getOrderId());
if(omsOrder.getOrderType().equals(3)){
//临期品
if(omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){
//请求OA中止流程
Assert.throwEx("审批完成后再试");
}else if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Finished.getCode())){
Assert.throwEx("审批状态不支持取消操作");
}
}
omsOrderService.checkMsOrderStatus(omsOrder);
if(omsOrder.getStatus().equals(0)||omsOrder.getStatus().equals(1)){
//去执行取消
@ -208,6 +214,13 @@ public class OmsOrderApi {
orderWrapper.eq(OmsOrder::getUserId,AuthContextUtils.getSysUserId());
orderWrapper.eq(OmsOrder::getOrderType,param.getOrderType()==null?0:param.getOrderType());
orderWrapper.orderByDesc(OmsOrder::getId);
if(param.getCheckStartTime()!=null){
orderWrapper.ge(OmsOrder::getCheckTime,param.getCheckStartTime().atStartOfDay());
}
if(param.getCheckEndTime()!=null){
orderWrapper.le(OmsOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59));
}
List<OmsOrder> list = omsOrderService.list(orderWrapper);
this.buildOrderVoInfo(list);
return R.byPageHelperList(list);

2
src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java

@ -1117,7 +1117,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
R<?> r = seeYonRequestBaseService.postBase(ERP_ORDER_CANCEL + "/" + orderSn
, null
, "取订单状态"
, "取订单状态"
);
if (r.getStatus() == 200) {
if (CollectionUtil.isNotEmpty(updItemBatch)) {

24
src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java

@ -2,8 +2,13 @@ package com.qs.serve.modules.wx.common.conf;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.cp.api.WxCpOAuth2Service;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.WxCpUserService;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import org.springframework.context.annotation.Configuration;
/**
@ -12,13 +17,13 @@ import org.springframework.context.annotation.Configuration;
* @since 2024/8/12
*/
@Slf4j
//@AllArgsConstructor
//@Configuration(proxyBeanMethods = false)
@AllArgsConstructor
@Configuration(proxyBeanMethods = false)
public class WxCpConfig {
private static WxCpConfig wxCpConfig;
private static WxCpService wxCpService;
private static Integer agentId = 10000;
private static String secret = "应用密钥";
private static String corpId = "企业微信id";
public WxCpService wxCpService(){
if(wxCpService!=null){
@ -26,10 +31,19 @@ public class WxCpConfig {
}
//
WxCpService service = new WxCpServiceImpl();
WxCpDefaultConfigImpl config =new WxCpDefaultConfigImpl();
config.setAgentId(agentId);
config.setCorpSecret(secret);
config.setCorpId(corpId);
// 挂载到静态类
WxCpConfig.wxCpService = service;
return service;
}
public void testLogin(String code)throws Exception{
}
}

3
src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java

@ -17,9 +17,10 @@ public class WxStatusConst {
public static final int WxUser_Subscribe_0 = 0;
public static final int WxUser_Subscribe_2 = 2;
/** 应用类型【1->小程序;2->公众号】 */
/** 应用类型【1->小程序;2->公众号 ;企业微信】 */
public static final int WxApp_AppType_1 = 1;
public static final int WxApp_AppType_2 = 2;
public static final int WxApp_AppType_3 = 3;
/** 是否第三方平台应用【1->是;0->否】 */
public static final int WxApp_IsComponent_1 = 1;

3
src/main/java/com/qs/serve/modules/wx/service/WxUserService.java

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.wx.entity.WxUser;
import com.qs.serve.modules.wx.entity.dto.WxLoginUser;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
@ -34,7 +35,7 @@ public interface WxUserService extends IService<WxUser> {
* @return
* @throws Exception
*/
WxUser login(WxLoginUser wxLoginUser) throws Exception;
WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request) throws Exception;
/**
* openId查询

64
src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java

@ -12,6 +12,7 @@ import com.qs.serve.common.model.enums.HttpCode;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.mapper.SysUserMapper;
import com.qs.serve.modules.wx.common.conf.WxCpConfig;
import com.qs.serve.modules.wx.common.conf.WxMpConfig;
import com.qs.serve.modules.wx.common.consts.WxStatusConst;
import com.qs.serve.modules.wx.entity.WxApp;
@ -26,13 +27,20 @@ import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.service.WxOAuth2Service;
import me.chanjar.weixin.cp.api.WxCpOAuth2Service;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.WxCpUserService;
import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpUserService;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@ -51,9 +59,14 @@ public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> impleme
@Autowired(required = false)
private WxAppService wxAppService;
@Autowired(required = false)
private WxCpConfig wxCpConfig;
@Autowired
private RedisService redisService;
private SysUserMapper sysUserMapper;
private List<String> getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){
WxMpUserList wxMpUserList = null;
List<String> openIds = new ArrayList<>();
@ -147,13 +160,60 @@ public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> impleme
return this.list(lqw);
}
@Override
public WxUser login(WxLoginUser wxLoginUser){
public WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request){
String code = wxLoginUser.getCode();
String appId = AuthContextUtils.getAppId();
WxApp wxApp = wxAppService.getById(appId);
WxUser wxUser = null;
if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_1)){
if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_3)){
//企业微信登录
WxCpService wxCpService = wxCpConfig.wxCpService();
WxCpOAuth2Service oauth2Service = wxCpService.getOauth2Service();
WxCpOauth2UserInfo cpOauth2UserInfo = null;
try {
cpOauth2UserInfo = oauth2Service.getUserInfo(code);
log.debug("UserTicket:{}",cpOauth2UserInfo.getUserTicket());
WxCpUserService wxCpUserService = wxCpService.getUserService();
WxCpUser wxCpUser = wxCpUserService.getById(cpOauth2UserInfo.getUserId());
String openId = wxCpUser.getOpenUserId();
wxUser = this.getByOpenId(openId);
if(wxUser == null){
wxUser = new WxUser();
wxUser.setAppId(wxApp.getId());
wxUser.setAppType(wxApp.getAppType());
wxUser.setNickName(wxCpUser.getName());
wxUser.setEmpName(wxCpUser.getName());
wxUser.setUnionId(wxCpUser.getUserId());
wxUser.setHeadimgUrl(wxCpUser.getAvatar());
wxUser.setOpenId(wxCpUser.getOpenUserId());
}
//通过手机号绑定员工号
if(StringUtils.hasText(wxCpUser.getMobile())){
List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getMobile,wxCpUser.getMobile()));
if(sysUsers.size()>0){
if(sysUsers.size()>1){
log.error("一个号码被多人使用:{}",wxCpUser.getMobile());
}
SysUser sysUser = sysUsers.get(0);
wxUser.setSysUserId(sysUser.getId());
wxUser.setSysUserCode(sysUser.getCode());
wxUser.setEmpName(sysUser.getName());
wxUser.setPhone(sysUser.getMobile());
}
}
if(wxUser.getId()==null){
save(wxUser);
}else {
updateById(wxUser);
}
} catch (WxErrorException e) {
log.error("企业微信登录失败:{}",e.getMessage());
}
}else if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_1)){
Assert.throwEx(HttpCode.DEV_ERR);
}else if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_2)){
WxMpService wxMpService = wxMpConfig.wxMpService().switchoverTo(appId);

Loading…
Cancel
Save