ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.util.StringUtil;
import com.ycl.config.PlatformConfig;
import com.ycl.exception.ServiceException;
import com.ycl.platform.domain.entity.*;
@@ -26,10 +27,13 @@
import com.ycl.platform.wvp.WVPResult;
import com.ycl.system.Result;
import com.ycl.system.domain.SysConfig;
import com.ycl.system.entity.SysDept;
import com.ycl.system.entity.SysDictData;
import com.ycl.system.mapper.SysConfigMapper;
import com.ycl.system.model.LoginUser;
import com.ycl.system.page.PageUtil;
import com.ycl.system.service.ISysDeptService;
import com.ycl.task.DeleteWorkOrderImgTask;
import com.ycl.utils.DateUtils;
import com.ycl.utils.SecurityUtils;
import com.ycl.utils.http.HttpUtils;
@@ -60,7 +64,9 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import pojo.CascadeOption;
import utils.file.FileUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -104,6 +110,8 @@
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private DeleteWorkOrderImgTask deleteWorkOrderImgTask;
    @Override
    public synchronized Boolean innerAddWorkOrder(List<WorkOrder> workOrderList) {
@@ -215,6 +223,7 @@
        }
        List<String> willAddSerialNumber = waitAddList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList());
        //只生成考核设备、且有运维单位的工单
        List<YwPoint> pointList = new LambdaQueryChainWrapper<>(ywPointService.getBaseMapper())
                .select(YwPoint::getUnitId, YwPoint::getSerialNumber, YwPoint::getImportantTag, YwPoint::getImportantTag, YwPoint::getImportantCommandImageTag)
                .in(YwPoint::getSerialNumber, willAddSerialNumber)
@@ -287,6 +296,7 @@
            }
            log.info("即将生成的工单:{}", workOrder);
        }
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        // 保存工单和故障类型
@@ -583,6 +593,37 @@
        return Result.ok("操作成功");
    }
    @Override
    public Result ywConditionList(WorkOrderYWConditionsForm form) {
        List<WorkOrder> workOrderList = new LambdaQueryChainWrapper<>(baseMapper)
                .in(WorkOrder::getWorkOrderNo,form.getWorkOrderNumbers())
                .list();
        System.out.println("--------------");
        System.out.println(workOrderList);
        if (CollectionUtils.isEmpty(workOrderList)) {
            throw new ServiceException("工单不存在");
        }
        // 工单状态
        for (WorkOrder workOrder : workOrderList) {
            workOrder.setStatus(WorkOrderStatusEnum.YW_HANDLE);
            workOrder.setYwHandleTime(LocalDateTime.now());
        }
        baseMapper.updateMany(workOrderList);
        // 添加一条运维情况记录
        for (WorkOrder workOrder : workOrderList) {
            WorkOrderYwConditionRecord workOrderYwConditionRecord = new WorkOrderYwConditionRecord();
            workOrderYwConditionRecord.setWorkOrderNo(workOrder.getWorkOrderNo());
            workOrderYwConditionRecord.setCommitUser(SecurityUtils.getLoginUser().getUserId().intValue());
            workOrderYwConditionRecord.setYwCondition(form.getYwCondition());
            workOrderYwConditionRecord.setYwProofMaterials(form.getYwProofMaterials());
            workOrderYwConditionRecord.setSysMsg(Boolean.FALSE);
            workOrderYwConditionRecordMapper.insert(workOrderYwConditionRecord);
            WorkOrderServiceImpl self = applicationContext.getBean(WorkOrderServiceImpl.class);
            self.getImage(workOrder);
        }
        return Result.ok("操作成功");
    }
    @Async("threadPoolTaskExecutor")
    public void getImage(WorkOrder workOrder) {
        List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper)
@@ -605,9 +646,41 @@
            img.setWorkOrderNo(workOrder.getWorkOrderNo());
            img.setImgUrl(frameImg);
            img.setCreateTime(new Date());
            //保留最新的5张
            workOrderCheckImgMapper.insert(img);
        }
    }
    /**
     * 清理工单图片
     * */
    public void clearWorkOrderImg(String workOrderNo) {
        //判断该工单的图片是否已经大于5张了
        //按照创建日期降序排列
        if (StringUtil.isEmpty(workOrderNo)) {
            return;
        }
        List<WorkOrderCheckImg> workOrderList = new LambdaQueryChainWrapper<WorkOrderCheckImg>(workOrderCheckImgMapper)
                .select()
                .eq(WorkOrderCheckImg::getWorkOrderNo, workOrderNo)
                .orderByDesc(WorkOrderCheckImg::getCreateTime)
                .list();
        if (workOrderList.size()>=5){
            List<String> imgList = workOrderList.subList(4,workOrderList.size()).stream().map(WorkOrderCheckImg::getImgUrl).collect(Collectors.toList());
            List<Integer> idList = workOrderList.subList(4, workOrderList.size()).stream().map(WorkOrderCheckImg::getId).collect(Collectors.toList());
            //删除照片 ,并且物理删除服务器内对应照片的名字
//                /profile/2024-11-18_1d8e6d37-a4d0-4bba-8473-ff4e50eda83d.png
            log.error("删除工单照片集合url:{}",imgList);
            log.error("删除工单存储数据集合id:{}",idList);
            for (String filePath: imgList){
                delImgFormClient(filePath);
            }
            workOrderCheckImgMapper.deleteBatchIds(idList);
        }
    }
    @Override
    public List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(String workOrderNo) {
@@ -650,9 +723,29 @@
    @Override
    public Result remove(List<String> ids) {
        if (baseMapper.deleteBatchIds(ids) > 0) {
            //批量删除是否被用到?
            return Result.ok("删除成功");
        }
        return Result.error("删除失败");
    }
    /***
     * 通过url删除服务器内的图片
     * @param url
     */
    public void delImgFormClient(String url){
        //提取文件名  /profile/2024-11-17_79c02666-da1e-45ba-9f29-7523c848fa4a.png
        // 这部分2024-11-17_79c02666-da1e-45ba-9f29-7523c848fa4a.png
        String imgPath = FileUtils.getImgName(url);
        if (imgPath.isEmpty()){
            log.error("url错误:{}",imgPath);
        }else{
            //提取日期部分 组装目录 : /opt/zgyw/uploadPath  + /  + yyyy-MM-dd +
            String pathName = DeleteWorkOrderImgTask.imgSaveBasePath + "/" + FileUtils.extractDateFromString(url);
            log.error("删除工单图片集合{}",pathName+"/" + imgPath);
            FileUtils.deleteFile(pathName+"/" + imgPath);
        }
    }
    /**
@@ -667,6 +760,18 @@
        String workOrderNo = workOrder.getWorkOrderNo();
        //删除工单审核记录
        workOrderAuditingRecordMapper.delete(new QueryWrapper<WorkOrderAuditingRecord>().eq("work_order_no", workOrderNo));
        //需要物理删除服务器中的图片
        //查询到工单照片集合
        List<String> workOrderImg = workOrderCheckImgMapper
                .selectList(new QueryWrapper<WorkOrderCheckImg>().eq("work_order_no", workOrderNo))
                .stream().map(WorkOrderCheckImg::getImgUrl).collect(Collectors.toList());
        log.error("删除工单图片集合:{}",workOrderImg);
        log.error("删除路径:{}",PlatformConfig.getUploadPath());
        for (String filePath: workOrderImg){
            delImgFormClient(filePath);
        }
        //删除工单图片记录
        workOrderCheckImgMapper.delete(new QueryWrapper<WorkOrderCheckImg>().eq("work_order_no", workOrderNo));
        //删除工单下发记录
@@ -682,6 +787,9 @@
        return Result.error("删除失败");
    }
    private final ISysDeptService deptService;
    /**
     * 分页查询
     *
@@ -690,6 +798,24 @@
     */
    @Override
    public Result page(WorkOrderQuery query) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysDept sysDept = null;
        Long deptId =null;
        if (loginUser.getDeptId() != null){
            deptId = loginUser.getDeptId();
            sysDept = deptService.selectDeptById(deptId);
        }
        //查询指定区数据
        // 登录账号的存在部门 不在部门内就不传值,默认查询全部
        if (sysDept !=null){
            //更具部门id获得对应枚举 部门code
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query.setDept(areaDeptEnum.getCode());
            }
        }
        IPage<WorkOrderVO> page = PageUtil.getPage(query, WorkOrderVO.class);
        if (query.getUnitId() == null) {
            query.setUnitId(SecurityUtils.getUnitId());
@@ -742,6 +868,11 @@
        if (query.getEnd() != null) query.setEnd(DateUtils.getDayEnd(query.getEnd()));
        baseMapper.distributePage(page, query);
        return Result.ok().data(page).total(page.getTotal());
    }
    @Override
    public List<WorkOrderVO> distributeList(){
        return  baseMapper.distributeList();
    }
    @Override
@@ -800,6 +931,9 @@
            distributeUnLock();
        }
    }
    @Override
    @Transactional
@@ -1147,6 +1281,11 @@
    @Override
    public Result detailByNo(String workOrderNo) {
        WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo);
        //报空原因1. sql 中 inner join 表 t_work_order_distribute_record 中 无与该表关联的记录 wo.work_order_no = dr.work_order_no
        if(workOrder == null){
            workOrder = baseMapper.detailByNoButNoDistributeRecord(workOrderNo);
        }
        // 是否报备
        boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper)
                .eq(Report::getSerialNumber, workOrder.getSerialNumber())
@@ -1156,6 +1295,8 @@
        List<SysDictData> errorList = workOrderErrorTypeService.getBaseMapper().getErrorList(workOrder.getWorkOrderNo());
        List<String> errList = errorList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList());
        workOrder.setErrorTypeList(errList);
        //详情时再次清理
        clearWorkOrderImg(workOrderNo);
        // 检测图片
        List<WorkOrderCheckImg> imgList = new LambdaQueryChainWrapper<>(workOrderCheckImgMapper)
                .eq(WorkOrderCheckImg::getWorkOrderNo, workOrderNo)