package com.espeed.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Pattern;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

import com.espeed.reading.util.ConfigPath;
import com.espeed.reading.util.ConstantUtil;
import com.espeed.reading.util.DBUtil;
import com.espeed.reading.util.DateFormat;
import com.espeed.reading.util.HttpUtil;
import com.espeed.reading.util.NetworkUtil;
import com.espeed.reading.util.TrackServiceUtil;
import com.espeed.reading.util.TrackUtil;
import com.espeed.reading.util.WebmailDBUtil;
import com.espeed.ua.UserAgent;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 
 * @项目名称: 邮件跟踪系统
 * @版权所有: 深圳市科飞时速网络技术有限公司(0755-88843776)
 * @技术支持: info@21gmail.com
 * @单元名称: 邮件跟踪系统action
 * @开始时间: 2018-6-1
 * @开发人员: 杨志钊
 */
public class TrackAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private Object responseData;

	private static final Pattern ipPattern = Pattern.compile("[\\d\\.]*");
	private static final String defaultToUrl = ConfigPath.getDefaultToUrl();

	private static final String allowIp = ConfigPath.getAllowIp();
	private static String cloudServiceUrl = ConfigPath.getCloudServiceUrl();
	private static final String controlCentreUrl = ConfigPath
			.getControlCentreUrl();

	// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
	private static ExecutorService fixedThreadPool = Executors
			.newFixedThreadPool(3);
	private static final Pattern emailPattern = Pattern.compile(ConfigPath
			.getEmailPattern());

	HttpServletRequest request = ServletActionContext.getRequest();
	HttpServletResponse response = ServletActionContext.getResponse();
	
	public void recordFromMail2() {
		fixedThreadPool.execute(new Runnable() {

			public void run() {
				try {
					System.out.println("in");
					TrackUtil.test(request, response);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	@SuppressWarnings("unchecked")
	private JSONObject initParam() {
		JSONObject param = new JSONObject();
		
		Map<String, String[]> map = request.getParameterMap();
		if (map != null && map.size() > 0) {
			for (Entry<String, String[]> entry : map.entrySet()) {
				if (entry.getValue() == null || entry.getValue().length == 0) {
					continue;
				}
				
				if (entry.getValue().length > 1) {
					param.put(entry.getKey(),
							StringUtils.join(entry.getValue(), ","));
				} else {
					param.put(entry.getKey(), entry.getValue()[0].trim());
				}
			}
		}
		Enumeration<String> enums = request.getAttributeNames();
		if (enums != null) {
			while (enums.hasMoreElements()) {
				String name = (String) enums.nextElement();
				param.put(name, request.getAttribute("name"));
			}
		}
		
		return param;
	}

	public void recordFromMail() {
		String ywxTo = request.getParameter("ywxTo");
		String ywxType = request.getParameter("ywxType");

		if (ywxTo == null || ywxTo.trim().isEmpty()
				|| ywxTo.trim().equalsIgnoreCase("null")) {
			ywxTo = defaultToUrl;
		} else {
			if (ywxType != null) {
				// 受访问资源类型,0营销邮邮件、1营销邮邮件HTML页面、2易外销用户站点、3和9(sale100.com独立)营销邮邮件里需要跟踪的超链、4营销邮邮件HTML页面里需要跟踪的超链、5易外销邮件、6易外销邮件里需要跟踪的超链、7询盘、8社交帖子
				if (ywxType == "8") {
					TrackUtil.recordFromHtmlInfo(request, response);
				} else {

					String uid = null;
					final List<String> emails = new ArrayList<String>();
							
					String toMail = null;
					if (StringUtils.isNotEmpty(request.getParameter("ywxMail"))) {
						// 点读地址
						try {
							toMail = (request.getParameter("ywxMail") != null && request
									.getParameter("ywxMail").startsWith("3D")) ? URLDecoder.decode(request
											.getParameter("ywxMail").replaceFirst("3D", ""), "UTF-8")
											: URLDecoder.decode(request.getParameter("ywxMail"), "UTF-8");
									
							
						} catch (UnsupportedEncodingException e2) {
							e2.printStackTrace();
						}

					}	
					

					Cookie[] cookies = request.getCookies();

					if (cookies != null && cookies.length > 0) {

						for (Cookie cookie : cookies) {
							if (ConstantUtil.USER_IDENTITY_COOKIE.equals(cookie
									.getName())) {
								uid = cookie.getValue();
							}
							if (cookie.getName().startsWith(
									ConstantUtil.EMAIL_IDENTITY_COOKIE)) {
								if (cookie.getValue() != null
										&& emailPattern.matcher(cookie.getValue())
												.matches()) {

									emails.add(cookie.getValue());
								}
							}
						}
					}
					
					// 设置cookie
					String serverDomain = request.getServerName();
					int len = 0;
					if (!ipPattern.matcher(serverDomain).matches()) {

						String[] domains = serverDomain.split("\\.");
						len = domains.length;
						if (len > 2) {
							serverDomain = domains[len - 2] + "."
									+ domains[len - 1];
						}
					}
					
					Cookie cookie = new Cookie(ConstantUtil.USER_IDENTITY_COOKIE,
							uid);
					cookie.setMaxAge(ConstantUtil.HALF_CENTURY);
					cookie.setDomain(serverDomain);

					response.addCookie(cookie);

					len = emails.size();

					for (int i = 0; i < len; i++) {
						cookie = new Cookie(ConstantUtil.EMAIL_IDENTITY_COOKIE
								+ "_" + i, emails.get(i));
						cookie.setMaxAge(ConstantUtil.HALF_CENTURY);
						cookie.setDomain(serverDomain);

						response.addCookie(cookie);
					}
					
					if (toMail != null && !emails.contains(toMail)) {
						emails.contains(toMail);
					}
					
					final JSONObject param = this.initParam();
					param.put("uid", uid);
					String jsessionId = request.getSession().getId();
					param.put("jsessionId", jsessionId);
					String ip = "unknown";
					try {
						ip = NetworkUtil.getIpAddress(request);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					param.put("ip", ip);
					String agentString = request.getHeader("User-Agent");
					String referer = request.getParameter("ywxReferrer");
					param.put("agentString", agentString);
					param.put("referer", referer);
					String language = request.getLocale().getLanguage();
					param.put("language", language);
					param.put("country", request.getLocale().getCountry());
					
					if (Arrays.asList("3", "6", "9").contains(ywxType)) {
						
						try {
							
							fixedThreadPool.execute(new Runnable() {
								
								public void run() {
									try {
										TrackUtil.recordFromOriginalMailInfo(param, emails);
									} catch (Exception e) {
										e.printStackTrace();
									}
								}
							});
							
						} catch (Exception e) {
							e.printStackTrace();
						}
					} else if (ywxType.equals("2") || ywxType.equals("4")) {
						
						fixedThreadPool.execute(new Runnable() {
							
							public void run() {
								try {
									TrackUtil.recordFromHtmlInfo2(param, emails);
								} catch (Exception e) {
									e.printStackTrace();
								}
							}
						});
						
					}
				}
			}
		}

		try {
			ywxTo = URLDecoder.decode(ywxTo, "UTF-8");
			if (ywxTo.contains("?")) {
				ywxTo = ywxTo + "&ywxMark=true";
			} else {
				ywxTo = ywxTo + "?ywxMark=true";
			}
			if (ywxTo.toLowerCase().startsWith("http://") 
					|| ywxTo.toLowerCase().startsWith("https://")) {
				
				response.sendRedirect(ywxTo);
			} else {
				request.setAttribute("ywxTo", ywxTo);
				request.getRequestDispatcher("dispatcher.jsp").forward(request, response);	
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public String recordFromHTML() {

		responseData = "SUCCESS";

		String ywxType = request.getParameter("ywxType");
		// 受访问资源类型,0营销邮邮件、1营销邮邮件HTML页面、2易外销用户站点、3营销邮邮件里需要跟踪的超链、4营销邮邮件HTML页面里需要跟踪的超链、5易外销邮件、6易外销邮件里需要跟踪的超链、7询盘
		if (ywxType != null && (Arrays.asList("1", "2", "7", "8").contains(ywxType))) {
			TrackUtil.recordFromHtmlInfo(request, response);
		}

		return SUCCESS;
	}

	public String getCustomers() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		String userIds = request.getParameter("userIds");
		Integer currentPage = request.getParameter("currentPage") == null ? null
				: Integer.valueOf(request.getParameter("currentPage"));
		Integer pageSize = request.getParameter("pageSize") == null ? null
				: Integer.valueOf(request.getParameter("pageSize"));
		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		String searchWord = request.getParameter("searchWord");
		responseData = TrackServiceUtil.getCustomers(userIds, currentPage,
				pageSize, sortType, searchWord);

		return SUCCESS;
	}

	public String getRecords() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		String userIds = request.getParameter("userIds");
		Integer currentPage = request.getParameter("currentPage") == null ? null
				: Integer.valueOf(request.getParameter("currentPage"));
		Integer pageSize = request.getParameter("pageSize") == null ? null
				: Integer.valueOf(request.getParameter("pageSize"));
		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		String value = request.getParameter("value");
		responseData = TrackServiceUtil.getRecords(userIds, currentPage,
				pageSize, value, sortType);

		return SUCCESS;
	}

	public String changeStatus() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		String ids = request.getParameter("ids");
		Integer status = request.getParameter("status") == null ? null
				: Integer.valueOf(request.getParameter("status"));

		responseData = TrackUtil.changeStatus(ids, status);

		return SUCCESS;
	}

	public String updateCustomerIds() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Long id = request.getParameter("id") == null ? null : Long
				.valueOf(request.getParameter("id"));
		Integer customerId = request.getParameter("customerId") == null ? null
				: Integer.valueOf(request.getParameter("customerId"));

		responseData = TrackUtil.updateCustomerIds(id, customerId);

		return SUCCESS;
	}

	public String countLink() {

		Integer userId = request.getParameter("userId") == null ? null
				: Integer.valueOf(request.getParameter("userId"));
		String mailUid = request.getParameter("mailUid") == null ? null
				: request.getParameter("mailUid");

		responseData = TrackServiceUtil.countLink(userId, mailUid);

		return SUCCESS;
	}

	public String getCountLinks() {

		Integer userId = request.getParameter("userId") == null ? null
				: Integer.valueOf(request.getParameter("userId"));
		String mailUid = request.getParameter("mailUid") == null ? null
				: request.getParameter("mailUid");
		Integer currentPage = request.getParameter("currentPage") == null ? null
				: Integer.valueOf(request.getParameter("currentPage"));
		Integer pageSize = request.getParameter("pageSize") == null ? null
				: Integer.valueOf(request.getParameter("pageSize"));

		responseData = TrackServiceUtil.getCountLinks(userId, mailUid,
				currentPage, pageSize);

		return SUCCESS;
	}

	public void getRecordInfos() {
		PrintWriter writer = null;

		try {
			String ip = NetworkUtil.getIpAddress(request);

			if (allowIp.contains(ip)) {

				Long id = request.getParameter("id") == null ? null : Long
						.valueOf(request.getParameter("id"));

				responseData = TrackUtil.getRecordInfos(id);
			} else {

				responseData = new ArrayList<Object>();
			}

			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/json;charset=UTF-8");

			writer = response.getWriter();

			writer.println(JSONArray.fromObject(responseData).toString());
			writer.flush();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				writer.close();
			}
		}

	}

	public String getLinkTracks() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? Integer
				.valueOf(result.get("data").toString()) : Integer
				.valueOf(request.getParameter("userId"));

		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String mailUid = request.getParameter("mailUid");

		responseData = TrackServiceUtil.getLinkTracks(userId, companyId,
				mailUid, sortType);

		return SUCCESS;
	}

	public String checkIp() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}
		Long id = request.getParameter("id") == null ? null : Long
				.valueOf(request.getParameter("id"));

		Integer type = request.getParameter("type") == null ? null : Integer
				.valueOf(request.getParameter("type"));

		String ip = request.getParameter("ip");

		responseData = TrackServiceUtil.checkIp(type, id, ip);

		return SUCCESS;
	}

	public String getEmailRecords() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer currentPage = request.getParameter("currentPage") == null ? null
				: Integer.valueOf(request.getParameter("currentPage"));
		Integer pageSize = request.getParameter("pageSize") == null ? null
				: Integer.valueOf(request.getParameter("pageSize"));
		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String email = request.getParameter("email");

		responseData = TrackServiceUtil.getEmailRecords(companyId, email,
				currentPage, pageSize, sortType);

		return SUCCESS;
	}

	public void downloadTrackFile() {
		String trackId = request.getParameter("trackId");
		String token = request.getParameter("token");

		// 下载类型:0追踪文件,1分享文件
		int type = 0;

		if (trackId != null) {
			try {
				trackId = Long.valueOf(trackId).toString();
			} catch (Exception e) {
				trackId = null;
			}
		} else {
			type = 1;
		}

		if (trackId != null) {
			final long id = Long.valueOf(trackId);
			// 异步计算下载数
			fixedThreadPool.execute(new Runnable() {

				public void run() {
					countDownloadNum(id);
				}
			});
		}

		String url = cloudServiceUrl + "/file/download?type=" + type
				+ "&accessTokens=" + token;
		try {
			response.sendRedirect(url);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private void countDownloadNum(Long trackId) {
		Connection conn = null;
		PreparedStatement ps = null;
		// 结果集对象
		ResultSet rs = null;
		String sql = null;

		try {
			conn = DBUtil.getConnection();

			sql = "update ts_file_track set is_download = 1, download_count = download_count + 1 where id = ?";
			ps = conn.prepareStatement(sql);
			ps.setObject(1, trackId);

			ps.executeUpdate();

			conn.commit();

		} catch (Exception e) {
			System.out.println("计算追踪附件下载数异常:" + e.getClass().getName() + "-->"
					+ e.getMessage());
		} finally {
			DBUtil.close(rs, ps, conn);
		}
	}

	public String recordTrackFile() {

		Integer userId = request.getParameter("userId") == null ? null
				: Integer.valueOf(request.getParameter("userId"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		Integer pageNumber = request.getParameter("pageNumber") == null ? null
				: Integer.valueOf(request.getParameter("pageNumber"));
		Long accessTime = request.getParameter("accessTime") == null ? null
				: Long.valueOf(request.getParameter("accessTime"));
		String to = request.getParameter("to");
		String trackId = request.getParameter("trackId");

		System.out.println("开始记录附件浏览记录:to=" + to + ",userId=" + userId
				+ ",companyId=" + companyId + ",pageNumber=" + pageNumber
				+ ",accessTime=" + accessTime + ",trackId=" + trackId);

		Map<String, Object> result = new HashMap<String, Object>();

		if (userId == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定用户ID");
			System.err.println("参数缺失,未指定用户ID");
			responseData = result;
			return SUCCESS;
		}
		if (companyId == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定企业ID");
			System.err.println("参数缺失,未指定企业ID");
			responseData = result;
			return SUCCESS;
		}
		if (pageNumber == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定页数");
			System.err.println("参数缺失,未指定页数");
			responseData = result;
			return SUCCESS;
		}
		if (accessTime == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定访问时长");
			System.err.println("参数缺失,未指定访问时长");
			responseData = result;
			return SUCCESS;
		}
		if (to == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定邮箱");
			System.err.println("参数缺失,未指定邮箱");
			responseData = result;
			return SUCCESS;
		}
		if (trackId == null) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "参数缺失,未指定追踪ID");
			System.err.println("参数缺失,未指定追踪ID");
			responseData = result;
			return SUCCESS;
		}

		to = to.trim();

		if (!emailPattern.matcher(to).matches()) {
			result.put("code", 400);
			result.put("success", false);
			result.put("msg", "邮箱格式错误:" + to);
			System.err.println("邮箱格式错误:" + to);
			responseData = result;
			return SUCCESS;
		}

		Connection conn = null;
		PreparedStatement ps = null;
		// 结果集对象
		ResultSet rs = null;
		String sql = null;

		try {
			String ip = NetworkUtil.getIpAddress(request);
			if (ip == null || ip.equalsIgnoreCase("unknown")
					|| ip.equalsIgnoreCase("null")) {
				result.put("code", 400);
				result.put("success", false);
				result.put("msg", "无法获取ip");
				System.err.println("无法获取ip");
				responseData = result;
				return SUCCESS;
			}
			// 解析ip
			String url = controlCentreUrl + "/webservice/ip";
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("ip", ip);

			String continent = null;
			String country = null;
			String province = null;
			String city = null;
			String address = null;
			String netProvider = null;

			Map<String, Object> resp = HttpUtil.doGet(url, params);
			if (resp.get("code").equals(200)) {

				Object data = resp.get("data");

				JSONObject json = JSONObject.fromObject(data);

				if (json.getInt("code") == 200) {
					json = JSONObject.fromObject(json.get("result"));

					netProvider = json.getString("isp");
					continent = json.getString("land");
					country = json.getString("country");
					province = json.getString("prov");
					city = json.getString("city");
					address = json.getString("dist");
				} else {
					System.err.println("ip解析失败:" + json.get("result"));
				}

			} else {
				System.err.println("ip解析失败:" + resp.get("msg"));
			}

			conn = DBUtil.getConnection();

			String agentString = request.getHeader("User-Agent");
			UserAgent userAgent = UserAgent.parseUserAgentString(agentString);
			String language = request.getLocale().getLanguage();
			if (request.getLocale().getCountry() != null
					&& !request.getLocale().getCountry().trim().isEmpty()) {
				language += "-" + request.getLocale().getCountry();
			}

			sql = "insert into ts_file_access(user_id,company_id,file_track_id,page_number,ip,jsession_id,continent,country,province,city,address,device_type,browser_name,language,net_provider,user_agent,access_time,access_email,create_time,os,customer_id) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
			ps = conn.prepareStatement(sql);
			ps.setObject(1, userId);// 用户id
			ps.setObject(2, companyId);// 企业id
			ps.setObject(3, trackId);// 追踪id
			ps.setObject(4, pageNumber);// 访问页数
			ps.setObject(5, ip);// 客户端ip
			ps.setObject(6, request.getSession().getId());// 回话id
			ps.setObject(7, continent);// 访问者所属洲
			ps.setObject(8, country);// 访问者所属国际
			ps.setObject(9, province);// 访问者所属省份
			ps.setObject(10, city);// 访问者所属城市
			ps.setObject(11, address);// 访问者所属详细地址
			ps.setObject(12, TrackUtil.getDeviceType(userAgent));// 设备类型
			ps.setObject(13, userAgent.getBrowser().getName());// 浏览器名称
			ps.setObject(14, language);// 浏览器设置的语言
			ps.setObject(15, netProvider);// 网络接入商
			ps.setObject(16, agentString);// 浏览器ua
			ps.setObject(17, accessTime);// 访问时长,单位秒
			ps.setObject(18, to);// 客户邮箱
			ps.setObject(19, DateFormat.getNowDate());// 创建时间
			ps.setObject(20, userAgent.getOperatingSystem().getName());// 操作系统名称
			ps.setObject(21, WebmailDBUtil.getCustomerId(userId, to));// 客户id

			ps.executeUpdate();
			
			sql = "select mail_uid from ts_file_track where id = ?";
			ps = conn.prepareStatement(sql);
			ps.setObject(1, trackId);
			
			String mailUid = null;
			
			rs = ps.executeQuery();
			
			if (rs.first()) {
				mailUid = rs.getString(1);
			}
			
			if (mailUid != null) {
				Connection conn2 = null;
				PreparedStatement ps2 = null;
				ResultSet rs2 = null;
				int tryCount = 0;
				
				while (conn2 == null && tryCount < 3) {
					tryCount++;
					try {
						conn2 = WebmailDBUtil.getConnection();
					} catch (Exception e) {
						e.printStackTrace();
						try {
							Thread.sleep(5000);
						} catch (InterruptedException ex) {
							ex.printStackTrace();
						}
					}
				}
				
				sql = "select id from attr_link_count where mail_uid = ?";
				ps2 = conn2.prepareStatement(sql);
				ps2.setObject(1, mailUid);
				rs2 = ps2.executeQuery();
				if (rs2.first()) {//已存在
					int cou = rs2.getInt(1);
					
					rs2.close();
					ps2.close();
					
					sql = "update attr_link_count set file_count = file_count + 1 where id = ?";
					ps2 = conn2.prepareStatement(sql);
					ps2.setObject(1, cou);
					ps2.executeUpdate();
				} else {//未存在
					rs2.close();
					ps2.close();
					
					sql = "insert into attr_link_count(mail_uid,file_count,link_count) values(?,?,?)";
					ps2 = conn2.prepareStatement(sql);
					ps2.setObject(1, mailUid);
					ps2.setObject(2, 1);
					ps2.setObject(3, 0);
					ps2.executeUpdate();
				}
				
				//conn2.commit();
				
				WebmailDBUtil.close(rs2, ps2, conn2);
			}
			
			conn.commit();

		} catch (Exception e) {
			System.err.println("记录附件浏览记录异常:" + e.getClass().getName() + "-->"
					+ e.getMessage());
		} finally {
			DBUtil.close(rs, ps, conn);
		}

		return SUCCESS;
	}

	public String getFileTracks() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? Integer
				.valueOf(result.get("data").toString()) : Integer
				.valueOf(request.getParameter("userId"));
		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String mailUid = request.getParameter("mailUid");

		responseData = TrackServiceUtil.getFileTracks(userId, companyId,
				mailUid, sortType);

		return SUCCESS;
	}

	public String countLinkTracks() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? Integer
				.valueOf(result.get("data").toString()) : Integer
				.valueOf(request.getParameter("userId"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String mailUid = request.getParameter("mailUid");

		responseData = TrackServiceUtil.countLinkTracks(userId, companyId,
				mailUid);

		return SUCCESS;
	}

	public String countFileTracks() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? Integer
				.valueOf(result.get("data").toString()) : Integer
				.valueOf(request.getParameter("userId"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String mailUid = request.getParameter("mailUid");

		responseData = TrackServiceUtil.countFileTracks(userId, companyId,
				mailUid);

		return SUCCESS;
	}

	public String countEmailTracks() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? null
				: Integer.valueOf(request.getParameter("userId"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		Integer type = request.getParameter("type") == null ? null : Integer
				.valueOf(request.getParameter("type"));
		String mailUid = request.getParameter("mailUid");

		responseData = TrackServiceUtil.countEmailTracks(type, userId,
				companyId, mailUid);

		return SUCCESS;
	}

	public String getDocRecords() {

		Map<String, Object> result = TrackUtil.getUserId(request
				.getParameter("token"));
		if (!result.get("code").equals(200)) {
			responseData = result;
			return SUCCESS;
		}

		Integer userId = request.getParameter("userId") == null ? Integer
				.valueOf(result.get("data").toString()) : Integer
				.valueOf(request.getParameter("userId"));
		Integer currentPage = request.getParameter("currentPage") == null ? null
				: Integer.valueOf(request.getParameter("currentPage"));
		Integer pageSize = request.getParameter("pageSize") == null ? null
				: Integer.valueOf(request.getParameter("pageSize"));
		Integer sortType = request.getParameter("sortType") == null ? null
				: Integer.valueOf(request.getParameter("sortType"));
		Integer companyId = request.getParameter("companyId") == null ? null
				: Integer.valueOf(request.getParameter("companyId"));
		String email = request.getParameter("email");
		Integer pageNumber = request.getParameter("pageNumber") == null ? null
				: Integer.valueOf(request.getParameter("pageNumber"));
		Long trackId = request.getParameter("trackId") == null ? null : Long
				.valueOf(request.getParameter("trackId"));

		responseData = TrackServiceUtil.getDocRecords(userId, companyId,
				pageNumber, trackId, email, currentPage, pageSize, sortType);

		return SUCCESS;
	}

	public Object getResponseData() {
		return responseData;
	}

	public void setResponseData(Object responseData) {
		this.responseData = responseData;
	}
}