|
|
@@ -0,0 +1,222 @@
|
|
|
+package com.platform.service.repair.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import com.github.pagehelper.PageHelper;
|
|
|
+import com.platform.common.exception.BusinessException;
|
|
|
+import com.platform.common.model.UserInfo;
|
|
|
+import com.platform.common.util.IdGeneratorUtils;
|
|
|
+import com.platform.common.util.SecurityUtils;
|
|
|
+import com.platform.common.util.StringUtils;
|
|
|
+import com.platform.dao.bean.MyVOPage;
|
|
|
+import com.platform.dao.dto.repair.RepairEntrustDTO;
|
|
|
+import com.platform.dao.entity.repair.RepairApplicationForm;
|
|
|
+import com.platform.dao.entity.repair.RepairEntrust;
|
|
|
+import com.platform.dao.entity.upms.SysFile;
|
|
|
+import com.platform.dao.enums.RepairApplicationFormStatusEnum;
|
|
|
+import com.platform.dao.enums.RepairEntrustStatusEnum;
|
|
|
+import com.platform.dao.enums.SysFileTypeEnum;
|
|
|
+import com.platform.dao.mapper.repair.RepairApplicationFormMapper;
|
|
|
+import com.platform.dao.mapper.repair.RepairEntrustMapper;
|
|
|
+import com.platform.dao.mapper.upms.SysFileMapper;
|
|
|
+import com.platform.dao.vo.repair.RepairEntrustVO;
|
|
|
+import com.platform.service.base.impl.BaseServiceImpl;
|
|
|
+import com.platform.service.repair.RepairEntrustService;
|
|
|
+import com.platform.service.util.SysFileUtils;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import tk.mybatis.mapper.entity.Example;
|
|
|
+import tk.mybatis.mapper.weekend.Weekend;
|
|
|
+import tk.mybatis.mapper.weekend.WeekendCriteria;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description 委外单 Service 实现类
|
|
|
+ */
|
|
|
+@AllArgsConstructor
|
|
|
+@Service("repairEntrustService")
|
|
|
+@Slf4j
|
|
|
+public class RepairEntrustServiceImpl
|
|
|
+ extends BaseServiceImpl<RepairEntrustMapper, RepairEntrust, RepairEntrustDTO>
|
|
|
+ implements RepairEntrustService {
|
|
|
+
|
|
|
+ private final RepairApplicationFormMapper repairApplicationFormMapper;
|
|
|
+ private final SysFileMapper sysFileMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建委外单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void createEntrust(RepairEntrustDTO dto) {
|
|
|
+ // 1. 校验工单是否存在且状态为维修中
|
|
|
+ RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(dto.getRepairId());
|
|
|
+ if (applicationForm == null) {
|
|
|
+ throw new BusinessException("工单不存在");
|
|
|
+ }
|
|
|
+ if (!RepairApplicationFormStatusEnum.PROCESSING.getValue().equals(applicationForm.getStatus())) {
|
|
|
+ throw new BusinessException("工单当前状态不允许委外,仅维修中的工单可以委外");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 生成委外单号
|
|
|
+ int count = getCountByDTO(new RepairEntrustDTO());
|
|
|
+ String entrustNo = IdGeneratorUtils.getEntrustNo(++count);
|
|
|
+ if (StringUtils.isNotBlank(dto.getEntrustNo())) {
|
|
|
+ entrustNo = dto.getEntrustNo();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 获取当前登录用户作为委外申请人
|
|
|
+ UserInfo userInfo = SecurityUtils.getUserInfo();
|
|
|
+
|
|
|
+ // 4. 创建委外单记录
|
|
|
+ RepairEntrust entrust = new RepairEntrust();
|
|
|
+ entrust.setId(IdGeneratorUtils.getObjectId());
|
|
|
+ entrust.setRepairId(dto.getRepairId());
|
|
|
+ entrust.setEntrustNo(entrustNo);
|
|
|
+ entrust.setOutType(dto.getOutType());
|
|
|
+ entrust.setEntrustUserId(userInfo.getUserId());
|
|
|
+ entrust.setRepairUserId(dto.getRepairUserId());
|
|
|
+ entrust.setReason(dto.getReason());
|
|
|
+ entrust.setStatus(RepairEntrustStatusEnum.PROCESSING.getValue());
|
|
|
+ entrust.setCreatedTime(LocalDateTime.now());
|
|
|
+ entrust.setUpdateTime(LocalDateTime.now());
|
|
|
+ entrust.setCreatedUserId(userInfo.getUserId());
|
|
|
+ entrust.setUpdateUserId(userInfo.getUserId());
|
|
|
+ mapper.insertSelective(entrust);
|
|
|
+
|
|
|
+ // 5. 更新原工单状态为委外维修中
|
|
|
+ applicationForm.setStatus(RepairApplicationFormStatusEnum.ENTRUST_REPAIR.getValue());
|
|
|
+ applicationForm.setUpdateTime(LocalDateTime.now());
|
|
|
+ repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 完成委外单
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void finishEntrust(RepairEntrustDTO dto) {
|
|
|
+ // 1. 查询委外单
|
|
|
+ RepairEntrust entrust = mapper.selectByPrimaryKey(dto.getId());
|
|
|
+ if (entrust == null) {
|
|
|
+ throw new BusinessException("委外单不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 校验状态
|
|
|
+ if (!RepairEntrustStatusEnum.PROCESSING.getValue().equals(entrust.getStatus())) {
|
|
|
+ throw new BusinessException("委外单当前状态不允许完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 校验维修情况必填
|
|
|
+ if (StringUtils.isBlank(dto.getFinishRemark())) {
|
|
|
+ throw new BusinessException("维修情况不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 保存完成图片/附件
|
|
|
+ saveFinishFile(dto);
|
|
|
+
|
|
|
+ // 5. 更新委外单状态为已完成
|
|
|
+ entrust.setStatus(RepairEntrustStatusEnum.FINISHED.getValue());
|
|
|
+ entrust.setFinishRemark(dto.getFinishRemark());
|
|
|
+ entrust.setFinishTime(LocalDateTime.now());
|
|
|
+ entrust.setUpdateTime(LocalDateTime.now());
|
|
|
+ UserInfo userInfo = SecurityUtils.getUserInfo();
|
|
|
+ entrust.setUpdateUserId(userInfo.getUserId());
|
|
|
+ mapper.updateByPrimaryKeySelective(entrust);
|
|
|
+
|
|
|
+ // 6. 更新原工单状态回到维修中
|
|
|
+ RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(entrust.getRepairId());
|
|
|
+ if (applicationForm != null) {
|
|
|
+ applicationForm.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
|
|
|
+ applicationForm.setUpdateTime(LocalDateTime.now());
|
|
|
+ repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据工单ID查询委外单列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<RepairEntrustVO> getByRepairId(String repairId) {
|
|
|
+ return mapper.selectByRepairId(repairId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取委外单详情(含文件)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public RepairEntrustVO getDetailById(String id) {
|
|
|
+ RepairEntrustVO vo = mapper.selectDetailById(id);
|
|
|
+ if (vo != null) {
|
|
|
+ // 加载完成图片
|
|
|
+ vo.setFinishFileList(getFileListByType(id, SysFileTypeEnum.ENTRUST_FINISH_IMGS.getValue()));
|
|
|
+ // 加载完成附件
|
|
|
+ vo.setFinishAttachmentList(getFileListByType(id, SysFileTypeEnum.ENTRUST_FINISH_FILES.getValue()));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询委外单列表(权限过滤)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public MyVOPage<RepairEntrustVO> selectPageList(RepairEntrustDTO dto, int pageNum, int pageSize) {
|
|
|
+ // 清除可能残留的分页参数,避免线程复用导致分页污染其他查询
|
|
|
+ PageHelper.clearPage();
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ try {
|
|
|
+ // 设置当前用户ID用于权限过滤
|
|
|
+ UserInfo userInfo = SecurityUtils.getUserInfo();
|
|
|
+ dto.setCurrentUserId(userInfo.getUserId());
|
|
|
+ return new MyVOPage<>(mapper.selectPageList(dto));
|
|
|
+ } finally {
|
|
|
+ PageHelper.clearPage();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存完成时的图片/附件
|
|
|
+ */
|
|
|
+ private void saveFinishFile(RepairEntrustDTO dto) {
|
|
|
+ // 保存完成图片
|
|
|
+ if (CollectionUtil.isNotEmpty(dto.getFinishFileList())) {
|
|
|
+ Weekend<SysFile> weekend = new Weekend<>(SysFile.class);
|
|
|
+ weekend.weekendCriteria()
|
|
|
+ .andEqualTo(SysFile::getType, SysFileTypeEnum.ENTRUST_FINISH_IMGS.getValue())
|
|
|
+ .andEqualTo(SysFile::getTargetId, dto.getId());
|
|
|
+ sysFileMapper.deleteByExample(weekend);
|
|
|
+ List<SysFile> list = SysFileUtils.changeFileList(
|
|
|
+ dto.getFinishFileList(), dto.getId(), SysFileTypeEnum.ENTRUST_FINISH_IMGS.getValue());
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ sysFileMapper.insertListforComplex(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 保存完成附件
|
|
|
+ if (CollectionUtil.isNotEmpty(dto.getFinishAttachmentList())) {
|
|
|
+ Weekend<SysFile> weekend = new Weekend<>(SysFile.class);
|
|
|
+ weekend.weekendCriteria()
|
|
|
+ .andEqualTo(SysFile::getType, SysFileTypeEnum.ENTRUST_FINISH_FILES.getValue())
|
|
|
+ .andEqualTo(SysFile::getTargetId, dto.getId());
|
|
|
+ sysFileMapper.deleteByExample(weekend);
|
|
|
+ List<SysFile> list = SysFileUtils.changeFileList(
|
|
|
+ dto.getFinishAttachmentList(), dto.getId(), SysFileTypeEnum.ENTRUST_FINISH_FILES.getValue());
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ sysFileMapper.insertListforComplex(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据类型获取文件列表
|
|
|
+ */
|
|
|
+ private List<SysFile> getFileListByType(String targetId, Integer type) {
|
|
|
+ Weekend<SysFile> weekend = new Weekend<>(SysFile.class);
|
|
|
+ WeekendCriteria<SysFile, Object> weekendCriteria = weekend.weekendCriteria();
|
|
|
+ weekendCriteria.andEqualTo(SysFile::getTargetId, targetId)
|
|
|
+ .andEqualTo(SysFile::getType, type);
|
|
|
+ return sysFileMapper.selectByExample(weekend);
|
|
|
+ }
|
|
|
+}
|