|
|
@@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
|
|
|
@@ -33,6 +34,7 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotcarzhbd.IotCarZhbdMapper;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotdailyreportfuel.IotDailyReportFuelMapper;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicerunlog.IotDeviceRunLogMapper;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojectinfo.IotProjectInfoMapper;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
|
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotrhdailyreport.IotRhDailyReportMapper;
|
|
|
import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
|
|
|
@@ -132,6 +134,9 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
private DictDataService dictDataService;
|
|
|
@Resource
|
|
|
private DeptMapper deptMapper;
|
|
|
+ @Resource
|
|
|
+ private IotProjectInfoMapper iotProjectInfoMapper;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -164,7 +169,6 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
teams.add(currentDept[0]);
|
|
|
// 查询增压机状态为非施工的小队
|
|
|
List<IotDeviceDO> teamStatusL = iotOpeationFillMapper.selectDevStatusBatch(teams);
|
|
|
- // System.out.println("无施工设备的队伍:" + currentDept.getName());
|
|
|
|
|
|
// 设置 日报填写状态 审核状态
|
|
|
iotRhDailyReport.setStatus(1);
|
|
|
@@ -173,8 +177,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
|
|
|
// 根据日报的 施工队伍 deptId 查询队伍所在的 项目 任务
|
|
|
// 根据日报的施工状态 更新 对应任务的 状态
|
|
|
- Long taskId = Long.MIN_VALUE;
|
|
|
Set<Long> deviceIds = new HashSet<>();
|
|
|
+
|
|
|
IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
|
|
|
reqVO.setDeptId(createReqVO.getDeptId());
|
|
|
// 只筛选未施工完成的任务
|
|
|
@@ -189,22 +193,49 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
Set<String> zhbdCarIds = new HashSet<>();
|
|
|
// 井号
|
|
|
String wellName;
|
|
|
- if (CollUtil.isNotEmpty(tasks)) {
|
|
|
- // 只查询 未施工完成 的任务 随机获取1个 最好是保持 1个施工队伍只存在于1个任务中
|
|
|
- IotProjectTaskDO task = tasks.get(0);
|
|
|
+
|
|
|
+ // 根据传参赋值 taskId 如果 createReqVO 传参对象中设置了 taskId 说明 填报人已经选择了 任务井 直接保存
|
|
|
+ Long existTaskId = createReqVO.getTaskId();
|
|
|
+ IotProjectTaskDO commonTask = null;
|
|
|
+ if (ObjUtil.isNotEmpty(existTaskId)) {
|
|
|
+ commonTask = iotProjectTaskMapper.selectById(existTaskId);
|
|
|
+ } else {
|
|
|
+ if (CollUtil.isNotEmpty(tasks)) {
|
|
|
+ // 只查询 未施工完成 的任务 随机获取1个 最好是保持 1个施工队伍只存在于1个任务中
|
|
|
+ commonTask = tasks.get(0);
|
|
|
+ } else {
|
|
|
+ // 当前队伍没有关联任务 查询当前部门关联的最新的完工任务 关联上 有可能是已经完工的空日报任务
|
|
|
+ reqVO.setDeptId(createReqVO.getDeptId());
|
|
|
+ // 只筛选未施工完成的任务
|
|
|
+ reqVO.setJobFlag(StrUtil.EMPTY);
|
|
|
+ reqVO.setFinishFlag("Y");
|
|
|
+ // 查询包含当前日报施工队伍的任务
|
|
|
+ List<IotProjectTaskDO> finishedTasks = iotProjectTaskMapper.selectList(reqVO);
|
|
|
+ if (CollUtil.isNotEmpty(finishedTasks)) {
|
|
|
+ // 最新完工的任务位于列表第1个元素
|
|
|
+ IotProjectTaskDO latestTask = finishedTasks.get(0);
|
|
|
+ iotRhDailyReport.setProjectId(latestTask.getProjectId());
|
|
|
+ iotRhDailyReport.setTaskId(latestTask.getId());
|
|
|
+ wellName = latestTask.getWellName();
|
|
|
+ } else {
|
|
|
+ wellName = StrUtil.EMPTY;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjUtil.isNotEmpty(commonTask)) {
|
|
|
// 暂时只考虑1个施工队伍只属于1个任务
|
|
|
- iotRhDailyReport.setProjectId(task.getProjectId());
|
|
|
- iotRhDailyReport.setTaskId(task.getId());
|
|
|
- taskId = task.getId();
|
|
|
- wellName = task.getWellName();
|
|
|
+ iotRhDailyReport.setProjectId(commonTask.getProjectId());
|
|
|
+ iotRhDailyReport.setTaskId(commonTask.getId());
|
|
|
+ wellName = commonTask.getWellName();
|
|
|
// 根据日报状态 查询 日报所属任务的状态
|
|
|
if (ObjUtil.isNotEmpty(createReqVO.getConstructionStatus())) {
|
|
|
- task.setStatus(createReqVO.getConstructionStatus());
|
|
|
+ commonTask.setStatus(createReqVO.getConstructionStatus());
|
|
|
// 更新任务状态
|
|
|
- iotProjectTaskMapper.updateById(task);
|
|
|
+ iotProjectTaskMapper.updateById(commonTask);
|
|
|
}
|
|
|
// 查询任务的设备列表
|
|
|
- deviceIds = task.getDeviceIds();
|
|
|
+ deviceIds = commonTask.getDeviceIds();
|
|
|
IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
|
|
|
deviceReqVO.setDeviceIds(new ArrayList<>(deviceIds));
|
|
|
List<IotDeviceDO> carDevices = iotDeviceMapper.selectListAlone(deviceReqVO);
|
|
|
@@ -253,8 +284,6 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
}
|
|
|
} else {
|
|
|
wellName = StrUtil.EMPTY;
|
|
|
- // 当前队伍没有关联任务 不生成日报
|
|
|
- // throw exception(IOT_PROJECT_TASK_NOT_RELATED);
|
|
|
}
|
|
|
|
|
|
// 查询当前队伍的运行记录 找到注水量 注水时间 赋值到日报的 注水时间
|
|
|
@@ -330,24 +359,6 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- /* if (CollUtil.isNotEmpty(deptDevices)) {
|
|
|
- deptDevices.forEach(device -> {
|
|
|
- deviceCodes.add(device.getDeviceCode());
|
|
|
- });
|
|
|
- // 查询当前小队在运行记录填报结果表中 生产日报虚拟设备id 查询当年的日报
|
|
|
- // 然后根据 虚拟设备id 在 rq_iot_device_run_log 表中查询 日报中填写的 当日注气量
|
|
|
- List<IotOpeationFillDO> reports = iotOpeationFillMapper.selectReportsByYear(createReqVO.getDeptId(), LocalDateTime.now().getYear());
|
|
|
- Set<Long> reportDeviceIds = new HashSet<>();
|
|
|
- if (CollUtil.isNotEmpty(reports)) {
|
|
|
- reports.forEach(report -> {
|
|
|
- reportDeviceIds.add(report.getDeviceId());
|
|
|
- });
|
|
|
- // 累计注气量
|
|
|
- BigDecimal currentYearFillContentSum = iotDeviceRunLogMapper.selectCurrentYearFillContentSum(createReqVO.getDeptId(), reportDeviceIds);
|
|
|
- iotRhDailyReport.setTotalGasInjection(currentYearFillContentSum);
|
|
|
- }
|
|
|
- } */
|
|
|
-
|
|
|
BigDecimal capacity = queryCapacity(createReqVO.getDeptId());
|
|
|
// 计算运行时效 当日注气量/产能
|
|
|
if (ObjUtil.isNotEmpty(createReqVO.getDailyGasInjection()) && (capacity.compareTo(BigDecimal.ZERO)>0)) {
|
|
|
@@ -371,9 +382,9 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
if (ObjUtil.isEmpty(existReport)) {
|
|
|
// 新增日报记录 如果是 无施工设备的队伍 status auditStatus 需要单独处理
|
|
|
if (CollUtil.isNotEmpty(teamStatusL)) {
|
|
|
- // 自动生成的日报 设置 填报完成 审批通过
|
|
|
- iotRhDailyReport.setStatus(1);
|
|
|
- iotRhDailyReport.setAuditStatus(20);
|
|
|
+ // 20260731 修改成 生成的空日报需要再次填报 确认并审核
|
|
|
+ iotRhDailyReport.setStatus(0);
|
|
|
+ iotRhDailyReport.setAuditStatus(0);
|
|
|
// 如果是自动生成的日报 需要根据规则设备 非生产时间
|
|
|
// 设备状态为 "动迁" 时,系统生成的日报里面,非生产时间内的 "生产配合"(relocation_time) 时间为24小时;
|
|
|
// 设备状态为 "完工" 时,系统生成的日报里面,非生产时间内的 "待命"(winter_break_time) 时间为24小时
|
|
|
@@ -512,6 +523,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
Long parentId = currentDept[0].getParentId();
|
|
|
if (ObjUtil.isNotEmpty(parentId)) {
|
|
|
AtomicReference<DeptDO> projectDept = new AtomicReference<>();
|
|
|
+ String finalWellName = wellName;
|
|
|
DataPermissionUtils.executeIgnore(() -> {
|
|
|
projectDept.set(deptService.getDept(parentId));
|
|
|
if (ObjUtil.isNotEmpty(projectDept) && "2".equals(projectDept.get().getType())) {
|
|
|
@@ -546,8 +558,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
if (CollUtil.isNotEmpty(users)) {
|
|
|
// 生成消息提醒标题 部门名称-井号
|
|
|
String msgTitle = currentDept[0].getName();
|
|
|
- if (StrUtil.isNotBlank(wellName)) {
|
|
|
- msgTitle = StrUtil.join("-", msgTitle, wellName);
|
|
|
+ if (StrUtil.isNotBlank(finalWellName)) {
|
|
|
+ msgTitle = StrUtil.join("-", msgTitle, finalWellName);
|
|
|
}
|
|
|
CountDownLatch latch = new CountDownLatch(users.size());
|
|
|
String finalMsgTitle = msgTitle;
|
|
|
@@ -837,11 +849,11 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
IotRhDailyReportDO dailyReport = validateIotRhDailyReportExists(updateReqVO.getId());
|
|
|
dailyReport.setAuditStatus(updateReqVO.getAuditStatus());
|
|
|
dailyReport.setOpinion(updateReqVO.getOpinion());
|
|
|
+ Long deptId = dailyReport.getDeptId();
|
|
|
+ Long taskId = dailyReport.getTaskId();
|
|
|
if (SupplierAuditStatusEnum.REJECT.getStatus().equals(updateReqVO.getAuditStatus())) {
|
|
|
dailyReport.setStatus(0);
|
|
|
// 审批拒绝后需要向 日报填报人 发送消息提醒 每个队伍暂时只有1人 随机取1人
|
|
|
- Long deptId = dailyReport.getDeptId();
|
|
|
- Long taskId = dailyReport.getTaskId();
|
|
|
DeptDO dept = deptService.getDept(deptId);
|
|
|
// 消息标题
|
|
|
String msgTitle = dept.getName();
|
|
|
@@ -864,6 +876,117 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ // 审核同意 将生产异常情况 (npt 工程质量) 发送到拥有 生产异常通知 角色的人员
|
|
|
+ BigDecimal accidentTime = dailyReport.getAccidentTime();
|
|
|
+ if (ObjUtil.isNotEmpty(accidentTime) && accidentTime.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+
|
|
|
+ String companyName = "瑞恒兴域";
|
|
|
+ BigDecimal day = accidentTime.divide(new BigDecimal("24"), 2, RoundingMode.HALF_UP);
|
|
|
+ String accidentDay = day + "T";
|
|
|
+ // 异常情况
|
|
|
+ String malfunction = StrUtil.blankToDefault(dailyReport.getMalfunction(), "无");
|
|
|
+ Long projectId = dailyReport.getProjectId();
|
|
|
+ DeptDO dept = deptService.getDept(deptId);
|
|
|
+ // 查询当前队伍的上级项目部
|
|
|
+ DeptDO projectDept = deptService.getDept(dept.getParentId());
|
|
|
+ // 队伍名称
|
|
|
+ String deptName = ObjUtil.isNotEmpty(dept) ? dept.getName() : StrUtil.EMPTY;
|
|
|
+ // 项目部名称
|
|
|
+ String projectDeptName = ObjUtil.isNotEmpty(projectDept) ? projectDept.getName() : StrUtil.EMPTY;
|
|
|
+ String contract = "无";
|
|
|
+ if (ObjUtil.isNotEmpty(projectId)) {
|
|
|
+ IotProjectInfoDO project = iotProjectInfoMapper.selectById(projectId);
|
|
|
+ if (ObjUtil.isNotEmpty(project)) {
|
|
|
+ contract = project.getContractName();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String wellName = "无";
|
|
|
+ if (ObjUtil.isNotEmpty(taskId)) {
|
|
|
+ IotProjectTaskDO task = iotProjectTaskMapper.selectById(taskId);
|
|
|
+ if (ObjUtil.isNotEmpty(task)) {
|
|
|
+ wellName = task.getWellName();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 当前处理进度 当日施工简报
|
|
|
+ String brief = StrUtil.blankToDefault(dailyReport.getProductionStatus(), "无");
|
|
|
+ // 下步计划
|
|
|
+ String nextPlan = StrUtil.blankToDefault(dailyReport.getNextPlan(), "无");
|
|
|
+ // 故障误工时间 accidentTime H
|
|
|
+ String PRODUCTION_EXCEPTION_MSG_TEMPLATE =
|
|
|
+ "[公司]:{}\n" +
|
|
|
+ "[项目部]:{}\n" +
|
|
|
+ "[队伍]:{}\n" +
|
|
|
+ "[井号]:{}\n" +
|
|
|
+ "[故障描述]:{}\n" +
|
|
|
+ "[当前处理进度]:{}\n" +
|
|
|
+ "[下步处理计划]:{}\n" +
|
|
|
+ "[累计误工时间]:{}\n";
|
|
|
+
|
|
|
+ String finalMsgTitle = StrUtil.format(PRODUCTION_EXCEPTION_MSG_TEMPLATE,
|
|
|
+ companyName, projectDeptName, deptName, wellName,
|
|
|
+ malfunction, brief, nextPlan, accidentDay
|
|
|
+ );
|
|
|
+
|
|
|
+ // 封装以上消息内容 发送到公司 角色 (生产异常通知)
|
|
|
+ // 查询瑞恒 157l 下具有以上角色的人员 查询集团(科瑞石油技术) 拥有以上角色的人员
|
|
|
+ Set<Long> userIds = new HashSet<>();
|
|
|
+ Set<Long> deptIds = new HashSet<>();
|
|
|
+ deptIds.add(157l);
|
|
|
+ List<AdminUserDO> companyUsers = adminUserService.getUserListByDeptIds(deptIds);
|
|
|
+ if (CollUtil.isNotEmpty(companyUsers)) {
|
|
|
+ companyUsers.forEach(user -> {
|
|
|
+ userIds.add(user.getId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ deptIds.clear();
|
|
|
+ deptIds.add(156l);
|
|
|
+ List<AdminUserDO> groupUsers = adminUserService.getUserListByDeptIds(deptIds);
|
|
|
+ if (CollUtil.isNotEmpty(groupUsers)) {
|
|
|
+ groupUsers.forEach(user -> {
|
|
|
+ userIds.add(user.getId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ RoleDO role = roleService.getRoleByCode("生产异常通知");
|
|
|
+ if (ObjUtil.isNotEmpty(role)) {
|
|
|
+ Set<Long> roleIds = new HashSet<>();
|
|
|
+ roleIds.add(role.getId());
|
|
|
+ List<UserRoleDO> userRoles = userRoleMapper.selectListByRoleIds(roleIds);
|
|
|
+ if (CollUtil.isNotEmpty(userRoles)) {
|
|
|
+ // 提取有审批角色的所有用户ID(去重+空值过滤)
|
|
|
+ Set<Long> roleUserIds = userRoles.stream()
|
|
|
+ .map(UserRoleDO::getUserId)
|
|
|
+ .filter(Objects::nonNull) // 过滤空userId
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ // 计算两个集合的交集,得到最终目标用户ID
|
|
|
+ Set<Long> targetUserIds = userIds.stream()
|
|
|
+ .filter(roleUserIds::contains)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ // 异步发送 站内信 钉钉消息
|
|
|
+ if (CollUtil.isNotEmpty(targetUserIds)) {
|
|
|
+ Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(targetUserIds);
|
|
|
+ // 给多个用户发送 相同 的 提醒消息
|
|
|
+ if (CollUtil.isNotEmpty(users)) {
|
|
|
+ // 生成消息提醒 标题内容
|
|
|
+ CountDownLatch latch = new CountDownLatch(users.size());
|
|
|
+ users.forEach((userId, user) -> {
|
|
|
+ pmsThreadPoolTaskExecutor.execute(() -> {
|
|
|
+ try {
|
|
|
+ String mobile = user.getMobile();
|
|
|
+ // 没有手机号也发送站内信消息
|
|
|
+ if (StrUtil.isNotBlank(finalMsgTitle)) {
|
|
|
+ pmsMessage.sendMessage(dailyReport.getId(), finalMsgTitle, PmsConstants.PRODUCTION_EXCEPTION,
|
|
|
+ userId, mobile);
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ latch.countDown();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
// 更新瑞恒日报审核状态
|
|
|
iotRhDailyReportMapper.updateById(dailyReport);
|
|
|
}
|