package com.yaochen.boss.job.component;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ycsoft.beans.core.cust.CCust;
import com.ycsoft.beans.system.SBullentionWorkCount;
import com.ycsoft.beans.system.SBulletinWorktask;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.beans.task.TaskCustExtInfo;
import com.ycsoft.beans.task.WTaskBaseInfo;
import com.ycsoft.beans.task.WTaskLog;
import com.ycsoft.beans.task.WTaskUser;
import com.ycsoft.beans.task.WTeam;
import com.ycsoft.boss.remoting.cfocn.WorkOrderClient;
import com.ycsoft.boss.remoting.ott.Result;
import com.ycsoft.business.dao.core.cust.CCustDao;
import com.ycsoft.business.dao.core.user.CUserDao;
import com.ycsoft.business.dao.system.SBulletinDao;
import com.ycsoft.business.dao.system.SBulletinWorktaskDao;
import com.ycsoft.business.dao.system.SOptrDao;
import com.ycsoft.business.dao.task.WTaskBaseInfoDao;
import com.ycsoft.business.dao.task.WTaskLogDao;
import com.ycsoft.business.dao.task.WTaskUserDao;
import com.ycsoft.business.dao.task.WTeamDao;
import com.ycsoft.commons.abstracts.BaseComponent;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.helper.StringHelper;
@Component
public class TaskComponent extends BaseComponent {
@Autowired
private WTaskBaseInfoDao wTaskBaseInfoDao;
@Autowired
private WTaskUserDao wTaskUserDao;
@Autowired
private WTaskLogDao wTaskLogDao;
@Autowired
private SOptrDao sOptrDao;
@Autowired
private CCustDao cCustDao;
@Autowired
private WTeamDao wTeamDao;
@Autowired
private SBulletinWorktaskDao sBulletinWorktaskDao;
@Autowired
private SBulletinDao sBulletinDao;
@Autowired
private CUserDao cUserDao;
//查找需要执行的工单任务
public List<WTaskLog> querySynTaskLog() throws Exception{
return wTaskLogDao.querySynLog();
}
/**
* 从cfocn撤回工单
* @param client
* @param taskId
* @param doneCode
* @throws Exception
*/
public void cancelTaskService(WorkOrderClient client,String taskId,Integer doneCode) throws Exception{
WTaskBaseInfo task= wTaskBaseInfoDao.queryForLock(taskId);
if(task==null){
throw new Exception("工单不存在");
}
if(!task.getTask_status().equals(StatusConstants.TASK_INIT)){
throw new Exception("工单状态非施工中");
}
//调用接口撤回
client.cancelTaskService(doneCode, taskId);
//更新工单状态为待派单
this.updateTaskBaseInfoStatus(taskId, StatusConstants.TASK_CREATE);
wTaskBaseInfoDao.updateTaskSyncStatus(taskId, StatusConstants.SUCCESS);
}
/**
* 同步工单给cfocn
* @param client
* @param taskId
* @return
* @throws Exception
*/
public boolean sendNewWorkOrder(WorkOrderClient client, String taskId,String cfonTeamId) throws Exception{
WTaskBaseInfo task=wTaskBaseInfoDao.queryForLock(taskId);
//工单状态判断
if(!task.getTask_status().equals(StatusConstants.TASK_CREATE)
&&!task.getTask_status().equals(StatusConstants.TASK_ENDWAIT)){
throw new Exception("工单状态非可派工单");
}
if(!cfonTeamId.equals(task.getTeam_id())){
throw new Exception("非cfocn的工单");
}
List<WTaskUser> userList = queryTaskUser(taskId);
TaskCustExtInfo extInfo = queryCustInfo(task.getCust_id());
boolean sign= client.createTaskService(task, userList, extInfo,cUserDao.queryUserByCustId(task.getCust_id()));
//更新工单状态为施工中
this.updateTaskBaseInfoStatus(taskId, StatusConstants.TASK_INIT);
//同步标志成功
wTaskBaseInfoDao.updateTaskSyncStatus(taskId, StatusConstants.SUCCESS);
return sign;
}
public String getTeamId(String teamType) throws Exception {
// 获取施工队信息
List<WTeam> teamList = wTeamDao.findAll();
for (WTeam team : teamList) {
if (team.getTeam_type().equals(teamType))
return team.getDept_id();
}
return null;
}
public void updateTaskBaseInfoStatus(String taskId,String status)throws Exception{
wTaskBaseInfoDao.updateTaskStatus(taskId, status);
}
public WTaskBaseInfo queryTaskBaseInfo(String taskId) throws Exception{
return wTaskBaseInfoDao.findByKey(taskId);
}
public TaskCustExtInfo queryCustInfo(String custId)throws Exception{
CCust cust = cCustDao.findByKey(custId);
String areaCode = wTaskBaseInfoDao.queryTaskProvinceCode(custId);
SOptr manager = sOptrDao.findByKey(cust.getStr9());
return new TaskCustExtInfo(cust.getCust_no(),areaCode,manager);
}
public void saveTaskSynResult(WTaskLog log,Result result) throws Exception{
if(result.isSuccess()){
log.setSyn_status(StatusConstants.SUCCESS);
}else if (result.isUndefinedError() || result.isConnectionError()){
//网络错误或者未知严重错误需要重发,所有不设置已发状态
log.setSyn_status(StatusConstants.NOT_EXEC);
wTaskBaseInfoDao.updateTaskSyncStatus(log.getTask_id(), StatusConstants.FAILURE);
}else {
log.setSyn_status(StatusConstants.FAILURE);
wTaskBaseInfoDao.updateTaskSyncStatus(log.getTask_id(), StatusConstants.FAILURE);
}
log.setError_code(result.getErr());
if(StringHelper.isNotEmpty(result.getReason())&&result.getReason().length()>110){
log.setError_remark(result.getReason().substring(0, 110));
}else{
log.setError_remark(result.getReason());
}
log.setSyn_time(new Date());
//wTaskLogDao.update(log);
wTaskLogDao.updateExecResult(log);
}
/**
* 查询公告提醒统计信息
*/
public List<SBullentionWorkCount> queryBullentionWorkCount(Date currentTimeStamp)throws Exception{
String supernetTreamId=this.getTeamId(SystemConstants.TEAM_TYPE_SUPERNET);
return wTaskBaseInfoDao.queryBullentionWorkCount(supernetTreamId, currentTimeStamp);
}
/**
* 查询部门的公告配置
* @return
* @throws Exception
*/
public List<SBulletinWorktask> queryDeptBullentionConfig() throws Exception{
return sBulletinWorktaskDao.findAll();
}
/**
* 更新公告内容和操作员查看信息
* @throws Exception
*/
public int updateBullentin(String bullentinId,String bullentinText) throws Exception{
return sBulletinDao.updateBulletinByWorkTask(bullentinId,bullentinText);
}
}