TaskUserManagerImpl.java 15.6 KB
/*
 * @(#)TaskUserManagerImpl.java
 *
 * Copyright (c) 2014-2017  苏州犀牛网络科技有限公司 版权所有
 * xiniunet. All rights reserved.
 *
 * This software is the confidential and proprietary
 * information of  xiniunet.
 * ("Confidential Information"). You shall not disclose
 * such Confidential Information and shall use it only
 * in accordance with the terms of the contract agreement
 * you entered into with xiniunet.
 */
package com.xiniunet.task.biz;

import com.alibaba.fastjson.JSON;
import com.xiniunet.foundation.service.FoundationService;
import com.xiniunet.framework.base.BaseManagerImpl;
import com.xiniunet.framework.base.BaseResponse;
import com.xiniunet.framework.exception.ErrorType;
import com.xiniunet.framework.security.Passport;
import com.xiniunet.framework.util.auth.ConfigToolObject;
import com.xiniunet.master.domain.system.User;
import com.xiniunet.master.request.system.UserFindRequest;
import com.xiniunet.master.response.system.UserFindResponse;
import com.xiniunet.master.service.MasterService;
import com.xiniunet.quartz.TaskRemindingJob;
import com.xiniunet.quartz.base.XNQuartzJob;
import com.xiniunet.quartz.base.XNQuartzJobData;
import com.xiniunet.task.constant.Message;
import com.xiniunet.task.dal.TaskMapper;
import com.xiniunet.task.dal.TaskUserMapper;
import com.xiniunet.task.domain.TaskUser;
import com.xiniunet.task.po.TaskPO;
import com.xiniunet.task.po.TaskUserPO;
import com.xiniunet.task.request.*;
import com.xiniunet.task.response.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 任务分配表的管理方法实现.
 * @author 薛磊
 */
@Transactional
@Service
public class TaskUserManagerImpl extends BaseManagerImpl implements TaskUserManager {

    @Autowired
    private FoundationService foundationService;

    @Autowired
    private TaskUserMapper taskUserMapper;

    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private MasterService masterService;

    /**
     * 根据Id获取任务分配表
     *
     * @param request 获取任务分配表请求
     * @param passport 用户护照
     * @return 获取任务分配表应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public TaskUserGetResponse get(TaskUserGetRequest request, Passport passport) {
        TaskUserGetResponse response = new TaskUserGetResponse();
        TaskUserPO entity = taskUserMapper.getById(request.getId(), passport);
        if (entity != null) {
            TaskUser taskUser = this.getMapper().map(entity, TaskUser.class);
            response.setTaskUser(taskUser );
        } else {
            response.addError(ErrorType.EXPECTATION_NULL, Message.COMMON_GET_FAILURE);
        }
        return response;
    }
    /**
     * 根据Id获取任务分配表
     *
     * @param request 获取任务分配表请求
     * @param passport 用户护照
     * @return 获取任务分配表应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public TaskUserInfoGetResponse getInfo(TaskUserInfoGetRequest request, Passport passport) {
        TaskUserInfoGetResponse response = new TaskUserInfoGetResponse();
        //查询对应的taskUser
        TaskUserPO entity = taskUserMapper.getByTaskId(request.getTaskId(),passport);
        if(entity == null){
            response.addError(ErrorType.BUSINESS_ERROR, "用户任务不存在或已被删除!");
            return response;
        }
        TaskUser taskUser = this.getMapper().map(entity, TaskUser.class);
        response.setTaskUser(taskUser );
        return response;
    }

    /**
     * 模糊查询任务分配表
     *
     * @param request 模糊查询任务分配表请求
     * @param passport 用户护照
     * @return 模糊查询任务分配表应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public TaskUserSearchResponse search(TaskUserSearchRequest request, Passport passport) {
        TaskUserSearchResponse response = new TaskUserSearchResponse();
        List<TaskUser> modelList = new ArrayList<>();
        Long count = taskUserMapper.searchCount(request, passport);
    
        if (count > 0) {
            // 处理分页参数
            if (request.getPageSize() > 0) {
                //如果输入的页码大于实际的分页数,将页码设置为最后一页的页码
                int lastPageNumber = (int) ((count - 1) / request.getPageSize() + 1);
                if (request.getPageNumber() > lastPageNumber) {
                    request.setPageNumber(lastPageNumber);
                }
            }
    
            //通过关键字查询出用户集合
            List<TaskUserPO> entityList = taskUserMapper.search(request, passport);
    
            for (TaskUserPO entity : entityList) {
                TaskUser taskUser = this.getMapper().map(entity, TaskUser.class);
                modelList.add(taskUser);
            }
        }
    
        response.setTotalCount(count);
        response.setResult(modelList);
        return response;
    }
    
    /**
     * 高级查询任务分配表
     *
     * @param request 高级查询任务分配表请求
     * @param passport 用户护照
     * @return 高级查询任务分配表应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public TaskUserFindResponse find(TaskUserFindRequest request, Passport passport) {
        TaskUserFindResponse response = new TaskUserFindResponse();
        List<TaskUser> modelList = new ArrayList<>();
        Long count = taskUserMapper.findCount(request, passport);
        if (count >0) {
            // 处理分页参数
            if (request.getPageSize() > 0) {
                //如果输入的页码大于实际的分页数,将页码设置为最后一页的页码
                int lastPageNumber = (int) ((count - 1) / request.getPageSize() + 1);
                if (request.getPageNumber() > lastPageNumber) {
                    request.setPageNumber(lastPageNumber);
                }
            }
    
            List<TaskUserPO> entityList = taskUserMapper.find(request, passport);
            Set<Long> userIdSet = new HashSet<>();
            for (TaskUserPO entity : entityList) {
                TaskUser taskUser = this.getMapper().map(entity, TaskUser.class);
                if(request.getIncludeOwner() != null && !request.getIncludeOwner()){
                    if(!taskUser.getUserId().equals(passport.getUserId())){
                        modelList.add(taskUser);
                        userIdSet.add(taskUser.getUserId());
                    }
                }else{
                    modelList.add(taskUser);
                    userIdSet.add(taskUser.getUserId());
                }
            }
            UserFindRequest userFindRequest = new UserFindRequest();
            userFindRequest.setPageSize(0);
            userFindRequest.setIds(new ArrayList<Long>(userIdSet));
            UserFindResponse userFindResponse = masterService.findUser(userFindRequest, passport);
            if (userFindResponse != null && userFindResponse.getResult() != null && userFindResponse.getResult().size() > 0) {
                Map<Long, User> userMap = new HashMap<>();
                for (User user : userFindResponse.getResult()) {
                    userMap.put(user.getId(), user);
                }
                for (TaskUser taskUser : modelList) {
                    User user = userMap.get(taskUser.getUserId());
                    if (user != null) {
                        if (StringUtils.isBlank(taskUser.getUserName())) {
                            taskUser.setUserName(user.getName());
                        }
                        taskUser.setAccount(user.getAccount());
                        taskUser.setAvatarId(user.getAvatarId());
                        taskUser.setAvatar(user.getAvatar());
                    }
                }
            }
        }
    
        response.setTotalCount(count);
        response.setResult(modelList);
        return response;
    }
    
    /**
     * 创建任务分配表
     *
     * @param request 创建任务分配表请求
     * @param passport 用户护照
     * @return 创建任务分配表应答
     */
    @Override
    public TaskUserCreateResponse create(TaskUserCreateRequest request, Passport passport) {
        TaskUserCreateResponse response = new TaskUserCreateResponse();

        TaskUserPO entity = this.getMapper().map(request, TaskUserPO.class);
        if(entity.getId() == null) {
            long id = foundationService.getNewId();
            entity.setId(id);
        }

        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity,passport,response);
        if(response.hasError()) {
            return response;
        }

        if (taskUserMapper.insert(entity, passport) == 0) {
            response.addError(ErrorType.EXPECTATION_NULL, Message.COMMON_CREATE_FAILURE);
            return response;
        }

        response.setId(entity.getId());
        return response;
    }
    /**
     * 更新任务提醒
     *
     * @param request 更新任务分配表请求
     * @param passport 用户护照
     * @return 更新任务分配表应答
     */
    @Override
    public TaskUserAlarmUpdateResponse updateAlarm(TaskUserAlarmUpdateRequest request, Passport passport) {
        TaskUserAlarmUpdateResponse response = new TaskUserAlarmUpdateResponse();
        //查询对应的task
        TaskPO taskPO = taskMapper.getById(request.getTaskId(),passport);
        if(taskPO == null){
            response.addError(ErrorType.BUSINESS_ERROR, "任务不存在或已被删除!");
            return response;
        }
        //查询对应的taskUser
        TaskUserPO taskUserPO = taskUserMapper.getByTaskId(request.getTaskId(),passport);
        if(taskUserPO == null){
            response.addError(ErrorType.BUSINESS_ERROR, "用户任务不存在或已被删除!");
            return response;
        }
        TaskUserPO entity = this.getMapper().map(request, TaskUserPO.class);
        entity.setRowVersion(taskUserPO.getRowVersion());
        entity.setId(taskUserPO.getId());
        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity,passport,response);
        if(response.hasError()) {
            return response;
        }
        Long result=taskUserMapper.updateAlarm(entity, passport);
        if (result != 1) {
            response.addError(ErrorType.BUSINESS_ERROR, Message.COMMON_UPDATE_FAILURE);
            return response;
        }
        XNQuartzJobData xnQuartzJobData = new XNQuartzJobData();
        xnQuartzJobData.setId(taskPO.getId());
        xnQuartzJobData.setUserTaskId(taskUserPO.getId());
        xnQuartzJobData.setPassport(passport);
        Date remindTime =null;
        //如果之前没有设置提醒现在设置了提醒
        if(taskPO.getEndTime() != null){
            if(!(taskUserPO.getIsTimeAlarm() != null && taskUserPO.getIsTimeAlarm()) &&
                    (request.getIsTimeAlarm()!=null && request.getIsTimeAlarm())){
                //计算提醒时间
                remindTime = (new Date(taskPO.getEndTime().getTime()-request.getAheadTimeCount()*60*1000));
            }else if((taskUserPO.getIsTimeAlarm() != null && taskUserPO.getIsTimeAlarm()) &&
                    (request.getIsTimeAlarm()==null || !request.getIsTimeAlarm())){//如果之前设置提醒现在没有设置了提醒
                //计算提醒时间,设置为之前的日期
                remindTime = (new Date(new Date().getTime()-1*60*1000));
            }else if((taskUserPO.getIsTimeAlarm() != null && taskUserPO.getIsTimeAlarm()) &&
                    (request.getIsTimeAlarm()!=null && request.getIsTimeAlarm())){//如果之前设置提醒现在设置了提醒,以现在的为主
                //计算提醒时间
                remindTime = (new Date(taskPO.getEndTime().getTime()-request.getAheadTimeCount()*60*1000));
            }
            if(remindTime != null){
                //调用任务提醒时间调度器
                TaskRemindingJob taskRemindingJob = new TaskRemindingJob();
                taskRemindingJob.setTriggerData(JSON.toJSONString(xnQuartzJobData));
                //设置为用户任务的id
                taskRemindingJob.setTriggerTag(String.valueOf(taskUserPO.getId()),  "TaskUserRemindingJob");
                taskRemindingJob.setCronTrigger(XNQuartzJob.getCron(remindTime));
            }

        }
        response.setResult(result);
        return response;
    }
    /**
     * 更新任务分配表
     *
     * @param request 更新任务分配表请求
     * @param passport 用户护照
     * @return 更新任务分配表应答
     */
    @Override
    public TaskUserUpdateResponse update(TaskUserUpdateRequest request, Passport passport) {
        TaskUserUpdateResponse response = new TaskUserUpdateResponse();

        TaskUserPO entity = this.getMapper().map(request, TaskUserPO.class);
        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity,passport,response);
        if(response.hasError()) {
            return response;
        }

        Long result=taskUserMapper.update(entity, passport);
        if (result != 1) {
            response.addError(ErrorType.BUSINESS_ERROR, Message.COMMON_UPDATE_FAILURE);
            return response;
        }
        response.setResult(result);
        return response;
    }
    /**
     * 更新任务分配表记录数
     *
     * @param request 更新任务分配表请求
     * @param passport 用户护照
     * @return 更新任务分配表应答
     */
    @Override
    public TaskUserCountUpdateResponse updateCount(TaskUserCountUpdateRequest request, Passport passport) {
        TaskUserCountUpdateResponse response = new TaskUserCountUpdateResponse();
        TaskUserPO taskUserPO = taskUserMapper.getByTaskId(request.getId(),passport);
        if(taskUserPO == null){
            response.addError(ErrorType.BUSINESS_ERROR, "用户任务信息不存在或已被删除!");
            return response;
        }
        TaskUserPO entity = this.getMapper().map(request, TaskUserPO.class);
        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity,passport,response);
        if(response.hasError()) {
            return response;
        }
        entity.setRowVersion(taskUserPO.getRowVersion());
        Long result=taskUserMapper.updateCount(entity, passport);
        if (result != 1) {
            response.addError(ErrorType.BUSINESS_ERROR, Message.COMMON_UPDATE_FAILURE);
            return response;
        }
        response.setResult(result);
        return response;
    }
    /**
     * 删除任务分配表
     *
     * @param request 删除任务分配表请求
     * @param passport 用户护照
     * @return 删除任务分配表应答
     */
    @Override
    public TaskUserDeleteResponse delete(TaskUserDeleteRequest request, Passport passport) {
        TaskUserDeleteResponse response = new TaskUserDeleteResponse();
         Long result= taskUserMapper.delete(request.getId(), passport);
         response.setResult(result);
        return response;
    }
    
    

    /**
     * 验证对象
     * @param taskUser 任务分配表
     * @param passport 用户护照
     */
    private void checkValidate(TaskUserPO taskUser, Passport passport, BaseResponse response) {
        // TODO
    }
}