handle batch plan

plp
chenshuichuan 2 years ago
parent f8edb0cb1c
commit b0af17d955

@ -17,6 +17,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@ -89,5 +91,13 @@ public class PlanController {
// 导出 Excel
ExcelUtils.write(response, "生产计划.xls", "数据", PlanRespVO.class, list);
}
@PostMapping("/saveBatchPlan")
@Operation(summary = "批量新增计划")
public CommonResult<Boolean> saveBatchPlan(@RequestBody List<PlanDO> planDOList) {
Boolean result = planService.saveBatchPlan(planDOList);
if(result)
return success(result);
else
return error(500, "insert error");
}
}

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.mes.controller.admin.plan.vo;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PlanStatusEnum {
(0),
(1),
(2),
(3),
(4),
(5);
private final int value;
// 一个可选的方法,用于根据整数值获取对应的枚举实例
public static PlanStatusEnum fromValue(int value) {
for (PlanStatusEnum status : PlanStatusEnum.values()) {
if (status.getValue() == value) {
return status;
}
}
throw new IllegalArgumentException("Unknown value: " + value);
}
}

@ -41,14 +41,12 @@ public class SaleOrderController {
@PostMapping("/create")
@Operation(summary = "创建销售订单")
@PreAuthorize("@ss.hasPermission('mes:sale-order:create')")
public CommonResult<Long> createSaleOrder(@Valid @RequestBody SaleOrderSaveReqVO createReqVO) {
return success(saleOrderService.createSaleOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新销售订单")
@PreAuthorize("@ss.hasPermission('mes:sale-order:update')")
public CommonResult<Boolean> updateSaleOrder(@Valid @RequestBody SaleOrderSaveReqVO updateReqVO) {
saleOrderService.updateSaleOrder(updateReqVO);
return success(true);
@ -57,7 +55,6 @@ public class SaleOrderController {
@DeleteMapping("/delete")
@Operation(summary = "删除销售订单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:sale-order:delete')")
public CommonResult<Boolean> deleteSaleOrder(@RequestParam("id") Long id) {
saleOrderService.deleteSaleOrder(id);
return success(true);
@ -66,7 +63,6 @@ public class SaleOrderController {
@GetMapping("/get")
@Operation(summary = "获得销售订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('mes:sale-order:query')")
public CommonResult<SaleOrderRespVO> getSaleOrder(@RequestParam("id") Long id) {
SaleOrderDO saleOrder = saleOrderService.getSaleOrder(id);
return success(BeanUtils.toBean(saleOrder, SaleOrderRespVO.class));
@ -74,7 +70,6 @@ public class SaleOrderController {
@GetMapping("/page")
@Operation(summary = "获得销售订单分页")
@PreAuthorize("@ss.hasPermission('mes:sale-order:query')")
public CommonResult<PageResult<SaleOrderRespVO>> getSaleOrderPage(@Valid SaleOrderPageReqVO pageReqVO) {
PageResult<SaleOrderRespVO> pageResult = saleOrderService.getSaleOrderPage(pageReqVO);
return success(pageResult);
@ -82,7 +77,6 @@ public class SaleOrderController {
@GetMapping("/export-excel")
@Operation(summary = "导出销售订单 Excel")
@PreAuthorize("@ss.hasPermission('mes:sale-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportSaleOrderExcel(@Valid SaleOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
@ -98,7 +92,6 @@ public class SaleOrderController {
@GetMapping("/sale-order-items/page")
@Operation(summary = "获得销售订单项分页")
@Parameter(name = "orderId", description = "销售订单编号")
@PreAuthorize("@ss.hasPermission('mes:sale-order:query')")
public CommonResult<PageResult<SaleOrderItemsRespVO>> getSaleOrderItemsPage(PageParam pageReqVO,
@RequestParam("orderId") Long orderId) {
return success(saleOrderService.getSaleOrderItemsPage(pageReqVO, orderId));
@ -106,14 +99,12 @@ public class SaleOrderController {
@PostMapping("/sale-order-items/create")
@Operation(summary = "创建销售订单项")
@PreAuthorize("@ss.hasPermission('mes:sale-order:create')")
public CommonResult<Long> createSaleOrderItems(@Valid @RequestBody SaleOrderItemsDO saleOrderItems) {
return success(saleOrderService.createSaleOrderItems(saleOrderItems));
}
@PutMapping("/sale-order-items/update")
@Operation(summary = "更新销售订单项")
@PreAuthorize("@ss.hasPermission('mes:sale-order:update')")
public CommonResult<Boolean> updateSaleOrderItems(@Valid @RequestBody SaleOrderItemsDO saleOrderItems) {
saleOrderService.updateSaleOrderItems(saleOrderItems);
return success(true);
@ -122,7 +113,6 @@ public class SaleOrderController {
@DeleteMapping("/sale-order-items/delete")
@Parameter(name = "id", description = "编号", required = true)
@Operation(summary = "删除销售订单项")
@PreAuthorize("@ss.hasPermission('mes:sale-order:delete')")
public CommonResult<Boolean> deleteSaleOrderItems(@RequestParam("id") Long id) {
saleOrderService.deleteSaleOrderItems(id);
return success(true);
@ -131,9 +121,14 @@ public class SaleOrderController {
@GetMapping("/sale-order-items/get")
@Operation(summary = "获得销售订单项")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:sale-order:query')")
public CommonResult<SaleOrderItemsDO> getSaleOrderItems(@RequestParam("id") Long id) {
return success(saleOrderService.getSaleOrderItems(id));
}
@GetMapping("/sale-order-items/getByOrderId")
@Operation(summary = "获得销售订单项")
@Parameter(name = "orderId", description = "订单编号", required = true)
public CommonResult<List<SaleOrderItemsRespVO>> getByOrderId(@RequestParam("orderId") Long orderId) {
List<SaleOrderItemsRespVO> list = saleOrderService.getSaleOrderItemsByOrderId(orderId);
return success(list);
}
}

@ -1,12 +1,16 @@
package cn.iocoder.yudao.module.mes.controller.admin.task;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.mes.controller.admin.bom.vo.BomSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.task.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO;
@ -28,8 +32,10 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -83,4 +89,51 @@ public class TaskItemNeedController {
List<ItemRequisitionAndStock> list = itemAnalysisService.getItemAnalysis(productId,number);
return success(list);
}
/**
* ,ProductsOfPlan
*
* **/
@GetMapping("/generate-plan/byTask")
@Operation(summary = "对生产任务单进行计划")
public CommonResult<List<PlanRespVO>> generatePlanByTask(@Valid TaskPlanParam planParam) {
System.out.println("planParam:"+planParam.toString());
int sizeOfPlan = planParam.getPlanDate()!=null? planParam.getPlanDate().length : 0;
Map<Long, List<PlanDO>> planMap = taskService.generatePlan(planParam.getTaskId(), sizeOfPlan, planParam.getProductsOfPlan());
List<PlanDO> list = new ArrayList<>();
//拿到已经存在的计划排最后面的未完成的计划看planMap有无同类产品该产品就排最前
PlanDO planDO = planService.selectLastOne();
Long lastProductId = planDO!=null? planDO.getProductId() : 0;
int dateCount = 0;
if(lastProductId>0 && planMap.containsKey(lastProductId)){
List<PlanDO> planDOList = planMap.get(lastProductId);
for (int i = 0; i< planDOList.size(); i++){
planDOList.get(i).setPlanEndTime(getNextDate(dateCount, planParam.getPlanDate()) );
planDOList.get(i).setPlanStartTime(getNextDate(dateCount, planParam.getPlanDate()) );
dateCount++;
}
list.addAll(planDOList);
}
//遍历剩下的产品
for (Long productId: planMap.keySet()) {
if(lastProductId>0 && productId.equals(lastProductId))continue;
List<PlanDO> planDOList = planMap.get(productId);
for (int i = 0; i< planDOList.size(); i++){
planDOList.get(i).setPlanEndTime(getNextDate(dateCount, planParam.getPlanDate()) );
planDOList.get(i).setPlanStartTime(getNextDate(dateCount, planParam.getPlanDate()) );
dateCount++;
}
list.addAll(planDOList);
}
return success(planService.buildVOList(list));
}
//根据下标取值返回日期天数,如果下标超出则返回最后一天,如果不给定日期,则默认从今天开始
private LocalDateTime getNextDate(int index, LocalDateTime[] dateTimes){
if(dateTimes == null)return LocalDateTime.now().plusDays(index);
else if(index >= dateTimes.length) return dateTimes[dateTimes.length-1];
else return dateTimes[index];
}
}

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.mes.controller.admin.task.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "生产任务单做计划 VO")
@Data
@ToString(callSuper = true)
public class TaskPlanParam {
@Schema(description = "任务id")
private Long taskId;
@Schema(description = "计划数")
private int sizeOfPlan;
@Schema(description = "计划产品数")
private int productsOfPlan;
@Schema(description = "日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] planDate;
}

@ -59,4 +59,16 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
}
return MapUtil.getLong(result.get(0), "sumCount", 0L);
}
/**查询按日期排序最后一个未完成(已经下达)的计划**/
default PlanDO selectLastOne(){
List<Integer> status = new ArrayList<>();
status.add(PlanStatusEnum..getValue());
status.add(PlanStatusEnum..getValue());
status.add(PlanStatusEnum..getValue());
return selectOne(new QueryWrapper<PlanDO>()
.eq("is_enable", true)
.in("status" ,status)
.orderByDesc("plan_end_time")
.last("limit 1"));
}
}

@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.validation.Valid;
import java.util.List;
/**
* Service
@ -50,5 +51,8 @@ public interface PlanService {
* @return
*/
PageResult<PlanRespVO> getPlanPage(PlanPageReqVO pageReqVO);
/**查询按日期排序最后一个未完成(已经下达)的计划**/
PlanDO selectLastOne();
List<PlanRespVO> buildVOList(List<PlanDO> list);
Boolean saveBatchPlan(List<PlanDO> planDOList);
}

@ -97,7 +97,8 @@ public class PlanServiceImpl implements PlanService {
private AdminUserService userService;
@Resource
private TaskService taskService;
private List<PlanRespVO> buildVOList(List<PlanDO> list) {
@Override
public List<PlanRespVO> buildVOList(List<PlanDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
@ -119,4 +120,13 @@ public class PlanServiceImpl implements PlanService {
task -> item.setTaskCode(task.getCode()));
});
}
/**查询按日期排序最后一个未完成(已经下达)的计划**/
public PlanDO selectLastOne(){
return planMapper.selectLastOne();
}
@Override
public Boolean saveBatchPlan(List<PlanDO> planDOList){
return planMapper.insertBatch(planDOList);
}
}

@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import javax.validation.Valid;
import java.util.List;
/**
* Service
@ -93,5 +94,5 @@ public interface SaleOrderService2 {
* @return
*/
SaleOrderItemsDO getSaleOrderItems(Long id);
List<SaleOrderItemsRespVO> getSaleOrderItemsByOrderId(Long orderId);
}

@ -172,4 +172,10 @@ public class SaleOrderServiceImpl implements SaleOrderService2 {
saleOrderItemsMapper.deleteByOrderId(orderId);
}
@Override
public List<SaleOrderItemsRespVO> getSaleOrderItemsByOrderId(Long orderId){
List<SaleOrderItemsDO> list = saleOrderItemsMapper.selectList(SaleOrderItemsDO::getOrderId,orderId);
return buildDetailVOList(list);
}
}

@ -98,6 +98,7 @@ public interface TaskService {
* @return
*/
PageResult<TaskDetailRespVO> getTaskDetailPage(PageParam pageReqVO, Long taskId);
//产品汇总
List<ViewTaskProductSummary> getTaskProductSummaryList(Long taskId);
/**
*
@ -135,5 +136,16 @@ public interface TaskService {
* @param productsOfPlan
* @return
*/
List<PlanDO> generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan);
Map<Long, List<PlanDO>> generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan);
/**
* ididplanDO
* @param taskId id
* @param productId id
* @param totalNumber
* @param productsOfPlan
* @return
*/
List<PlanDO> generatePlan2(Long taskId, Long productId, Long totalNumber, int productsOfPlan);
}

@ -6,6 +6,7 @@ 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.controller.admin.plan.vo.PlanStatusEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailSumResult;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.ViewTaskProductSummary;
@ -224,9 +225,34 @@ public class TaskServiceImpl implements TaskService {
@Override
public List<PlanDO> generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan) {
return null;
public Map<Long, List<PlanDO>> generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan) {
List<ViewTaskProductSummary> summaryList = summaryMapper.selectListByTaskId(taskId);
Map<Long, List<PlanDO>> planMap = new HashMap<>();
for (ViewTaskProductSummary summary : summaryList) {
Long unplanNumber = summary.getTotalNumber() - summary.getPlanNumber();
unplanNumber = unplanNumber > 0? unplanNumber : 0;
List<PlanDO> planDOList = generatePlan2(taskId, summary.getProductId(), unplanNumber, productsOfPlan);
planMap.put(summary.getProductId(), planDOList);
}
return planMap;
}
@Override
public List<PlanDO> generatePlan2(Long taskId, Long productId, Long totalNumber, int productsOfPlan){
List<PlanDO> list = new ArrayList<>();
for (; totalNumber >0 ; ) {
PlanDO planDO = new PlanDO().setTaskId(taskId).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));
list.add(planDO);
}
return list;
}
}
Loading…
Cancel
Save