/**
* Copyright © 2015-2020 JeePlus All rights reserved.
*/
package com.jeeplus.modules.iim.web;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeeplus.common.json.AjaxJson;
import com.jeeplus.common.oss.OSSClientUtil;
import com.jeeplus.common.utils.*;
import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
import com.jeeplus.modules.sysuseroffice.service.UserofficeService;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.jeeplus.common.config.Global;
import com.jeeplus.common.web.BaseController;
import com.jeeplus.modules.iim.entity.Friend;
import com.jeeplus.modules.iim.entity.FriendGroup;
import com.jeeplus.modules.iim.entity.LayFileJsonData;
import com.jeeplus.modules.iim.entity.LayGroup;
import com.jeeplus.modules.iim.entity.LayGroupJsonData;
import com.jeeplus.modules.iim.entity.LayGroupUser;
import com.jeeplus.modules.iim.entity.LayJson;
import com.jeeplus.modules.iim.entity.LayJsonData;
import com.jeeplus.modules.iim.entity.Mine;
import com.jeeplus.modules.iim.service.LayGroupService;
import com.jeeplus.modules.sys.dao.UserDao;
import com.jeeplus.modules.sys.entity.Office;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.service.OfficeService;
import com.jeeplus.modules.sys.service.SystemService;
import com.jeeplus.modules.sys.utils.UserUtils;
/**
* 联系人Controller
*
* @author jeeplus(seven修改)
* @version 2016-6-23
*/
@Controller
@RequestMapping(value = "${adminPath}/iim/contact")
public class ContactController extends BaseController {
@Autowired
private SystemService systemService;
@Autowired
private LayGroupService layGroupService;
@Autowired
private UserofficeService userofficeService;
@Autowired
private UserDao userDao;
@Autowired
private OfficeService officeService;
private ExecutorService poolExecutor = Executors.newFixedThreadPool(10);
/**
* 打开通讯录
*
* @param user
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = { "index", "" })
public String index(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
List list = systemService.findUser(user);
model.addAttribute("list", list);
return "modules/iim/contacts";
}
/**
* 查找
*
* @param u
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "searchUsers")
public String searchUsers(User u, HttpServletRequest request, HttpServletResponse response, Model model) {
User user = UserUtils.getUser();
if(! user.isAdmin()) {
if (StringUtils.isNotBlank(u.getMobile()) || StringUtils.isNotBlank(u.getName())) {
List users = userDao.findFriendByMobileOrName(u);
model.addAttribute("list", users);
}else if(StringUtils.isNotBlank(u.getComId()) && u.getComId().equals("comId")) {
Useroffice useroffice = new Useroffice();
List companyList = UserUtils.getAllCompany(user);
List companyIds = new ArrayList();
for (Office office : companyList) {
companyIds.add(office.getId());
}
useroffice.setCompanyIds(companyIds);
useroffice.setDelFlag("0");
List list = new ArrayList();
if(StringUtils.isEmpty(u.getName())&&StringUtils.isEmpty(u.getMobile())){
list = userofficeService.searchUsers(useroffice);
}
if(StringUtils.isNotEmpty(u.getName())&&StringUtils.isEmpty(u.getMobile())){
useroffice.setName(u.getName());
list = userofficeService.searchUsers(useroffice);
}
if (StringUtils.isEmpty(u.getName())&&StringUtils.isNotEmpty(u.getMobile())) {
useroffice.setMobile(u.getMobile());
list = userofficeService.searchUsers(useroffice);
}
if (StringUtils.isNotEmpty(u.getName())&&StringUtils.isNotEmpty(u.getMobile())) {
useroffice.setName(u.getName());
useroffice.setMobile(u.getMobile());
list = userofficeService.searchUsers(useroffice);
}
List friends = new ArrayList();
for (int i = 0; i < list.size(); i++) {
User u1 = UserUtils.get(list.get(i).getUserId());
if(u1!=null&&u1.getCompany().getName().equals(user.getCompany().getName())&&!u1.getLoginName().equals(user.getLoginName())){
friends.add(u1);
}
}
// 我的好友--->常用联系人
User currentUser = UserUtils.getUser();
friends.addAll(userDao.findFriends(currentUser));
List users = new ArrayList<>();
if (StringUtils.isNotBlank(u.getMobile())) {
if (StringUtils.isNotBlank(u.getName())){
for (User user1:friends){
if (user1.getMobile().equals(u.getMobile())){
if(user1.getName().contains(u.getName())) {
users.add(user1);
}
break;
}
}
}else {
for (User user1:friends){
if (user1.getMobile().equals(u.getMobile())){
users.add(user1);
break;
}
}
}
model.addAttribute("list", users);
}else if (StringUtils.isNotBlank(u.getName())){
for (User user1 : friends) {
if (user1.getName().contains(u.getName())) {
users.add(user1);
}
}
model.addAttribute("list", users);
}else {
users.addAll(friends);
model.addAttribute("list", users);
}
}else {
model.addAttribute("list", null);
}
}else{
List friends = userDao.searchUsers(u);
model.addAttribute("list", friends);
}
/*
User u = UserUtils.getUser();
if(! u.isAdmin()){
user.setCompany(UserUtils.getSelectCompany());
}
List friends = userDao.searchUsers(user);*/
return "modules/iim/search_user";
}
/**
* 添加好友--->常用联系人
*/
@RequestMapping(value = "addFriend")
public String addFriend(String ids, RedirectAttributes redirectAttributes) {
String idArray[] = ids.split(",");
User currentUser = UserUtils.getUser();
for (String id : idArray) {
if (userDao.findFriend(currentUser.getId(), id) == null) {
userDao.insertFriend(IdGen.uuid(), currentUser.getId(), id,"0","0");// 添加对方为好友
userDao.insertFriend(IdGen.uuid(), id,
currentUser.getId(),"0","1");//同时把自己添加为对方的好友
}
}
addMessage(redirectAttributes, "添加好友成功");
return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
}
/**
* 删除好友
*/
@RequestMapping(value = "delFriend")
public String delFriend(String id, RedirectAttributes redirectAttributes) {
User friend = UserUtils.get(id);
User currentUser = UserUtils.getUser();
if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) != null) {
userDao.deleteFriend(currentUser.getId(), friend.getId());// 删除好友
userDao.deleteFriend(friend.getId(),
currentUser.getId());//同时把自己从对方的好友列表删除
}
return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
}
/**
* 确认通过好友
*/
@RequestMapping(value = "friendAudit")
public String friendAudit(String id, RedirectAttributes redirectAttributes) {
User friend = UserUtils.get(id);
User currentUser = UserUtils.getUser();
if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) == null) {
userDao.friendAudit(currentUser.getId(), friend.getId());// 确认通过好友
userDao.friendAudit(friend.getId(),
currentUser.getId());//同时把自己从对方的好友列表确认通过好友
}
return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
}
/**
* 拒绝通过好友
*/
@RequestMapping(value = "friendAuditNo")
public String friendAuditNo(String id, RedirectAttributes redirectAttributes) {
User friend = UserUtils.get(id);
User currentUser = UserUtils.getUser();
if (friend != null && userDao.findFriend(currentUser.getId(), friend.getId()) == null) {
userDao.friendAuditNo(currentUser.getId(), friend.getId());// 确认通过好友
userDao.friendAuditNo(friend.getId(),
currentUser.getId());//同时把自己从对方的好友列表确认通过好友
}
return "redirect:" + Global.getAdminPath() + "/iim/contact/myFriends/?repage";
}
/**
* 打开我的好友列表--->常用联系人列表
*
* @param user
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "myFriends")
public String myFriends(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
User currentUser = UserUtils.getUser();
List friends = userDao.findFriends(currentUser);
model.addAttribute("list", friends);
List friendsAudit = userDao.findFriendsAudit(currentUser);
model.addAttribute("listAudit", friendsAudit);
return "modules/iim/myFriends";
}
/**
* 打开我的好友列表--->常用联系人列表
*
* @param user
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "myFriendsAudit")
public String myFriendsAudit(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
User currentUser = UserUtils.getUser();
List friends = userDao.findFriendsAudit(currentUser);
model.addAttribute("list", friends);
return "modules/iim/myFriends";
}
/**
* 打开聊天窗口
*
* @param user
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "layerIM")
public String layerIM(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
List list = systemService.findUser(user);
model.addAttribute("list", list);
return "modules/iim/layerIM";
}
/**
* layim初始化信息
*
* @param user
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(value = "friend")
@ResponseBody
public LayJson getFriend(User user, HttpServletRequest request, HttpServletResponse response, Model model) {
LayJsonData data = new LayJsonData();
data.getFriend().clear();
LayJson j = new LayJson();
j.setCode(0);
// 我的个人信息
Mine m = new Mine();
m.setId(UserUtils.getUser().getId());
m.setUsername(UserUtils.getUser().getName());
m.setStatus("online");
m.setRemark(UserUtils.getUser().getSign());
m.setAvatar(UserUtils.getUser().getPhoto());
data.setMine(m);
// 我的好友--->常用联系人
User currentUser = UserUtils.getUser();
List friends = userDao.findFriends(currentUser);
FriendGroup friendGroup = new FriendGroup();
friendGroup.setGroupname("我的好友");
friendGroup.setId(1);
friendGroup.setOnline(friends.size());
for (User u : friends) {
Friend friend = new Friend();
friend.setId(u.getId());
friend.setUsername(u.getName());
friend.setAvatar(u.getPhoto());
friend.setSign(u.getSign());
friendGroup.getList().add(friend);
}
data.getFriend().add(friendGroup);
// 按部门显示联系人
//List officeList = officeService.findList(false);
Office company = UserUtils.getSelectCompany();
if(!"1".equals(company.getId())){
List officeList = officeService.findByParentIdsCompany(UserUtils.getSelectCompany(), UserUtils.getSelectOffice());
int index = 1;
for (Office office : officeList) {
user.setOffice(office);
user.setCompany(UserUtils.getSelectCompany());
List users = userDao.findListByOffice(user);
FriendGroup fgroup = new FriendGroup();
fgroup.setGroupname(office.getName());
fgroup.setOnline(users.size());
fgroup.setId(++index);
for (User u : users) {
if(currentUser.getId().equals(u.getId())){
continue;
}
Friend friend = new Friend();
friend.setId(u.getId());
friend.setAvatar(u.getPhoto());
friend.setUsername(u.getName());
friend.setSign(u.getSign());
fgroup.getList().add(friend);
}
data.getFriend().add(fgroup);
}
}
// 不属于任何部门的联系人
/*user.setOffice(null);
List users = userDao.findListByOffice(user);
FriendGroup group = new FriendGroup();
group.setGroupname("未分组");
group.setOnline(users.size());
group.setId(++index);
for (User u : users) {
Friend friend = new Friend();
friend.setId(u.getLoginName());
friend.setUsername(u.getName());
friend.setAvatar(u.getPhoto());
friend.setSign(u.getSign());
group.getList().add(friend);
}
data.getFriend().add(group);*/
// 用户自己创建的群组和属于的群组
// 查找我属于的群组
List memberLayGroupList = layGroupService.findGroupList(UserUtils.getUser());
for (LayGroup g : memberLayGroupList) {
data.getGroup().add(g);
}
j.setData(data);
return j;
}
/**
* 群组成员接口
*
* @return
*/
@RequestMapping(value = "getMembers")
@ResponseBody
public LayJson getMembers(LayGroup group) {
LayGroupJsonData data = new LayGroupJsonData();
group = layGroupService.get(group.getId());
// 设置群主
data.getOwner().put("username", group.getCreateBy().getName());
data.getOwner().put("id", group.getCreateBy().getId());
data.getOwner().put("avatar", group.getCreateBy().getPhoto());
data.getOwner().put("sign", group.getCreateBy().getSign());
// 将群主添加到群聊第一个
List zlist = group.getLayGroupUserList();
for (LayGroupUser lgUser : zlist) {
Friend friend = new Friend();
friend.setUsername(lgUser.getUser().getName());
friend.setId(lgUser.getUser().getId());
friend.setAvatar(lgUser.getUser().getPhoto());
friend.setSign(lgUser.getUser().getSign());
data.getList().add(friend);
}
LayJson j = new LayJson();
j.setData(data);
return j;
}
@ResponseBody
@RequestMapping(value = { "uploadImage", "uploadFile" })
public String uploadImage(HttpServletRequest request, HttpServletResponse response, MultipartFile file)
throws IllegalStateException, IOException {
String filepath = "";
String content = null;
LayFileJsonData data = new LayFileJsonData();
String contentType = "";
// 判断文件是否为空
if (!file.isEmpty()) {
contentType = file.getContentType();
// 文件保存路径
String realPath ="messages/"+DateUtils.formatDate(new Date())+"/"+ UserUtils.getPrincipal() + "/";
OSSClientUtil ossUtil = new OSSClientUtil();
String newName = System.currentTimeMillis()+"-"+file.getOriginalFilename();
ossUtil.uploadFile2OSS(file.getInputStream(),realPath,newName);
filepath = Global.getAliDownloadUrl() + "/" + realPath + newName;
data.setName(file.getOriginalFilename());
data.setSrc(filepath);
}
ObjectMapper mapper = new ObjectMapper();
HashMap map = new HashMap();
map.put("code", "0");
map.put("data", data);
content = mapper.writeValueAsString(map);
return content;
}
@RequestMapping(value = "friendStatus")
@ResponseBody
public AjaxJson getFriendStatus(User user,boolean flag,String status, HttpServletRequest request, HttpServletResponse response, Model model) {
AjaxJson data = new AjaxJson();
StringBuilder stringBuilder = new StringBuilder();
// 我的好友--->常用联系人
User currentUser = UserUtils.getUser();
List friends = userDao.findFriends(currentUser);
List ids = null;
if(friends!=null&&friends.size()>0) {
ids = new ArrayList<>(friends.size());
for (User u : friends) {
if ("online".equals(SmackUtils.IsUserOnLine(u.getId()))) {
stringBuilder.append(u.getId()).append(",");
}
ids.add(u.getId());
}
}
// 按部门显示联系人
//List officeList = officeService.findList(false);
Office company = UserUtils.getSelectCompany();
if(!"1".equals(company.getId())){
List officeList = officeService.findByParentIdsCompany(UserUtils.getSelectCompany(), UserUtils.getSelectOffice());
for (Office office : officeList) {
user.setOffice(office);
user.setCompany(UserUtils.getSelectCompany());
List users = userDao.findListByOffice(user);
for (User u : users) {
if((ids!=null&&ids.contains(u.getId()))||currentUser.getId().equals(u.getId())){
continue;
}
// if("online".equals(SmackUtils.IsUserOnLine(u.getId()))){
// stringBuilder.append(u.getId()).append(",");
// }
}
}
}
final String users = stringBuilder.toString();
data.getBody().put("userStr", users);
if(flag){
if(StringUtils.isBlank(status)){
status = "online";
}
final JSONObject body = new JSONObject();
body.put("id",currentUser.getId());
body.put("status",status);
final String string = body.toJSONString();
if(StringUtils.isNotBlank(users)) {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
String[] split = users.split(",");
Set set = new HashSet<>(split.length * 2);
set.addAll(Arrays.asList(split));
for (String u : set) {
//SmackUtils.sendSmackMessage(u, string, "_online_all_status_");
}
}
});
}
}
return data;
}
}