diff --git a/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java b/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java index b45b79aa..2276308b 100644 --- a/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java +++ b/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 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 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 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 objectMap = genTokenInfo(request, wxUser); return R.ok(objectMap); } @@ -108,27 +113,33 @@ public class WxSvcLoginApi { @SysLog(title = "公众号登录",biz = BizType.LOGIN,inter = InterType.API) @PostMapping("/mp") public R login(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){ - Map 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 objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap); + } + + @NotNull + private Map genTokenInfo(HttpServletRequest request, WxUser wxUser) { + Map objectMap = new HashMap<>(); String token = IdUtil.fastSimpleUUID(); - LoginUser loginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"", + 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()); + redisService.set(wxUserKey, wxUser.getId()); //后台管理员信息 Map tokenMap = new HashMap<>(10); String client = "wx_app"; - String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId()); + 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); @@ -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; } /** diff --git a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java index 43325fab..033c16fd 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java +++ b/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 list = omsOrderService.list(orderWrapper); this.buildOrderVoInfo(list); return R.byPageHelperList(list); diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java index 99668c6c..e40180f8 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java @@ -1117,7 +1117,7 @@ public class OmsOrderServiceImpl extends ServiceImpl i R r = seeYonRequestBaseService.postBase(ERP_ORDER_CANCEL + "/" + orderSn , null - , "获取订单状态" + , "取消订单状态" ); if (r.getStatus() == 200) { if (CollectionUtil.isNotEmpty(updItemBatch)) { diff --git a/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java b/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java index 5500b0fb..4d043339 100644 --- a/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java +++ b/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{ + + + + } } diff --git a/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java b/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java index 2e54055d..5d222dad 100644 --- a/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java +++ b/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; diff --git a/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java b/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java index 8336e165..1ed40c84 100644 --- a/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java +++ b/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 { * @return * @throws Exception */ - WxUser login(WxLoginUser wxLoginUser) throws Exception; + WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request) throws Exception; /** * openId查询 diff --git a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java b/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java index 613bdd7d..6bfd58f0 100644 --- a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java +++ b/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 impleme @Autowired(required = false) private WxAppService wxAppService; + @Autowired(required = false) + private WxCpConfig wxCpConfig; + @Autowired private RedisService redisService; + private SysUserMapper sysUserMapper; + private List getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){ WxMpUserList wxMpUserList = null; List openIds = new ArrayList<>(); @@ -147,13 +160,60 @@ public class WxUserServiceImpl extends ServiceImpl 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 sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper() + .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);