Commit ede6e3cf authored by 温志超's avatar 温志超

Merge remote-tracking branch 'origin/dev' into dev

parents dc7b77a4 0382c323
......@@ -111,7 +111,7 @@
</logger>
<!--排产操作日志-->
<logger name="com.bsn.mes.pro.schedule" level="info">
<logger name="com.ximai.mes.pro.schedule" level="info">
<appender-ref ref="sys-schedule"/>
</logger>
</configuration>
package com.ximai.mes.kanban.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BasicRatio {
BigDecimal numerator;
BigDecimal denominator;
}
......@@ -3,11 +3,13 @@ package com.ximai.mes.kanban.dto.material;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicDailyData {
@ApiModelProperty("日")
int day;
......
......@@ -17,7 +17,7 @@ public class ErpDataDto {
@ApiModelProperty("采购到货完成率")
BigDecimal materialDistRatio;
@ApiModelProperty("salesTimelyDeliveryRatio")
@ApiModelProperty("销售发货及时率")
BigDecimal salesTimelyDeliveryRatio;
@ApiModelProperty("库存趋势图")
......@@ -40,6 +40,8 @@ public class ErpDataDto {
public static class SalesOutboundPlan{
@ApiModelProperty("通知单号")
String outApplyNo;
@ApiModelProperty("产品名称")
String itemName;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("计划出库时间")
Date planOutDate;
......
......@@ -7,6 +7,7 @@ import com.ximai.common.utils.data.StringUtils;
import com.ximai.mes.cal.domain.CalPlanWorkunit;
import com.ximai.mes.cal.mapper.CalPlanWorkunitMapper;
import com.ximai.mes.constant.QcAbnormalTypeEnum;
import com.ximai.mes.kanban.dto.BasicRatio;
import com.ximai.mes.kanban.dto.equipment.EquipmentQuery;
import com.ximai.mes.kanban.dto.equipment.EquipmentStatDto;
import com.ximai.mes.kanban.dto.material.BasicDailyData;
......@@ -24,6 +25,7 @@ import com.ximai.mes.qc.dto.QcAbnormalReportDto;
import com.ximai.mes.qc.dto.QcAbnormalReportStatusEnum;
import com.ximai.mes.qc.mapper.QcAbnormalReportMapper;
import com.ximai.mes.qc.service.IQcAbnormalReportService;
import com.ximai.mes.remote.ErpKanbanService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -47,55 +49,21 @@ public class KanbanMaterialService {
@Autowired
private CalPlanWorkunitMapper calPlanWorkunitMapper;
@Autowired
private IMdWorkunitService workunitService;
private ErpKanbanService erpKanbanService;
public ErpDataDto getErpData(){
ErpDataDto rst = new ErpDataDto();
rst.setMaterialDistRatio(new BigDecimal("42"));
//趋势图
ErpDataDto.InventoryTrend inventoryTrend = new ErpDataDto.InventoryTrend();
List<BasicDailyData> stockInTrend = new ArrayList<>();
LocalDateTime start = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN);
LocalDateTime end = start.plusMonths(1).plusDays(-1).with(LocalTime.MAX);
int dayOfMonth = end.getDayOfMonth();
for(int i=1;i<=dayOfMonth;i++){
stockInTrend.add(new BasicDailyData(i, new BigDecimal(new Random().nextInt(10))));
}
inventoryTrend.setStockInTrend(stockInTrend);
List<BasicDailyData> stockOutTrend = new ArrayList<>();
inventoryTrend.setStockOutTrend(stockOutTrend);
for(int i=1;i<=dayOfMonth;i++){
stockOutTrend.add(new BasicDailyData(i, new BigDecimal(new Random().nextInt(10))));
}
rst.setInventoryTrend(inventoryTrend);
rst.setStockInCompleteRatio(new BigDecimal("24.2"));
rst.setSalesTimelyDeliveryRatio(new BigDecimal("43.2"));
List<ErpDataDto.SalesOutboundPlan> salesOutboundPlanList = new ArrayList<>();
for(int i=0;i<8;i++){
ErpDataDto.SalesOutboundPlan plan = new ErpDataDto.SalesOutboundPlan();
plan.setPlanOutDate(new Date());
plan.setOutApplyNo("JS201232" + i);
plan.setOutQuantity(new BigDecimal(new Random().nextInt(20)));
plan.setPlanQuantity(new BigDecimal(new Random().nextInt(20)));
salesOutboundPlanList.add(plan);
}
rst.setSalesOutboundPlanList(salesOutboundPlanList);
return rst;
return erpKanbanService.getMaterialStat().getData();
}
public MesDataDto getMesData(){
MesDataDto rst = new MesDataDto();
rst.setStockInCompleteRatio(new BigDecimal("52"));
List<MesDataDto.OrderInfoDto> orderInfoList = new ArrayList<>();
for(int i=0;i<10;i++){
MesDataDto.OrderInfoDto temp = new MesDataDto.OrderInfoDto();
temp.setItemName("测试"+i);
temp.setWorkorderNo("B20123212"+i);
temp.setPlanFinishDate(new Date());
temp.setFinishQuantity(new BigDecimal("200"));
temp.setPlanQuantity(new BigDecimal("300"));
orderInfoList.add(temp);
LocalDateTime currMonth = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN);
LocalDateTime nextMonth = currMonth.plusMonths(1);
BasicRatio basicRatio = taskWorkunitMapper.selectStockInCompleteRatio(currMonth, nextMonth);
if(basicRatio.getDenominator()!=null&&basicRatio.getDenominator().compareTo(BigDecimal.ZERO)!=0){
rst.setStockInCompleteRatio(basicRatio.getNumerator().divide(basicRatio.getDenominator(), 3, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100")));
}
List<MesDataDto.OrderInfoDto> orderInfoList = taskWorkunitMapper.selectTaskWorkUnitWithKanban2(currMonth, nextMonth);
rst.setOrderInfoList(orderInfoList);
return rst;
}
......
......@@ -2,6 +2,8 @@ package com.ximai.mes.pro.mapper.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ximai.mes.kanban.dto.BasicRatio;
import com.ximai.mes.kanban.dto.material.MesDataDto;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.pro.domain.task.ProTask;
import com.ximai.mes.pro.domain.task.ProTaskWorkunit;
......@@ -10,6 +12,7 @@ import com.ximai.mes.pro.dto.task.WorkunitProcessingDto;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -213,4 +216,31 @@ public interface ProTaskWorkunitMapper extends BaseMapper<ProTaskWorkunit> {
List<ProTaskWorkunitDto> selectTaskWorkUnitWithKanban(@Param("ew") QueryWrapper<ProTaskWorkunit> query);
void deleteByTaskIds(@Param("taskIds")List<Long> taskIds);
/**
* 物料综合看板专用生产入库计划
* @param startDate 开始时间
* @param endDate 结束时间
* @return
*/
@Select(value = "select t2.arrange_code as workorderNo,wo.product_name as itemName,max(t1.schedule_end_date) planFinishDate,sum(t1.quantity) planQuantity,sum(t1.quantity_produced) finishQuantity\n" +
"from pro_task_workunit t1 left join pro_task t2 on t1.task_id = t2.task_id\n" +
"left join pro_task_workorder tw on t2.task_id = tw.task_id\n" +
"left join pro_workorder wo on wo.workorder_id = tw.workorder_id\n" +
"where t1.schedule_end_date > #{startDate} and t1.schedule_end_date < #{endDate} \n" +
"and t2.is_last_process = 1 group by t2.arrange_code,wo.product_name")
List<MesDataDto.OrderInfoDto> selectTaskWorkUnitWithKanban2(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
/**
* 物料综合看板入库完成率
* @param startDate 开始时间
* @param endDate 结束时间
* @return
*/
@Select(value = "select ifnull(sum(t1.quantity),0) denominator,ifnull(sum(t1.quantity_produced),0) numerator from pro_task_workunit t1 left join pro_task t2 on t1.task_id = t2.task_id\n" +
"where t1.schedule_end_date > #{startDate} and t1.schedule_end_date < #{endDate} \n" +
"and t2.is_last_process = 1")
BasicRatio selectStockInCompleteRatio(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
}
......@@ -252,14 +252,21 @@ public class ProStartWorkServiceImpl implements IProStartWorkService {
QueryWrapper<CalPlanWorkunit> calPlanWorkunitQueryWrapper = new QueryWrapper<>();
Date startDate = startWork.getStartDate();
Date endDate = startWork.getEndDate();
calPlanWorkunitQueryWrapper.between("start_date", startDate, endDate).eq("rest_flag", 1).eq("workunit_id", workunitId)
calPlanWorkunitQueryWrapper.between("start_date", startDate, endDate).eq("rest_flag", 0).eq("workunit_id", workunitId)
.or()
.between("end_date", startDate, endDate).eq("rest_flag", 1).eq("workunit_id", workunitId);
.between("end_date", startDate, endDate).eq("rest_flag", 0).eq("workunit_id", workunitId);
List<CalPlanWorkunit> calPlanWorkunits = calPlanWorkunitService.selectListByQw(calPlanWorkunitQueryWrapper);
return this.computeWorkTime(startWork, calPlanWorkunits, workunitId);
}
private Map<String, Long> computeWorkTime(ProStartWork startWork, List<CalPlanWorkunit> calPlanWorkunits, Long workunitId) {
Date startDate = startWork.getStartDate();
Date endDate = startWork.getEndDate();
long startWorkDateTimeStamp = startDate.getTime();
long startWorkendDateTimeStamp = endDate.getTime();
//统计排班日历内加工工时
List<CalPlanWorkunit> planWorkunitList = calPlanWorkunits.stream().filter(x -> x.getStartDate().getTime() < x.getEndDate().getTime()).collect(Collectors.toList());
LongSummaryStatistics breakTimeSum = planWorkunitList.stream().map(x -> {
LongSummaryStatistics workTimeSum = planWorkunitList.stream().map(x -> {
long cPwStartTimeStamp = x.getStartDate().getTime();
long endTimeStamp = x.getEndDate().getTime();
if (cPwStartTimeStamp < startWorkDateTimeStamp) {
......@@ -272,8 +279,8 @@ public class ProStartWorkServiceImpl implements IProStartWorkService {
return endTimeStamp > cPwStartTimeStamp ? (endTimeStamp - cPwStartTimeStamp) : 0;
}).collect(Collectors.summarizingLong(x -> x));
long breakTimeSec = breakTimeSum.getSum();
long workTimeSec = startWorkendDateTimeStamp - startWorkDateTimeStamp - breakTimeSec;
long workTimeSec = workTimeSum.getSum();
long breakTimeSec = startWorkendDateTimeStamp - startWorkDateTimeStamp - workTimeSec;
workTimeSec = workTimeSec < 0 ? 0L : workTimeSec;
Map<String, Long> map = new HashMap<>();
map.put("breakTimeSec", breakTimeSec / 1000);
......
package com.ximai.mes.remote;
import com.ximai.common.annotation.ApiLog;
import com.ximai.common.enums.BusinessType;
import com.ximai.common.enums.InOutType;
import com.ximai.mes.kanban.dto.material.ErpDataDto;
import com.ximai.mes.remote.dto.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
* erp远程调用接口
*/
@FeignClient(value = "erp-kanbanService", url = "${remote.erp.url}")
public interface ErpKanbanService {
@ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "物料看板ERP数据")
@PostMapping(value = "/materialStat/allData")
ErpResponseResult<ErpDataDto> getMaterialStat();
}
package com.bs.mes.pro;
import cn.hutool.core.date.DateUtil;
import com.ximai.mes.cal.domain.CalPlanWorkunit;
import com.ximai.mes.pro.domain.ProStartWork;
import com.ximai.mes.pro.schedule.Equipment;
import com.ximai.mes.pro.schedule.strategy.EvaluateEquipmentDeliveryTime;
import com.ximai.mes.pro.service.impl.ProStartWorkServiceImpl;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ProStartWorkServiceImplTest {
@Test public void computeWorkTime() throws Exception {
ProStartWorkServiceImpl proStartWorkService = new ProStartWorkServiceImpl();
Method methods = ProStartWorkServiceImpl.class.getDeclaredMethod("computeWorkTime", ProStartWork.class, List.class, Long.class);
methods.setAccessible(true);
// 测试1 加工时间超出上班时间
ProStartWork proStartWork = new ProStartWork();
List<CalPlanWorkunit> calPlanWorkunits = new ArrayList<>();
proStartWork.setStartDate(DateUtil.parse("2024-11-22 13:53","yyyy-MM-dd HH:mm"));
proStartWork.setEndDate(DateUtil.parse("2024-11-23 13:03","yyyy-MM-dd HH:mm"));
calPlanWorkunits.add(new CalPlanWorkunit(){
{
setStartDate(DateUtil.parse("2024-11-22 09:00","yyyy-MM-dd HH:mm"));
setEndDate(DateUtil.parse("2024-11-22 13:00","yyyy-MM-dd HH:mm"));
};
});
calPlanWorkunits.add(new CalPlanWorkunit(){
{
setStartDate(DateUtil.parse("2024-11-22 15:00","yyyy-MM-dd HH:mm"));
setEndDate(DateUtil.parse("2024-11-22 19:00","yyyy-MM-dd HH:mm"));
};
});
calPlanWorkunits.add(new CalPlanWorkunit(){
{
setStartDate(DateUtil.parse("2024-11-23 09:00","yyyy-MM-dd HH:mm"));
setEndDate(DateUtil.parse("2024-11-23 13:00","yyyy-MM-dd HH:mm"));
};
});
calPlanWorkunits.add(new CalPlanWorkunit(){
{
setStartDate(DateUtil.parse("2024-11-23 15:00","yyyy-MM-dd HH:mm"));
setEndDate(DateUtil.parse("2024-11-23 19:00","yyyy-MM-dd HH:mm"));
};
});
Map<String, Long> rst = (Map) methods.invoke(proStartWorkService, proStartWork, calPlanWorkunits, 0l);
Assert.assertEquals((240+240)*60, rst.get("workTimeSec").longValue());
Assert.assertEquals((proStartWork.getEndDate().getTime()-proStartWork.getStartDate().getTime())/1000-rst.get("workTimeSec").longValue(),
rst.get("breakTimeSec").longValue());
//测试2 加工时间在排班日历范围内
proStartWork.setEndDate(DateUtil.parse("2024-11-23 12:48","yyyy-MM-dd HH:mm"));
rst = (Map) methods.invoke(proStartWorkService, proStartWork, calPlanWorkunits, 0l);
Assert.assertEquals((228+240)*60, rst.get("workTimeSec").longValue());
Assert.assertEquals((proStartWork.getEndDate().getTime()-proStartWork.getStartDate().getTime())/1000-rst.get("workTimeSec").longValue(),
rst.get("breakTimeSec").longValue());
}
}
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