diff --git a/sql/mysql/mes_data2.sql b/sql/mysql/mes_data2.sql index f677cc5922..6cfc7af2ba 100644 --- a/sql/mysql/mes_data2.sql +++ b/sql/mysql/mes_data2.sql @@ -51,6 +51,7 @@ CREATE TABLE `mes_energy_device_check_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', `device_id` bigint NOT NULL COMMENT '能源设备Id', + `device_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '设备类型', `last_check_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上次抄表时间', `last_check_value` decimal(24, 6) DEFAULT NULL COMMENT '上次抄表值', `check_value` decimal(24, 6) DEFAULT NULL COMMENT '抄表值', @@ -70,3 +71,5 @@ CREATE TABLE `mes_energy_device_check_record` DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC COMMENT ='抄表记录'; + + diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordPageReqVO.java index 04090f8daf..b5de505941 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordPageReqVO.java @@ -20,6 +20,8 @@ public class EnergyDeviceCheckRecordPageReqVO extends PageParam { @Schema(description = "能源设备Id", example = "17334") private Long deviceId; + @Schema(description = "设备类型", example = "1") + private String deviceType; @Schema(description = "抄表时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordRespVO.java index 319b0b81a2..f66e3c8328 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordRespVO.java @@ -16,7 +16,9 @@ public class EnergyDeviceCheckRecordRespVO { @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13646") @ExcelProperty("ID") private Long id; - + @Schema(description = "设备类型", example = "1") + @ExcelProperty("设备类型") + private String deviceType; @Schema(description = "能源设备Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17334") @ExcelProperty("能源设备Id") private Long deviceId; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordSaveReqVO.java index 755f0df67b..60a988dcf4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceCheckRecordSaveReqVO.java @@ -13,7 +13,8 @@ public class EnergyDeviceCheckRecordSaveReqVO { @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13646") private Long id; - + @Schema(description = "设备类型", example = "1") + private String deviceType; @Schema(description = "能源设备Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17334") @NotNull(message = "能源设备Id不能为空") private Long deviceId; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskItemNeedController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskItemNeedController.java index a096611261..2f9fdce1e5 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskItemNeedController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/TaskItemNeedController.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO; import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskPlanParam; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; import cn.iocoder.yudao.module.mes.service.bom.BomService; import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemAnalysisService; import cn.iocoder.yudao.module.mes.service.itemrequisition.entity.ItemRequisitionAndStock; @@ -38,6 +40,8 @@ public class TaskItemNeedController { @Resource private PlanService planService; @Resource + private PlanMapper planMapper; + @Resource private ErpProductService productService; @Resource private BomService bomService; @@ -130,4 +134,33 @@ public class TaskItemNeedController { else return dateTimes[index]; } + + /** + * taskId 为明细id + * 对生产任务单明细进行计划,以每个计划的产品数优先排产ProductsOfPlan + * 排出的计划数超过选定的天数,则后续计划堆积在最后一天 + **/ + @GetMapping("/generate-plan/byTaskDetail") + @Operation(summary = "对生产任务单进行计划") + public CommonResult> generatePlanByTaskDetail(@Valid TaskPlanParam planParam) { + if(planParam.getPlanDate() != null){ + //对得到的日期做一下排序,防止拿到的是乱序日期 + Arrays.sort(planParam.getPlanDate(), Comparator.naturalOrder()); + } + TaskDetailDO detailDO = taskService.getTaskDetail(planParam.getTaskId()); + //已经计划数 planMapper.selectSumTaskDetail(detailDO.getId(),null); + Long number = planParam.getPlanNumber(); + if(number==null)number = detailDO.getNumber(); + //生成计划 + List planList = taskService.generatePlan3(detailDO.getTaskId(),detailDO.getId(), + detailDO.getProductId(), number, planParam.getProductsOfPlan()); + //计划排日期 + int dateCount = 0; + for (int i = 0; i < planList.size(); i++) { + planList.get(i).setPlanEndTime(getNextDate(dateCount, planParam.getPlanDate())); + planList.get(i).setPlanStartTime(getNextDate(dateCount, planParam.getPlanDate())); + dateCount++; + } + return success(planService.buildVOList(planList)); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java index fd478d7c44..9be3c2c75c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskDetailRespVO.java @@ -38,6 +38,10 @@ public class TaskDetailRespVO { @ExcelProperty("数量") private Long number; + @Schema(description = "已计划", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("已计划数量") + private Long planNumber; + @Schema(description = "打包要求(每包/个)", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("打包要求(每包/个)") private Long packageSize; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPlanParam.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPlanParam.java index a47000f0f8..9d39974794 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPlanParam.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/task/vo/TaskPlanParam.java @@ -20,7 +20,8 @@ public class TaskPlanParam { private int sizeOfPlan; @Schema(description = "计划产品数") private int productsOfPlan; - + @Schema(description = "需要计划的数") + private Long planNumber ; @Schema(description = "日期") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/energydevice/EnergyDeviceCheckRecordDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/energydevice/EnergyDeviceCheckRecordDO.java index 71025438d1..3f7e5bc1ba 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/energydevice/EnergyDeviceCheckRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/energydevice/EnergyDeviceCheckRecordDO.java @@ -33,6 +33,8 @@ public class EnergyDeviceCheckRecordDO extends BaseDO { * 能源设备Id */ private Long deviceId; + //@Schema(description = "设备类型", example = "1") + private String deviceType; /** * 上次抄表时间 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java index 4ea09b87bf..67e34a2f57 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/plan/PlanMapper.java @@ -98,5 +98,16 @@ public interface PlanMapper extends BaseMapperX { @Update("UPDATE mes_plan SET status = #{status} WHERE id = #{id}") void updateStatus(@Param("id") Long id, @Param("status") Integer status); - + default Long selectSumTaskDetail(Long taskDetailId, List statusList) { + // SQL sum 查询 + List> result = selectMaps(new QueryWrapper() + .select("SUM(plan_number) AS sumCount") + .in(statusList != null && statusList.size() > 0, "status", statusList) + .eq(taskDetailId != null, "task_detail_id", taskDetailId)); + // 获得数量 + if (CollUtil.isEmpty(result)) { + return 0L; + } + return MapUtil.getLong(result.get(0), "sumCount", 0L); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java index 8318b92877..a6e0ee568c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java @@ -64,7 +64,7 @@ public class BomServiceImpl implements BomService { if (createReqVO.getIsEnable()) { BomDO temp = bomMapper.selectByProductId(createReqVO.getProductId()); if (temp != null) { - throw exception(new ErrorCode(500, "每个产品启用的BOM只能有一个,请先禁用改产品其他BOM!")); + throw exception(BOM_EXISTS); } } // 插入 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceCheckRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceCheckRecordServiceImpl.java index 7f9201221a..36fc5d26b0 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceCheckRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceCheckRecordServiceImpl.java @@ -43,8 +43,9 @@ public class EnergyDeviceCheckRecordServiceImpl implements EnergyDeviceCheckReco EnergyDeviceCheckRecordDO energyDeviceCheckRecord = BeanUtils.toBean(createReqVO, EnergyDeviceCheckRecordDO.class); energyDeviceCheckRecord.setLastCheckTime(energyDeviceDO.getLastCheckTime()); energyDeviceCheckRecord.setLastCheckValue(energyDeviceDO.getLastCheckValue()); - - BigDecimal diff = energyDeviceCheckRecord.getCheckValue().subtract(energyDeviceDO.getLastCheckValue()).abs(); + energyDeviceCheckRecord.setDeviceType(energyDeviceDO.getDeviceType()); + BigDecimal last = energyDeviceDO.getLastCheckValue()==null? BigDecimal.ZERO : energyDeviceDO.getLastCheckValue(); + BigDecimal diff = energyDeviceCheckRecord.getCheckValue().subtract(last).abs(); energyDeviceCheckRecord.setDiffValue(diff); energyDeviceCheckRecordMapper.insert(energyDeviceCheckRecord); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java index 0b9769d686..67b69aebb8 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java @@ -15,6 +15,9 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.ENERGY_DEVICE_CHECK_RECORD_NOT_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.ENERGY_DEVICE_NOT_EXISTS; @@ -87,8 +90,26 @@ public class EnergyDeviceServiceImpl implements EnergyDeviceService { } @Override + @Transactional(rollbackFor = Exception.class) public Long createEnergyDeviceCheckRecord(EnergyDeviceCheckRecordDO energyDeviceCheckRecord) { + if(energyDeviceCheckRecord.getCheckTime()==null) + energyDeviceCheckRecord.setCheckTime(LocalDateTime.now()); + EnergyDeviceDO energyDeviceDO = energyDeviceMapper.selectById(energyDeviceCheckRecord.getDeviceId()); + // 插入 + ; + energyDeviceCheckRecord.setLastCheckTime(energyDeviceDO.getLastCheckTime()); + energyDeviceCheckRecord.setLastCheckValue(energyDeviceDO.getLastCheckValue()); + energyDeviceCheckRecord.setDeviceType(energyDeviceDO.getDeviceType()); + BigDecimal last = energyDeviceDO.getLastCheckValue()==null? BigDecimal.ZERO : energyDeviceDO.getLastCheckValue(); + + BigDecimal diff = energyDeviceCheckRecord.getCheckValue().subtract(last).abs(); + energyDeviceCheckRecord.setDiffValue(diff); energyDeviceCheckRecordMapper.insert(energyDeviceCheckRecord); + + energyDeviceDO.setLastCheckTime(energyDeviceCheckRecord.getCheckTime()); + energyDeviceDO.setLastCheckValue(energyDeviceCheckRecord.getCheckValue()); + energyDeviceMapper.updateById(energyDeviceDO); + // 返回 return energyDeviceCheckRecord.getId(); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java index 8a5d6cd6cb..a0d70c3c45 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskService.java @@ -160,4 +160,8 @@ public interface TaskService { */ List generatePlan2(Long taskId, Long productId, Long totalNumber, int productsOfPlan); + /** + * 根据任务单明细id,产品id,产品总数,计划数量,每个计划产品数生成planDO + * */ + List generatePlan3(Long taskId,Long taskDetailId, Long productId, Long totalNumber, int productsOfPlan); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java index d0949ef889..daade4fcf6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/task/TaskServiceImpl.java @@ -197,12 +197,18 @@ public class TaskServiceImpl implements TaskService { Map unitMap = productUnitService.getProductUnitMap( convertSet(list, TaskDetailDO::getUnitId)); - return BeanUtils.toBean(list, TaskDetailRespVO.class, item -> { + List resList = BeanUtils.toBean(list, TaskDetailRespVO.class, item -> { MapUtils.findAndThen(map, item.getProductId(), product -> item.setProductName(product.getName())); MapUtils.findAndThen(unitMap, item.getUnitId(), unit -> item.setUnitName(unit.getName())); }); + for (TaskDetailRespVO respVO : resList) { + Long number = planMapper.selectSumTaskDetail(respVO.getId(),null); + respVO.setPlanNumber(number); + } + + return resList; } @Override @@ -275,5 +281,22 @@ public class TaskServiceImpl implements TaskService { } return list; } - + //根据生产任务单明细生成排产计划 + @Override + public List generatePlan3(Long taskId,Long taskDetailId, Long productId, Long totalNumber, int productsOfPlan) { + List list = new ArrayList<>(); + for (; totalNumber > 0; ) { + PlanDO planDO = new PlanDO().setTaskId(taskId).setTaskDetailId(taskDetailId).setProductId(productId).setFinishNumber(0L) + .setIsEnable(true).setStatus(PlanStatusEnum.计划.getValue()); + //剩下的不一定满productsOfPlan, + if (totalNumber - productsOfPlan >= 0) + planDO.setPlanNumber((long) productsOfPlan); + else planDO.setPlanNumber((long) totalNumber); + totalNumber = totalNumber - productsOfPlan; + planDO.setCode(noRedisDAO.generate3(MesNoRedisDAO.PLAN_NO_PREFIX)); + planDO.setPriorityNum(1L); + list.add(planDO); + } + return list; + } } \ No newline at end of file