Compare commits

...

4 Commits

Author SHA1 Message Date
liweidong-hj 0046df08ec 物流优化 1 week ago
pangyang 69e647fb58 生产质量检验消息提醒 1 week ago
sunjianxi bfb09d89b8 排产开发-sjx 1 week ago
pangyang d108bf3a5d 槽液结果查询修改 1 week ago
  1. 39
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RemindMsg.java
  2. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RemindMsgVO.java
  3. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java
  4. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskExecuteRecordService.java
  5. 20
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java
  6. 202
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java
  7. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskServiceImpl.java
  8. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankReportController.java
  9. 92
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RemindMsgController.java
  10. 40
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/excel/RemindMsgExcel.java
  11. 30
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/RemindMsgServiceImpl.java
  12. BIN
      blade-service/blade-desk/src/main/resources/Excel/QA/材料消息提醒.xls
  13. BIN
      blade-service/blade-desk/src/main/resources/Excel/QA/镀种消息提醒.xls
  14. BIN
      blade-service/blade-desk/src/main/resources/Excel/QA/颜色消息提醒.xls
  15. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
  16. 7
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
  17. 153
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java

@ -116,9 +116,9 @@ public class RemindMsg extends BaseEntity {
@Schema(description = "编码")
private String code;
/**
* 类型
* 类型 0零件号提醒 1: 镀层提醒 2颜色提醒 3:材料提醒
*/
@Schema(description = "类型")
@Schema(description = "类型 0:零件号提醒 1: 镀层提醒 2:颜色提醒 3:材料提醒")
private Long remindMsgType;
/**
* [零件]id
@ -176,15 +176,10 @@ public class RemindMsg extends BaseEntity {
@Schema(description = "子[零件]id")
private Long subPartId;
/**
* [零件]编码
* [零件]编码,虚拟子件号
*/
@Schema(description = "子[零件]编码")
@Schema(description = "子[零件]编码,虚拟子件号")
private String subPartCode;
/**
* 生产标识
*/
@Schema(description = "生产标识")
private String prodFlagText;
/**
* 参数1
*/
@ -210,4 +205,30 @@ public class RemindMsg extends BaseEntity {
*/
@Schema(description = "[零件]名称")
private String partName;
//镀种信息
private String plateing;
//参数1上限
private BigDecimal param1Up;
//参数1下限
private BigDecimal param1Down;
//参数2上限
private BigDecimal param2Up;
//参数2下限
private BigDecimal param2Down;
//参数3上限
private BigDecimal param3Up;
//参数3下限
private BigDecimal param3Down;
//提醒颜色
private String remindColor;
//显示颜色
private String showColor;
//程式编号
private String formula;
//材料
private String material;
}

@ -28,4 +28,9 @@ public class RemindMsgVO extends RemindMsg {
private String platingName = "";
@Schema(description = "工艺一级路线")
private String processClazz1Name = "";
private String param1;
private String param2;
private String param3;
}

@ -40,6 +40,7 @@ import org.springblade.desk.logistics.pojo.entity.Station;
import org.springblade.desk.logistics.service.IOrderBindService;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.IPipelineService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -169,6 +170,9 @@ public class PipelineController extends BladeController {
@Autowired
AgvTaskTypeUtil agvTaskTypeUtil;
@Autowired
ITaskExecuteRecordService taskExecuteRecordService;
/**
* 接收空物料箱到输送线通知
*/
@ -190,10 +194,10 @@ public class PipelineController extends BladeController {
@GetMapping("/test")
@ApiOperationSupport(order = 4)
@Operation(summary = "接收物料箱", description = "传入箱条码")
public R test(@RequestParam String test1,@RequestParam String test2) {
String taskTypeByPositions = agvTaskTypeUtil.getTaskTypeByPositions(test1, test2);
public R test(@RequestParam String taskCode) {
boolean b = taskExecuteRecordService.releaseSite(taskCode);
return R.data(taskTypeByPositions);
return R.data(b);
}
}

@ -107,4 +107,9 @@ public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord
* @return
*/
boolean genAgvSchedulingTask(String taskType, String startPos, String endPos, String type, Task task);
boolean releaseSite(String taskCode);
}

@ -358,11 +358,11 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
List<Station> stationList =null;
if (returnToWarehouseDto.getEndStationCode() != null && !returnToWarehouseDto.getEndStationCode().isEmpty()) {
stationList=stationService.list(new LambdaQueryWrapper<Station>()
// .ne(Station::getStatus, CONVEYOR_LINE_RECEIVE_ONLY)
.ne(Station::getStatus, CONVEYOR_LINE_RECEIVE_ONLY)
.eq(Station::getStationStatus, STATUS_FREE)
.eq(Station::getStationCode, returnToWarehouseDto.getEndStationCode()));
if (stationList==null||stationList.size()==0) {
return R.fail("当前结束站点码被占用");
return R.fail("当前结束站点码被占用/输送线站点不支持配送");
}
List<StationCenter> stationCenterList = stationCenterService.list(new LambdaQueryWrapper<StationCenter>().select(StationCenter::getWcId).eq(StationCenter::getStationId, stationList.get(0).getId()));
if (stationCenterList==null||stationCenterList.size()==0) {
@ -372,12 +372,12 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
if (bsWorkCenterEntityList==null||bsWorkCenterEntityList.size()==0) {
return R.fail("当前结束站点码没有对应的作业中心");
}
if (!bsWorkCenterEntityList.get(0).getWcName().equals("镀后检验作业中心")) {
stationList=stationList.stream().filter(s->!s.getStatus().equals(CONVEYOR_LINE_RECEIVE_ONLY)).toList();
if (stationList==null||stationList.size()==0) {
return R.fail("当前结束站点码被占用");
}
}
// if (!bsWorkCenterEntityList.get(0).getWcName().equals("镀后检验作业中心")) {
// stationList=stationList.stream().filter(s->!s.getStatus().equals(CONVEYOR_LINE_RECEIVE_ONLY)).toList();
// if (stationList==null||stationList.size()==0) {
// return R.fail("当前结束站点码被占用");
// }
// }
}
agvSend = Objects.nonNull(agvSend) ? agvSend : false; // 默认不发送AGV
@ -1451,7 +1451,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
} else {
List<CenterTeam> list = iCenterTeamService.list(new LambdaQueryWrapper<CenterTeam>()
.select(CenterTeam::getWcId, CenterTeam::getTsId)
.eq(workPlan.getSubsidiaryTeam()!=null&&!workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getMakeTeam()))
.eq(workPlan.getSubsidiaryTeam()!=null&&!workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getSubsidiaryTeam()))
.eq(workPlan.getSubsidiaryTeam()==null||workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getMakeTeam())));
if (list == null || list.size() == 0) {
return R.fail(orderCardNo + "车间订单班次查询作业中心异常");
@ -1474,7 +1474,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
} else {
List<CenterTeam> list = iCenterTeamService.list(new LambdaQueryWrapper<CenterTeam>()
.select(CenterTeam::getWcId, CenterTeam::getTsId)
.eq(workPlan.getSubsidiaryTeam()!=null&&!workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getMakeTeam()))
.eq(workPlan.getSubsidiaryTeam()!=null&&!workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getSubsidiaryTeam()))
.eq(workPlan.getSubsidiaryTeam()==null||workPlan.getSubsidiaryTeam().equals(""),CenterTeam::getTsId, (workPlan.getMakeTeam())));
if (list == null || list.size() == 0) {
return R.fail(orderCardNo + "车间订单班次查询作业中心异常");

@ -22,6 +22,7 @@ import org.springblade.desk.logistics.service.*;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
@ -191,6 +192,15 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
}
// 6. 任务走出储位状态,将站点设置为空闲
if (method.equals(TaskExecuteRecord.STATUS_OUTBIN)){
boolean conCtuReturn = releaseSite(agvCallBack.getTaskCode());
if (!conCtuReturn) {
return R.fail("站点释放失败");
}
}
// 回调处理成功
log.info("AGV回调成功:任务单号{}的执行记录已更新,状态为{}", agvCallBack.getTaskCode(), method);
R r = new R();
@ -199,6 +209,41 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
return r;
}
@Override
public boolean releaseSite(String taskCode) {
try {
TaskExecuteRecord taskExecuteRecord = baseMapper.selectByTaskCode(taskCode);
if (null == taskExecuteRecord) {
log.error("未根据taskCode查询到有效数据,请求参数:{}", taskCode);
return false;
}
Station startStation = stationService.getByStationCode(taskExecuteRecord.getStartPos());
Station endStation = stationService.getByStationCode(taskExecuteRecord.getEndPos());
log.info("走出储位,开始位置:{},结束位置:{}", taskExecuteRecord.getStartPos(), taskExecuteRecord.getEndPos());
// 业务规则:起点必须是站点,且终点是传送线(1001)或有效站点时,才释放起点站点
if (null != startStation && (DROPOFF_CONVEYOR_LINE.equals(taskExecuteRecord.getEndPos()) || null != endStation)) {
startStation.setStationStatus(Station.STATUS_FREE);
boolean update = stationService.updateById(startStation);
if (update) {
log.info("站点释放成功:{}", startStation.getStationCode());
return true;
} else {
log.error("站点释放失败:{}", startStation.getStationCode());
return false;
}
}
return true;
} catch (Exception e) {
log.error("releaseSite执行异常,taskCode:{}", taskCode, e);
return false;
}
}
private boolean updateMesCtuLocation(String taskCode) {
log.info("开始执行updateMesCtuLocation,taskCode:{}", taskCode);
@ -424,17 +469,17 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
log.info("任务{}不需要送到库位,直接完成", taskCode);
log.info("终点位置为站点信息:{},直接完成", taskExecuteRecord.getEndPos());
Station startStation = stationService.getByStationCode(taskExecuteRecord.getStartPos());
// 起点位置为站点 将站点状态改为空闲
if(null != startStation){
startStation.setStationStatus(Station.STATUS_FREE);
boolean update = stationService.updateById(startStation);
if (update) {
log.info("站点释放成功:{}", startStation.getStationCode());
} else {
log.error("站点释放失败:{}", startStation.getStationCode());
}
}
// Station startStation = stationService.getByStationCode(taskExecuteRecord.getStartPos());
// // 起点位置为站点 将站点状态改为空闲
// if(null != startStation){
// startStation.setStationStatus(Station.STATUS_FREE);
// boolean update = stationService.updateById(startStation);
// if (update) {
// log.info("站点释放成功:{}", startStation.getStationCode());
// } else {
// log.error("站点释放失败:{}", startStation.getStationCode());
// }
// }
// 终点位置为站点将状态修改为占用
if(null != endStation){
@ -719,65 +764,112 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean genAgvSchedulingTask(String taskType, String startPos, String endPos, String type, Task task) {
// 获取虚拟货架
VirtualShelves virtualShelves = virtualShelvesService.getVirtualShelvesCode();
if (null == virtualShelves) {
throw new ServiceException("获取虚拟货架失败");
}
VirtualShelves virtualShelves = null;
String boundShelvesCode = null;
// 站点绑定虚拟货架
JSONObject response = boundVirtualShelves(
virtualShelves.getVirtualShelvesCode(),
startPos
);
String code = response.getString("code");
String message = response.getString("message");
try {
// 1. 获取虚拟货架
virtualShelves = virtualShelvesService.getVirtualShelvesCode();
if (null == virtualShelves) {
log.error("获取虚拟货架失败");
return false;
}
// 2. 绑定虚拟货架
JSONObject response = boundVirtualShelves(
virtualShelves.getVirtualShelvesCode(),
startPos
);
String code = response.getString("code");
String message = response.getString("message");
if ("0".equals(code)) {
log.info("绑定虚拟货架成功,虚拟货架:{},站点:{}", virtualShelves.getVirtualShelvesCode(), startPos);
if ("0".equals(code)) {
// 绑定成功,记录绑定的货架号
boundShelvesCode = virtualShelves.getVirtualShelvesCode();
log.info("绑定虚拟货架成功,虚拟货架:{},站点:{}", boundShelvesCode, startPos);
} else {
// 绑定失败,尝试使用错误消息中的货架号
log.warn("首次绑定失败,响应:{}", response);
virtualShelves.setIsBound(VirtualShelves.BOUND_YES);
virtualShelvesService.updateById(virtualShelves);
// 提取货架号
String number = extractShelfCodeFromMessage(message);
if (number == null) {
log.error("绑定失败且无法解析货架号:" + message);
return false;
}
} else {
log.error("绑定虚拟货架失败,虚拟货架:{},站点:{},响应:{}",
virtualShelves.getVirtualShelvesCode(), startPos, response);
VirtualShelves existedShelves = virtualShelvesService.selectByVirtualShelvesCode(number);
if (existedShelves == null) {
log.error("指定的虚拟货架不存在:" + number);
return false;
}
//修改Task状态
task.setTaskStatus(Task.BOUND_VIRTUAL_SHELVES);
task.setRemark(message);
taskService.updateById(task);
// 使用已存在的货架重新绑定
JSONObject retryResponse = boundVirtualShelves(number, startPos);
String retryCode = retryResponse.getString("code");
String retryMessage = retryResponse.getString("message");
if (!"0".equals(retryCode)) {
// 重试失败,更新任务状态
task.setTaskStatus(Task.BOUND_VIRTUAL_SHELVES);
task.setRemark(retryMessage);
taskService.updateById(task);
log.error("重新绑定虚拟货架失败:" + retryMessage);
return false;
}
return false;
}
// 重试成功,使用重试的货架
boundShelvesCode = number;
virtualShelves = existedShelves;
log.info("重新绑定虚拟货架成功,虚拟货架:{},站点:{}", boundShelvesCode, startPos);
}
// 3. 调用AGV调度
AgvSchedulingTaskVO agvSchedulingTaskVO = genAgvSchedulingTask(
taskType,
startPos,
endPos,
type,
boundShelvesCode
);
if (null == agvSchedulingTaskVO || !"0".equals(agvSchedulingTaskVO.getCode())) {
throw new ServiceException("调用AGV调度失败");
}
// 4. 入库记录
if (null == task) {
throw new ServiceException("任务信息为空");
}
boolean record = inboundRecord(agvSchedulingTaskVO, task, boundShelvesCode);
if (!record) {
throw new ServiceException("入库记录保存失败");
}
// 调用AGV
AgvSchedulingTaskVO agvSchedulingTaskVO = genAgvSchedulingTask(
taskType,
startPos,
endPos,
type,
virtualShelves.getVirtualShelvesCode()
);
if (null == agvSchedulingTaskVO || !"0".equals(agvSchedulingTaskVO.getCode())) {
throw new ServiceException("调用AGV调度失败");
}
// 5. 所有步骤成功后,更新虚拟货架状态
virtualShelves.setIsBound(VirtualShelves.BOUND_YES);
virtualShelvesService.updateById(virtualShelves);
// 入库记录
if (null == task) {
return false;
}
return true;
boolean record = inboundRecord(agvSchedulingTaskVO, task, virtualShelves.getVirtualShelvesCode());
if (!record) {
throw new ServiceException("入库记录保存失败");
} catch (Exception e) {
log.error("genAgvSchedulingTask执行异常", e);
if (boundShelvesCode != null) {
log.warn("流程失败,已绑定的虚拟货架:{} 可能需要手动解绑", boundShelvesCode);
}
throw e;
}
}
return true;
private String extractShelfCodeFromMessage(String message) {
if (message == null || !message.contains(":")) {
return null;
}
return message.substring(message.lastIndexOf(":") + 1).trim();
}
}

@ -75,6 +75,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
taskVO.setStatusDesc(Task.getStatusName(taskVO.getTaskStatus()));
if (taskVO.getWcId()!=null&&taskVO.getWcId()==0) {
taskVO.setWcName(DROPOFF_CONVEYOR_LINE_NAME);
taskVO.setStationRegion(DROPOFF_CONVEYOR_LINE_NAME);
}
}
return page.setRecords(taskVOList);

@ -94,13 +94,23 @@ public class LiquidTankReportController extends BladeController {
@Operation(summary = "list分页", description = "传入LiquidTankReport Obj")
public R<IPage<LiquidTankReportVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankReport,
Query query) {
Date crStart = null;
Date crEnd = null;
if(null != liquidTankReport.get("createTimeStart") && !"".equals(liquidTankReport.get("createTimeStart"))){
crStart = RequestUtil.buildDateBeginOfDay(liquidTankReport, BaseRequest.CREATE_TIME_START);
crEnd = RequestUtil.buildDateEndOfDay(liquidTankReport, BaseRequest.CREATE_TIME_END);
}
QueryWrapper<LiquidTankReport> qw = Condition.getQueryWrapper(liquidTankReport, LiquidTankReport.class);
qw.eq(liquidTankReport.containsKey("name"), LiquidTankReport.COL_NAME, liquidTankReport.get("name"));
if (liquidTankReport.containsKey(BaseRequest.CREATE_TIME_START) && liquidTankReport.containsKey(BaseRequest.CREATE_TIME_END)) {
Date crStart = RequestUtil.buildDateBeginOfDay(liquidTankReport, BaseRequest.CREATE_TIME_START);
Date crEnd = RequestUtil.buildDateEndOfDay(liquidTankReport, BaseRequest.CREATE_TIME_END);
if(null != crStart && null != crEnd){
qw.between(BaseCol.CREATE_TIME, crStart, crEnd);
}
// if (liquidTankReport.containsKey(BaseRequest.CREATE_TIME_START) && liquidTankReport.containsKey(BaseRequest.CREATE_TIME_END)) {
// Date crStart = RequestUtil.buildDateBeginOfDay(liquidTankReport, BaseRequest.CREATE_TIME_START);
// Date crEnd = RequestUtil.buildDateEndOfDay(liquidTankReport, BaseRequest.CREATE_TIME_END);
// qw.between(BaseCol.CREATE_TIME, crStart, crEnd);
// }
IPage<LiquidTankReport> pages = service.page(Condition.getPage(query), qw);
IPage<LiquidTankReportVO> pagesVO = LiquidTankReportWrapper.build().pageVO(pages);
for(LiquidTankReportVO one : pagesVO.getRecords()){

@ -100,6 +100,7 @@ public class RemindMsgController extends BladeController {
// qw.like(RemindMsg.PART_NAME, partName);
// }
// qw.like(map.containsKey("partName"), RemindMsg.PART_NAME, map.get("partName"));
qw.orderByDesc("CREATE_TIME");
IPage<RemindMsg> pages = service.page(Condition.getPage(query), qw);
IPage<RemindMsgVO> pagesVO = RemindMsgWrapper.build().pageVO(pages);
pagesVO.getRecords()
@ -155,9 +156,39 @@ public class RemindMsgController extends BladeController {
@ApiLog("新增提醒信息")
@Operation(summary = "新增批量", description = "传入RemindMsg List")
public R saveBat(@Valid @RequestBody List<RemindMsg> addList) {
addList.forEach(one -> {
for(RemindMsg one : addList){
if(0== one.getRemindMsgType()){
}
if(1== one.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("PLATEING",one.getPlateing());
if(service.count(qw)>0){
return R.fail(one.getPlateing()+"此镀种信息已存在");
}
}
if(2== one.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("SUB_PART_CODE",one.getSubPartCode());
if(service.count(qw)>0){
return R.fail(one.getSubPartCode()+"此零件信息已存在");
}
}
if(3== one.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("FORMULA",one.getFormula());
if(service.count(qw)>0){
return R.fail(one.getFormula()+"此程式编号已存在");
}
}
one.setId(null);
});
}
// addList.forEach(one -> {
// one.setId(null);
// });
return R.status(service.saveBatch(addList));
}
@ -169,6 +200,36 @@ public class RemindMsgController extends BladeController {
@ApiLog("修改提醒信息")
@Operation(summary = "修改一条", description = "传入RemindMsg Obj")
public R update(@Valid @RequestBody RemindMsg updateOne) {
if(0== updateOne.getRemindMsgType()){
}
if(1== updateOne.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("PLATEING",updateOne.getPlateing());
qw.ne("ID",updateOne.getId());
if(service.count(qw)>0){
return R.fail(updateOne.getPlateing()+"此镀种信息已存在");
}
}
if(2== updateOne.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("SUB_PART_CODE",updateOne.getSubPartCode());
qw.ne("ID",updateOne.getId());
if(service.count(qw)>0){
return R.fail(updateOne.getSubPartCode()+"此零件信息已存在");
}
}
if(3== updateOne.getRemindMsgType()){
QueryWrapper<RemindMsg> qw = new QueryWrapper<>();
qw.eq("FORMULA",updateOne.getFormula());
qw.ne("ID",updateOne.getId());
if(service.count(qw)>0){
return R.fail(updateOne.getFormula()+"此程式编号已存在");
}
}
return R.status(service.updateById(updateOne));
}
@ -257,6 +318,33 @@ public class RemindMsgController extends BladeController {
"导入模版-消息提醒.xls");
}
@GetMapping("/downloadExcelTemplatePlate")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplatePlate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/镀种消息提醒.xls",
"导入模版-镀种消息提醒.xls");
}
@GetMapping("/downloadExcelTemplateColor")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplateColor() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/颜色消息提醒.xls",
"导入模版-颜色消息提醒.xls");
}
@GetMapping("/downloadExcelTemplateMaterial")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplateMaterial() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/材料消息提醒.xls",
"导入模版-材料消息提醒.xls");
}
/**
* [提醒信息] 导入Excel
*/

@ -114,6 +114,10 @@ public class RemindMsgExcel implements Serializable {
@ColumnWidth(20)
@ExcelProperty("子[零件]编码")
private String subPartCode;
@ColumnWidth(20)
@ExcelProperty("虚拟子件号")
private String subPartCodeNew;
/**
* 生产标识
*/
@ -144,4 +148,40 @@ public class RemindMsgExcel implements Serializable {
// @ColumnWidth(20)
// @ExcelProperty("参数4")
private String param4;
//镀种信息
@ExcelProperty("镀种信息")
private String plateing;
//参数1上限
@ExcelProperty("参数1上限")
private BigDecimal param1Up;
//参数1下限
@ExcelProperty("参数1下限")
private BigDecimal param1Down;
//参数2上限
@ExcelProperty("参数2上限")
private BigDecimal param2Up;
//参数2下限
@ExcelProperty("参数2下限")
private BigDecimal param2Down;
//参数3上限
@ExcelProperty("参数3上限")
private BigDecimal param3Up;
//参数3下限
@ExcelProperty("参数3下限")
private BigDecimal param3Down;
//提醒颜色
@ExcelProperty("提醒颜色")
private String remindColor;
//显示颜色
@ExcelProperty("显示颜色")
private String showColor;
//程式编号
@ExcelProperty("程式编号")
private String formula;
//材料
@ExcelProperty("材料")
private String material;
}

@ -72,5 +72,35 @@ public class RemindMsgServiceImpl extends BaseServiceImpl<RemindMsgMapper, Remin
vo.setProcessClazz1Name(part.getCraftWay());
}
}
if(null != vo.getParam1Up() && null != vo.getParam1Down()){
vo.setParam1(vo.getParam1Up() + "~" + vo.getParam1Down());
}
if(null != vo.getParam1Up() && null == vo.getParam1Down()){
vo.setParam1(vo.getParam1Up()+"");
}
if(null == vo.getParam1Up() && null != vo.getParam1Down()){
vo.setParam1(vo.getParam1Down()+"");
}
if(null != vo.getParam2Up() && null != vo.getParam2Down()){
vo.setParam2(vo.getParam2Up() + "~" + vo.getParam2Down());
}
if(null != vo.getParam2Up() && null == vo.getParam2Down()){
vo.setParam2(vo.getParam2Up()+"");
}
if(null == vo.getParam2Up() && null != vo.getParam2Down()){
vo.setParam2(vo.getParam2Down()+"");
}
if(null != vo.getParam3Up() && null != vo.getParam3Down()){
vo.setParam3(vo.getParam3Up() + "~" + vo.getParam3Down());
}
if(null != vo.getParam3Up() && null == vo.getParam3Down()){
vo.setParam3(vo.getParam3Up()+"");
}
if(null == vo.getParam3Up() && null != vo.getParam3Down()){
vo.setParam3(vo.getParam3Down()+"");
}
}
}

@ -36,6 +36,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.scheduling.pojo.entity.EquipAbilityEntity;
@ -57,6 +58,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 工艺能力表 服务实现类
@ -107,7 +109,8 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
}
//删除3天之前的数据
List<EquipResourceEntity> deleteList = this.list(Wrappers.<EquipResourceEntity>lambdaQuery().le(EquipResourceEntity::getDateTime,DateFormatUtils.format(DateUtils.addDays(date,-3),"yyyy-MM-dd")));
deleteList.forEach(item -> baseMapper.deleteById(item.getId()));
List<Long> idList = deleteList.stream().map(BaseEntity::getId).collect(Collectors.toList());
baseMapper.deleteByIds(idList);
log.info("初始化设备资源结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
}

@ -33,6 +33,7 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.scheduling.pojo.entity.PersonAbilityEntity;
import org.springblade.scheduling.pojo.entity.PersonResourceEntity;
@ -45,12 +46,12 @@ import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 工艺能力表 服务实现类
@ -87,6 +88,10 @@ public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMap
generateData(today);
}
}
//删除3天之前的数据
List<PersonResourceEntity> deleteList = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().le(PersonResourceEntity::getDateTime,DateFormatUtils.format(DateUtils.addDays(date,-3),"yyyy-MM-dd")));
List<Long> idList = deleteList.stream().map(BaseEntity::getId).collect(Collectors.toList());
baseMapper.deleteByIds(idList);
log.info("初始化人力资源结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
}

@ -528,23 +528,25 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
} else {
if ("设备".equals(mainProducerMap.get(craft.getPpsId()))) {
String glassCodeStr = null;
Map<String, Object> sameFurnaceMap = new HashMap<>();
Map<String, Object> sameMap = new HashMap<>();
//同炉同槽
if(order.getYieldType() == YieldOrderEnum.YIELD_TYPE_1.getCode()){
//热表同槽
Boolean isSameTrough = sameTrough(order, craft, localDateTime, workPlanList);
sameMap = sameTrough(order, craft, localDateTime, workPlanList, prevProcessEnd);
//同槽就不需要继续匹配了
if (isSameTrough) {
if (sameMap.get("isSameTrough").toString() == "true") {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm");
prevProcessEnd = LocalDateTime.parse(sameMap.get("prevProcessEnd").toString(), formatter);
continue;
}
}else{
//烧结同炉
if (sintMap.containsKey(craft.getPpsId())) {
sameFurnaceMap = sameFurnace(order, craft, workPlanList, localDateTime, glassCodeStr, sintMap, part, processMap, prevProcessEnd);
sameMap = sameFurnace(order, craft, workPlanList, localDateTime, glassCodeStr, sintMap, part, processMap, prevProcessEnd);
//同炉的话就不用走下面的匹配了,直接下一工序
if (sameFurnaceMap.get("isSameFurnace").toString() == "true") {
if (sameMap.get("isSameFurnace").toString() == "true") {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm");
prevProcessEnd = LocalDateTime.parse(sameFurnaceMap.get("prevProcessEnd").toString(), formatter);
prevProcessEnd = LocalDateTime.parse(sameMap.get("prevProcessEnd").toString(), formatter);
continue;
}
}
@ -688,8 +690,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//更新剩余产能
equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(capacity));
equipResource.setIsUsed("1");
if (order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode() && sameFurnaceMap.get("glassCode") != null) {
equipResource.setGlassCode(sameFurnaceMap.get("glassCode").toString());
if (order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode() && sameMap.get("glassCode") != null) {
equipResource.setGlassCode(sameMap.get("glassCode").toString());
}
equipResourceService.updateById(equipResource);
//同一个设备可能有多个工艺能力,同一时间只能做一个工艺能力的零件,所以需要把当前设备所有工艺能力的剩余产能都更新调
@ -703,8 +705,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
for(EquipResourceEntity otherResource : otherResourceList){
otherResource.setRestCapacity(otherResource.getTotalCapacity().multiply(rate).setScale(0, RoundingMode.FLOOR));
otherResource.setIsUsed("1");
if (order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode() && sameFurnaceMap.get("glassCode") != null) {
otherResource.setGlassCode(sameFurnaceMap.get("glassCode").toString());
if (order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode() && sameMap.get("glassCode") != null) {
otherResource.setGlassCode(sameMap.get("glassCode").toString());
}
equipResourceService.updateById(otherResource);
}
@ -809,13 +811,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
wrapper.eq(PersonResourceEntity::getTeamId,craft.getMakeTeam());
}
wrapper.orderByAsc(PersonResourceEntity::getDateTime,PersonResourceEntity::getStartTime);
List<PersonResourceEntity> personResourceList = personResourceService.list(Wrappers.<PersonResourceEntity>lambdaQuery()
.eq(PersonResourceEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(PersonResourceEntity::getProcessId, craft.getPpsId())
.eq(PersonResourceEntity::getCraftId, craft.getCaId())
.le(PersonResourceEntity::getStartTime, prevProcessEnd)
.orderByAsc(PersonResourceEntity::getDateTime,PersonResourceEntity::getStartTime)
.eq(PersonResourceEntity::getTeamId,craft.getMakeTeam()));
List<PersonResourceEntity> personResourceList = personResourceService.list(wrapper);
if (CollectionUtils.isNotEmpty(personResourceList)) {
workPlan.setMakeTeam(personResourceList.get(0).getTeamId());
}
@ -1417,29 +1413,110 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
public Boolean sameTrough(YieldOrderEntity order, YieldOrderCraftEntity craft, LocalDateTime dateTime, List<WorkPlanEntity> workPlanList) {
public Map<String, Object> sameTrough(YieldOrderEntity order,
YieldOrderCraftEntity craft,
LocalDateTime dateTime,
List<WorkPlanEntity> workPlanList,
LocalDateTime prevProcessEnd) {
Map<String, Object> map = new HashMap<>();
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) {
LambdaQueryWrapper<WorkPlanEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(WorkPlanEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(WorkPlanEntity::getCaId, craft.getCaId())
.eq(WorkPlanEntity::getPpsId, craft.getPpsId())
.ge(WorkPlanEntity::getPlanStartTime, dateTime);
//返工订单需要原班组加工
if(StringUtils.isNotEmpty(order.getReworkCode())){
wrapper.eq(WorkPlanEntity::getMakeTeam,craft.getMakeTeam());
LambdaQueryWrapper<WorkPlanEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(WorkPlanEntity::getWorkCenterId, craft.getWorkCenterId())
.eq(WorkPlanEntity::getCaId, craft.getCaId())
.eq(WorkPlanEntity::getPpsId, craft.getPpsId())
.ge(WorkPlanEntity::getPlanStartTime, dateTime);
//返工订单需要原班组加工
if(StringUtils.isNotEmpty(order.getReworkCode())){
wrapper.eq(WorkPlanEntity::getMakeTeam,craft.getMakeTeam());
}
wrapper.orderByAsc(WorkPlanEntity::getPlanStartTime);
//查询是否有已经排产的计划
List<WorkPlanEntity> workPlanOldList = workPlanService.list(wrapper);
//如果没有查询到非同槽条件,默认同槽
if(sameTrough == null){
if (CollectionUtils.isNotEmpty(workPlanOldList)) {
//总生产量
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
for (WorkPlanEntity entry : workPlanOldList) {
List<Long> resourceList = new ArrayList<>();
if (StringUtils.isNotEmpty(entry.getEquipResourceId())) {
List<Long> resourceIdList = Arrays.stream(entry.getEquipResourceId().split(","))
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toList());
for(Long resourceId : resourceIdList){
EquipResourceEntity equipResource = equipResourceService.getById(resourceId);
if(equipResource == null){
continue;
}
//判断剩余产能是否满足总产能
if (sumCapacity.compareTo(equipResource.getRestCapacity()) > 0) {
resourceList.clear();
break;
} else {
resourceList.add(resourceId);
}
}
}
List<WorkPlanEntity> processPlanList = new ArrayList<>();
for(Long resourceId : resourceList){
EquipResourceEntity equipResource = equipResourceService.getById(resourceId);
//生成车间订单
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setPlanStartTime(equipResource.getStartTime());
if ("0".equals(equipResource.getEquipType())) {
workPlan.setPlanEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().setScale(0, RoundingMode.CEILING).longValue()));
} else {
workPlan.setPlanEndTime(equipResource.getEndTime());
}
workPlan.setWorkQty(0);
workPlan.setCaId(craft.getCaId());
workPlan.setPpsId(craft.getPpsId());
workPlan.setMakeTeam(equipResource.getTeamId());
workPlan.setWorkCenterId(craft.getWorkCenterId());
workPlan.setOrders(craft.getProcessNo());
workPlan.setWoId(order.getId());
workPlan.setOem("0");
workPlan.setTestQty(0);
workPlan.setQualifiedQty(0);
workPlan.setUnqualifiedQty(0);
workPlan.setScrapQty(0);
workPlan.setHourQuota((double)ChronoUnit.MINUTES.between(workPlan.getPlanStartTime(), workPlan.getPlanEndTime()));
workPlan.setEquipCode(equipResource.getEquipCode());
workPlan.setEquipName(equipResource.getEquipName());
workPlan.setEquipResourceId(equipResource.getId().toString());
processPlanList.add(workPlan);
equipResource.setRestCapacity(equipResource.getRestCapacity().subtract(sumCapacity));
equipResourceService.updateById(equipResource);
isSameTrough = true;
}
if(CollectionUtils.isNotEmpty(processPlanList)){
WorkPlanEntity workPlan = new WorkPlanEntity();
BeanUtils.copyProperties(processPlanList.get(0),workPlan);
workPlan.setPlanStartTime(processPlanList.get(0).getPlanStartTime());
workPlan.setPlanEndTime(processPlanList.get(processPlanList.size()-1).getPlanEndTime());
String equipCode = processPlanList.stream().map(WorkPlanEntity::getEquipCode).collect(Collectors.joining(","));
String equipName = processPlanList.stream().map(WorkPlanEntity::getEquipName).collect(Collectors.joining(","));
String equipResourceId = processPlanList.stream().map(WorkPlanEntity::getEquipResourceId).map(String::valueOf).collect(Collectors.joining(","));
Double hourQuota = processPlanList.stream().mapToDouble(WorkPlanEntity::getHourQuota).sum();
workPlan.setEquipCode(equipCode);
workPlan.setEquipName(equipName);
workPlan.setEquipResourceId(equipResourceId);
workPlan.setHourQuota(hourQuota);
workPlanList.add(workPlan);
prevProcessEnd = workPlan.getPlanEndTime();
//排完了跳出循环
break;
}
}
}
wrapper.orderByAsc(WorkPlanEntity::getPlanStartTime);
//查询是否有已经排产的计划
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::getPlanStartTime, dateTime).orderByAsc(WorkPlanEntity::getPlanStartTime));
}else if(sameTrough != null) {
if (CollectionUtils.isNotEmpty(workPlanOldList)) {
//总生产量
BigDecimal sumCapacity = order.getYpArea().multiply(BigDecimal.valueOf(order.getYpQty()));
@ -1466,7 +1543,6 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
resourceList.add(resourceId);
}
}
}
//如果产能满足,再判断是否满足同槽条件
if (isEnough) {
@ -1579,6 +1655,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
workPlan.setEquipResourceId(equipResourceId);
workPlan.setHourQuota(hourQuota);
workPlanList.add(workPlan);
prevProcessEnd = workPlan.getPlanEndTime();
//排完了跳出循环
break;
}
}
}
@ -1588,7 +1667,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
}
return isSameTrough;
map.put("isSameTrough", isSameTrough);
map.put("prevProcessEnd" , prevProcessEnd);
return map;
}
public Map<String, Object> sameFurnace(YieldOrderEntity order,

Loading…
Cancel
Save