fix feeding and plan

plp
chenshuichuan 2 years ago
parent cf4edd9277
commit 99d03b80b5

@ -203,20 +203,20 @@ CREATE TABLE `mes_feeding_record`
CREATE TABLE `mes_feeding_record_detail` CREATE TABLE `mes_feeding_record_detail`
( (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`record_id` bigint DEFAULT NULL COMMENT '记录id', `record_id` bigint DEFAULT NULL COMMENT '记录id',
`item_id` bigint DEFAULT NULL COMMENT '原料id', `item_id` bigint DEFAULT NULL COMMENT '原料id',
`weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量',
`unit_id` bigint DEFAULT NULL COMMENT '单位', `unit_id` bigint DEFAULT NULL COMMENT '单位',
`user_id` bigint DEFAULT NULL COMMENT '记录人', `user_id` bigint DEFAULT NULL COMMENT '记录人',
`feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ) ENGINE = InnoDB
AUTO_INCREMENT = 2 AUTO_INCREMENT = 2
@ -226,25 +226,48 @@ CREATE TABLE `mes_feeding_record_detail`
CREATE TABLE `mes_feeding_record_plan` CREATE TABLE `mes_feeding_record_plan`
( (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`record_id` bigint DEFAULT NULL COMMENT '记录id', `record_id` bigint DEFAULT NULL COMMENT '记录id',
`record_detail_id` bigint DEFAULT NULL COMMENT '记录明细id', `record_detail_id` bigint DEFAULT NULL COMMENT '记录明细id',
`plan_id` bigint DEFAULT NULL COMMENT '计划id', `plan_id` bigint DEFAULT NULL COMMENT '计划id',
`item_id` bigint DEFAULT NULL COMMENT '原料id', `item_id` bigint DEFAULT NULL COMMENT '原料id',
`weight` decimal(24, 6) DEFAULT NULL COMMENT '重量', `weight` decimal(24, 6) DEFAULT NULL COMMENT '重量',
`unit_id` bigint DEFAULT NULL COMMENT '单位', `unit_id` bigint DEFAULT NULL COMMENT '单位',
`user_id` bigint DEFAULT NULL COMMENT '记录人', `user_id` bigint DEFAULT NULL COMMENT '记录人',
`feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间', `feeding_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '投料时间',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT ='投料记录分配计划';
CREATE TABLE `mes_error_record`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '标题',
`location` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '位置',
`exception` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '异常',
`pre_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '前数据',
`post_data` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '后数据',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ) ENGINE = InnoDB
AUTO_INCREMENT = 2 AUTO_INCREMENT = 2
DEFAULT CHARSET = utf8mb4 DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT ='投料记录分配计划'; ROW_FORMAT = DYNAMIC COMMENT ='错误记录';

@ -16,14 +16,12 @@ public class ErpPurchaseOrderSaveReqVO {
private Long id; private Long id;
@Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1724") @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1724")
@NotNull(message = "供应商编号不能为空")
private Long supplierId; private Long supplierId;
@Schema(description = "结算账户编号", example = "31189") @Schema(description = "结算账户编号", example = "31189")
private Long accountId; private Long accountId;
@Schema(description = "采购时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "采购时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "采购时间不能为空")
private LocalDateTime orderTime; private LocalDateTime orderTime;
@Schema(description = "优惠率,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "99.88") @Schema(description = "优惠率,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "99.88")

@ -46,7 +46,7 @@ public interface ErpProductMapper extends BaseMapperX<ErpProductDO> {
/**查询不同类型的产品**/ /**查询不同类型的产品**/
default List<ErpProductDO> selectByCategorys(List<Integer> categoryIds){ default List<ErpProductDO> selectByCategorys(List<Integer> categoryIds){
return selectList(new QueryWrapper<ErpProductDO>() return selectList(new QueryWrapper<ErpProductDO>()
.eq("is_enable", true) .eq("status", 0)
.in("category_id" ,categoryIds)); .in("category_id" ,categoryIds));
} }
} }

@ -1,5 +1,17 @@
package cn.iocoder.yudao.module.mes.controller.admin.feedingplan; package cn.iocoder.yudao.module.mes.controller.admin.feedingplan;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService;
import cn.iocoder.yudao.module.mes.service.plan.PlanService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -20,6 +32,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO;
@ -37,6 +50,16 @@ public class FeedingRecordPlanController {
@Resource @Resource
private FeedingRecordPlanService feedingRecordPlanService; private FeedingRecordPlanService feedingRecordPlanService;
@Resource
private ErpProductService productService;
@Resource
private ErpProductUnitService productUnitService;
@Resource
private AdminUserApi adminUserApi;
@Resource
private PlanService planService;
@Resource
private FeedingRecordService feedingRecordService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建投料分配计划") @Operation(summary = "创建投料分配计划")
@ -75,8 +98,10 @@ public class FeedingRecordPlanController {
@Operation(summary = "获得投料分配计划分页") @Operation(summary = "获得投料分配计划分页")
@PreAuthorize("@ss.hasPermission('mes:feeding-record-plan:query')") @PreAuthorize("@ss.hasPermission('mes:feeding-record-plan:query')")
public CommonResult<PageResult<FeedingRecordPlanRespVO>> getFeedingRecordPlanPage(@Valid FeedingRecordPlanPageReqVO pageReqVO) { public CommonResult<PageResult<FeedingRecordPlanRespVO>> getFeedingRecordPlanPage(@Valid FeedingRecordPlanPageReqVO pageReqVO) {
PageResult<FeedingRecordPlanRespVO> pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO);
return success(pageResult); PageResult<FeedingRecordPlanDO> pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO);
PageResult<FeedingRecordPlanRespVO> pageResult1 = new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal());
return success(pageResult1);
} }
@GetMapping("/export-excel") @GetMapping("/export-excel")
@ -86,10 +111,42 @@ public class FeedingRecordPlanController {
public void exportFeedingRecordPlanExcel(@Valid FeedingRecordPlanPageReqVO pageReqVO, public void exportFeedingRecordPlanExcel(@Valid FeedingRecordPlanPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<FeedingRecordPlanRespVO> list = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO).getList(); List<FeedingRecordPlanDO> list = feedingRecordPlanService.getFeedingRecordPlanPage(pageReqVO).getList();
List<FeedingRecordPlanRespVO> list1 = buildVOList(list);
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "投料分配计划.xls", "数据", FeedingRecordPlanRespVO.class, ExcelUtils.write(response, "投料分配计划.xls", "数据", FeedingRecordPlanRespVO.class,
list); list1);
}
private List<FeedingRecordPlanRespVO> buildVOList(List<FeedingRecordPlanDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, FeedingRecordPlanDO::getItemId));
Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap(
convertSet(list, FeedingRecordPlanDO::getUnitId));
// 1.4 管理员信息
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, FeedingRecordPlanDO::getUserId));
//投料单
Map<Long, FeedingRecordDO> recordMap = feedingRecordService.getRecordMap(
convertSet(list, FeedingRecordPlanDO::getRecordId));
//生产计划
Map<Long, PlanDO> planMap = planService.getPlanMap(
convertSet(list, FeedingRecordPlanDO::getPlanId));
return BeanUtils.toBean(list, FeedingRecordPlanRespVO.class, item -> {
MapUtils.findAndThen(map, item.getItemId(),
product -> item.setItemName(product.getName()));
MapUtils.findAndThen(unitMap, item.getUnitId(),
unit -> item.setUnitName(unit.getName()));
MapUtils.findAndThen(userMap, item.getUserId(),
user -> item.setUserName(user.getNickname()));
MapUtils.findAndThen(recordMap, item.getRecordId(),
record -> item.setRecordCode(record.getFeedingRecordCode()));
MapUtils.findAndThen(planMap, item.getPlanId(),
plan -> item.setPlanCode(plan.getCode()));
});
} }
} }

@ -1,5 +1,12 @@
package cn.iocoder.yudao.module.mes.controller.admin.feedingrecord; package cn.iocoder.yudao.module.mes.controller.admin.feedingrecord;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper;
import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService;
import cn.iocoder.yudao.module.mes.service.plan.PlanService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -14,18 +21,21 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.FEEDING_RECORD_NOT_EXISTS;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO;
import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService; import cn.iocoder.yudao.module.mes.service.feedingrecord.FeedingRecordService;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
@ -103,12 +113,54 @@ public class FeedingRecordController {
List< FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(recordId); List< FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(recordId);
return success(feedingRecordService.buildVOList(detailDOList)); return success(feedingRecordService.buildVOList(detailDOList));
} }
@Resource
private FeedingRecordMapper feedingRecordMapper;
@Resource
private ItemRequisitionService itemRequisitionService;
@Resource
private PlanService planService;
@PutMapping("/update-status") @PutMapping("/update-status")
@Operation(summary = "提交状态") @Operation(summary = "提交状态")
public CommonResult<Boolean> updateStatus(@RequestParam("id") Long id, public CommonResult<Boolean> updateStatus(@RequestParam("id") Long id,
@RequestParam("status") String status) { @RequestParam("status") String status) {
feedingRecordService.updateStatus(id, status); LoginUser user = SecurityFrameworkUtils.getLoginUser();
return success(true); if(user!=null){
FeedingRecordDO recordDO = feedingRecordMapper.selectById(id);
if(recordDO==null) throw exception(FEEDING_RECORD_NOT_EXISTS);
//后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理
if(recordDO.getFeedingType().equals(FeedingTypeEnum..getValue())) {
List<FeedingRecordDetailDO> detailDOList = feedingRecordService.getFeedingRecordDetailListByRecordId(id);
//计划及计划物料需求
List<Integer> statusList = new ArrayList<>();
statusList.add(PlanStatusEnum..getValue());
//获取正在开工的计划,按照计划完工时间从小到大排序,优先分配给最近计划完工的计划。
List<PlanDO> planDOList = planService.getPlanByStatusAndPipeline(statusList,recordDO.getFeedingPipeline());
Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap = new HashMap<>();
Map<String, ItemRequisitionDetailRespVO> planItemMap = new HashMap<>();
for (int i = 0; i < planDOList.size(); i++) {
//获取计划的物料需求
List<ItemRequisitionDetailRespVO> list = itemRequisitionService.getItemRequisitionList(planDOList.get(i).getId());
planItemListMap.put(planDOList.get(i).getId(), list);
for (ItemRequisitionDetailRespVO respVO: list ) {
String key = getMapKey(planDOList.get(i).getId(), respVO.getProductId());
planItemMap.put(key, respVO);
}
}
feedingRecordService.updateStatus(recordDO,detailDOList, status , user.getId(),planDOList,
planItemListMap, planItemMap);
}
else {
recordDO.setRecordStatus(FeedingStatusEnum..getValue());
feedingRecordMapper.updateById(recordDO);
}
return success(true);
}
else return CommonResult.error(500,"无法获取操作用户!请检查!");
}
private String getMapKey(Long planId, Long itemId){
return planId + "-" + itemId;
} }
} }

@ -50,4 +50,7 @@ public class ItemRequisitionPageReqVO extends PageParam {
@Schema(description = "领料人ID",example = "15546") @Schema(description = "领料人ID",example = "15546")
private Long workerId; private Long workerId;
@Schema(description = "制浆线")
private String feedingPipeline;
} }

@ -59,4 +59,8 @@ public class ItemRequisitionRespVO {
@Schema(description = "领料人ID",example = "15546") @Schema(description = "领料人ID",example = "15546")
private Long workerId; private Long workerId;
@Schema(description = "制浆线")
@ExcelProperty("制浆线")
private String feedingPipeline;
} }

@ -47,4 +47,6 @@ public class ItemRequisitionSaveReqVO {
@Schema(description = "领料人ID",example = "15546") @Schema(description = "领料人ID",example = "15546")
private Long workerId; private Long workerId;
@Schema(description = "制浆线")
private String feedingPipeline;
} }

@ -65,4 +65,6 @@ public class PlanPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
@Schema(description = "制浆线")
private String feedingPipeline;
} }

@ -87,4 +87,7 @@ public class PlanRespVO {
@ExcelProperty("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "制浆线")
@ExcelProperty("创建时间")
private String feedingPipeline;
} }

@ -59,5 +59,6 @@ public class PlanSaveReqVO {
@Schema(description = "是否启用") @Schema(description = "是否启用")
private Boolean isEnable; private Boolean isEnable;
@Schema(description = "制浆线")
private String feedingPipeline;
} }

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition; package cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
@ -65,4 +66,8 @@ public class ItemRequisitionDO extends BaseDO {
private Long workerId; private Long workerId;
// @Schema(description = "制浆线")
// @ExcelProperty("制浆线")
private String feedingPipeline;
} }

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.plan; package cn.iocoder.yudao.module.mes.dal.dataobject.plan;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -91,5 +92,7 @@ public class PlanDO extends BaseDO {
* {@link TODO infra_boolean_string } * {@link TODO infra_boolean_string }
*/ */
private Boolean isEnable; private Boolean isEnable;
//@Schema(description = "制浆线")
private String feedingPipeline;
} }

@ -29,6 +29,7 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.eqIfPresent(PlanDO::getPlanNumber, reqVO.getPlanNumber()) .eqIfPresent(PlanDO::getPlanNumber, reqVO.getPlanNumber())
.eqIfPresent(PlanDO::getFinishNumber, reqVO.getFinishNumber()) .eqIfPresent(PlanDO::getFinishNumber, reqVO.getFinishNumber())
.eqIfPresent(PlanDO::getStatus, reqVO.getStatus()) .eqIfPresent(PlanDO::getStatus, reqVO.getStatus())
.eqIfPresent(PlanDO::getFeedingPipeline, reqVO.getFeedingPipeline())
.betweenIfPresent(PlanDO::getPlanStartTime, reqVO.getPlanStartTime()) .betweenIfPresent(PlanDO::getPlanStartTime, reqVO.getPlanStartTime())
.betweenIfPresent(PlanDO::getPlanEndTime, reqVO.getPlanEndTime()) .betweenIfPresent(PlanDO::getPlanEndTime, reqVO.getPlanEndTime())
.betweenIfPresent(PlanDO::getStartTime, reqVO.getStartTime()) .betweenIfPresent(PlanDO::getStartTime, reqVO.getStartTime())
@ -37,7 +38,8 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.eqIfPresent(PlanDO::getRemark, reqVO.getRemark()) .eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
.eqIfPresent(PlanDO::getIsEnable, reqVO.getIsEnable()) .eqIfPresent(PlanDO::getIsEnable, reqVO.getIsEnable())
.betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PlanDO::getId)); .orderByDesc(PlanDO::getPlanStartTime)
.orderByDesc(PlanDO::getPlanEndTime));
} }
default PlanDO selectByNo(String no) { default PlanDO selectByNo(String no) {
return selectOne(PlanDO::getCode, no); return selectOne(PlanDO::getCode, no);
@ -71,4 +73,7 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
default List<PlanDO> selectBy(List<Integer> statusList) { default List<PlanDO> selectBy(List<Integer> statusList) {
return selectList(PlanDO::getStatus, statusList); return selectList(PlanDO::getStatus, statusList);
} }
default List<PlanDO> selectBy(List<Integer> statusList, String pipeline) {
return selectList(PlanDO::getStatus, statusList, PlanDO::getFeedingPipeline, pipeline);
}
} }

@ -51,6 +51,6 @@ public interface FeedingRecordPlanService {
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<FeedingRecordPlanRespVO> getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO); PageResult<FeedingRecordPlanDO> getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO);
BigDecimal selectSumBy(Long planId, Long itemId); BigDecimal selectSumBy(Long planId, Long itemId);
} }

@ -46,16 +46,7 @@ public class FeedingRecordPlanServiceImpl implements FeedingRecordPlanService {
@Resource @Resource
private FeedingRecordPlanMapper feedingRecordPlanMapper; private FeedingRecordPlanMapper feedingRecordPlanMapper;
@Resource
private ErpProductService productService;
@Resource
private ErpProductUnitService productUnitService;
@Resource
private AdminUserApi adminUserApi;
@Resource
private PlanService planService;
@Resource
private FeedingRecordService feedingRecordService;
@Override @Override
public Long createFeedingRecordPlan(FeedingRecordPlanSaveReqVO createReqVO) { public Long createFeedingRecordPlan(FeedingRecordPlanSaveReqVO createReqVO) {
@ -95,42 +86,10 @@ public class FeedingRecordPlanServiceImpl implements FeedingRecordPlanService {
} }
@Override @Override
public PageResult<FeedingRecordPlanRespVO> getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO) { public PageResult<FeedingRecordPlanDO> getFeedingRecordPlanPage(FeedingRecordPlanPageReqVO pageReqVO) {
PageResult<FeedingRecordPlanDO> pageResult = feedingRecordPlanMapper.selectPage(pageReqVO); return feedingRecordPlanMapper.selectPage(pageReqVO);
return new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal());
} }
private List<FeedingRecordPlanRespVO> buildVOList(List<FeedingRecordPlanDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, ErpProductDO> map = productService.getProductMap(
convertSet(list, FeedingRecordPlanDO::getItemId));
Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap(
convertSet(list, FeedingRecordPlanDO::getUnitId));
// 1.4 管理员信息
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, FeedingRecordPlanDO::getUserId));
//投料单
Map<Long, FeedingRecordDO> recordMap = feedingRecordService.getRecordMap(
convertSet(list, FeedingRecordPlanDO::getRecordId));
//生产计划
Map<Long, PlanDO> planMap = planService.getPlanMap(
convertSet(list, FeedingRecordPlanDO::getPlanId));
return BeanUtils.toBean(list, FeedingRecordPlanRespVO.class, item -> {
MapUtils.findAndThen(map, item.getItemId(),
product -> item.setItemName(product.getName()));
MapUtils.findAndThen(unitMap, item.getUnitId(),
unit -> item.setUnitName(unit.getName()));
MapUtils.findAndThen(userMap, item.getUserId(),
user -> item.setUnitName(user.getNickname()));
MapUtils.findAndThen(recordMap, item.getRecordId(),
record -> item.setRecordCode(record.getFeedingRecordCode()));
MapUtils.findAndThen(planMap, item.getPlanId(),
plan -> item.setPlanCode(plan.getCode()));
});
}
@Override @Override
public BigDecimal selectSumBy(Long planId, Long itemId){ public BigDecimal selectSumBy(Long planId, Long itemId){
return feedingRecordPlanMapper.selectSumBy(planId,itemId); return feedingRecordPlanMapper.selectSumBy(planId,itemId);

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.feedingrecord;
import java.util.*; import java.util.*;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -73,7 +74,9 @@ public interface FeedingRecordService {
if(ids.isEmpty())return new HashMap<>(); if(ids.isEmpty())return new HashMap<>();
return convertMap(getFeedingRecordList(ids), FeedingRecordDO::getId); return convertMap(getFeedingRecordList(ids), FeedingRecordDO::getId);
} }
void updateStatus(Long id, String status); void updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
,List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
Map<String, ItemRequisitionDetailRespVO> planItemMap);
//提交、反提交投料记录单 //提交、反提交投料记录单

@ -7,13 +7,18 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.FeedingRecordPlanRespVO; import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.FeedingRecordPlanRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.StockWorkShopTypeEnum; import cn.iocoder.yudao.module.mes.controller.admin.stockworkshop.vo.StockWorkShopTypeEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO; import cn.iocoder.yudao.module.mes.dal.dataobject.stockworkshop.StockWorkshopDO;
import cn.iocoder.yudao.module.mes.dal.mysql.feedingplan.FeedingRecordPlanMapper;
import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO; import cn.iocoder.yudao.module.mes.dal.redis.no.MesNoRedisDAO;
import cn.iocoder.yudao.module.mes.service.feedingplan.FeedingRecordPlanService; import cn.iocoder.yudao.module.mes.service.feedingplan.FeedingRecordPlanService;
import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService;
import cn.iocoder.yudao.module.mes.service.plan.PlanService; import cn.iocoder.yudao.module.mes.service.plan.PlanService;
import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopDetailService; import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopDetailService;
import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService; import cn.iocoder.yudao.module.mes.service.stockworkshop.StockWorkshopService;
@ -24,6 +29,8 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.*; import java.util.*;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
@ -38,6 +45,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordDetailMa
import javax.annotation.Resource; import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@ -65,11 +73,10 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
@Resource @Resource
private FeedingRecordPlanService recordPlanService; private FeedingRecordPlanService recordPlanService;
@Resource @Resource
private StockWorkshopService workshopService; private FeedingRecordPlanMapper recordPlanMapper;
@Resource
private StockWorkshopDetailService workshopDetailService;
@Resource @Resource
private PlanService planService; private StockWorkshopService workshopService;
@Override @Override
@ -80,6 +87,7 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
FeedingRecordDO feedingRecord = BeanUtils.toBean(createReqVO, FeedingRecordDO.class); FeedingRecordDO feedingRecord = BeanUtils.toBean(createReqVO, FeedingRecordDO.class);
feedingRecord.setRecordStatus(FeedingStatusEnum.稿.getValue()); feedingRecord.setRecordStatus(FeedingStatusEnum.稿.getValue());
feedingRecordMapper.insert(feedingRecord); feedingRecordMapper.insert(feedingRecord);
//todo 检查投料原料项如果不是kg则转为kg
// 插入子表 // 插入子表
createFeedingRecordDetailList(feedingRecord.getId(), createReqVO.getFeedingRecordDetails()); createFeedingRecordDetailList(feedingRecord.getId(), createReqVO.getFeedingRecordDetails());
@ -183,34 +191,123 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
* **/ * **/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateStatus(Long id, String status) { public void updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
FeedingRecordDO recordDO = feedingRecordMapper.selectById(id); ,List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
if(recordDO==null) throw exception(FEEDING_RECORD_NOT_EXISTS); Map<String, ItemRequisitionDetailRespVO> planItemMap) {
//后续步骤只处理领料投料的投料单,湿废品和干废品投料暂不处理
if(!recordDO.getFeedingType().equals(FeedingTypeEnum..getValue()))
return;
List<FeedingRecordDetailDO> detailDOList = getFeedingRecordDetailListByRecordId(id);
List<Integer> statusList = new ArrayList<>();
statusList.add(PlanStatusEnum..getValue());
List<PlanDO> planDOList = planService.getPlanByStatus(statusList);
if(status.equals(FeedingStatusEnum..getValue())) { if(status.equals(FeedingStatusEnum..getValue())) {
//detailDOMap 汇总投料原料
Map<Long, FeedingRecordDetailDO>detailDOMap = new HashMap<>();
for (FeedingRecordDetailDO recordDetailDO: detailDOList) { for (FeedingRecordDetailDO recordDetailDO: detailDOList) {
//车间仓投料出库
StockWorkshopDO workshopDO = new StockWorkshopDO() StockWorkshopDO workshopDO = new StockWorkshopDO()
.setItemId(recordDetailDO.getItemId()) .setItemId(recordDetailDO.getItemId())
.setCount(recordDetailDO.getWeight().multiply(BigDecimal.valueOf(-1))) .setCount(recordDetailDO.getWeight().multiply(BigDecimal.valueOf(-1)))
.setCategoryId(1L); .setCategoryId(1L);
workshopService.updateStock(workshopDO, StockWorkShopTypeEnum..getValue(), workshopService.updateStock(workshopDO, StockWorkShopTypeEnum..getValue(),
recordDO.getId(), recordDO.getFeedingRecordCode()); recordDO.getId(), recordDO.getFeedingRecordCode());
//合并同原料
if(detailDOMap.containsKey(recordDetailDO.getItemId())){
BigDecimal totalWeight = detailDOMap.get(recordDetailDO.getItemId()).getWeight()
.add(recordDetailDO.getWeight());
detailDOMap.get(recordDetailDO.getItemId()).setWeight(totalWeight);
}else detailDOMap.put(recordDetailDO.getItemId(), recordDetailDO);
} }
dealPlan(detailDOMap,recordDO, userId, planDOList, planItemListMap, planItemMap);
} }
//todo 需要回退吗? //todo 需要回退吗?
else if(status.equals(FeedingStatusEnum.稿.getValue())) { else if(status.equals(FeedingStatusEnum.稿.getValue())) {
} }
} }
private void dealPlan(Map<Long, FeedingRecordDetailDO> detailDOMap , FeedingRecordDO recordDO, Long userId,
List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
Map<String, ItemRequisitionDetailRespVO> planItemMap){
MathContext mc = new MathContext(3, RoundingMode.HALF_UP);
//分配计划
//totalPlanNeedItem记录所有计划需要的该原料总数用于最后按比例分配原料
Map<Long, BigDecimal>totalPlanNeedItem = new HashMap<>();
//recordPlanDOMap 记录已分配计划id原料id对应的分配量同计划id原料id的合并为一个记录最终插入数据库
Map<String, FeedingRecordPlanDO> recordPlanDOMap = new HashMap<>();
for (int i = 0; i < planDOList.size(); i++) {
List<ItemRequisitionDetailRespVO> list = planItemListMap.get(planDOList.get(i).getId());
for(ItemRequisitionDetailRespVO respVO: list){
//原料需要分配
int cp = respVO.getNumber().compareTo(respVO.getFinishNumber());
if(detailDOMap.containsKey(respVO.getProductId())
&& detailDOMap.get(respVO.getProductId()).getWeight().compareTo(BigDecimal.ZERO) > 0
&& cp > 0 ){
FeedingRecordDetailDO detailDO = detailDOMap.get(respVO.getProductId());
BigDecimal weight = respVO.getNumber().subtract(respVO.getFinishNumber(), mc);
//投料不能满足计划需求,则对该计划投料为实际投料数量, 否则满足,为需求数量
if(weight.compareTo(detailDO.getWeight()) > 0 ){
weight = detailDO.getWeight();
}
//未分配投料数量减少
detailDO.setWeight(detailDO.getWeight().subtract(weight));
String key = getMapKey(planDOList.get(i).getId(), respVO.getProductId());
if(recordPlanDOMap.containsKey(key)){
//正常来说单个计划再做物料分析的时候只会产生一条ItemRequisitionDetailRespVO
recordPlanDOMap.get(key).setWeight( recordPlanDOMap.get(key).getWeight().add(weight));
}else{
FeedingRecordPlanDO recordPlanDO = new FeedingRecordPlanDO()
.setPlanId(planDOList.get(i).getId())
.setItemId(respVO.getProductId())
.setRecordId(recordDO.getId()).setUserId(userId).setUnitId(respVO.getUnitId())
.setRecordDetailId(respVO.getId()).setFeedingTime(detailDO.getFeedingTime())
.setWeight(weight);
recordPlanDOMap.put(key, recordPlanDO);
}
}
if(totalPlanNeedItem.containsKey(respVO.getProductId())){
BigDecimal totalNumber = totalPlanNeedItem.get(respVO.getProductId()).add(respVO.getNumber());
totalPlanNeedItem.put(respVO.getProductId(), totalNumber);
}else totalPlanNeedItem.put(respVO.getProductId(), respVO.getNumber());
}
}
dealLast(detailDOMap, recordDO.getId(), userId, planDOList, totalPlanNeedItem, recordPlanDOMap, planItemMap);
//插入
recordPlanMapper.insertBatch(recordPlanDOMap.values());
}
//处理剩余未分配原料按照totalPlanNeedItem 比例分配到每个计划
private Map<String, FeedingRecordPlanDO> dealLast(Map<Long, FeedingRecordDetailDO> detailDOMap, Long recordId, Long userId
, List<PlanDO> planDOList, Map<Long, BigDecimal>totalPlanNeedItem, Map<String, FeedingRecordPlanDO> recordPlanDOMap ,
Map<String, ItemRequisitionDetailRespVO> planItemMap){
MathContext mc = new MathContext(5, RoundingMode.HALF_UP);
for (Long itemId : detailDOMap.keySet()) {
//原料有未分配数量
if(detailDOMap.get(itemId).getWeight().compareTo(BigDecimal.ZERO) <= 0)continue;
BigDecimal factor = detailDOMap.get(itemId).getWeight().divide(totalPlanNeedItem.get(itemId), mc);
for (PlanDO plan : planDOList) {
ItemRequisitionDetailRespVO detailRespVO = planItemMap.get(getMapKey(plan.getId(),itemId));
//该计划不需要这种物料
if(detailRespVO==null){
System.out.println("~~~~~~~计算出错!~~~~~~");
continue;
}
BigDecimal weight = factor.multiply(detailRespVO.getNumber());
String key = getMapKey(plan.getId(), itemId);
if(recordPlanDOMap.containsKey(key)){
recordPlanDOMap.get(key).setWeight( recordPlanDOMap.get(key).getWeight().add(weight));
}else{
FeedingRecordPlanDO recordPlanDO = new FeedingRecordPlanDO()
.setPlanId(plan.getId()).setItemId(itemId)
.setRecordId(recordId).setUserId(userId).setUnitId(detailRespVO.getUnitId())
.setRecordDetailId(detailDOMap.get(itemId).getId())
.setFeedingTime(detailDOMap.get(itemId).getFeedingTime())
.setWeight(weight);
recordPlanDOMap.put(key, recordPlanDO);
}
}
}
return recordPlanDOMap;
}
private String getMapKey(Long planId, Long itemId){
return planId + "-" + itemId;
}
} }

@ -65,5 +65,7 @@ public interface ItemRequisitionService {
List<ItemRequisitionDetailDO> getItemRequisitionDetailListByItemRequisitionId(Long itemRequisitionId); List<ItemRequisitionDetailDO> getItemRequisitionDetailListByItemRequisitionId(Long itemRequisitionId);
List<ItemRequisitionDetailRespVO> buildDetailVOList(List<ItemRequisitionDetailDO> list, Long planId); List<ItemRequisitionDetailRespVO> buildDetailVOList(List<ItemRequisitionDetailDO> list, Long planId);
ItemRequisitionDetailRespVO getItemRequisition(Long planId, Long itemId); ItemRequisitionDetailRespVO getItemRequisitionDetailRespVO(Long planId, Long itemId);
List<ItemRequisitionDetailRespVO> getItemRequisitionList(Long planId);
} }

@ -163,12 +163,12 @@ public class ItemRequisitionServiceImpl implements ItemRequisitionService {
} }
@Override @Override
public ItemRequisitionDetailRespVO getItemRequisition(Long planId, Long itemId){ public ItemRequisitionDetailRespVO getItemRequisitionDetailRespVO(Long planId, Long itemId){
ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectByPlanId(planId); ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectByPlanId(planId);
if(itemRequisitionDO != null){ if(itemRequisitionDO != null){
ItemRequisitionDetailDO detailDO = ItemRequisitionDetailDO detailDO =
itemRequisitionDetailMapper.selectBy(itemRequisitionDO.getId(), itemId); itemRequisitionDetailMapper.selectBy(itemRequisitionDO.getId(), itemId);
if(detailDO == null) return null;
ItemRequisitionDetailRespVO respVO = new ItemRequisitionDetailRespVO() ItemRequisitionDetailRespVO respVO = new ItemRequisitionDetailRespVO()
.setItemRequisitionId(itemRequisitionDO.getId()) .setItemRequisitionId(itemRequisitionDO.getId())
.setUnitId(detailDO.getUnitId()) .setUnitId(detailDO.getUnitId())
@ -179,4 +179,23 @@ public class ItemRequisitionServiceImpl implements ItemRequisitionService {
} }
return null; return null;
} }
@Override
public List<ItemRequisitionDetailRespVO> getItemRequisitionList(Long planId){
ItemRequisitionDO itemRequisitionDO = itemRequisitionMapper.selectByPlanId(planId);
List<ItemRequisitionDetailRespVO> respVOList = new ArrayList<>();
if(itemRequisitionDO != null){
List<ItemRequisitionDetailDO> detailDOList =
itemRequisitionDetailMapper.selectListByItemRequisitionId(itemRequisitionDO.getId());
for (ItemRequisitionDetailDO detailDO :detailDOList) {
ItemRequisitionDetailRespVO respVO = new ItemRequisitionDetailRespVO()
.setItemRequisitionId(itemRequisitionDO.getId())
.setUnitId(detailDO.getUnitId())
.setNumber(detailDO.getNumber())
.setProductId(detailDO.getProductId());
respVO.setFinishNumber(recordPlanService.selectSumBy(planId, detailDO.getProductId()));
respVOList.add(respVO);
}
}
return respVOList;
}
} }

@ -73,4 +73,5 @@ public interface PlanService {
} }
List<PlanDO> getPlanByStatus(List<Integer> statusList); List<PlanDO> getPlanByStatus(List<Integer> statusList);
List<PlanDO> getPlanByStatusAndPipeline(List<Integer> statusList, String pipeline);
} }

@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
@ -159,6 +160,8 @@ public class PlanServiceImpl implements PlanService {
//更新计划状态 //更新计划状态
planDO.setStatus(PlanStatusEnum..getValue()); planDO.setStatus(PlanStatusEnum..getValue());
planDO.setIsEnable(true); planDO.setIsEnable(true);
planDO.setFeedingPipeline(saveReqVO.getFeedingPipeline());
planDO.setStartTime(LocalDateTime.now());
planMapper.updateById(planDO); planMapper.updateById(planDO);
return true; return true;
} }
@ -171,4 +174,9 @@ public class PlanServiceImpl implements PlanService {
public List<PlanDO> getPlanByStatus(List<Integer> statusList){ public List<PlanDO> getPlanByStatus(List<Integer> statusList){
return planMapper.selectBy(statusList); return planMapper.selectBy(statusList);
} }
@Override
public List<PlanDO> getPlanByStatusAndPipeline(List<Integer> statusList, String pipeline){
return planMapper.selectBy(statusList,pipeline);
}
} }

@ -150,7 +150,7 @@ public class FeedingRecordPlanServiceImplTest extends BaseDbUnitTest {
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用 // 调用
PageResult<FeedingRecordPlanRespVO> pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(reqVO); PageResult<FeedingRecordPlanDO> pageResult = feedingRecordPlanService.getFeedingRecordPlanPage(reqVO);
// 断言 // 断言
assertEquals(1, pageResult.getTotal()); assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size()); assertEquals(1, pageResult.getList().size());

Loading…
Cancel
Save