DssDriverV2Controller.java 8.83 KB
package com.ruoyi.controller.dss2;

import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.asymmetric.Sign;
import com.ruoyi.common.ConstSignInConstSignInProperties;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.domain.driver.NewDriver;
import com.ruoyi.domain.dss.sign.vo.DssSignVo;
import com.ruoyi.domain.dss2.driver.dto.DssDetailSignV2DTO;
import com.ruoyi.domain.dss2.driver.dto.DssSignV2DTO;
import com.ruoyi.domain.dss2.driver.vo.DssSignInV2Vo;
import com.ruoyi.driver.service.IDriverService;
import com.ruoyi.in.domain.CalDriverScheduling;
import com.ruoyi.in.domain.SignIn;
import com.ruoyi.in.domain.SignInV1;
import com.ruoyi.in.service.ISignInService;
import com.ruoyi.in.service.SignInServiceV1;
import com.ruoyi.in.service.impl.SignInServiceImpl;
import com.ruoyi.pojo.response.SignInResponseVo;
import com.ruoyi.service.BigViewServiceV1;
import com.ruoyi.service.driver.NewDriverService;
import com.ruoyi.system.service.ISysDictDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.ResponseResult;

import java.util.Date;
import java.util.Objects;

@RestController
@Slf4j
@RequestMapping("/dss/v2")
@Api(tags = "【蓝斯二期】设备信息")
public class DssDriverV2Controller {

    @Autowired
    private SignInServiceV1 signInServiceV1;
    @Autowired
    private ISysDictDataService sysDictDataService;
    @Autowired
    private BigViewServiceV1 bigViewServiceV1;
    @Autowired
    private ISignInService signInService;
    @Autowired
    private NewDriverService newDriverService;

    /**
     * 线下签到接口
     *
     * @param signV2DTO 签到请求数据传输对象
     * @param bindingResult 数据校验结果
     * @return 返回签到结果封装对象
     */
    @ApiOperation("线下签到")
    @PostMapping("/offline/sign/in/add")
    public ResponseResult<DssSignVo> addSign(@RequestBody DssSignV2DTO signV2DTO, BindingResult bindingResult) {
        // 数据校验,如果有错误则返回错误信息
        if (bindingResult.hasErrors()) {
            return ResponseResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        // 获取审核人员信息,如果找不到则返回错误信息
        NewDriver driver = newDriverService.getOne(signV2DTO.getAuditJobCode());
        if (Objects.isNull(driver)) {
            return ResponseResult.error("无法查找到审核人员");
        }

        // 将请求DTO转换为签到实体对象,并设置创建者信息
        SignIn signIn = convertSignIn(signV2DTO);
        signIn.setCreateBy(Convert.toStr(driver.getId()));

        // 调用服务添加签到信息,并处理结果
        AjaxResult ajaxResult = signInServiceV1.addSignInOffice(signIn);

        // 如果添加成功,则进行后续处理,包括获取字典数据、复制属性等
        if (Objects.nonNull(ajaxResult) && ajaxResult.isSuccess()) {
            SysDictData sysDictData = new SysDictData();
            sysDictData.setDictType("drinking");
            SysDictData dictData = sysDictDataService.getOne(sysDictData);

            SignInV1 signInV1 = (SignInV1) ajaxResult.get(AjaxResult.DATA_TAG);

            SignInResponseVo vo = new SignInResponseVo();
            if (Objects.nonNull(signInV1)) {
                BeanUtils.copyProperties(signInV1, vo);

                vo.setDeviceId(signIn.getDeviceId());

                vo.setName(signInV1.getDriver().getPersonnelName());
                vo.setPosts(signInV1.getPosts());
                // 将处理后的数据转换为响应结果并返回
                ResponseResult<DssSignVo> responseResult = ResponseResult.success(convertSignInVo(vo, signV2DTO, dictData, signInV1));
                responseResult.setMsg(Convert.toStr(ajaxResult.get(AjaxResult.MSG_TAG)));
                return responseResult;
            }
        }

        // 如果添加失败,则根据AjaxResult中的信息返回相应的错误结果
        return ResponseResult.error(Convert.toInt(ajaxResult.get(AjaxResult.CODE_TAG)), Convert.toStr(ajaxResult.get(AjaxResult.MSG_TAG)));
    }

    @ApiOperation("签到详情")
    @PostMapping("/offline/sign/in")
    public ResponseResult<DssSignInV2Vo> detailSignIn(@RequestBody DssDetailSignV2DTO signV2DTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResponseResult.error(bindingResult.getFieldError().getDefaultMessage());
        }

        Date date = signV2DTO.getDate();
        if (Objects.isNull(date)) {
            date = new Date();
        }

        CalDriverScheduling calDriverScheduling = signInServiceV1.findSchedulingByDateTime(signV2DTO.getJobCode(), date, 1);
        if (Objects.isNull(calDriverScheduling) || Objects.isNull(calDriverScheduling.getDriverScheduling())
                || Objects.isNull(calDriverScheduling.getDriverScheduling().getSignInId())) {
            return ResponseResult.success();
        }
        SignIn signIn = signInService.getById(calDriverScheduling.getDriverScheduling().getSignInId());
        if (Objects.isNull(signIn)) {
            return ResponseResult.success();
        }
        DssSignInV2Vo vo = convertDssSignInV2Vo(signIn);
        return ResponseResult.success(vo);
    }


    private SignIn convertSignIn(DssSignV2DTO dto) {
        SignIn signIn = new SignIn();
//        signIn.setImage();
        signIn.setJobCode(dto.getStaffCode());

        signIn.setCreateTime(dto.getSignTime());
        signIn.setType(1);

        if (Objects.nonNull(dto.getTestValue())) {
            signIn.setAlcoholFlag(ConstSignInConstSignInProperties.ALCOHOL_FLAG_YES);
            signIn.setAlcoholIntake(Convert.toBigDecimal(dto.getTestValue()));
        }
        signIn.setSingnIn("104");
        if (StringUtils.isNotEmpty(dto.getImageContent())) {
            signIn.setImage(dto.getImageContent());
            signIn.setResourceType(1);
        } else if (StringUtils.isNotEmpty(dto.getVideoContent())) {
            signIn.setImage(dto.getImageContent());
            signIn.setResourceType(2);
        }
        signIn.setExceptionId(dto.getExceptionId());

//        SysDictData sysDictData = querySystData(null,"drunkenness");
//        if(Objects.nonNull(sysDictData)){
//
//        }

        return signIn;
    }


    /**
     * 将登录响应信息、签到信息、字典数据和签到记录转换为DSS签到视图对象
     *
     * @param responseVo 登录响应视图对象,包含登录相关信息
     * @param dto 签到信息DTO,包含签到相关数据
     * @param dictData 字典数据,用于参考测试值的阈值
     * @param signInV1 签到记录,包含用户的签到详情
     * @return 返回一个转换后的DSS签到视图对象
     */
    private DssSignVo convertSignInVo(SignInResponseVo responseVo, DssSignV2DTO dto, SysDictData dictData, SignInV1 signInV1) {
        // 初始化DSS签到视图对象
        DssSignVo vo = new DssSignVo();
        // 设置测试ID,即登录响应中的ID
        vo.setTestId(Convert.toStr(responseVo.getId()));

        // 根据签到状态判断测试结果,如果是签到状态区内,则测试结果为2,否则为0
        Integer testResult = bigViewServiceV1.isSignStatusZoneEnum(signInV1.getSignIn()) ? 2 : 0;
        vo.setTestResult(testResult);
        // 如果字典数据为空或测试结果为0且测试值大于字典数据的阈值,则设置测试结果为1
        if (Objects.isNull(dictData) || Objects.equals(testResult, 0) && dto.getTestValue() > Convert.toLong(dictData.getDictValue())) {
            vo.setTestResult(1);
        }

        // 根据签到状态设置结果,如果签到状态为1,则结果为0,否则为1
        Integer result = Objects.equals(1, signInV1.getSignIn().getStatus()) ? 0 : 1;
        vo.setResult(result);

        // 返回转换后的DSS签到视图对象
        return vo;
    }

    private DssSignInV2Vo convertDssSignInV2Vo(SignIn signIn) {
        DssSignInV2Vo vo = new DssSignInV2Vo();
        vo.setId(Convert.toInt(signIn.getId()));
        vo.setStatus(signIn.getStatus());
        vo.setType(signIn.getType());
        vo.setExType(signIn.getExType());
        vo.setAlcoholIntake(Convert.toStr(signIn.getAlcoholIntake()));
        vo.setAlcoholFlag(signIn.getAlcoholFlag());
        vo.setJobCode(signIn.getJobCode());
        vo.setSignInDate(signIn.getCreateTime());

        return vo;
    }
}