TaskTempServiceImpl.java 7.69 KB
package vion.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.github.linpeilie.Converter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import vion.dto.TaskTempDTO;
import vion.mapper.TaskTempMapper;
import vion.model.*;
import vion.service.IFileService;
import vion.service.ITaskTempService;
import vion.service.IUserService;
import vion.third.DingMod;
import vion.vo.TaskTempVO;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class TaskTempServiceImpl extends MPJBaseServiceImpl<TaskTempMapper, TaskTemp> implements ITaskTempService {

    private final IFileService fileService;
    private final IUserService userService;
    private final DingMod dingMod;
    private final Converter converter;

    @Value("${fileUrl:}")
    private String fileUrl;

    @Override
    public Page<TaskTempVO> getTaskTempList(TaskTempDTO data) {
        Page<TaskTemp> taskTempPage = this
                .lambdaQuery(converter.convert(data, TaskTemp.class))
                .between(ArrayUtil.isAllNotNull(data.getStartdate(), data.getEnddate()), TaskTemp::getRepairTime, data.getStartdate(), data.getEnddate())
                .page(Page.of(data.getPageNum(), data.getPageSize()));
        List<TaskTempVO> taskTempVOList = converter.convert(taskTempPage.getRecords(), TaskTempVO.class);
        return Page.<TaskTempVO>of(taskTempPage.getCurrent(), taskTempPage.getSize(), taskTempPage.getTotal()).setRecords(taskTempVOList);
    }

    @Override
    public TaskTempVO getTaskTempById(Long id) {
        MPJLambdaWrapper<TaskTemp> wrapper = new MPJLambdaWrapper<TaskTemp>()
                .selectAll(TaskTemp.class)
                .selectCollection(FileInfo.class, TaskTempVO::getFileList)
                .leftJoin(FileInfo.class, on -> on
                        .eq(FileInfo::getSourceId, TaskTemp::getId)
                        .eq(FileInfo::getStoreId, 0L))
                .eq(TaskTemp::getId, id);
        return Opt.ofNullable(this.selectJoinOne(TaskTempVO.class, wrapper))
                .ifPresent(taskTempVO -> {
                    Task task = Db.getOne(Wrappers.lambdaQuery(Task.class).eq(Task::getTaskTempId, id));
                    taskTempVO.setTask(task);
                })
                .orElse(null);
    }

    @Override
    public Object saveTaskTemp(TaskTempDTO data) {
        TaskTemp taskTemp = converter.convert(data, TaskTemp.class);
        this.save(taskTemp);

        Opt.ofNullable(data.getFiles())
                .ifPresent(fileList ->
                        Arrays.stream(fileList).forEach(infile -> {
                            //上传url地址
                            String orgName = infile.getOriginalFilename();
                            String mainName = FileUtil.mainName(orgName);
                            String fileExt = FileUtil.extName(orgName);
                            String filename = StrUtil.format("{}_{}.{}", mainName, DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS"), fileExt);
                            String path = fileUrl + FileUtil.FILE_SEPARATOR + 0 + FileUtil.FILE_SEPARATOR + taskTemp.getId() + FileUtil.FILE_SEPARATOR + filename;
                            File file = FileUtil.touch(path);
                            try {
                                infile.transferTo(file);
                            } catch (IOException e) {
                                log.error("保存文件出错", e);
                            }

                            FileInfo fileInfo = new FileInfo();
                            fileInfo.setStoreId(0L);
                            fileInfo.setSourceId(taskTemp.getId());
                            fileInfo.setSourceType(2);
                            fileInfo.setName(filename);
                            fileInfo.setUrl(path);
                            fileInfo.setType(FileUtil.extName(file));
                            fileInfo.setSha256(SecureUtil.sha256(file).toUpperCase());
                            fileInfo.setUploader(data.getRepairPeople());
                            fileService.save(fileInfo);
                        }));

        // todo 异步发送钉钉消息通知
        List<User> userList = userService.lambdaQuery().eq(User::getPreWorkOrder, 1).list();
        String userids = userList.stream().map(User::getUserid).collect(Collectors.joining(","));
        dingMod.workMsg(buildMsg(userids, taskTemp));

        return MapUtil.<String, Long>builder()
                .put("id", taskTemp.getId())
                .build();
    }

    @Override
    public Map<String, Long> getInfoByPhone(String phone) {
        MPJLambdaWrapper<TaskTemp> wrapper = new MPJLambdaWrapper<TaskTemp>()
                .selectAs(TaskTemp::getStoreId, TaskTempVO::getStoreId)
                .selectAs(Store::getAccountId, TaskTempVO::getAccountId)
                .leftJoin(Store.class, Store::getId, TaskTemp::getStoreId)
                .eq(TaskTemp::getRepairPhone, phone)
                .orderByDesc(TaskTemp::getCreateTime);
        List<TaskTempVO> voList = this.selectJoinList(TaskTempVO.class, wrapper);
        List<TaskTempVO> filterList = voList.stream().filter(BeanUtil::isNotEmpty).collect(Collectors.toList());

        if (CollUtil.isNotEmpty(filterList) && filterList.size() > 1) {
            return MapUtil.<String, Long>builder().put("accountId", filterList.get(0).getAccountId()).put("storeId", filterList.get(0).getStoreId()).build();
        }
        return MapUtil.empty();
    }

    JSONObject buildMsg(String userid, TaskTemp taskTemp) {
        JSONObject jsonObj = new JSONObject();
        jsonObj.set("agent_id", 2358374016L);
        jsonObj.set("userid_list", userid);

        JSONObject msg = new JSONObject();
        JSONObject content = new JSONObject();
        content.set("title", "客户提交工单,请及时处理哦~_~");
        String markdown = StrUtil.format("#### 门店信息: **{}**" +
                        "  \n  #### 客户姓名:{}" +
                        "  \n  #### 联系方式:{}" +
                        "  \n  #### 故障描述:{}" +
                        "  \n  #### 发送时间:{}",
                taskTemp.getStoreName(), taskTemp.getRepairPeople(), taskTemp.getRepairPhone(), taskTemp.getFaultDescription(), DateUtil.now());
        content.set("markdown", markdown);
        content.set("btn_orientation", "1");

        JSONArray jsonArray = new JSONArray();
        jsonArray.add(new JSONObject().set("title", "查看详情").set("action_url", "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=dingkrzwks0jpi2di3uo&response_type=code&scope=snsapi_auth&state=STATE&redirect_uri=https%3A%2F%2Fyunwei.vionyun.com%3A8443%2Fyunwei%2Fapi%2Fding%2Fcallback%2Finside%3FtaskTempId%3D" + taskTemp.getId()));
        content.set("btn_json_list", jsonArray);

        msg.set("msgtype", "action_card");
        msg.set("action_card", content);
        jsonObj.set("msg", msg);
        return jsonObj;
    }
}