package com.norteksoft.wf.base.utils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.acs.entity.organization.Company;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.acs.service.AcsUtils;
import com.norteksoft.acs.service.organization.UserManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.util.AsyncMailUtils;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.PropUtils;
import com.norteksoft.product.util.SystemUrls;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.task.entity.WorkflowTask;
import com.norteksoft.wf.base.enumeration.CommonStrings;
import com.norteksoft.wf.base.enumeration.TrustRecordState;
import com.norteksoft.wf.engine.entity.TrustRecord;
import com.norteksoft.wf.engine.service.DataDictionaryManager;
import com.norteksoft.wf.engine.service.DelegateMainManager;
import com.norteksoft.wf.engine.service.TaskService;
import com.norteksoft.wf.engine.service.WorkflowInstanceManager;
@Service
@Transactional(readOnly=false)
public class TimerUtils {
private Log log = LogFactory.getLog(DataDictionaryManager.class);
private DelegateMainManager delegateMainManager;
private WorkflowInstanceManager workflowInstanceManager;
private TaskService taskService;
private UserManager userManager;
private AcsUtils acsUtils;
private static final long MILLI_SECOND = 24*60*60*1000;
@Autowired
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
@Autowired
public void setDelegateMainManager(DelegateMainManager delegateMainManager) {
this.delegateMainManager = delegateMainManager;
}
@Autowired
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
@Autowired
public void setWorkflowInstanceManager(
WorkflowInstanceManager workflowInstanceManager) {
this.workflowInstanceManager = workflowInstanceManager;
}
@Autowired
public void setAcsUtils(AcsUtils acsUtils) {
this.acsUtils = acsUtils;
}
@Transactional(readOnly=false)
public void run() throws Exception{
List<Company> companys=acsUtils.getAllCompanys();
for(Company company:companys){
ThreadParameters parameters=new ThreadParameters(company.getId());
ParameterUtils.setParameters(parameters);
String systemAdmin = ApiFactory.getAcsService().getSystemAdminLoginName();
parameters=new ThreadParameters(company.getId());
parameters.setUserName("系统");
parameters.setLoginName(systemAdmin);
ParameterUtils.setParameters(parameters);
//委托
delegateMain();
//催办
List<WorkflowTask> result=new ArrayList<WorkflowTask>();
result.addAll(workflowInstanceManager.getNeedReminderTasksByInstance());
result.addAll(taskService.getNeedReminderTasks());
reminder(result);
}
deleteExportTempFile();
//清空同步处理时的实例map,见TaskService中的completeInteractiveWorkflowTask方法
TaskService.instanceIds.clear();
}
/**
* 删除导出的临时文件
*/
public void deleteExportTempFile(){
String path = PropUtils.getProp("excel.export.file.path");
if(StringUtils.isNotEmpty(path)){
File file = new File(path);
if(file.isDirectory()){
String[] tempList=file.list();
File temp=null;
for(String t:tempList){
temp=new File(path+t);
if(temp.isFile()){
temp.delete();
}
}
}
}
}
@Transactional(readOnly=false)
public void delegateMain(){
try {
//权限委托
List<TrustRecord> delegateMains = delegateMainManager.getDelegateMainsOnAssign();
for(TrustRecord dm:delegateMains){
com.norteksoft.product.api.entity.User trustee=ApiFactory.getAcsService().getUserByLoginName(dm.getTrustee());//受托人
com.norteksoft.product.api.entity.User trustor=ApiFactory.getAcsService().getUserByLoginName(dm.getTrustor());//委托人
if(needEfficient(dm)){
ApiFactory.getAcsService().assignTrustedRole(trustor.getId(), dm.getRoleIds().split(","), trustee.getId());
dm.setState(TrustRecordState.EFFICIENT);
delegateMainManager.saveDelegateMain(dm);
}
if(needEnd(dm)){
ApiFactory.getAcsService().deleteTrustedRole(trustor.getId(), dm.getRoleIds().split(","),trustee.getId() );
dm.setState(TrustRecordState.END);
delegateMainManager.saveDelegateMain(dm);
}
}
//流程委托
List<TrustRecord> workflowDelegateMains = delegateMainManager.getAllStartWorkflowDelegateMain();
for(TrustRecord wfdm : workflowDelegateMains){
if(needEfficient(wfdm)){
wfdm.setState(TrustRecordState.EFFICIENT);
delegateMainManager.saveDelegateMain(wfdm);
}
if(needEnd(wfdm)){
wfdm.setState(TrustRecordState.END);
delegateMainManager.saveDelegateMain(wfdm);
//委托结束时取回任务
taskService.recieveDelegateTask(wfdm);
}
}
} catch (Exception e) {
log.error("定时委托异常:"+e.getMessage());
}
}
/*
* 判断是需要结束委托
* 当委托处于生效状态,并且当前日期大于或等于截至日期时就需要结束
*/
public boolean needEnd(TrustRecord dm){
return (dm.getState()==TrustRecordState.EFFICIENT || dm.getState()==TrustRecordState.STARTED)
&&dm.getEndTime().compareTo(new Date(System.currentTimeMillis()))<=0;
}
/*
* 判断是需要生效
* 当委托处于启用状态,并且当前日期在生效日期和截至日期之间时就需要生效
*/
public boolean needEfficient(TrustRecord dm){
return dm.getState()==TrustRecordState.STARTED
&&dm.getBeginTime().compareTo(new Date(System.currentTimeMillis()))<=0
&&dm.getEndTime().compareTo(new Date(System.currentTimeMillis()))>=0;
}
public void reminder(List<WorkflowTask> tasks){
try {
for(WorkflowTask task : tasks){
if(neetReminder(task)){
if(task.getReminderLimitTimes()!=0&&task.getReminderLimitTimes().equals(task.getAlreadyReminderTimes())){
if(StringUtils.isNotEmpty(task.getReminderNoticeStyle())){
informSettingUser(task);
}
}
if(task.getReminderLimitTimes()==0||task.getReminderLimitTimes()>task.getAlreadyReminderTimes()){
if(StringUtils.isNotEmpty(task.getReminderStyle())){
reminder(task);
}
task.setLastReminderTime(new Date(System.currentTimeMillis()));
task.setAlreadyReminderTimes(task.getAlreadyReminderTimes()+1);
}
}
}
taskService.saveTasks(tasks);
} catch (Exception e) {
log.error("定时催办异常:"+e.getMessage());
}
}
/*
* 催办超出次数限制,通知相关人员
*/
public void informSettingUser(WorkflowTask task) throws Exception{
String[] reminderNoticeStyle = task.getReminderNoticeStyle().split(",");
for(String style:reminderNoticeStyle){
if(style.equalsIgnoreCase(CommonStrings.EMAIL_STYLE)){
emailInform(task);
}else if(style.equalsIgnoreCase(CommonStrings.RTX_STYLE)){
RtxInform(task);
}else if(style.equalsIgnoreCase(CommonStrings.SMS_STYLE)){
smsInform(task);
}else if(style.equalsIgnoreCase(CommonStrings.SWING_STYLE)){
swingInform(task);
}
}
}
public void RtxInform(WorkflowTask task) {
String msg = new StringBuilder( "任务:").append(task.getTitle()).append("的办理人").append(task.getTransactorName()).append( "被催办次数已经超过设置上限,请您核实情况。").toString();
if(StringUtils.isNotEmpty(task.getReminderNoticeUser())){
for(String userLoginName : task.getReminderNoticeUser().split(",")){
rtx.RtxMsgSender.sendNotify(userLoginName, "催办超期提醒", "1", msg , "",task.getCompanyId());
}
}
}
public void smsInform(WorkflowTask task) {
// TODO Auto-generated method stub
}
public void emailInform(WorkflowTask task) {
if(StringUtils.isNotEmpty(task.getReminderNoticeUser())){
Set<String> informUserEmails = new HashSet<String>();
User temp ;
for(String userLoginName : task.getReminderNoticeUser().split(",")){
temp = userManager.getUserByLoginName(userLoginName);
if(temp!=null)informUserEmails.add(temp.getEmail());
}
String msg = new StringBuilder( "任务:").append(task.getTitle()).append("的办理人").append(task.getTransactorName()).append( "被催办次数已经超过设置上限,请您核实情况。").toString();
AsyncMailUtils.sendMail(informUserEmails,"催办超期提醒", msg);
}
}
public void swingInform(WorkflowTask task) throws Exception {
String msg = new StringBuilder( "任务:").append(task.getTitle()).append("的办理人").append(task.getTransactorName()).append( "被催办次数已经超过设置上限,请您核实情况。").toString();
if(StringUtils.isNotEmpty(task.getReminderNoticeUser())){
for(String userLoginName : task.getReminderNoticeUser().split(",")){
ApiFactory.getPortalService().addMessage("task", "系统管理员", ContextUtils.getLoginName(), userLoginName,"催办超期提醒", msg, "/task/message-task.htm?id="+task.getId());
}
}
}
public void reminder(WorkflowTask task) throws Exception{
String[] reminderStyles = task.getReminderStyle().split(",");
for(String style:reminderStyles){
if(StringUtils.trim(style).equalsIgnoreCase(CommonStrings.EMAIL_STYLE)){
emailReminder(task);
}else if(StringUtils.trim(style).equalsIgnoreCase(CommonStrings.RTX_STYLE)){
rtxReminder(task);
}else if(StringUtils.trim(style).equalsIgnoreCase(CommonStrings.SMS_STYLE)){
smsReminder(task);
}else if(StringUtils.trim(style).equalsIgnoreCase(CommonStrings.SWING_STYLE)){
swingReminder(task);
}
}
}
public void emailReminder(WorkflowTask task){
User user = userManager.getUserByLoginName(task.getTransactor());
String msg = new StringBuilder( "任务:").append(task.getTitle()).append( "已经生成")
.append(((System.currentTimeMillis()-task.getCreatedTime().getTime())/MILLI_SECOND)).append("天了。请尽快办理!").toString();
AsyncMailUtils.sendMail(user.getEmail(),"催办超期提醒", msg);
}
public void rtxReminder(WorkflowTask task){
String msg = new StringBuilder("(").append(new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis()))).append( ")任务:").append(task.getTitle()).append( "已经生成")
.append(((System.currentTimeMillis()-task.getCreatedTime().getTime())/MILLI_SECOND)).append("天了。请尽快办理!").toString();
String url = SystemUrls.getSystemUrl(StringUtils.substring(task.getUrl(), 0,task.getUrl().indexOf('/')))
+StringUtils.substring(task.getUrl(), task.getUrl().indexOf('/'));
if(url.contains("?")){
url=url+task.getId();
}else{
url=url+"?taskId="+task.getId();
}
User user = userManager.getUserByLoginName(task.getTransactor());
rtx.RtxMsgSender.sendNotify(task.getTransactor(), "任务办理提醒", "1", msg , url,user.getCompanyId());
}
public void swingReminder(WorkflowTask task) throws Exception{
if(StringUtils.isNotEmpty(task.getTransactor())){
String msg = new StringBuilder("(").append(new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis()))).append( ")任务:").append(task.getTitle()).append( "已经生成")
.append(((System.currentTimeMillis()-task.getCreatedTime().getTime())/MILLI_SECOND)).append("天了。请尽快办理!").toString();
ApiFactory.getPortalService().addMessage("task", "系统管理员", ContextUtils.getLoginName(), task.getTransactor(),"待办任务催办提醒", msg, "/task/message-task.htm?id="+task.getId());
}
}
public void smsReminder(WorkflowTask task){
//TODO
}
public boolean neetReminder(WorkflowTask task){
return (task.getLastReminderTime()== null && (System.currentTimeMillis()-task.getCreatedTime().getTime())>task.getDuedate()*MILLI_SECOND) ||
(task.getLastReminderTime()!= null && (System.currentTimeMillis()-task.getLastReminderTime().getTime())>task.getRepeat()*MILLI_SECOND);
}
}