排产修改-sjx

liweidong
sunjianxi 2 months ago
parent 32df8d1431
commit 076604f91c
  1. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkPlan.java
  2. 22
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkOrderEntity.java
  3. 18
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java
  4. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java
  5. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PlateAroundServiceImpl.java
  6. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  7. 34
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java
  8. 8
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java
  9. 199
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  10. 1
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml
  11. 8
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java
  12. 423
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  13. 7
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java
  14. 46
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java

@ -98,12 +98,12 @@ public class WorkPlan extends BaseEntity {
* 计划开始
*/
@Schema(description = "计划开始")
private LocalDateTime startTime;
private LocalDateTime planStartTime;
/**
* 计划结束
*/
@Schema(description = "计划结束")
private LocalDateTime endTime;
private LocalDateTime planEndTime;
/**
* 加工班组
*/

@ -330,5 +330,27 @@ public class WorkOrderEntity extends BaseEntity {
@Schema(description = "零件号")
private String partCode;
/**
* 计划开始
*/
@Schema(description = "计划开始")
private LocalDateTime planStartTime;
/**
* 计划结束
*/
@Schema(description = "计划结束")
private LocalDateTime planEndTime;
/**
* 实际开始
*/
@Schema(description = "实际开始")
private LocalDateTime factStartTime;
/**
* 实际结束
*/
@Schema(description = "实际结束")
private LocalDateTime factEndTime;
}

@ -102,12 +102,12 @@ public class WorkPlanEntity extends BaseEntity {
* 计划开始
*/
@Schema(description = "计划开始")
private LocalDateTime startTime;
private LocalDateTime planStartTime;
/**
* 计划结束
*/
@Schema(description = "计划结束")
private LocalDateTime endTime;
private LocalDateTime planEndTime;
/**
* 加工班组
*/
@ -157,12 +157,12 @@ public class WorkPlanEntity extends BaseEntity {
* 实际开始
*/
@Schema(description = "实际开始")
private Date factStartTime;
private LocalDateTime factStartTime;
/**
* 实际结束
*/
@Schema(description = "实际结束")
private Date factEndTime;
private LocalDateTime factEndTime;
/**
*
*/
@ -269,4 +269,14 @@ public class WorkPlanEntity extends BaseEntity {
*/
private String teamMembers;
/**
* 班组人员
*/
private String factTeamMembers;
/**
* 零件号
*/
private String partCode;
}

@ -521,10 +521,10 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
wp.setHourQuota(rp.getHourQuota());
wp.setMakeMemo(rp.getMakeMemo());
wp.setStatus(WorkPlan.STATUS_NO_START);
wp.setStartTime(rp.getStartTime().toInstant()
wp.setPlanStartTime(rp.getStartTime().toInstant()
.atZone(ZoneId.systemDefault()) // 指定时区(通常用系统默认)
.toLocalDateTime());
wp.setEndTime(rp.getEndTime().toInstant()
wp.setPlanEndTime(rp.getEndTime().toInstant()
.atZone(ZoneId.systemDefault()) // 指定时区(通常用系统默认)
.toLocalDateTime());
wp.setRpId(rp.getId());

@ -248,7 +248,7 @@ public class PlateAroundServiceImpl extends BaseServiceImpl<PlateAroundMapper, P
prWorkOrder.setOcId(nextWorkPlan.getOcId());
}
prWorkOrder.setOemType(WorkOrder.OEM_TYPE_WHOLE);
nextWorkPlan.setEndTime(LocalDateTime.now());
nextWorkPlan.setPlanEndTime(LocalDateTime.now());
workPlanService.updateById(nextWorkPlan);
//产生外协生产进度记录信息
WorkOrderRun wr = new WorkOrderRun();

@ -331,8 +331,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
wpr.setCaId(wp.getCaId());
wpr.setProcessAbility(processAbilityService.getById(wp.getCaId()));
wpr.setStartTime(localDateTimeToDate(wp.getStartTime()));
wpr.setEndTime(localDateTimeToDate(wp.getEndTime()));
wpr.setStartTime(localDateTimeToDate(wp.getPlanStartTime()));
wpr.setEndTime(localDateTimeToDate(wp.getPlanEndTime()));
WorkPlanVO wpVO = new WorkPlanVO();
BeanUtils.copyProperties(wp, wpr);
wpVO.setProcessSet(bsProcessSetService.getById(wp.getPpsId()));

@ -51,6 +51,7 @@ import org.springblade.scheduling.scheduling.excel.SchedulingBoardExcel;
import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springblade.scheduling.scheduling.excel.WorkOrderExcel;
import org.springblade.scheduling.scheduling.service.IWorkOrderService;
import org.springblade.scheduling.scheduling.vo.WorkPlanVO;
import org.springblade.scheduling.scheduling.wrapper.WorkOrderWrapper;
import org.springframework.web.bind.annotation.*;
@ -263,4 +264,37 @@ public class WorkOrderController extends BladeController {
return R.success();
}
/**
* 资质执行分析 自定义分页
*/
@GetMapping("/selectQuaExecuteAnalysisPage")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入WorkOrder")
public R<IPage<WorkPlanVO>> selectQuaExecuteAnalysisPage(WorkPlanVO workPlan, Query query) {
IPage<WorkPlanVO> pages = workOrderService.selectQuaExecuteAnalysisPage(Condition.getPage(query), workPlan);
return R.data(pages);
}
/**
* 执行分析-按作业中心 自定义分页
*/
@GetMapping("/selectCenterExecuteList")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入WorkOrder")
public R<List<WorkPlanVO>> selectCenterExecuteList(WorkPlanVO workPlan) {
List<WorkPlanVO> list = workOrderService.selectCenterExecuteList(workPlan);
return R.data(list);
}
/**
* 资质执行分析 自定义分页
*/
@GetMapping("/selectOrderExecuteDetailPage")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入WorkOrder")
public R<IPage<WorkPlanVO>> selectOrderExecuteDetailPage(WorkPlanVO workPlan, Query query) {
IPage<WorkPlanVO> pages = workOrderService.selectOrderExecuteDetailPage(Condition.getPage(query), workPlan);
return R.data(pages);
}
}

@ -34,6 +34,7 @@ import org.springblade.scheduling.pojo.entity.WorkOrderEntity;
import org.springblade.scheduling.scheduling.excel.SchedulingBoardExcel;
import org.springblade.scheduling.scheduling.excel.WorkOrderExcel;
import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springblade.scheduling.scheduling.vo.WorkPlanVO;
import java.util.List;
@ -81,4 +82,11 @@ public interface WorkOrderMapper extends BaseMapper<WorkOrderEntity> {
List<WorkOrderVO> selectGlassCakeOrderPage(IPage page, WorkOrderVO workOrder);
List<WorkPlanVO> selectQuaExecuteAnalysisPage(IPage page, WorkPlanVO workPlan);
List<WorkPlanVO> selectCenterExecuteList(WorkPlanVO workPlan);
List<WorkPlanVO> selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan);
}

@ -97,10 +97,10 @@
to_char(g.receive_time,'YYYY-MM-DD') AS "receiveTime",
f.name AS "currentProcessName",
d.name AS "processName",
to_char(b.start_time,'YYYY-MM-DD HH24:MI') AS "startTime",
to_char(b.end_time,'YYYY-MM-DD HH24:MI') AS "endTime",
to_char(b.start_time,'YYYY-MM-DD HH24:MI:SS') AS "planStartTime",
to_char(b.end_time,'YYYY-MM-DD HH24:MI:SS') AS "planEndTime",
to_char(b.plan_start_time,'YYYY-MM-DD HH24:MI') AS "startTime",
to_char(b.plan_end_time,'YYYY-MM-DD HH24:MI') AS "endTime",
to_char(b.plan_start_time,'YYYY-MM-DD HH24:MI:SS') AS "planStartTime",
to_char(b.plan_end_time,'YYYY-MM-DD HH24:MI:SS') AS "planEndTime",
to_char(b.fact_start_time,'YYYY-MM-DD HH24:MI:SS') AS "factStartTime",
to_char(b.fact_end_time,'YYYY-MM-DD HH24:MI:SS') AS "factEndTime",
c.ts_name AS "teamName",
@ -119,12 +119,12 @@
LEFT JOIN MES_YIELD_ORDER g on g.id = a.yo_id
<where>
a.is_deleted = 0 and b.is_deleted = 0 and a.status in (1,2,3,5)
and b.start_time is not null and b.end_time is not null and g.work_center_id = 81
and b.plan_start_time is not null and b.plan_end_time is not null and g.work_center_id = 81
<if test="startTime !=null and startTime != ''">
and to_char(b.start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
and to_char(b.plan_start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
</if>
<if test="endTime !=null and endTime != ''">
and to_char(b.end_time,'YYYY-MM-DD') <![CDATA[ <= ]]> #{endTime}
and to_char(b.plan_end_time,'YYYY-MM-DD') <![CDATA[ <= ]]> #{endTime}
</if>
<if test="woCode !=null and woCode != ''">
and a.wo_code = #{woCode}
@ -151,7 +151,7 @@
</foreach>
</if>
</where>
order by g.release_date,b.start_time,a.WO_CODE
order by g.release_date,b.plan_start_time,a.WO_CODE
</select>
<select id="getMaxByCodePattern" resultType="java.lang.String">
@ -230,10 +230,10 @@
<where>
a.is_deleted = 0 and h.is_deleted = 0 and a.status in (1,2,3,5)
<if test="startTime !=null and startTime != ''">
and to_char(h.start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
and to_char(h.plan_start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
</if>
<if test="endTime !=null and endTime != ''">
and to_char(h.end_time,'YYYY-MM-DD') <![CDATA[ <= ]]> #{endTime}
and to_char(h.plan_end_time,'YYYY-MM-DD') <![CDATA[ <= ]]> #{endTime}
</if>
<if test="woCode !=null and woCode != ''">
and a.wo_code = #{woCode}
@ -317,4 +317,183 @@
b.YIELD_TYPE = 12003
</select>
<select id="selectQuaExecuteAnalysisPage" resultType="org.springblade.scheduling.scheduling.vo.WorkPlanVO">
SELECT
b.wo_code as "woCode",
b.part_code as "partCode",
c.part_name as "partName",
b.batch_no as "batchNo",
b.card_no as "cardNo",
c.product_ident as "productIdent",
d.name as "processName",
e.ca_name as "craftName",
f.CERTIFICATE_NAME as "certificateName",
f.work_center_name as "workCenterName",
g.ts_name as "teamName",
a.team_members as "teamMembers",
a.fact_team_members as "factTeamMembers",
a.fact_end_time as "factEndTime",
case
when a.team_members is not null
and a.fact_team_members is not null
and INSTR(a.team_members, a.fact_team_members) > 0
then 1
else 0
end as isQua
FROM
MES_WORK_PLAN a
LEFT JOIN MES_WORK_ORDER b ON a.WO_ID = b.ID
LEFT JOIN MES_YIELD_ORDER c ON b.YO_ID = c.ID
LEFT JOIN BS_PROCESS_SET d on a.PPS_ID = d.ID
LEFT JOIN BS_CRAFT_ABILITY e on a.ca_id = e.ID
LEFT JOIN MES_PERSON_ABILITY f on a.WORK_CENTER_ID = f.WORK_CENTER_ID and f.CRAFT_ID = a.CA_ID and f.PROCESS_ID = a.PPS_ID
LEFT JOIN BS_TEAM_SET g on a.MAKE_TEAM = g.id
<where>
a.status in ('3','5') and TEAM_MEMBERS is not null
<if test="param2.startTime !=null and param2.startTime != ''">
and a.fact_end_time <![CDATA[ >= ]]> to_date(#{param2.startTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.endTime !=null and param2.endTime != ''">
and a.fact_end_time <![CDATA[ <= ]]> to_date(#{param2.endTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.partCode !=null and param2.partCode != ''">
and b.part_code like concat(concat('%',#{param2.partCode}),'%')
</if>
<if test="param2.woCode !=null and param2.woCode != ''">
and b.wo_code like concat(concat('%',#{param2.woCode}),'%')
</if>
<if test="param2.craftName !=null and param2.craftName != ''">
and e.ca_name = #{param2.craftName}
</if>
<if test="param2.processName !=null and param2.processName != ''">
and d.name = #{param2.processName}
</if>
<if test="param2.certificateName !=null and param2.certificateName != ''">
and f.CERTIFICATE_NAME like concat(concat('%',#{param2.certificateName}),'%')
</if>
<if test="param2.productIdent !=null and param2.productIdent != ''">
and c.product_ident = #{param2.productIdent}
</if>
<if test="param2.isQua == 1">
and a.fact_team_members is not null
and INSTR(a.team_members, a.fact_team_members) <![CDATA[ > ]]> 0
</if>
<if test="param2.isQua == 0">
and (a.fact_team_members is null or (a.fact_team_members is not null
and INSTR(a.team_members, a.fact_team_members) <![CDATA[ <= ]]> 0))
</if>
</where>
</select>
<select id="selectCenterExecuteList" resultType="org.springblade.scheduling.scheduling.vo.WorkPlanVO">
SELECT
b.WORK_CENTER_ID AS "workCenterId",
c.wc_name AS "workCenterName",
sum( CASE WHEN a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{interval} / 1440 THEN 1 ELSE 0 END ) AS earlyStartCount,
sum( CASE WHEN a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{interval} / 1440 AND a.PLAN_START_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS onTimeStartCount,
sum( CASE WHEN a.FACT_START_TIME <![CDATA[ > ]]> a.PLAN_START_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS delayStartCount,
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{interval} / 1440 THEN 1 ELSE 0 END ) AS earlyFinishCount,
sum( CASE WHEN a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{interval} / 1440 AND a.PLAN_END_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS onTimeFinishCount,
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ > ]]> a.PLAN_END_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS delayFinishCount,
count( 1 ) AS totalOrderCount
FROM
MES_WORK_ORDER a
LEFT JOIN MES_YIELD_ORDER b ON a.yo_id = b.id
LEFT JOIN BS_WORK_CENTER c ON b.work_center_id = c.id
<where>
a.IS_DELETED = 0
AND PLAN_START_TIME IS NOT NULL
AND FACT_START_TIME IS NOT NULL
AND PLAN_END_TIME IS NOT NULL
AND FACT_END_TIME IS NOT NULL
<if test="startTime !=null and startTime != ''">
and a.fact_end_time <![CDATA[ >= ]]> to_date(#{startTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="endTime !=null and endTime != ''">
and a.fact_end_time <![CDATA[ <= ]]> to_date(#{endTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="workCenterId !=null and workCenterId != ''">
and b.work_center_id = #{workCenterId}
</if>
</where>
group BY
b.WORK_CENTER_ID,
c.wc_name
</select>
<select id="selectOrderExecuteDetailPage" resultType="org.springblade.scheduling.scheduling.vo.WorkPlanVO">
SELECT
b.WORK_CENTER_ID AS "workCenterId",
c.wc_name AS "workCenterName",
a.wo_code as "woCode",
a.part_code as "partCode",
b.part_name as "partName",
a.batch_no as "batchNo",
a.card_no as "cardNo",
b.receive_time as "receiveTime",
a.plan_start_time as "planStartTime",
a.fact_start_time as "factStartTime",
CASE WHEN a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{param2.interval} / 1440 THEN '提前'
WHEN a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{param2.interval} / 1440 AND a.PLAN_START_TIME + #{param2.interval} / 1440 THEN '准时'
ELSE '延迟' END AS startType,
a.plan_end_time as "planEndTime",
a.fact_end_time as "factEndTime",
CASE WHEN a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{param2.interval} / 1440 THEN '提前'
WHEN a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{param2.interval} / 1440 AND a.PLAN_END_TIME + #{param2.interval} / 1440 THEN '准时'
ELSE '延迟' END AS endType,
ROUND((a.plan_end_time - a.plan_start_time) * 1440, 0) AS "planDurationMinute",
ROUND((a.fact_end_time - a.fact_start_time) * 1440, 0) AS "factDurationMinute",
ROUND((a.fact_end_time - a.fact_start_time) * 1440, 0) - ROUND((a.plan_end_time - a.plan_start_time) * 1440, 0) as "biasDurationMinute"
FROM
MES_WORK_ORDER a
LEFT JOIN MES_YIELD_ORDER b ON a.yo_id = b.id
LEFT JOIN BS_WORK_CENTER c ON b.work_center_id = c.id
<where>
a.IS_DELETED = 0
AND PLAN_START_TIME IS NOT NULL
AND FACT_START_TIME IS NOT NULL
AND PLAN_END_TIME IS NOT NULL
AND FACT_END_TIME IS NOT NULL
<if test="param2.startTime !=null and param2.startTime != ''">
and a.fact_end_time <![CDATA[ >= ]]> to_date(#{param2.startTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.endTime !=null and param2.endTime != ''">
and a.fact_end_time <![CDATA[ <= ]]> to_date(#{param2.endTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.partCode !=null and param2.partCode != ''">
and b.part_code like concat(concat('%',#{param2.partCode}),'%')
</if>
<if test="param2.woCode !=null and param2.woCode != ''">
and a.wo_code like concat(concat('%',#{param2.woCode}),'%')
</if>
<if test="param2.workCenterId !=null and param2.workCenterId != ''">
and b.work_center_id = #{param2.workCenterId}
</if>
<if test="param2.cardNo !=null and param2.cardNo != ''">
and a.card_no = #{param2.cardNo}
</if>
<if test="param2.batchNo !=null and param2.batchNo != ''">
and a.batch_no = #{param2.batchNo}
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '提前'">
and a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '准时'">
and a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{param2.interval} / 1440 AND a.PLAN_START_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '延迟'">
and a.FACT_START_TIME <![CDATA[ > ]]> a.PLAN_START_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '提前'">
and a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '准时'">
and a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{param2.interval} / 1440 AND a.PLAN_END_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '延迟'">
and a.FACT_END_TIME <![CDATA[ > ]]> a.PLAN_END_TIME + #{param2.interval} / 1440
</if>
</where>
</select>
</mapper>

@ -87,6 +87,7 @@
<if test="yieldOrder.workCenterId != null">
and work_center_id = #{yieldOrder.workCenterId}
</if>
order by receive_time desc
</where>
</select>

@ -28,11 +28,13 @@ package org.springblade.scheduling.scheduling.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.produce.pojo.entity.WorkPlan;
import org.springblade.scheduling.scheduling.dto.WorkOrderDto;
import org.springblade.scheduling.pojo.entity.WorkOrderEntity;
import org.springblade.scheduling.scheduling.excel.SchedulingBoardExcel;
import org.springblade.scheduling.scheduling.excel.WorkOrderExcel;
import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springblade.scheduling.scheduling.vo.WorkPlanVO;
import java.util.List;
@ -105,4 +107,10 @@ public interface IWorkOrderService extends BaseService<WorkOrderEntity> {
* @param cardNo
*/
void saveWorkOrderFromBak(String cardNo);
IPage<WorkPlanVO> selectQuaExecuteAnalysisPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan);
List<WorkPlanVO> selectCenterExecuteList(WorkPlanVO workPlan);
IPage<WorkPlanVO> selectOrderExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan);
}

@ -49,6 +49,7 @@ import org.springblade.scheduling.scheduling.mapper.WorkOrderMapper;
import org.springblade.scheduling.scheduling.service.*;
import org.springblade.scheduling.scheduling.vo.SameTroughVO;
import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springblade.scheduling.scheduling.vo.WorkPlanVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -184,10 +185,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
});
//初始化作业中心
List<WorkCenterEntity> workCenterList = workCenterService.list();
Map<Long,String> workCenterMap = workCenterList.stream().collect(Collectors.toMap(BaseEntity::getId,WorkCenterEntity::getWcName));
Map<Long, String> workCenterMap = workCenterList.stream().collect(Collectors.toMap(BaseEntity::getId, WorkCenterEntity::getWcName));
//初始化工艺能力
List<CraftAbilityEntity> craftAbilityList = craftAbilityService.list();
Map<Long,String> craftAbilityMap = craftAbilityList.stream().collect(Collectors.toMap(BaseEntity::getId,CraftAbilityEntity::getCaName));
Map<Long, String> craftAbilityMap = craftAbilityList.stream().collect(Collectors.toMap(BaseEntity::getId, CraftAbilityEntity::getCaName));
//初始化烧结温度曲线
List<SintTempCurveEntity> sintList = sintTempCurveService.list();
Map<Long, List<SintTempCurveEntity>> sintMap = sintList.stream().collect(Collectors.groupingBy(SintTempCurveEntity::getProcessId));
@ -220,7 +221,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
new LinkedBlockingQueue<>(),
r -> new Thread(r, "scheduling-thread-" + System.currentTimeMillis()));
map.forEach((workcenter, orders) -> {
threadPool.execute(() -> allocateResources(orders, personAbilityMap, mainProducerMap, planMap, processMap,sintMap,workCenterMap,craftAbilityMap));
threadPool.execute(() -> allocateResources(orders, personAbilityMap, mainProducerMap, planMap, processMap, sintMap, workCenterMap, craftAbilityMap));
});
}
@ -229,15 +230,15 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public List<WorkOrderDto> schedulingBoard(WorkOrderDto workOrder) {
List<WorkOrderDto> list = baseMapper.selectWorkOrderList(workOrder);
String yesterday = DateFormatUtils.format(DateUtils.addDays(new Date(),-1),"yyyy-MM-dd");
String twodaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(),-2),"yyyy-MM-dd");
String threeDaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(),-3),"yyyy-MM-dd");
String yesterday = DateFormatUtils.format(DateUtils.addDays(new Date(), -1), "yyyy-MM-dd");
String twodaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(), -2), "yyyy-MM-dd");
String threeDaysAgo = DateFormatUtils.format(DateUtils.addDays(new Date(), -3), "yyyy-MM-dd");
list.forEach(item -> {
if((yesterday.equals(item.getReceiveTime()) || twodaysAgo.equals(item.getReceiveTime())) && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())){
if ((yesterday.equals(item.getReceiveTime()) || twodaysAgo.equals(item.getReceiveTime())) && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())) {
item.setRemindStatus("1");
}
try {
if(DateUtils.parseDate(threeDaysAgo,"yyyy-MM-dd").compareTo(DateUtils.parseDate(item.getReceiveTime(),"yyyy-MM-dd")) > 0 && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())){
if (DateUtils.parseDate(threeDaysAgo, "yyyy-MM-dd").compareTo(DateUtils.parseDate(item.getReceiveTime(), "yyyy-MM-dd")) > 0 && !"5".equals(item.getPlanStatus()) && !"3".equals(item.getPlanStatus())) {
item.setRemindStatus("2");
}
} catch (ParseException e) {
@ -246,22 +247,46 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
item.setPriorityAps(YieldOrderEnum.getName(Integer.parseInt(item.getPriorityAps())));
});
Map<String, List<WorkOrderDto>> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode));
//默认不展示所有工序都完成的订单
if(StringUtils.isEmpty(workOrder.getBatchNo())){
woCodeGroup = woCodeGroup.entrySet().stream()
.filter(entry -> {
// 检查当前分组是否存在至少一个status≠5的元素
return entry.getValue().stream().anyMatch(dto -> !"5".equals(dto.getPlanStatus()));
})
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
//根据工序名称过滤订单
if(StringUtils.isNotEmpty(workOrder.getProcessName())){
woCodeGroup = woCodeGroup.entrySet().stream()
.filter(entry -> {
return entry.getValue().stream()
.anyMatch(dto -> workOrder.getProcessName().equals(dto.getProcessName()));
})
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
}
List<WorkOrderDto> resultList = new ArrayList<>();
for (Map.Entry<String, List<WorkOrderDto>> entry : woCodeGroup.entrySet()) {
if(StringUtils.isNotEmpty(workOrder.getProcessName())){
//根据工序名称过滤订单
/* if (StringUtils.isNotEmpty(workOrder.getProcessName())) {
List<WorkOrderDto> list1 = entry.getValue();
List<String> processNameList = list1.stream().map(WorkOrderDto::getProcessName).collect(Collectors.toList());
if(processNameList.contains(workOrder.getProcessName())){
if (processNameList.contains(workOrder.getProcessName())) {
WorkOrderDto workOrderDto = new WorkOrderDto();
String woCode = entry.getKey();
workOrderDto.setWoCode(woCode);
workOrderDto.setWorkOrderList(entry.getValue());
resultList.add(workOrderDto);
continue;
}else{
} else {
continue;
}
}
}*/
WorkOrderDto workOrderDto = new WorkOrderDto();
String woCode = entry.getKey();
workOrderDto.setWoCode(woCode);
@ -316,35 +341,35 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
return baseMapper.selectTeam();
}
@Override
public List<String> selectEquip() {
return baseMapper.selectEquip();
}
@Override
public List<SchedulingBoardExcel> exportSchedulingBoard(WorkOrderDto workOrder) {
return baseMapper.exportSchedulingBoard(workOrder);
}
@Override
public void receiveDispatcherFromOldMes(Long id, Long userId) {
WorkOrderEntity workOrder = new WorkOrderEntity();
workOrder.setId(id);
workOrder.setDispatcher(userId);
updateById(workOrder);
}
void calculateCr(List<YieldOrderEntity> list) {
//查询订单下的工序,计算cr值
for (YieldOrderEntity entity : list) {
List<YieldOrderCraftEntity> craftList = yieldOrderCraftService.list(Wrappers.<YieldOrderCraftEntity>lambdaQuery().eq(YieldOrderCraftEntity::getYoId, entity.getId()));
//定义订单总工时
BigDecimal total = new BigDecimal(0);
for (YieldOrderCraftEntity craftEntity : craftList) {
total = total.add(craftEntity.getHourQuota());
}
//换算成天
total = total.divide(BigDecimal.valueOf(1440), 2, RoundingMode.HALF_UP);
@Override
public List<String> selectEquip() {
return baseMapper.selectEquip();
}
@Override
public List<SchedulingBoardExcel> exportSchedulingBoard(WorkOrderDto workOrder) {
return baseMapper.exportSchedulingBoard(workOrder);
}
@Override
public void receiveDispatcherFromOldMes(Long id, Long userId) {
WorkOrderEntity workOrder = new WorkOrderEntity();
workOrder.setId(id);
workOrder.setDispatcher(userId);
updateById(workOrder);
}
void calculateCr(List<YieldOrderEntity> list) {
//查询订单下的工序,计算cr值
for (YieldOrderEntity entity : list) {
List<YieldOrderCraftEntity> craftList = yieldOrderCraftService.list(Wrappers.<YieldOrderCraftEntity>lambdaQuery().eq(YieldOrderCraftEntity::getYoId, entity.getId()));
//定义订单总工时
BigDecimal total = new BigDecimal(0);
for (YieldOrderCraftEntity craftEntity : craftList) {
total = total.add(craftEntity.getHourQuota());
}
//换算成天
total = total.divide(BigDecimal.valueOf(1440), 2, RoundingMode.HALF_UP);
if (total.compareTo(new BigDecimal(0)) == 0) {
entity.setCrValue(new BigDecimal(0));
continue;
@ -392,7 +417,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.map(ppsId -> processMap.get(ppsId))
.filter(chineseName -> chineseName != null && !chineseName.isEmpty())
.collect(Collectors.joining(","));
order.setErrorInfo("工序信息不完整,工序:"+errorInfo+"未匹配作业中心");
order.setErrorInfo("工序信息不完整,工序:" + errorInfo + "未匹配作业中心");
order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(order);
continue;
@ -403,32 +428,32 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//判断是否有公共工序已经处理了,如果有则重新定义workPlanList,获取公共工序的最后结束时间和当前时间做比较,取大的作为上一道工序结束时间
if (planMap.containsKey(order.getYoCode())) {
workPlanList = planMap.get(order.getYoCode());
prevProcessEnd = prevProcessEnd.compareTo(workPlanList.get(workPlanList.size() - 1).getEndTime()) > 0 ? prevProcessEnd : workPlanList.get(workPlanList.size() - 1).getEndTime();
prevProcessEnd = prevProcessEnd.compareTo(workPlanList.get(workPlanList.size() - 1).getPlanEndTime()) > 0 ? prevProcessEnd : workPlanList.get(workPlanList.size() - 1).getPlanEndTime();
}
//处理外协工序,外协可能多个工序连续的,共享开始结束时间
Map<Long,List<YieldOrderCraftEntity>> outSourceMap = craftList.stream().filter(item -> item.getIsOutsource() == true).collect(Collectors.groupingBy(YieldOrderCraftEntity::getOcId));
Map<Long,String> ppsIdMap = new HashMap<>();
Map<Long, List<YieldOrderCraftEntity>> outSourceMap = craftList.stream().filter(item -> item.getIsOutsource() == true).collect(Collectors.groupingBy(YieldOrderCraftEntity::getOcId));
Map<Long, String> ppsIdMap = new HashMap<>();
for (Map.Entry<Long, List<YieldOrderCraftEntity>> entry : outSourceMap.entrySet()) {
String ppsIdStr = entry.getValue().stream()
.map(entity -> String.valueOf(entity.getPpsId())) // long → String
// 等价写法:.map(entity -> Long.toString(entity.getPpsId()))
.collect(Collectors.joining(",")); // 逗号分隔拼接
ppsIdMap.put(entry.getKey(),ppsIdStr);
ppsIdMap.put(entry.getKey(), ppsIdStr);
}
for (int i = 0; i < craftList.size(); i++) {
YieldOrderCraftEntity craft = craftList.get(i);
//如果是外协的话,去查询外协工序时间,若未查询到先默认3天,跳过该工序的排产
if(craft.getIsOutsource()){
if (craft.getIsOutsource()) {
String ppsIdStr = ppsIdMap.get(craft.getOcId());
OutsourceProcessEntity outsourceProcess = outsourceProcessService.getOne(Wrappers.<OutsourceProcessEntity>lambdaQuery().eq(OutsourceProcessEntity::getProcessId,ppsIdStr));
OutsourceProcessEntity outsourceProcess = outsourceProcessService.getOne(Wrappers.<OutsourceProcessEntity>lambdaQuery().eq(OutsourceProcessEntity::getProcessId, ppsIdStr));
BigDecimal totalTime = new BigDecimal(0);
if(outsourceProcess != null){
if (outsourceProcess != null) {
//外协多工序需要把时间平分,方便处理
prevProcessEnd = prevProcessEnd.plusMinutes((long)((double)outsourceProcess.getDays()/ppsIdStr.split(",").length*24*60));
totalTime = totalTime.add(BigDecimal.valueOf((long)((double)outsourceProcess.getDays()/ppsIdStr.split(",").length*24*60)));
}else{
prevProcessEnd = prevProcessEnd.plusMinutes((long) ((double) outsourceProcess.getDays() / ppsIdStr.split(",").length * 24 * 60));
totalTime = totalTime.add(BigDecimal.valueOf((long) ((double) outsourceProcess.getDays() / ppsIdStr.split(",").length * 24 * 60)));
} else {
prevProcessEnd = prevProcessEnd.plusDays(3);
totalTime = totalTime.add(BigDecimal.valueOf(3*24*60));
totalTime = totalTime.add(BigDecimal.valueOf(3 * 24 * 60));
}
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setWoId(order.getId());
@ -445,21 +470,21 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setScrapQty(0);
workPlan.setOcId(craft.getOcId());
workPlanList.add(workPlan);
}else{
} else {
if ("设备".equals(mainProducerMap.get(craft.getPpsId()))) {
//热表同槽
Boolean isSameTrough = sameTrough(order,craft,prevProcessEnd,workPlanList);
Boolean isSameTrough = sameTrough(order, craft, prevProcessEnd, workPlanList);
//同槽就不需要继续匹配了
if(isSameTrough){
if (isSameTrough) {
continue;
}
String glassCodeStr = null;
Map<String,Object> sameFurnaceMap = new HashMap<>();
Map<String, Object> sameFurnaceMap = new HashMap<>();
//烧结同炉
if(sintMap.containsKey(craft.getPpsId())){
sameFurnaceMap = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap);
if (sintMap.containsKey(craft.getPpsId())) {
sameFurnaceMap = sameFurnace(order, craft, workPlanList, prevProcessEnd, glassCodeStr, sintMap);
//同炉的话就不用走下面的匹配了,直接下一工序
if(sameFurnaceMap.get("isSameFurnace").toString() == "true"){
if (sameFurnaceMap.get("isSameFurnace").toString() == "true") {
continue;
}
}
@ -467,7 +492,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//根据作业中心查询所有设备
List<EquipAbilityEntity> equipAbilityList = equipAbilityService.list(Wrappers.<EquipAbilityEntity>lambdaQuery().in(EquipAbilityEntity::getWorkCenterId, craft.getWorkCenterId()).eq(EquipAbilityEntity::getCraftId, craft.getCaId()));
if (CollectionUtils.isEmpty(equipAbilityList)) {
order.setErrorInfo("作业中心:"+workCenterMap.get(craft.getWorkCenterId())+",工艺:"+craftAbilityMap.get(craft.getCaId())+",工序:"+processMap.get(craft.getPpsId()) +",未匹配到对应的设备能力");
order.setErrorInfo("作业中心:" + workCenterMap.get(craft.getWorkCenterId()) + ",工艺:" + craftAbilityMap.get(craft.getCaId()) + ",工序:" + processMap.get(craft.getPpsId()) + ",未匹配到对应的设备能力");
order.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderService.updateById(order);
isSchecuding = false;
@ -526,11 +551,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
} else {
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
workPlan.setPlanStartTime(equipResource.getStartTime());
if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else {
workPlan.setEndTime(equipResource.getEndTime());
workPlan.setPlanEndTime(equipResource.getEndTime());
}
workPlan.setWorkQty(order.getYpQty());
workPlan.setCaId(craft.getCaId());
@ -544,7 +569,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getStartTime(), workPlan.getEndTime())));
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId());
@ -552,7 +577,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//更新剩余产能
equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(capacity));
equipResource.setIsUsed("1");
if((order.getYieldType() == 2 || order.getYieldType() == 3) && sameFurnaceMap.get("glassCode") != null){
if ((order.getYieldType() == 2 || order.getYieldType() == 3) && sameFurnaceMap.get("glassCode") != null) {
equipResource.setGlassCode(sameFurnaceMap.get("glassCode").toString());
}
@ -574,8 +599,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
equipResourceService.update(equipResource1, updateWrapper);
//当前工序的结束时间作为下一工序的开始时间
prevProcessEnd = workPlan.getEndTime();
dateTime = workPlan.getEndTime();
prevProcessEnd = workPlan.getPlanEndTime();
dateTime = workPlan.getPlanEndTime();
isOccupied = true;
break;
}
@ -596,20 +621,20 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanEntity workPlan = new WorkPlanEntity();
BigDecimal totalTime = new BigDecimal(0);
PersonAbilityEntity ability = personAbilityMap.get(craft.getWorkCenterId() + "-" + craft.getPpsId() + "-" + craft.getCaId());
log.info("人员能力是:"+ craft.getWorkCenterId() + "-" + craft.getPpsId() + "-" + craft.getCaId());
log.info("人员能力是:" + craft.getWorkCenterId() + "-" + craft.getPpsId() + "-" + craft.getCaId());
//镀后检验和镀后接收先按半小时计算
if (ability != null) {
if ("镀后检验".equals(ability.getProcessName()) || "镀后接收".equals(ability.getProcessName())) {
totalTime = BigDecimal.valueOf(30);
workPlan.setStartTime(prevProcessEnd.plusMinutes(30));
workPlan.setEndTime(prevProcessEnd.plusMinutes(60));
workPlan.setPlanStartTime(prevProcessEnd.plusMinutes(30));
workPlan.setPlanEndTime(prevProcessEnd.plusMinutes(60));
if ("镀后接收".equals(ability.getProcessName())) {
workPlan.setMakeTeam(Long.valueOf(64));
}
if ("镀后检验".equals(ability.getProcessName())) {
workPlan.setMakeTeam(Long.valueOf(65));
}
prevProcessEnd = workPlan.getEndTime();
prevProcessEnd = workPlan.getPlanEndTime();
} else {
if ("0".equals(ability.getType())) {
totalTime = totalTime.add(BigDecimal.valueOf(order.getYpQty()).multiply(ability.getStandardTime()).add(ability.getPrepareTime()));
@ -624,20 +649,20 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.eq(PersonResourceEntity::getCraftId, craft.getCaId())
.le(PersonResourceEntity::getStartTime, prevProcessEnd)
.ge(PersonResourceEntity::getEndTime, prevProcessEnd));
if(CollectionUtils.isNotEmpty(personResourceList)){
if (CollectionUtils.isNotEmpty(personResourceList)) {
workPlan.setMakeTeam(personResourceList.get(0).getTeamId());
}
//需要人员资质的指定到人
if(StringUtils.isNotEmpty(ability.getProductIdent())
if (StringUtils.isNotEmpty(ability.getProductIdent())
&& StringUtils.isNotEmpty(order.getProductIdent())
&& ability.getProductIdent().equals(order.getProductIdent())
&& workPlan.getMakeTeam() != null){
List<String> memberList = baseMapper.selectTeamMember(workPlan.getMakeTeam(),ability.getCertificateId());
if(CollectionUtils.isNotEmpty(memberList)){
&& workPlan.getMakeTeam() != null) {
List<String> memberList = baseMapper.selectTeamMember(workPlan.getMakeTeam(), ability.getCertificateId());
if (CollectionUtils.isNotEmpty(memberList)) {
workPlan.setTeamMembers(memberList.stream().collect(Collectors.joining(",")));
}
}
}else{
} else {
prevProcessEnd = prevProcessEnd.plusMinutes(30);
totalTime = BigDecimal.valueOf(30);
}
@ -660,7 +685,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//未匹配到设备和人力资源,将工序状态改为6,标识为未排产
craft.setStatus(YieldOrderEnum.STATUS_PROCESS_ERROR.getCode());
yieldOrderCraftService.updateById(craft);
log.info("未匹配到设备和人力资源的工序是:"+craft.getPpsId());
log.info("未匹配到设备和人力资源的工序是:" + craft.getPpsId());
}
}
@ -682,8 +707,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workOrder.setBatchNo(order.getBatchNo());
workOrder.setYoId(order.getId());
workOrder.setMakeQty(order.getYpQty());
workOrder.setPlanStartDate(workPlanList.get(0).getStartTime() == null ? null : workPlanList.get(0).getStartTime().truncatedTo(ChronoUnit.DAYS).toString().substring(0, 10));
workOrder.setPlanEndDate(workPlanList.get(workPlanList.size() - 1).getEndTime() == null ? null : workPlanList.get(workPlanList.size() - 1).getEndTime().truncatedTo(ChronoUnit.DAYS).toString().substring(0, 10));
workOrder.setPlanStartDate(workPlanList.get(0).getPlanStartTime() == null ? null : workPlanList.get(0).getPlanStartTime().truncatedTo(ChronoUnit.DAYS).toString().substring(0, 10));
workOrder.setPlanEndDate(workPlanList.get(workPlanList.size() - 1).getPlanEndTime() == null ? null : workPlanList.get(workPlanList.size() - 1).getPlanEndTime().truncatedTo(ChronoUnit.DAYS).toString().substring(0, 10));
workOrder.setPlanStartTime(workPlanList.get(0).getPlanStartTime() == null ? null : workPlanList.get(0).getPlanStartTime());
workOrder.setPlanEndTime(workPlanList.get(workPlanList.size() - 1).getPlanEndTime() == null ? null : workPlanList.get(workPlanList.size() - 1).getPlanEndTime());
workOrder.setInventoryQty(0);
workOrder.setRunStatus(2);
workOrder.setPickingStatus(0);
@ -700,9 +727,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workOrder.setPartCode(order.getPartCode());
workOrder.setDemandDate(order.getDemandDate());
//调度员是主工序加工班组的调度员
if(workPlanList.get(0).getMakeTeam() != null){
if (workPlanList.get(0).getMakeTeam() != null) {
TeamSetEntity teamSet = teamSetService.getById(workPlanList.get(0).getMakeTeam());
if(teamSet != null){
if (teamSet != null) {
workOrder.setDispatcher(teamSet.getDispatcher());
}
}
@ -772,13 +799,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
int startIndex = -1;
int endIndex = -1;
for (int i = 0; i < workPlanList.size(); i++) {
if (workPlanList.get(i).getStartTime() != null) {
if (workPlanList.get(i).getPlanStartTime() != null) {
startIndex = i;
break;
}
}
for (int i = workPlanList.size() - 1; i > 0; i--) {
if (workPlanList.get(i).getEndTime() != null) {
if (workPlanList.get(i).getPlanEndTime() != null) {
endIndex = i;
break;
}
@ -790,13 +817,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanEntity next = workPlanList.get(i + 1); // 下一个计划(当前计划的后续计划)
// 当前计划的结束时间 = 下一个计划的开始时间
LocalDateTime currentEnd = next.getStartTime();
LocalDateTime currentEnd = next.getPlanStartTime();
// 当前计划的开始时间 = 结束时间 - 加工时间
LocalDateTime currentStart = currentEnd.minusMinutes(current.getHourQuota().longValue());
// 赋值给当前计划
current.setStartTime(currentStart);
current.setEndTime(currentEnd);
current.setPlanStartTime(currentStart);
current.setPlanEndTime(currentEnd);
current.setMakeTeam(next.getMakeTeam());
}
}
@ -807,40 +834,40 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanEntity prev = workPlanList.get(i - 1); // 上一个计划(当前计划的前置计划)
// 当前计划的开始时间 = 上一个计划的结束时间
LocalDateTime currentStart = prev.getEndTime();
LocalDateTime currentStart = prev.getPlanEndTime();
// 当前计划的结束时间 = 开始时间 + 加工时间
LocalDateTime currentEnd = currentStart.plusMinutes(current.getHourQuota().longValue());
// 赋值给当前计划
current.setStartTime(currentStart);
current.setEndTime(currentEnd);
current.setPlanStartTime(currentStart);
current.setPlanEndTime(currentEnd);
current.setMakeTeam(prev.getMakeTeam());
}
}
//特殊处理,一个作业中心只有人力资源的情况
for(int i=0;i<list.size();i++){
if(list.get(i).getStartTime() == null && list.get(i).getEndTime() == null){
if(i!=0 && list.get(i-1).getEndTime() != null){
list.get(i).setStartTime(list.get(i-1).getEndTime());
list.get(i).setEndTime(list.get(i).getStartTime().plusMinutes(list.get(i).getHourQuota().longValue()));
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getPlanStartTime() == null && list.get(i).getPlanEndTime() == null) {
if (i != 0 && list.get(i - 1).getPlanEndTime() != null) {
list.get(i).setPlanStartTime(list.get(i - 1).getPlanEndTime());
list.get(i).setPlanEndTime(list.get(i).getPlanStartTime().plusMinutes(list.get(i).getHourQuota().longValue()));
continue;
}
if(i!=list.size()-1 && list.get(i+1).getStartTime() != null){
list.get(i).setEndTime(list.get(i+1).getStartTime());
list.get(i).setStartTime(list.get(i).getEndTime().minusMinutes(list.get(i).getHourQuota().longValue()));
if (i != list.size() - 1 && list.get(i + 1).getPlanStartTime() != null) {
list.get(i).setPlanEndTime(list.get(i + 1).getPlanStartTime());
list.get(i).setPlanStartTime(list.get(i).getPlanEndTime().minusMinutes(list.get(i).getHourQuota().longValue()));
}
}
}
//判断是否所有数据都没有开始结束时间,说明订单只有人力资源匹配
boolean isEmpty = list.stream().allMatch(item -> Objects.isNull(item.getStartTime())
&& Objects.isNull(item.getEndTime()));
if(isEmpty){
boolean isEmpty = list.stream().allMatch(item -> Objects.isNull(item.getPlanStartTime())
&& Objects.isNull(item.getPlanEndTime()));
if (isEmpty) {
//上一道工序结束时间
LocalDateTime prevProcessEnd = LocalDateTime.now();
for(int i=0;i<list.size();i++){
list.get(i).setStartTime(prevProcessEnd);
list.get(i).setEndTime(prevProcessEnd.plusMinutes(list.get(i).getHourQuota().longValue()));
prevProcessEnd = list.get(i).getEndTime();
for (int i = 0; i < list.size(); i++) {
list.get(i).setPlanStartTime(prevProcessEnd);
list.get(i).setPlanEndTime(prevProcessEnd.plusMinutes(list.get(i).getHourQuota().longValue()));
prevProcessEnd = list.get(i).getPlanEndTime();
}
}
@ -1089,8 +1116,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
equipResource.setIsUsed("1");
equipResourceService.updateById(equipResource);
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
workPlan.setPlanStartTime(equipResource.getStartTime());
workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
workPlan.setWorkQty(order.getYpQty());
workPlan.setCaId(craft.getCaId());
workPlan.setPpsId(craft.getPpsId());
@ -1103,7 +1130,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getStartTime(), workPlan.getEndTime())));
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId());
@ -1180,113 +1207,113 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
public Boolean sameTrough(YieldOrderEntity order,YieldOrderCraftEntity craft,LocalDateTime dateTime,List<WorkPlanEntity> workPlanList){
public Boolean sameTrough(YieldOrderEntity order, YieldOrderCraftEntity craft, LocalDateTime dateTime, List<WorkPlanEntity> workPlanList) {
Boolean isSameTrough = false;
SameTroughEntity sameTrough =sameTroughService.getOne(Wrappers.<SameTroughEntity>lambdaQuery()
.eq(SameTroughEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(SameTroughEntity::getCraftId,craft.getCaId())
.eq(SameTroughEntity::getProcessId,craft.getPpsId()));
if(sameTrough != null){
SameTroughEntity sameTrough = sameTroughService.getOne(Wrappers.<SameTroughEntity>lambdaQuery()
.eq(SameTroughEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(SameTroughEntity::getCraftId, craft.getCaId())
.eq(SameTroughEntity::getProcessId, craft.getPpsId()));
if (sameTrough != null) {
//查询是否有已经排产的计划
List<WorkPlanEntity> workPlanOldList = workPlanService.list(Wrappers.<WorkPlanEntity>lambdaQuery()
.eq(WorkPlanEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(WorkPlanEntity::getCaId,craft.getCaId())
.eq(WorkPlanEntity::getPpsId,craft.getPpsId())
.ge(WorkPlanEntity::getStartTime,dateTime).orderByAsc(WorkPlanEntity::getStartTime));
if(CollectionUtils.isNotEmpty(workPlanOldList)){
.eq(WorkPlanEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(WorkPlanEntity::getCaId, craft.getCaId())
.eq(WorkPlanEntity::getPpsId, craft.getPpsId())
.ge(WorkPlanEntity::getPlanStartTime, dateTime).orderByAsc(WorkPlanEntity::getPlanStartTime));
if (CollectionUtils.isNotEmpty(workPlanOldList)) {
//总生产量
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
//可能有多个订单符合要求,按照车间订单、时间分组排序
Map<Long,List<WorkPlanEntity>> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId));
for(Map.Entry<Long,List<WorkPlanEntity>> entry : workPlanMap.entrySet()){
Map<Long, List<WorkPlanEntity>> workPlanMap = workPlanOldList.stream().collect(Collectors.groupingBy(WorkPlanEntity::getWoId));
for (Map.Entry<Long, List<WorkPlanEntity>> entry : workPlanMap.entrySet()) {
List<WorkPlanEntity> planList = entry.getValue();
Boolean isEnough = true;
List<Long> resourceList = new ArrayList<>();
for(WorkPlanEntity workPlan : planList){
if(workPlan.getEquipResourceId() != null){
for (WorkPlanEntity workPlan : planList) {
if (workPlan.getEquipResourceId() != null) {
EquipResourceEntity equipResource = equipResourceService.getById(workPlan.getEquipResourceId());
//判断剩余产能是否满足总产能
if(sumCapacity.compareTo(equipResource.getRestCapacity()) > 0){
if (sumCapacity.compareTo(equipResource.getRestCapacity()) > 0) {
isEnough = false;
resourceList.clear();
break;
}else{
} else {
resourceList.add(workPlan.getEquipResourceId());
}
}
}
//如果产能满足,再判断是否满足同槽条件
if(isEnough){
if (isEnough) {
WorkOrderEntity workOrder = this.getById(workPlanOldList.get(0).getWoId());
YieldOrderEntity yieldOrderEntity = yieldOrderService.getById(workOrder.getYoId());
List<YieldOrderCraftEntity> orderCraftList = yieldOrderCraftService.list(Wrappers.<YieldOrderCraftEntity>lambdaQuery()
.eq(YieldOrderCraftEntity::getYoId,yieldOrderEntity.getId())
.eq(YieldOrderCraftEntity::getPpsId,craft.getPpsId())
.eq(YieldOrderCraftEntity::getCaId,craft.getCaId())
.eq(YieldOrderCraftEntity::getWorkCenterId,craft.getWorkCenterId()));
.eq(YieldOrderCraftEntity::getYoId, yieldOrderEntity.getId())
.eq(YieldOrderCraftEntity::getPpsId, craft.getPpsId())
.eq(YieldOrderCraftEntity::getCaId, craft.getCaId())
.eq(YieldOrderCraftEntity::getWorkCenterId, craft.getWorkCenterId()));
SameTroughVO voNew = sameTroughService.selectSameTroughInfo(craft.getId());
SameTroughVO voOld = sameTroughService.selectSameTroughInfo(orderCraftList.get(0).getId());
//根据同槽因素进行比对
Boolean isSameTrough2 = true;
//键位
if("1".equals(sameTrough.getKeyBinding()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getKeyBinding()) && StringUtils.isNotEmpty(voOld.getKeyBinding()) && !voNew.getKeyBinding().equals(voOld.getKeyBinding())){
if ("1".equals(sameTrough.getKeyBinding()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getKeyBinding()) && StringUtils.isNotEmpty(voOld.getKeyBinding()) && !voNew.getKeyBinding().equals(voOld.getKeyBinding())) {
isSameTrough2 = false;
}
//生产厂家
if("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())){
if ("1".equals(sameTrough.getProducter()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getProducter()) && StringUtils.isNotEmpty(voOld.getProducter()) && !voNew.getProducter().equals(voOld.getProducter())) {
isSameTrough2 = false;
}
//检验编号
if("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())){
if ("1".equals(sameTrough.getInspectionCode()) && voNew.getPartCode().equals(voOld.getPartCode()) && StringUtils.isNotEmpty(voNew.getInspectionCode()) && StringUtils.isNotEmpty(voOld.getInspectionCode()) && !voNew.getInspectionCode().equals(voOld.getInspectionCode())) {
isSameTrough2 = false;
}
//材料
if("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())){
if ("1".equals(sameTrough.getMaterial()) && StringUtils.isNotEmpty(voNew.getMaterial()) && StringUtils.isNotEmpty(voOld.getMaterial()) && !voNew.getMaterial().equals(voOld.getMaterial())) {
isSameTrough2 = false;
}
//厚度
if("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())){
if ("1".equals(sameTrough.getThickness()) && StringUtils.isNotEmpty(voNew.getThickness()) && StringUtils.isNotEmpty(voOld.getThickness()) && !voNew.getThickness().equals(voOld.getThickness())) {
isSameTrough2 = false;
}
//钝化
if("1".equals(sameTrough.getPassivation())){
if(StringUtils.isNotEmpty(voNew.getPlate())
if ("1".equals(sameTrough.getPassivation())) {
if (StringUtils.isNotEmpty(voNew.getPlate())
&& StringUtils.isNotEmpty(voOld.getPlate())
&& ((voNew.getPlate().contains("不钝化")
&& !voOld.getPlate().contains("不钝化"))
|| (voOld.getPlate().contains("不钝化")
&& !voNew.getPlate().contains("不钝化")))){
&& !voNew.getPlate().contains("不钝化")))) {
isSameTrough2 = false;
}
}
//硬度
if("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())){
if ("1".equals(sameTrough.getHardness()) && StringUtils.isNotEmpty(voNew.getHardness()) && StringUtils.isNotEmpty(voOld.getHardness()) && !voNew.getHardness().equals(voOld.getHardness())) {
isSameTrough2 = false;
}
//生产标识
if("1".equals(sameTrough.getProductIdent())){
List<String> highIdentList = Arrays.asList(new String[]{"JHT","JI","JIX","YH","CC","SATA"});
if(StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())){
if ("1".equals(sameTrough.getProductIdent())) {
List<String> highIdentList = Arrays.asList(new String[]{"JHT", "JI", "JIX", "YH", "CC", "SATA"});
if (StringUtils.isNotEmpty(order.getProductIdent()) && highIdentList.contains(order.getProductIdent())) {
isSameTrough2 = false;
}
if(!(voNew.getPartCode().equals(voOld.getPartCode())
if (!(voNew.getPartCode().equals(voOld.getPartCode())
&& StringUtils.isNotEmpty(voNew.getProductIdent())
&& StringUtils.isNotEmpty(voOld.getProductIdent())
&& voNew.getProductIdent().equals(voOld.getProductIdent()))){
isSameTrough2 = false;
&& voNew.getProductIdent().equals(voOld.getProductIdent()))) {
isSameTrough2 = false;
}
}
if(isSameTrough2){
for(Long resourceId : resourceList){
if (isSameTrough2) {
for (Long resourceId : resourceList) {
EquipResourceEntity equipResource = equipResourceService.getById(resourceId);
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
workPlan.setPlanStartTime(equipResource.getStartTime());
if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else {
workPlan.setEndTime(equipResource.getEndTime());
workPlan.setPlanEndTime(equipResource.getEndTime());
}
workPlan.setWorkQty(order.getYpQty());
workPlan.setCaId(craft.getCaId());
@ -1300,7 +1327,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getStartTime(), workPlan.getEndTime())));
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId());
@ -1319,10 +1346,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
return isSameTrough;
}
public Map<String,Object> sameFurnace(YieldOrderEntity order,YieldOrderCraftEntity craft,List<WorkPlanEntity> workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map<Long, List<SintTempCurveEntity>> sintMap){
Map<String,Object> map = new HashMap<>();
public Map<String, Object> sameFurnace(YieldOrderEntity order, YieldOrderCraftEntity craft, List<WorkPlanEntity> workPlanList, LocalDateTime prevProcessEnd, String glassCodeStr, Map<Long, List<SintTempCurveEntity>> sintMap) {
Map<String, Object> map = new HashMap<>();
Boolean isSameFurnace = false;
if(order.getYieldType() == YieldOrderEnum.YIELD_TYPE_2.getCode() || order.getYieldType() == YieldOrderEnum.YIELD_TYPE_3.getCode()){//烧结订单
if (order.getYieldType() == YieldOrderEnum.YIELD_TYPE_2.getCode() || order.getYieldType() == YieldOrderEnum.YIELD_TYPE_3.getCode()) {//烧结订单
//获取当前工序的所有温度曲线
List<SintTempCurveEntity> sintList = sintMap.get(craft.getPpsId());
List<List<String>> sintMaterialList = new ArrayList<>();
@ -1332,44 +1360,44 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
PartEntity part = new PartEntity();
part.setPartCode(order.getPartCode());
List<PartEntity> childPartList = partService.selectChildPart(part);
if(CollectionUtils.isNotEmpty(childPartList)){
if (CollectionUtils.isNotEmpty(childPartList)) {
//获取子件的所有玻璃粉牌号
List<String> materialList = childPartList.stream().filter(item -> StringUtils.isNotEmpty(item.getMaterial())).map(PartEntity::getMaterial).collect(Collectors.toList());
List<String> maxMatchList = null;
int maxCount = 0;
for(List<String> glassCodeList : sintMaterialList){
for (List<String> glassCodeList : sintMaterialList) {
int currentCount = (int) glassCodeList.stream().filter(materialList::contains).count();
if (currentCount > maxCount) {
maxCount = currentCount;
maxMatchList = glassCodeList;
}
}
if(maxMatchList != null){
if (maxMatchList != null) {
glassCodeStr = maxMatchList.stream().collect(Collectors.joining(","));
map.put("glassCode",glassCodeStr);
log.info("订单:"+order.getYoCode()+",温度曲线是:"+glassCodeStr);
map.put("glassCode", glassCodeStr);
log.info("订单:" + order.getYoCode() + ",温度曲线是:" + glassCodeStr);
}
}
//包含说明之前有过这个温度曲线的订单
//根据当前时间查询包含玻璃粉牌号的设备资源
List<EquipResourceEntity> equipResourceList = equipResourceService.list(Wrappers.<EquipResourceEntity>lambdaQuery()
.eq(EquipResourceEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(EquipResourceEntity::getCraftId,craft.getCaId())
.ge(EquipResourceEntity::getStartTime,prevProcessEnd)
.eq(EquipResourceEntity::getGlassCode,glassCodeStr));
if(CollectionUtils.isNotEmpty(equipResourceList)){
.eq(EquipResourceEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(EquipResourceEntity::getCraftId, craft.getCaId())
.ge(EquipResourceEntity::getStartTime, prevProcessEnd)
.eq(EquipResourceEntity::getGlassCode, glassCodeStr));
if (CollectionUtils.isNotEmpty(equipResourceList)) {
//计算生产所需产能,需将m2换算成dm2
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
for(EquipResourceEntity equipResource : equipResourceList){
if(equipResource.getRestCapacity().compareTo(sumCapacity) > 0){
for (EquipResourceEntity equipResource : equipResourceList) {
if (equipResource.getRestCapacity().compareTo(sumCapacity) > 0) {
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
workPlan.setPlanStartTime(equipResource.getStartTime());
if ("0".equals(equipResource.getEquipType())) {
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
} else {
workPlan.setEndTime(equipResource.getEndTime());
workPlan.setPlanEndTime(equipResource.getEndTime());
}
workPlan.setWorkQty(order.getYpQty());
workPlan.setCaId(craft.getCaId());
@ -1383,7 +1411,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getStartTime(), workPlan.getEndTime())));
workPlan.setHourQuota(BigDecimal.valueOf(ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime())));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId());
@ -1399,7 +1427,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
map.put("isSameFurnace",isSameFurnace);
map.put("isSameFurnace", isSameFurnace);
return map;
}
@ -1412,22 +1440,63 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public void saveWorkOrderFromBak(String cardNo) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("cardNo",cardNo);
paramMap.put("cardNo", cardNo);
// 恢复老mes排产数据
String url = oldMesUrl + saveWorkOrderFromBak;
try {
HttpUtil.post(url+"/"+cardNo, paramMap);
HttpUtil.post(url + "/" + cardNo, paramMap);
} catch (Exception e) {
log.error("恢复老mes排产数据报错:"+e.getMessage());
log.error("恢复老mes排产数据报错:" + e.getMessage());
e.printStackTrace();
}
List<String> cardNoList = Arrays.asList(cardNo.split(","));
List<YieldOrderEntity> orderList = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(YieldOrderEntity::getCardNo,cardNoList));
orderList.forEach(item ->{
List<YieldOrderEntity> orderList = yieldOrderService.list(Wrappers.<YieldOrderEntity>lambdaQuery().in(YieldOrderEntity::getCardNo, cardNoList));
orderList.forEach(item -> {
item.setStatus(YieldOrderEnum.STATUS_RECOVER.getCode());
yieldOrderService.updateById(item);
});
}
@Override
public IPage<WorkPlanVO> selectQuaExecuteAnalysisPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
if (StringUtils.isNotEmpty(workPlan.getStartTime())) {
workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(workPlan.getEndTime())) {
workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59");
}
List<WorkPlanVO> list = baseMapper.selectQuaExecuteAnalysisPage(page, workPlan);
return page.setRecords(list);
}
@Override
public List<WorkPlanVO> selectCenterExecuteList(WorkPlanVO workPlan) {
List<WorkPlanVO> list = baseMapper.selectCenterExecuteList(workPlan);
if (CollectionUtils.isNotEmpty(list)) {
for (WorkPlanVO vo : list) {
vo.setEarlyStartCountRate(vo.getEarlyStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setOnTimeStartCountRate(vo.getOnTimeStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setDelayStartCountRate(vo.getDelayStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setEarlyFinishCountRate(vo.getEarlyFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setOnTimeFinishCountRate(vo.getOnTimeFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setDelayFinishCountRate(vo.getDelayFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
}
}
return list;
}
@Override
public IPage<WorkPlanVO> selectOrderExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
if (StringUtils.isNotEmpty(workPlan.getStartTime())) {
workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(workPlan.getEndTime())) {
workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59");
}
List<WorkPlanVO> list = baseMapper.selectOrderExecuteDetailPage(page, workPlan);
return page.setRecords(list);
}
}

@ -38,6 +38,9 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
@ -69,7 +72,7 @@ public class WorkPlanServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPla
WorkPlanEntity workPlanUpdate = new WorkPlanEntity();
workPlanUpdate.setId(id);
if (ObjectUtils.isNotEmpty(factStartTime)) {
workPlanUpdate.setFactStartTime(factStartTime);
workPlanUpdate.setFactStartTime(LocalDateTime.ofInstant(factStartTime.toInstant(), ZoneId.systemDefault()));
workPlanUpdate.setStatus(WorkPlanEntity.STATUS_START);
//获取当前计划
WorkPlanEntity workPlan = baseMapper.selectById(id);
@ -82,7 +85,7 @@ public class WorkPlanServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPla
}
}
if (ObjectUtils.isNotEmpty(factEndTime)) {
workPlanUpdate.setFactEndTime(factEndTime);
workPlanUpdate.setFactEndTime(LocalDateTime.ofInstant(factEndTime.toInstant(), ZoneId.systemDefault()));
workPlanUpdate.setStatus(WorkPlanEntity.STATUS_COMPLETE);
}
this.updateById(workPlanUpdate);

@ -43,4 +43,50 @@ public class WorkPlanVO extends WorkPlanEntity {
@Serial
private static final long serialVersionUID = 1L;
private String partName;
private String batchNo;
private String cardNo;
private String productIdent;
private String processName;
private String craftName;
private String certificateName;
private String workCenterName;
private String teamName;
private String woCode;
private String startTime;
private String endTime;
private String isQua;
private Integer earlyStartCount;
private Integer onTimeStartCount;
private Integer delayStartCount;
private Integer earlyFinishCount;
private Integer onTimeFinishCount;
private Integer delayFinishCount;
private String earlyStartCountRate;
private String onTimeStartCountRate;
private String delayStartCountRate;
private String earlyFinishCountRate;
private String onTimeFinishCountRate;
private String delayFinishCountRate;
private Integer totalOrderCount;
private Integer interval;
private String startType;
private String endType;
private String planDurationMinute;
private String factDurationMinute;
private String biasDurationMinute;
private String receiveTime;
}

Loading…
Cancel
Save