diff --git a/src/main/java/com/kiisoo/ic/config/ShiroConfig.java b/src/main/java/com/kiisoo/ic/config/ShiroConfig.java index 68fec43..1478484 100644 --- a/src/main/java/com/kiisoo/ic/config/ShiroConfig.java +++ b/src/main/java/com/kiisoo/ic/config/ShiroConfig.java @@ -47,6 +47,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/realtime/**", "anon"); + filterChainDefinitionMap.put("/store/emp/import", "anon"); filterChainDefinitionMap.put("/view/**", "anon"); filterChainDefinitionMap.put("/templates/**", "anon"); filterChainDefinitionMap.put("/login", "anon"); diff --git a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java index c54ee12..2e08e67 100644 --- a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java +++ b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java @@ -3,6 +3,7 @@ package com.kiisoo.ic.store.controller; import com.kiisoo.ic.common.BaseController; import com.kiisoo.ic.store.service.StoreEmployeeService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -23,6 +24,7 @@ import java.util.Map; @Slf4j public class StoreEmployeeController extends BaseController { + @Autowired private StoreEmployeeService storeEmployeeService; /** diff --git a/src/main/java/com/kiisoo/ic/tag/constant/Constants.java b/src/main/java/com/kiisoo/ic/tag/constant/Constants.java new file mode 100644 index 0000000..95a80ac --- /dev/null +++ b/src/main/java/com/kiisoo/ic/tag/constant/Constants.java @@ -0,0 +1,11 @@ +package com.kiisoo.ic.tag.constant; + +/** + * @Description: 标签静态类 + * @Auther: yechenhao + * @Date: 2020/4/14 0002 21:14 + * @Version: v1 + */ +public class Constants { + +} diff --git a/src/main/java/com/kiisoo/ic/tag/controller/TagController.java b/src/main/java/com/kiisoo/ic/tag/controller/TagController.java new file mode 100644 index 0000000..284eb73 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/tag/controller/TagController.java @@ -0,0 +1,93 @@ +package com.kiisoo.ic.tag.controller; + +import com.kiisoo.ic.common.BaseController; +import com.kiisoo.ic.tag.entity.TagDO; +import com.kiisoo.ic.tag.service.TagService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @Description: 标签controller + * @Auther: yechenhao + * @Date: 2020/4/14 0002 21:14 + * @Version: v1 + */ +@Controller +@RequestMapping("/tag") +@Slf4j +public class TagController extends BaseController { + + @Autowired + private TagService tagService; + + /** + * 增加标签 + * @param tagDO 标签实体类 + * @return + * @throws Exception + */ + @RequestMapping(value = "add",method = RequestMethod.POST) + @ResponseBody + public Map addTag(@RequestBody TagDO tagDO){ + try { + Boolean hasAdd = tagService.addTag(tagDO); + return data(hasAdd); + }catch (Exception e){ + log.error("添加标签失败",e); + return fail(); + } + } + + /** + * 修改标签 + * @param tagDO 标签实体类 + * @return + * @throws Exception + */ + @RequestMapping(value = "update",method = RequestMethod.POST) + @ResponseBody + public Map updateTag(@RequestBody TagDO tagDO){ + try { + Boolean hasUpdate = tagService.updateTag(tagDO); + return data(hasUpdate); + }catch (Exception e){ + log.error("修改标签失败",e); + return fail(); + } + } + + /** + * 删除标签 + * @param tagId 标签实体id + * @return + * @throws Exception + */ + @RequestMapping(value = "delete",method = RequestMethod.POST) + @ResponseBody + public Map deleteTag(@RequestParam("tagId") Long tagId){ + try { + Boolean hasDel = tagService.deleteTag(tagId); + return data(hasDel); + }catch (Exception e){ + log.error("删除标签失败",e); + return fail(); + } + } + +// @RequestMapping(value = "sync",method = RequestMethod.GET) +// @ResponseBody +// public Map syncTag(){ +// try { +// Boolean hasSync = tagService.syncTag(); +// return data(hasSync); +// }catch (Exception e){ +// log.error("添加标签失败",e); +// return fail(); +// } +// } +} diff --git a/src/main/java/com/kiisoo/ic/tag/entity/TagDO.java b/src/main/java/com/kiisoo/ic/tag/entity/TagDO.java new file mode 100644 index 0000000..770048a --- /dev/null +++ b/src/main/java/com/kiisoo/ic/tag/entity/TagDO.java @@ -0,0 +1,26 @@ +package com.kiisoo.ic.tag.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.List; + +/** + * @Description: 标签对象 + * @Auther: yechenhao + * @Date: 2020/4/7 0002 10:06 + * @Version: v1 + */ +@Data +@TableName("privilage_tag") +public class TagDO { + /** + * 数据库实体id和企业微信标签id相同 + */ + private Long id; + /** + * 标签名 + */ + private String name; + +} diff --git a/src/main/java/com/kiisoo/ic/tag/mapper/TagDOMapper.java b/src/main/java/com/kiisoo/ic/tag/mapper/TagDOMapper.java new file mode 100644 index 0000000..2d4f959 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/tag/mapper/TagDOMapper.java @@ -0,0 +1,14 @@ +package com.kiisoo.ic.tag.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.kiisoo.ic.tag.entity.TagDO; +import org.springframework.stereotype.Repository; + +@Repository +public interface TagDOMapper extends BaseMapper { + /** + * 查询部门最大id + * @return + */ + Long selectMaxTagId(); +} diff --git a/src/main/java/com/kiisoo/ic/tag/service/TagService.java b/src/main/java/com/kiisoo/ic/tag/service/TagService.java new file mode 100644 index 0000000..d8cedc7 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/tag/service/TagService.java @@ -0,0 +1,83 @@ +package com.kiisoo.ic.tag.service; + +import com.kiisoo.ic.tag.entity.TagDO; +import com.kiisoo.ic.tag.mapper.TagDOMapper; +import com.kiisoo.ic.wx.service.QWMailListManageService; +import lombok.Synchronized; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description: 标签管理service + * @Auther: yechenhao + * @Date: 2020/4/7 0002 10:06 + * @Version: v1 + */ +@Service +public class TagService { + + @Autowired + private QWMailListManageService qwMailListManageService; + + @Autowired + private TagDOMapper tagDOMapper; + + /** + * 增加标签 + * @param tagDO 标签实体类 + * @return + * @throws Exception + */ + @Transactional(rollbackFor = Exception.class) + @Synchronized + public Boolean addTag(TagDO tagDO) throws Exception { + //数据库创建标签(需要返回标签id) + Long maxId = tagDOMapper.selectMaxTagId(); + tagDO.setId(maxId+1); + int insert = tagDOMapper.insert(tagDO); + if (insert == 0){ + throw new Exception("创建标签service失败"); + } + //成功则添加用户到企业微信 + qwMailListManageService.addTag(tagDO); + return true; + } + + /** + * 修改标签 + * @param tagDO 标签实体类 + * @return + * @throws Exception + */ + @Transactional(rollbackFor = Exception.class) + public Boolean updateTag(TagDO tagDO) throws Exception { + //数据库创建标签(需要返回标签id) + int update = tagDOMapper.updateById(tagDO); + if (update == 0){ + throw new Exception("修改标签service失败"); + } + //成功则添加用户到企业微信 + qwMailListManageService.updateTag(tagDO); + return true; + } + + /** + * 删除标签 + * @param tagId 标签实体id + * @return + * @throws Exception + */ + @Transactional(rollbackFor = Exception.class) + public Boolean deleteTag(Long tagId) throws Exception { + //数据库创建标签(需要返回标签id) + int delete = tagDOMapper.deleteById(tagId); + if (delete == 0){ + throw new Exception("删除标签service失败"); + } + //todo 删除标签后操作员工 + //成功则添加用户到企业微信 + qwMailListManageService.deleteTag(tagId); + return true; + } +} diff --git a/src/main/java/com/kiisoo/ic/wx/service/QWMailListManageService.java b/src/main/java/com/kiisoo/ic/wx/service/QWMailListManageService.java index 21e60f7..d8b6a73 100644 --- a/src/main/java/com/kiisoo/ic/wx/service/QWMailListManageService.java +++ b/src/main/java/com/kiisoo/ic/wx/service/QWMailListManageService.java @@ -1,18 +1,23 @@ package com.kiisoo.ic.wx.service; +import com.alibaba.fastjson.JSON; import com.kiisoo.ic.config.WxCpConfiguration; import com.kiisoo.ic.department.entity.DepartmentDO; import com.kiisoo.ic.employee.entity.EmployeeDO; +import com.kiisoo.ic.tag.entity.TagDO; +import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.cp.api.WxCpDepartmentService; -import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.api.WxCpUserService; +import me.chanjar.weixin.cp.api.*; import me.chanjar.weixin.cp.bean.WxCpDepart; +import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpUser; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.io.File; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.kiisoo.ic.department.constant.Constants.MAIN_DEPARTMENT_ID; @@ -98,6 +103,33 @@ public class QWMailListManageService { //todo 删除部门后操作员工 } + /** + * 增加企业微信标签 + */ + public void addTag(TagDO tagDO) throws WxErrorException { + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpTagService tagService = wxCpService.getTagService(); + tagService.create(tagDO.getName(),tagDO.getId().intValue()); + } + + /** + * 修改企业微信部门 + */ + public void updateTag(TagDO tagDO) throws WxErrorException { + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpTagService tagService = wxCpService.getTagService(); + tagService.update(tagDO.getId().toString(),tagDO.getName()); + } + + /** + * 修改企业微信部门 + */ + public void deleteTag(Long tagId) throws WxErrorException { + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpTagService tagService = wxCpService.getTagService(); + tagService.delete(tagId.toString()); + } + /** * 获取企业微信所有部门架构 */ @@ -106,4 +138,92 @@ public class QWMailListManageService { WxCpDepartmentService departmentService = wxCpService.getDepartmentService(); return departmentService.list(null); } + + public void sendWelcomeMsg(String welcomeCode, String content, File file) throws WxErrorException { + String mediaType = ""; + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpMediaService mediaService = wxCpService.getMediaService(); + WxMediaUploadResult upload = mediaService.upload(mediaType,file); + String url = wxCpService.getWxCpConfigStorage().getApiUrl("/cgi-bin/externalcontact/send_welcome_msg"); + String accessToken = wxCpService.getWxCpConfigStorage().getAccessToken(); + Map map = new HashMap<>(); + map.put("access_token", accessToken); + + + Map text = new HashMap<>(); + map.put("content", content); + + + Map image = new HashMap<>(); + map.put("media_id", upload.getMediaId()); + + Map link = new HashMap<>(); + map.put("title", ""); + map.put("picurl", ""); + map.put("desc", ""); + map.put("url", ""); + + Map miniprogram = new HashMap<>(); + map.put("title", ""); + map.put("pic_media_id", ""); + map.put("appid", ""); + map.put("page", ""); + + + map.put("text",text); + map.put("image",image); + map.put("link",link); + map.put("miniprogram",miniprogram); + + + String result = wxCpService.post(url, JSON.toJSONString(map)); + + //todo判断返回码 + } + + + public void sendExternalContactMsg(List cpUserIds, String sender,String content, File file) throws WxErrorException { + String mediaType = ""; + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpMediaService mediaService = wxCpService.getMediaService(); + WxMediaUploadResult upload = mediaService.upload(mediaType,file); + String url = wxCpService.getWxCpConfigStorage().getApiUrl("/cgi-bin/externalcontact/send_welcome_msg"); + String accessToken = wxCpService.getWxCpConfigStorage().getAccessToken(); + Map map = new HashMap<>(); + map.put("access_token", accessToken); + map.put("chat_type", "single"); + map.put("external_userid", cpUserIds); + map.put("sender", sender); + + + Map text = new HashMap<>(); + map.put("content", content); + + + Map image = new HashMap<>(); + map.put("media_id", upload.getMediaId()); + + Map link = new HashMap<>(); + map.put("title", ""); + map.put("picurl", ""); + map.put("desc", ""); + map.put("url", ""); + + Map miniprogram = new HashMap<>(); + map.put("title", ""); + map.put("pic_media_id", ""); + map.put("appid", ""); + map.put("page", ""); + + + map.put("text",text); + map.put("image",image); + map.put("link",link); + map.put("miniprogram",miniprogram); + + + String result = wxCpService.post(url, JSON.toJSONString(map)); + + //todo判断返回码 + } } diff --git a/src/main/java/com/kiisoo/ic/wx/service/WxResponseService.java b/src/main/java/com/kiisoo/ic/wx/service/WxResponseService.java index 8ead703..accf54e 100644 --- a/src/main/java/com/kiisoo/ic/wx/service/WxResponseService.java +++ b/src/main/java/com/kiisoo/ic/wx/service/WxResponseService.java @@ -16,6 +16,7 @@ import com.kiisoo.ic.wx.entity.FollowUserDTO; import com.kiisoo.ic.wx.entity.FollowUserTag; import com.sun.org.apache.regexp.internal.RE; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.xmlbeans.impl.xb.xsdschema.Public; @@ -50,6 +51,9 @@ public class WxResponseService { @Autowired private CustomerEnterpriseService customerEnterpriseService; + + @Autowired + private QWMailListManageService qwMailListManageService; /** * 获取微信权限验证(认证服务器时使用) * @@ -271,7 +275,7 @@ public class WxResponseService { * @return * @throws Exception */ - public String customerParse(String sVerifyMsgSig, String sVerifyTimeStamp, String sVerifyNonce, String data) throws AesException, ParserConfigurationException, IOException, SAXException { + public String customerParse(String sVerifyMsgSig, String sVerifyTimeStamp, String sVerifyNonce, String data) throws AesException, ParserConfigurationException, IOException, SAXException, WxErrorException { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeixinApi.CUSTOMER_TOKEN, WeixinApi.CUSTOMER_ENCODING_AES_KEY, WeixinApi.CORPID); String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, data); log.info(sMsg); @@ -310,6 +314,10 @@ public class WxResponseService { //根据解析的xml结果执行业务操作,并取得返回内容 String content = ""; + + NodeList welcomeCodeNode; + String welcomeCode; + switch (changeType) { case "edit_external_contact": @@ -340,6 +348,12 @@ public class WxResponseService { log.info(res); //添加客户并添加店铺企业微信信息 addExternalContact(res); + + welcomeCodeNode = root.getElementsByTagName("WelcomeCode"); + welcomeCode = welcomeCodeNode.item(0).getTextContent(); + + sendWelcomeMsg(welcomeCode); + break; case "add_half_external_contact": // NodeList stateNode2 = root.getElementsByTagName("State"); @@ -359,8 +373,8 @@ public class WxResponseService { log.info("del_follow_user 配置了客户联系功能的成员被外部联系人删除时,回调该事件"); break; default: - NodeList welcomeCodeNode = root.getElementsByTagName("WelcomeCode"); - String welcomeCode = welcomeCodeNode.item(0).getTextContent(); + welcomeCodeNode = root.getElementsByTagName("WelcomeCode"); + welcomeCode = welcomeCodeNode.item(0).getTextContent(); log.info("change_external_chat 客户群被修改后(群名变更,群成员增加或移除),回调该事件。收到该事件后,企业需要再调用获取客户群详情接口,以获取最新的群详情。"); break; } @@ -381,6 +395,10 @@ public class WxResponseService { } } + private void sendWelcomeMsg(String welcomeCode) throws WxErrorException { +// qwMailListManageService.sendWelcomeMsg(welcomeCode); + } + /** * 解析企业微信返回的客户信息 * @param