Commit b58c6c95 authored by 李驰骋's avatar 李驰骋

生产计划看板接口提交

parent d93f387a
...@@ -2,6 +2,9 @@ package com.ximai.mes.kanban.controller; ...@@ -2,6 +2,9 @@ package com.ximai.mes.kanban.controller;
import com.ximai.common.core.domain.AjaxResult; import com.ximai.common.core.domain.AjaxResult;
import com.ximai.mes.kanban.dto.abnormal.AbnormalMonthStatDto; import com.ximai.mes.kanban.dto.abnormal.AbnormalMonthStatDto;
import com.ximai.mes.kanban.dto.equipment.EquipmentQuery;
import com.ximai.mes.kanban.dto.task.TaskPlanQuery;
import com.ximai.mes.kanban.dto.task.TaskPlanStatDto;
import com.ximai.mes.kanban.dto.task.TaskStatDto; import com.ximai.mes.kanban.dto.task.TaskStatDto;
import com.ximai.mes.kanban.service.KanbanTaskService; import com.ximai.mes.kanban.service.KanbanTaskService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -9,6 +12,7 @@ import io.swagger.annotations.ApiModelProperty; ...@@ -9,6 +12,7 @@ import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -31,4 +35,11 @@ public class KanbanTaskController { ...@@ -31,4 +35,11 @@ public class KanbanTaskController {
return AjaxResult.success(rst); return AjaxResult.success(rst);
} }
@ApiOperation("生产计划看板")
@PostMapping("/taskPlanStat")
public AjaxResult<TaskPlanStatDto> taskPlanStat(@RequestBody TaskPlanQuery taskPlanQuery) {
TaskPlanStatDto rst = kanbanTaskService.taskPlanStat(taskPlanQuery);
return AjaxResult.success(rst);
}
} }
package com.ximai.mes.kanban.dto.task;
import lombok.Data;
@Data
public class TaskPlanQuery {
String lineName;
}
package com.ximai.mes.kanban.dto.task;
import com.ximai.mes.pro.domain.task.ProTaskWorkunit;
import com.ximai.mes.pro.dto.task.ProTaskWorkunitDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 生产计划看板
*/
@Data
public class TaskPlanStatDto {
@ApiModelProperty("按日统计加工产品")
List<TaskPlanDay> taskPlanDayList;
@Data
public static class TaskPlanDay{
@ApiModelProperty("开始日期")
private String startDate;
@ApiModelProperty("产品列表")
private List<ProductTaskInfo> productList;
}
@Data
public static class ProductTaskInfo{
@ApiModelProperty("产品编号")
private String itemCode;
@ApiModelProperty("计划数")
private BigDecimal planQuantity;
@ApiModelProperty("工序列表")
private List<ProcessTaskInfo> processList;
}
@Data
public static class ProcessTaskInfo{
@ApiModelProperty("工序名称")
private String processName;
/**
* 进行中0,完成1,超期未完成2
*/
@ApiModelProperty("状态,进行中0,完成1,超期未完成2")
private int state;
@ApiModelProperty("报工")
private BigDecimal reportQuantity=BigDecimal.ZERO;
@ApiModelProperty("合格数")
private BigDecimal qualifyQuantity=BigDecimal.ZERO;
@ApiModelProperty("合格率")
private BigDecimal qualifiedRate=BigDecimal.ZERO;
@ApiModelProperty("计划数")
private BigDecimal planQuantity=BigDecimal.ZERO;
}
@Data
public static class TaskWorkunitGroup{
String startDate;
String itemCode;
List<ProTaskWorkunitDto> taskWorkunitList;
}
@Data
@AllArgsConstructor
public static class TaskWorkunitProcessKey{
String processName;
int idx;
}
}
package com.ximai.mes.kanban.service; package com.ximai.mes.kanban.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.common.utils.data.StringUtils; import com.ximai.common.utils.data.StringUtils;
import com.ximai.mes.constant.TaskWorkunitStatusEnum; import com.ximai.mes.constant.TaskWorkunitStatusEnum;
import com.ximai.mes.kanban.dto.task.TaskPlanQuery;
import com.ximai.mes.kanban.dto.task.TaskPlanStatDto;
import com.ximai.mes.kanban.dto.task.TaskStatDto; import com.ximai.mes.kanban.dto.task.TaskStatDto;
import com.ximai.mes.pro.domain.ProFeedback; import com.ximai.mes.pro.domain.ProFeedback;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder; import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
...@@ -36,7 +40,6 @@ public class KanbanTaskService { ...@@ -36,7 +40,6 @@ public class KanbanTaskService {
private ProTaskWorkunitMapper taskWorkunitMapper; private ProTaskWorkunitMapper taskWorkunitMapper;
@ApiOperation("工序当月统计") @ApiOperation("工序当月统计")
@PostMapping("/currentMonthStat")
public TaskStatDto currentMonthStat() { public TaskStatDto currentMonthStat() {
LocalDateTime monthFirstDay = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN); LocalDateTime monthFirstDay = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN);
LocalDateTime nextMonth = monthFirstDay.plusMonths(1); LocalDateTime nextMonth = monthFirstDay.plusMonths(1);
...@@ -227,5 +230,106 @@ public class KanbanTaskService { ...@@ -227,5 +230,106 @@ public class KanbanTaskService {
return rst; return rst;
} }
@ApiOperation("工序计划统计")
public TaskPlanStatDto taskPlanStat(TaskPlanQuery taskPlanQuery) {
TaskPlanStatDto rst = new TaskPlanStatDto();
List<TaskPlanStatDto.TaskPlanDay> taskPlanDayList = new ArrayList<>();
QueryWrapper<ProTaskWorkunit> query = new QueryWrapper<>();
LocalDateTime curr = LocalDateTime.now().with(LocalTime.MIN);
query.le("ptw.schedule_start_date", curr.plusDays(3));
query.gt("ptw.schedule_start_date", curr.plusDays(-3));
query.eq(StringUtils.isNotEmpty(taskPlanQuery.getLineName()), "wu.line_name", taskPlanQuery.getLineName());
query.orderByDesc("ordinal","schedule_start_date");
List<ProTaskWorkunitDto> dataList = taskWorkunitMapper.selectTaskWorkUnitWithKanban(query);
//合并相同批号任务
Map<String,List<ProTaskWorkunitDto>> dataMap = dataList.stream().collect(Collectors.groupingBy(s->s.getTaskBatch()));
//转换数据-》获取首工序最早开始时间
List<TaskPlanStatDto.TaskWorkunitGroup> taskWorkunitGroupList = new ArrayList<>();
dataMap.forEach((k,v)->{
TaskPlanStatDto.TaskWorkunitGroup temp = new TaskPlanStatDto.TaskWorkunitGroup();
temp.setTaskWorkunitList(v);
temp.setItemCode(v.get(0).getItemCode());
temp.setStartDate(DateUtil.format(v.get(0).getScheduleStartDate(), "yyyy-MM-dd"));
taskWorkunitGroupList.add(temp);
});
//按时间分组数据
Map<String, List<TaskPlanStatDto.TaskWorkunitGroup>> taskWorkunitGroupMap = taskWorkunitGroupList.stream().collect(Collectors.groupingBy(s->s.getStartDate()));
taskWorkunitGroupMap = MapUtil.sort(taskWorkunitGroupMap);
taskWorkunitGroupMap.forEach((k,v)->{
TaskPlanStatDto.TaskPlanDay taskPlanDay = new TaskPlanStatDto.TaskPlanDay();
taskPlanDay.setStartDate(k);
List<TaskPlanStatDto.ProductTaskInfo> productList = new ArrayList<>();
//按产品分组
Map<String, List<TaskPlanStatDto.TaskWorkunitGroup>> taskWorkunitGroupMap2 = v.stream().collect(Collectors.groupingBy(s->s.getItemCode()));
taskWorkunitGroupMap2.forEach((k2,v2)->{
TaskPlanStatDto.ProductTaskInfo productTaskInfo = new TaskPlanStatDto.ProductTaskInfo();
productTaskInfo.setItemCode(k2);
List<ProTaskWorkunitDto> tempTaskWorkunitList = new ArrayList<>();
for (TaskPlanStatDto.TaskWorkunitGroup taskWorkunitGroup : v2) {
tempTaskWorkunitList.addAll(taskWorkunitGroup.getTaskWorkunitList());
}
//按工序分组任务
Map<TaskPlanStatDto.TaskWorkunitProcessKey, List<ProTaskWorkunitDto>> taskWorkunitMap = tempTaskWorkunitList.stream().collect(Collectors.groupingBy(s->{
return new TaskPlanStatDto.TaskWorkunitProcessKey(s.getProcessName(), s.getIdx());
}));
taskWorkunitMap = MapUtil.sort(taskWorkunitMap, Comparator.comparing(TaskPlanStatDto.TaskWorkunitProcessKey::getIdx));
List<TaskPlanStatDto.ProcessTaskInfo> processList = new ArrayList<>();
taskWorkunitMap.forEach((k3,v3)->{
BigDecimal reportQuantity = BigDecimal.ZERO;
BigDecimal qualifyQuantity = BigDecimal.ZERO;
BigDecimal planQuantity = BigDecimal.ZERO;
int state = 0;
for(ProTaskWorkunitDto workunit:v3){
reportQuantity = reportQuantity.add(workunit.getQuantityProduced());
qualifyQuantity = qualifyQuantity.add(workunit.getQuantityQualify());
planQuantity = planQuantity.add(workunit.getQuantity());
}
TaskPlanStatDto.ProcessTaskInfo processTaskInfo = new TaskPlanStatDto.ProcessTaskInfo();
processTaskInfo.setState(this.getWorkunitState(v3));
processTaskInfo.setProcessName(k3.getProcessName());
processTaskInfo.setQualifyQuantity(qualifyQuantity);
processTaskInfo.setReportQuantity(reportQuantity);
processTaskInfo.setPlanQuantity(planQuantity);
if(reportQuantity.compareTo(BigDecimal.ZERO)>0){
processTaskInfo.setQualifiedRate(qualifyQuantity.divide(reportQuantity, 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100")));
}
processList.add(processTaskInfo);
});
productTaskInfo.setPlanQuantity(processList.get(0).getPlanQuantity());
productTaskInfo.setProcessList(processList);
productList.add(productTaskInfo);
});
taskPlanDay.setProductList(productList);
taskPlanDayList.add(taskPlanDay);
});
rst.setTaskPlanDayList(taskPlanDayList);
return rst;
}
private int getWorkunitState(List<ProTaskWorkunitDto> list){
Set<String> temp = new HashSet<>();
list.forEach(s->{
if(s.getStatus().equals(TaskWorkunitStatusEnum.FINISHED.getStatus())
|| s.getQuantity().compareTo(s.getQuantityProduced())<=0){
if(s.getActualEndDate()==null){
temp.add("finish");
}else if(s.getActualEndDate().compareTo(s.getScheduleEndDate())<=0){
temp.add("finish");
}else{
temp.add("expireFinish");
}
}else{
temp.add("other");
}
});
if(temp.contains("other")){
return 0;
}else if(temp.contains("expireFinish")){
return 2;
}
return 1;
}
} }
...@@ -47,7 +47,7 @@ public class ProTaskWorkunitDto extends BaseEntity { ...@@ -47,7 +47,7 @@ public class ProTaskWorkunitDto extends BaseEntity {
* 顺序号 * 顺序号
*/ */
@Excel(name = "顺序号") @Excel(name = "顺序号")
private Long idx; private int idx;
/** /**
* 工作单元ID * 工作单元ID
...@@ -218,6 +218,9 @@ public class ProTaskWorkunitDto extends BaseEntity { ...@@ -218,6 +218,9 @@ public class ProTaskWorkunitDto extends BaseEntity {
@ApiModelProperty("工时单位") @ApiModelProperty("工时单位")
private String stdWorkingTimeUom; private String stdWorkingTimeUom;
@ApiModelProperty("产线名")
private String lineName;
@ApiModelProperty("单价") @ApiModelProperty("单价")
private BigDecimal unitPrice; private BigDecimal unitPrice;
} }
...@@ -188,4 +188,28 @@ public interface ProTaskWorkunitMapper extends BaseMapper<ProTaskWorkunit> { ...@@ -188,4 +188,28 @@ public interface ProTaskWorkunitMapper extends BaseMapper<ProTaskWorkunit> {
@Select(value = "select workunit_id,count(*) ct from pro_task_workunit t1 where t1.`status` = 'BEGINNING' group by workunit_id") @Select(value = "select workunit_id,count(*) ct from pro_task_workunit t1 where t1.`status` = 'BEGINNING' group by workunit_id")
List<WorkunitProcessingDto> selectWorkunitProcessing(); List<WorkunitProcessingDto> selectWorkunitProcessing();
/**
* 计划看板专用
* @param query
* @return
*/
@Select(value = "select t.task_id, t.task_code, t.task_batch, t.workstation_id\n" +
"\t, t.workstation_code, t.process_id, t.process_code, t.process_name, t.item_id\n" +
"\t, wo.product_code as item_code, wo.product_name as item_name, wo.customer_project_no, wo.order_code, t.specification\n" +
"\t, t.unit_of_measure, ptw.task_workunit_id, ptw.quantity, ptw.create_by, t.quantity_wait\n" +
"\t, ptw.quantity_produced\n" +
"\t, ptw.schedule_start_date, t.duration, ptw.schedule_end_date\n" +
"\t, t.ordinal as idx, t.create_time, t.update_by\n" +
"\t, t.update_time, ptw.STATUS, ptw.quantity_qualify, ptw.remark, ptw.quantity_unqualify\n" +
"\t, wo.workorder_code, wu.line_name\n" +
"\t, ptw.STATUS " +
"from pro_task_workunit ptw\n" +
"\tleft join pro_task t on ptw.task_id = t.task_id\n" +
"\tleft join pro_task_workorder tw on t.task_id = tw.task_id\n" +
"\tleft join pro_workorder wo on wo.workorder_id = tw.workorder_id\n" +
"\tleft join pro_process p on t.process_id = p.process_id\n" +
"\tleft join md_workunit wu on wu.workunit_id = ptw.workunit_id " +
"${ew.customSqlSegment} ")
List<ProTaskWorkunitDto> selectTaskWorkUnitWithKanban(@Param("ew") QueryWrapper<ProTaskWorkunit> query);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment