package com.example.expense.expensereport.service;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.expense.entity.ExpenseReport;
import com.example.expense.expensereport.dao.ExpenseReportDao;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.Opinion;
import com.norteksoft.product.api.entity.WorkflowTask;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.web.wf.WorkflowManagerSupport;
import com.norteksoft.acs.base.utils.log.LogUtilDao;
import com.norteksoft.product.api.entity.User;
import com.norteksoft.wf.base.enumeration.ProcessState;
import com.norteksoft.wf.engine.client.EndInstanceInterface;
import com.norteksoft.wf.engine.client.FormFlowable;
import com.norteksoft.wf.engine.client.FormFlowableDeleteInterface;
import com.norteksoft.wf.engine.client.OnStartingSubProcess;
import com.norteksoft.wf.engine.client.RetrieveTaskInterface;
@Service
@Transactional
public class ExpenseReportManager extends WorkflowManagerSupport<ExpenseReport> implements FormFlowableDeleteInterface,RetrieveTaskInterface,EndInstanceInterface,OnStartingSubProcess {
@Autowired
private ExpenseReportDao expenseReportDao;
@Autowired
public LogUtilDao logUtilDao;
public ExpenseReport getExpenseReport(Long id){
return expenseReportDao.get(id);
}
public void saveExpenseReport(ExpenseReport expenseReport){
expenseReportDao.save(expenseReport);
}
public void deleteExpenseReport(Long id){
ApiFactory.getInstanceService()
.deleteInstance(getExpenseReport(id));
}
public void deleteExpenseReportById(Long id){
expenseReportDao.delete(id);
}
/**
* 删除实体,流程相关文件都删除
* @param ids
*/
public String deleteExpenseReport(String ids) {
String[] deleteIds = ids.split(",");
int deleteNum=0;
int failNum=0;
for (String id : deleteIds) {
ExpenseReport expenseReport = expenseReportDao.get(Long.valueOf(id));
if(deleteRight(expenseReport)){
if(expenseReport.getWorkflowInfo()!=null){
ApiFactory.getInstanceService().deleteInstance(expenseReportDao.get(Long.valueOf(id)));
}else{
expenseReportDao.delete(expenseReport);
}
deleteNum++;
}else{
failNum++;
}
}
return deleteNum+" 条数据成功删除,"+failNum+" 条数据没有权限删除!";
}
private boolean deleteRight(ExpenseReport expenseReport){
return ApiFactory.getInstanceService().isInstanceComplete(expenseReport)||ApiFactory.getInstanceService().canDeleteInstanceInTask(expenseReport, expenseReport.getWorkflowInfo().getCurrentActivityName());
}
public void deleteExpenseReport(ExpenseReport expenseReport){
expenseReportDao.delete(expenseReport);
}
public Page<ExpenseReport> search(Page<ExpenseReport>page){
return expenseReportDao.search(page);
}
public List<ExpenseReport> listAll(){
return expenseReportDao.getAllExpenseReport();
}
/**
* 得到所有意见集合
*/
public List<Opinion> getOpinions(ExpenseReport expenseReport) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
return ApiFactory.getOpinionService().getOpinions(expenseReport);
}
public ExpenseReport getExpenseReportByTaskId(Long taskId) {
if(taskId==null)return null;
return getExpenseReport(ApiFactory.getFormService().getFormFlowableIdByTask(taskId));
}
/*
* 删除流程实例时的回调方法(在流程参数中配置了beanName)
*
* @see com.norteksoft.wf.engine.client.FormFlowableDeleteInterface#
* deleteFormFlowable(java.lang.Long)
*/
@Override
public void deleteFormFlowable(Long id) {
expenseReportDao.delete(id);
}
/**
* 得到意见
* @param opinion
* @param submitflag
* @param opinionflag
* @return
*/
public String getOpinion(String opinion,boolean submitflag,boolean opinionflag){
String str;
if(submitflag){
str="已阅。 ";
}else{
if(opinionflag)
str="同意。 ";
else
str="不同意。 ";
}
if(StringUtils.isNotEmpty(opinion))str=str+"其它意见:"+opinion;
return str;
}
public void saveLog(String opType,ExpenseReport expenseReport){
ThreadParameters parameters=new ThreadParameters();
parameters.setCompanyId(expenseReport.getCompanyId());
parameters.setUserName(expenseReport.getCreator());
parameters.setLoginName(expenseReport.getCreator());
ParameterUtils.setParameters(parameters);
ApiFactory.getBussinessLogService().log(opType, "上传文件");
}
/**
* 返回环节办理人是否具有创建正文的权限
* @param incomeArchives
* @param taskId
* @return
*/
public boolean getOfficialTextCreateRight(String defCode){
return ApiFactory.getPermissionService().getActivityPermission(defCode).getDocumentCreateable();
}
/**
* 获得保留编辑痕迹
* @param documentTaskId
* @return
*/
public String getEditRight(Long documentTaskId) {
return ApiFactory.getPermissionService().getDocumentPermission(documentTaskId);
}
/**
* 返回环节办理人是否具有创建正文的权限
* @param incomeArchives
* @param taskId
* @return
*/
public boolean getOfficialTextCreateRight(Long taskId){
return ApiFactory.getPermissionService().getActivityPermission(taskId).getDocumentCreateable();
}
/**
* 下载正文权限
* @return
*/
public boolean isDownLoadDocument(Long taskId){
if(taskId!=null){
return ApiFactory.getPermissionService().getActivityPermission(taskId).getDocumentDownloadable();
}
return false;
}
/**
* 得加签人员(选所有人的时候)
* @param expenseReport
*/
public void getSignName(ExpenseReport expenseReport){
List<User> allUser = ApiFactory.getAcsService().getUsersByCompany(ContextUtils.getCompanyId());
String signLoginNames = "";
for (User user : allUser) {
signLoginNames+=user.getLoginName()+",";
}
expenseReport.setSignLoginNames(signLoginNames.substring(0, signLoginNames.length()-1));
}
/**
* 得批示传阅人员(选所有人的时候)
* @param expenseReport
*/
public void getReadName(ExpenseReport expenseReport) {
List<User> allUser = ApiFactory.getAcsService().getUsersByCompany(ContextUtils.getCompanyId());
String signLoginNames = "";
for (User user : allUser) {
signLoginNames+=user.getLoginName()+",";
}
expenseReport.setReadLoginNames(signLoginNames.substring(0, signLoginNames.length()-1));
}
/**
* 得到当前环节办理人(包括受托人)
* @param expenseReport
* @return
*/
public List<WorkflowTask> getTaskHander(ExpenseReport expenseReport,Long taskId) {
WorkflowTask task = ApiFactory.getTaskService().getTask(taskId);
// List<String[]> transactors = ApiFactory.getTaskService().getActivityTaskTransactors(expenseReport);
// List<String[]> principals = ApiFactory.getTaskService().getActivityTaskPrincipalsDetail(expenseReport);
List<WorkflowTask> taskList = ApiFactory.getTaskService().getActivityTasks(expenseReport);
/* List<String[]> result = new ArrayList<String[]>();
if(transactors.size()>0)result.addAll(transactors);
//当受托人减签委托人时 会报错所以是委托任务是不让选择委托人
if(task.getTrustor()==null){
if(principals.size()>0)result.addAll(principals);
}*/
return taskList;
}
/**
* 取回任务业务补偿
*/
@Override
public void retrieveTaskExecute(Long entityId,Long taskId) {
getExpenseReport(entityId);
}
/**
* 流程正常结束时的业务补偿
*/
@Override
public void endInstanceExecute(Long entityId) {
ExpenseReport expenseReport = getExpenseReport(entityId);
expenseReport.getWorkflowInfo().setProcessState(ProcessState.END);
this.saveEntity(expenseReport);
}
@Override
protected ExpenseReport getEntity(Long id) {
return expenseReportDao.get(id);
}
@Override
protected void saveEntity(ExpenseReport expenseReport) {
expenseReportDao.save(expenseReport);
}
public String goback(Long taskId){
return ApiFactory.getTaskService().returnTask(taskId);
}
@Override
public FormFlowable getRequiredSubEntity(Map<String, Object> param) {
ExpenseReport expenseReport = new ExpenseReport();
expenseReport.setSignPersons(ContextUtils.getUserName());
expenseReport.setSignLoginNames(ContextUtils.getLoginName());
expenseReport.setSignPersonIds(ContextUtils.getUserId()+"");
expenseReport.setReadLoginNames(ContextUtils.getLoginName());
expenseReport.setReadPersonIds(ContextUtils.getUserId()+"");
expenseReport.setReadPersons(ContextUtils.getUserName());
expenseReport.setCreator(ContextUtils.getLoginName());
expenseReport.setCompanyId(ContextUtils.getCompanyId());
expenseReport.setCreatedTime(new Date());
expenseReport.setCreatorId(ContextUtils.getUserId());
expenseReport.setName(ContextUtils.getUserName());
User user = ApiFactory.getDataDictService().getDirectLeader(ContextUtils.getUserId());
if(user!=null){
expenseReport.setDirectLeaderName(user.getName());
}else{
expenseReport.setDirectLeaderName("空");
}
expenseReportDao.save(expenseReport);
return expenseReport;
}
}