Browse Source

2024-04-25 修改配置信息读取方式

master_hella_20240701
zhousq 1 year ago
parent
commit
70ae9e03db
  1. 2
      win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/enums/ErrorCodeConstants.java
  2. 20
      win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/enums/MesConfigKeys.java
  3. 34
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/config/InfaConfigUtil.java
  4. 21
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/config/MesBaseConfig.java
  5. 160
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesorderday/MesOrderDayServiceImpl.java
  6. 2
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesworkscheduling/MesWorkSchedulingService.java
  7. 18
      win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesworkscheduling/MesWorkSchedulingServiceImpl.java

2
win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/enums/ErrorCodeConstants.java

@ -29,6 +29,7 @@ public interface ErrorCodeConstants {
ErrorCode TEAM_NOT_EXISTS = new ErrorCode(1_006_000_016, "班组不存在!");
ErrorCode TEAM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_006_000_017, "班组导入数据内容为空!");
ErrorCode PRODUCTION_PLAN_NOT_EXISTS = new ErrorCode(1_006_000_018, "排产计划不存在!");
ErrorCode PRODUCTION_PLAN_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_006_000_019, "排产计划导入数据内容为空!");
ErrorCode TEAM_SETTING_NOT_EXISTS = new ErrorCode(1_006_000_020, "班组不存在!");
ErrorCode TEAM_SETTING_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_006_000_021, "班组导入数据内容为空!");
@ -44,6 +45,7 @@ public interface ErrorCodeConstants {
ErrorCode MES_ORDER_MONTH_SUB_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_006_000_031, "订单月计划子计划数据内容为空!");
ErrorCode ORDER_SCHEDULED = new ErrorCode(1_006_000_032, "计划已排产,无法删除!");
ErrorCode ORDER_DAY_IS_EMPTY = new ErrorCode(1_006_000_033, "日计划数据不存在!");
ErrorCode PLAN_SCHEDULED_EXISTS = new ErrorCode(1_006_000_034, "计划已经排产,不能重复排产!");
// ========== 能力配置 1-006-001-000 ==========
ErrorCode ABILITY_INFO_LIST_IS_EMPTY = new ErrorCode(1_006_001_001, "能力矩阵信息不存在!");

20
win-module-mes/win-module-mes-api/src/main/java/com/win/module/mes/enums/MesConfigKeys.java

@ -0,0 +1,20 @@
package com.win.module.mes.enums;
public class MesConfigKeys {
/**是否开启齐套检查*/
public static final String PRE_START_CHECK_ON="mes_pre_start_check_on";
/**是否顺序生产:开启时只能按顺序进行工单开工,关闭时可以任意选择一个工单开工*/
public static final String STRICT_ON_SEQUENCE="mes_strict_on_sequence";
/**工位校验开关-是否设备校验*/
public static final String CHECK_EQUIPMENT_ON="mes_check_equipment_on";
/**工位校验开关-是否物料校验*/
public static final String CHECK_MATERIAL_ON="mes_check_material_on";
/**工位校验开关-是否技能校验*/
public static final String CHECK_ABILITY_ON="mes_check_ability_on";
/**工位校验开关-是否步骤校验*/
public static final String CHECK_STEPS_ON="mes_check_steps_on";
/**工位校验开关-是否岗位校验*/
public static final String CHECK_POST_ON="mes_check_post_on";
/**是否允许工序多次报工*/
public static final String ALLOW_MUTI_REPORT_PROCESS="mes_allow_muti_report_process";
}

34
win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/config/InfaConfigUtil.java

@ -0,0 +1,34 @@
package com.win.module.mes.config;
import com.win.module.infra.api.config.ConfigApi;
import com.win.module.infra.vo.ConfigInfoVO;
import com.win.module.system.util.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class InfaConfigUtil {
@Resource
private ConfigApi apiConfigApi;
public Boolean getBooleanValue(String key,Boolean defaulValue){
return Boolean.valueOf(getStringValue(key,String.valueOf(defaulValue)));
}
public String getStringValue(String key,String defaulValue){
ConfigInfoVO configInfoVO = apiConfigApi.queryConfigInfoByKey(key);
if(StringUtils.isNull(configInfoVO)){
return defaulValue;
}else{
if (StringUtils.isNull(configInfoVO.getValue())){
return defaulValue;
}else{
return configInfoVO.getValue();
}
}
}
public Integer getIntegerValue(String key,Integer defaulValue){
return Integer.valueOf(getStringValue(key,String.valueOf(defaulValue)));
}
}

21
win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/config/MesBaseConfig.java

@ -1,21 +0,0 @@
package com.win.module.mes.config;
public class MesBaseConfig {
/**
* MES工作流中的通用配置项
* */
//是否开工检查
public static final Boolean PRE_START_CHECK_ON=true;
//是否顺序生产:开启时只能按顺序进行工单开工,关闭时可以任意选择一个工单开工
public static final Boolean STRICT_ON_SEQUENCE=true;
//工位校验开关-是否设备校验
public static final Boolean CHECK_EQUIPMENT_ON=true;
//工位校验开关-是否物料校验
public static final Boolean CHECK_MATERIAL_ON=true;
//工位校验开关-是否技能校验
public static final Boolean CHECK_ABILITY_ON=true;
//工位校验开关-是否步骤校验
public static final Boolean CHECK_STEPS_ON=true;
//工位校验开关-是否岗位校验
public static final Boolean CHECK_POST_ON=true;
}

160
win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesorderday/MesOrderDayServiceImpl.java

@ -4,9 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.win.framework.common.exception.ErrorCode;
import com.win.module.mes.config.MesBaseConfig;
import com.win.module.mes.controller.mesorderday.vo.*;
import com.win.module.mes.dal.dataobject.mesorderdayroutesub.MesOrderDayRoutesubDO;
import com.win.module.mes.dal.dataobject.mesworkscheduling.MesWorkSchedulingDO;
@ -20,13 +17,13 @@ import com.win.module.mes.service.mesorderdayroutesub.MesOrderDayRoutesubService
import com.win.module.mes.service.mesorderdayworker.MesOrderDayWorkerService;
import com.win.module.mes.service.mesorderdayworkstation.MesOrderDayWorkstationService;
import com.win.module.mes.service.mesworkscheduling.MesWorkSchedulingService;
import com.win.module.mes.service.mesworkschedulingdetail.MesWorkSchedulingDetailService;
import com.win.module.mes.config.InfaConfigUtil;
import com.win.module.system.util.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.*;
@ -62,7 +59,9 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
private MesOrderDayWorkerService mesOrderDayWorkerService;
@Resource
private MesOrderDayWorkstationService mesOrderDayWorkstationService;
@Resource
InfaConfigUtil infaConfigUtil;
private String WAITBEGIN;
@Override
@Transactional
public Long createOrderDay(MesOrderDayCreateReqVO createReqVO) {
@ -74,7 +73,7 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
}
//生成对应的数据模板
private void createRealationModels(MesOrderDayDO orderDay){
private void createRealationModels(MesOrderDayDO orderDay) {
//生成工艺路线实例,产品工艺不存在时不允许录入计划
mesOrderDayRouteService.createOrderDayRouteModel(orderDay);
@ -84,11 +83,12 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
mesOrderDayEquipmentService.createOrderDayEquipmentModel(orderDay);
// //生成工位信息实例 没有强制要求
//mesOrderDayWorkerService.createOrderDayWorkerModel(orderDay);
mesOrderDayWorkstationService.createOrderDayWorkstationModel(orderDay);
mesOrderDayWorkstationService.createOrderDayWorkstationModel(orderDay);
//生成工序模具信息
//-------------
}
@Override
public Integer updateOrderDay(MesOrderDayUpdateReqVO updateReqVO) {
// 校验存在
@ -105,11 +105,11 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
///validateOrderDayExists(id);
// 删除2
MesOrderDayDO mesOrderDayDO = orderDayMapper.selectById(id);
if(StringUtils.isNotNull(mesOrderDayDO)){
mesOrderDayRouteService.deleteOrderDayRouteModel(mesOrderDayDO);
mesOrderDayBomService.deleteOrderDayBomModel(mesOrderDayDO);
return orderDayMapper.deleteById(id);
}else{
if (StringUtils.isNotNull(mesOrderDayDO)) {
mesOrderDayRouteService.deleteOrderDayRouteModel(mesOrderDayDO);
mesOrderDayBomService.deleteOrderDayBomModel(mesOrderDayDO);
return orderDayMapper.deleteById(id);
} else {
return -1;
}
}
@ -151,6 +151,7 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
return errorList;
}
/**
* 发布日生产计划
* 步骤根据日生产计划的计划编号产品号计划数量计划时间工单模式bom方式是否可改工艺方式是否可改 生产模式
@ -158,60 +159,68 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
* 生产模式派工则根据工艺路线+工序的配置 生成默认的工位人员设备领工方式 把人员设备数据置空人员和设备可以随时调整
* 如果bom方式使用了替代bom则可以在发布时进行调整
* 如果工艺方式使用了临时工艺则可以在发布时进行调整发布后不可以调整
*job_mes_work_scheduling job_mes_work_scheduling_detail
* */
* job_mes_work_scheduling job_mes_work_scheduling_detail
*/
@Override
@Transactional
public Integer publish(MesOrderDayCreateReqVO reqVO){
if(StringUtils.isNull(reqVO)){
throw exception(ORDER_DAY_IS_EMPTY);
}
Map<String, List> schedulingSingle = getSchedulingSingle(reqVO);
//工作模式
int ret=mesWorkSchedulingService.inertBacthTrans(schedulingSingle.get("master"),schedulingSingle.get("sub"));
MesOrderDayDO dayDO=new MesOrderDayDO();
dayDO.setPlanNoDay(reqVO.getPlanNoDay());
dayDO.setBatchCode(reqVO.getBatchCode());
dayDO.setProductCode(reqVO.getProductCode());
dayDO.setId(reqVO.getUpdateId());
dayDO.setStatus(PlanBillStatusEnum.PUBLISHED.getCode());
orderDayMapper.updateById(dayDO);
return ret;
public Integer publish(MesOrderDayCreateReqVO reqVO) {
if (StringUtils.isNull(reqVO)) {
throw exception(ORDER_DAY_IS_EMPTY);
}
//增加判断是否已经发布了该计划
if (!mesWorkSchedulingService.exisitWorkScheduling(reqVO)) {
getPreCheckStauts();//获取前置参数配置
Map<String, List> schedulingSingle = getSchedulingSingle(reqVO);
//工作模式
int ret = mesWorkSchedulingService.inertBacthTrans(schedulingSingle.get("master"), schedulingSingle.get("sub"));
MesOrderDayDO dayDO = new MesOrderDayDO();
dayDO.setPlanNoDay(reqVO.getPlanNoDay());
dayDO.setBatchCode(reqVO.getBatchCode());
dayDO.setProductCode(reqVO.getProductCode());
dayDO.setId(reqVO.getUpdateId());
dayDO.setStatus(PlanBillStatusEnum.PUBLISHED.getCode());
orderDayMapper.updateById(dayDO);
return ret;
} else {
throw exception(PLAN_SCHEDULED_EXISTS);
}
}
@Override
public void publish(Long id){
public void publish(Long id) {
}
private Map<String,List> getSchedulingSingle(MesOrderDayCreateReqVO createReqVO){
Integer planCounts=createReqVO.getPlanCount();
Integer billCount=1;
if(createReqVO.getWorkMode().equalsIgnoreCase(WorkModeEnum.BATCH.getCode())){
billCount=planCounts;
}else{
billCount=1;
private Map<String, List> getSchedulingSingle(MesOrderDayCreateReqVO createReqVO) {
Integer planCounts = createReqVO.getPlanCount();
Integer billCount = 1;
if (createReqVO.getWorkMode().equalsIgnoreCase(WorkModeEnum.BATCH.getCode())) {
billCount = planCounts;
} else {
billCount = 1;
}
int counts=Math.floorDiv(planCounts,billCount);
int perCounts=planCounts/counts;
int counts = Math.floorDiv(planCounts, billCount);
int perCounts = planCounts / counts;
//获取工艺路线的实例的工序
OrderDayQueryParamVo orderVO =new OrderDayQueryParamVo();
OrderDayQueryParamVo orderVO = new OrderDayQueryParamVo();
orderVO.setBatchCode(createReqVO.getBatchCode());
orderVO.setPlanNoDay(createReqVO.getPlanNoDay());
orderVO.setProductCode(createReqVO.getProductCode());
orderVO.setProcessrouteCode(createReqVO.getProcessrouteCode());
List<MesOrderDayRoutesubDO> orderDayRoutesubList = mesOrderDayRoutesubService.getOrderDayRoutesubList(orderVO);
Optional<MesOrderDayRoutesubDO> startNode = orderDayRoutesubList.stream().filter(item -> item.getPreProcessCode().equalsIgnoreCase("startNode")).findFirst();
List<MesWorkSchedulingDO> list=new ArrayList<>();
List<MesWorkSchedulingDetailDO> listSub=new ArrayList<>();
int leftCounts=planCounts;
for(int i=0;i<counts;i++){
MesWorkSchedulingDO item=getBaseMesWorkSchedulingDO(createReqVO);
List<MesWorkSchedulingDO> list = new ArrayList<>();
List<MesWorkSchedulingDetailDO> listSub = new ArrayList<>();
int leftCounts = planCounts;
for (int i = 0; i < counts; i++) {
MesWorkSchedulingDO item = getBaseMesWorkSchedulingDO(createReqVO);
item.setPlanCount(perCounts);
item.setWorkingNode(startNode.get().getProcessCode());
list.add(item);
if(StringUtils.isNotEmpty(orderDayRoutesubList)){ //生成工序级任务
final int taskSort=i;
orderDayRoutesubList.forEach(sub->{
MesWorkSchedulingDetailDO detailDO=new MesWorkSchedulingDetailDO();
if (StringUtils.isNotEmpty(orderDayRoutesubList)) { //生成工序级任务
final int taskSort = i;
orderDayRoutesubList.forEach(sub -> {
MesWorkSchedulingDetailDO detailDO = new MesWorkSchedulingDetailDO();
detailDO.setSchedulingCode(item.getSchedulingCode());
detailDO.setPlanCount(perCounts);
detailDO.setStatus(WorkingScheduleEnum.READYTODO.getCode());
@ -223,19 +232,19 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
listSub.add(detailDO);
});
}
leftCounts=leftCounts - perCounts;
leftCounts = leftCounts - perCounts;
}
if(leftCounts>0){//有剩余工单的数量和计划数量不是整除关系时
final int taskSort=counts;
if (leftCounts > 0) {//有剩余工单的数量和计划数量不是整除关系时
final int taskSort = counts;
final int finalLeftCounts = leftCounts;
MesWorkSchedulingDO item=getBaseMesWorkSchedulingDO(createReqVO);
MesWorkSchedulingDO item = getBaseMesWorkSchedulingDO(createReqVO);
item.setPlanCount(leftCounts);
item.setWorkingNode(startNode.get().getProcessCode());
list.add(item);
if(StringUtils.isNotEmpty(orderDayRoutesubList)){ //生成工序级任务
orderDayRoutesubList.forEach(sub->{
MesWorkSchedulingDetailDO detailDO=new MesWorkSchedulingDetailDO();
if (StringUtils.isNotEmpty(orderDayRoutesubList)) { //生成工序级任务
orderDayRoutesubList.forEach(sub -> {
MesWorkSchedulingDetailDO detailDO = new MesWorkSchedulingDetailDO();
detailDO.setSchedulingCode(item.getSchedulingCode());
detailDO.setPlanCount(finalLeftCounts);
detailDO.setStatus(WorkingScheduleEnum.READYTODO.getCode());
@ -248,23 +257,26 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
});
}
}
Map<String,List> map=new HashMap<>();
map.put("master",list);
map.put("sub",listSub);
Map<String, List> map = new HashMap<>();
map.put("master", list);
map.put("sub", listSub);
return map;
}
private MesWorkSchedulingDO getBaseMesWorkSchedulingDO(MesOrderDayCreateReqVO createReqVO){
MesWorkSchedulingDO item=new MesWorkSchedulingDO();
private void getPreCheckStauts(){
//从配置项中获取配置
if (infaConfigUtil.getBooleanValue(MesConfigKeys.PRE_START_CHECK_ON,Boolean.FALSE)) {
WAITBEGIN = WorkingScheduleEnum.WAITBEGIN.getCode();
} else {
WAITBEGIN = WorkingScheduleEnum.READYTODO.getCode();
}
}
private MesWorkSchedulingDO getBaseMesWorkSchedulingDO(MesOrderDayCreateReqVO createReqVO) {
MesWorkSchedulingDO item = new MesWorkSchedulingDO();
item.setFlagDo(WorkStatusEnum.READY.getCode());
//是否需要齐套检查 如果需要
String status;
if(MesBaseConfig.PRE_START_CHECK_ON){
status=WorkingScheduleEnum.WAITBEGIN.getCode();
}else{
status=WorkingScheduleEnum.READYTODO.getCode();
}
item.setStatus(status);
item.setStatus(WAITBEGIN);
item.setFinishCount(0);
item.setFormType(createReqVO.getWorkMode());
item.setLineCode(createReqVO.getLineCode());
@ -279,12 +291,14 @@ public class MesOrderDayServiceImpl implements MesOrderDayService {
item.setWorkingTaskSort(0);
return item;
}
private LocalDateTime getLocalDatetime( LocalDateTime date,String time){
String target=DateUtil.format( date, DatePattern.NORM_DATE_PATTERN)+" "+time;
return DateUtil.parseLocalDateTime(target,DatePattern.NORM_DATETIME_PATTERN);
private LocalDateTime getLocalDatetime(LocalDateTime date, String time) {
String target = DateUtil.format(date, DatePattern.NORM_DATE_PATTERN) + " " + time;
return DateUtil.parseLocalDateTime(target, DatePattern.NORM_DATETIME_PATTERN);
}
@Resource
MesWorkSchedulingService mesWorkSchedulingService;
@Resource
MesOrderDayRoutesubService mesOrderDayRoutesubService;
MesOrderDayRoutesubService mesOrderDayRoutesubService;
}

2
win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesworkscheduling/MesWorkSchedulingService.java

@ -4,6 +4,7 @@ import java.util.*;
import javax.validation.*;
import com.win.framework.common.pojo.CustomConditions;
import com.win.module.mes.controller.mesorderday.vo.MesOrderDayCreateReqVO;
import com.win.module.mes.controller.mesworkscheduling.vo.*;
import com.win.module.mes.dal.dataobject.mesworkscheduling.MesWorkSchedulingDO;
import com.win.framework.common.pojo.PageResult;
@ -83,4 +84,5 @@ public interface MesWorkSchedulingService {
public List<MesWorkSchedulingExcelVO> importMesWorkSchedulingList(List<MesWorkSchedulingExcelVO> datas, Integer mode, boolean updatePart);
void inertBacth(List<MesWorkSchedulingDO> list);
Integer inertBacthTrans(List<MesWorkSchedulingDO> list, List<MesWorkSchedulingDetailDO> listsub);
Boolean exisitWorkScheduling(MesOrderDayCreateReqVO reqVO);
}

18
win-module-mes/win-module-mes-biz/src/main/java/com/win/module/mes/service/mesworkscheduling/MesWorkSchedulingServiceImpl.java

@ -1,7 +1,9 @@
package com.win.module.mes.service.mesworkscheduling;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.win.framework.common.pojo.CustomConditions;
import com.win.module.mes.controller.mesorderday.vo.MesOrderDayCreateReqVO;
import com.win.module.mes.controller.mesworkscheduling.vo.*;
import com.win.module.mes.dal.dataobject.mesworkschedulingdetail.MesWorkSchedulingDetailDO;
import com.win.module.mes.dal.mysql.mesworkschedulingdetail.MesWorkSchedulingDetailMapper;
@ -119,4 +121,20 @@ public class MesWorkSchedulingServiceImpl implements MesWorkSchedulingService {
mesWorkSchedulingDetailMapper.insertBatch(listsub);
return list.size();
}
@Override
public Boolean exisitWorkScheduling(MesOrderDayCreateReqVO reqVO){
if(StringUtils.isNull(reqVO)){
return true;
}else{
QueryWrapper<MesWorkSchedulingDO> queryWrapper=new QueryWrapper<>();
MesWorkSchedulingDO dao=new MesWorkSchedulingDO();
dao.setProductCode(reqVO.getProductCode());
dao.setPlanMaserCode(reqVO.getPlanNoDay());
dao.setProuteCode(reqVO.getProcessrouteCode());
//dao.setPlanMaserCode(reqVO.get)
queryWrapper.setEntity(dao);
return workSchedulingMapper.exists(queryWrapper);
}
}
}

Loading…
Cancel
Save