modified: 生箔下料,出空辊,上烘箱,自动入烘箱业务改动

This commit is contained in:
2024-08-23 15:58:51 +08:00
parent 42c4bac3cf
commit 4347ec4f02
41 changed files with 459 additions and 82 deletions

View File

@@ -16,6 +16,7 @@ import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
@@ -86,8 +87,8 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
if (ObjectUtil.isNotEmpty(mdcPropertyMap) && ObjectUtil.isNotEmpty(mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID))) {
String traceId = mdcPropertyMap.get(LogMessageConstant.FIELD_TRACEID);
doc.add(new StringField(LogMessageConstant.FIELD_TRACEID, traceId, Field.Store.YES));
doc.add(new StringField(LogMessageConstant.FIELD_LABEL, ObjectUtil.isNotEmpty(mdcPropertyMap.get("tag_name"))
? mdcPropertyMap.get("tag_name") : "-", Field.Store.YES));
doc.add(new StringField(LogMessageConstant.FIELD_LABEL, ObjectUtil.isNotEmpty(mdcPropertyMap.get(GeneralDefinition.MDC_KEY))
? mdcPropertyMap.get(GeneralDefinition.MDC_KEY) : "-", Field.Store.YES));
}
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, message, Field.Store.YES));
try {

View File

@@ -14,12 +14,14 @@ public enum TagNameEnum {
/**
* LMS系统
*/
LMS("LMS系统"),
RAW_DOWN("手持生箔下料"),
RAW_READY("手持生箔准备就绪"),
GX_IN("手持管芯入库"),
GX_OUT("手持管芯出库"),
SWITCH_STATUS_OF_LIFT("货梯切换状态"),
ERROR_GX_IN_OUT("管芯满入空出异常处理"),
AUTO_CALL_EMPTY_BY_CZZC("自动称重暂存位叫空"),
AUTO_IN_HOT("自动创建入烘箱"),
/**
* 标记符号
*/

View File

@@ -0,0 +1,18 @@
package org.nl.wms.ext.erp.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: lyd
* @Description:
* @Date: 2024/8/22
*/
@RestController
@RequestMapping("/api/erp")
@Slf4j
@SaIgnore
public class ErpToLmsController {
}

View File

@@ -0,0 +1,4 @@
/**
* ERP交互类
*/
package org.nl.wms.ext.erp;

View File

@@ -0,0 +1,9 @@
package org.nl.wms.ext.erp.service;
/**
* @Author: lyd
* @Description:
* @Date: 2024/8/22
*/
public interface ErpToLmsService {
}

View File

@@ -0,0 +1,9 @@
package org.nl.wms.ext.erp.service;
/**
* @Author: lyd
* @Description:
* @Date: 2024/8/22
*/
public interface LmsToErpService {
}

View File

@@ -0,0 +1,13 @@
package org.nl.wms.ext.erp.service.impl;
import org.nl.wms.ext.erp.service.ErpToLmsService;
import org.springframework.stereotype.Service;
/**
* @Author: lyd
* @Description:
* @Date: 2024/8/22
*/
@Service
public class ErpToLmsServiceImpl implements ErpToLmsService {
}

View File

@@ -0,0 +1,13 @@
package org.nl.wms.ext.erp.service.impl;
import org.nl.wms.ext.erp.service.LmsToErpService;
import org.springframework.stereotype.Service;
/**
* @Author: lyd
* @Description:
* @Date: 2024/8/22
*/
@Service
public class LmsToErpServiceImpl implements LmsToErpService {
}

View File

@@ -41,9 +41,15 @@ public class RawFoilPdaController {
@PostMapping("/needEmptyAxis")
@Log("生箔下料")
public ResponseEntity<Object> needEmptyAxis(@RequestBody JSONObject whereJson) {
public ResponseEntity<Object> needEmptyAxisBack(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(rawFoilPdaService.needEmptyAxis(whereJson), HttpStatus.OK);
}
@PostMapping("/needEmptyAxis/v2")
@Log("生箔下料")
public ResponseEntity<Object> needEmptyAxisV2(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(rawFoilPdaService.needEmptyAxisV2(whereJson), HttpStatus.OK);
}
@PostMapping("/confirmBlanking")
@Log("准备就绪")
public ResponseEntity<Object> confirmBlanking(@RequestBody JSONObject whereJson) {

View File

@@ -1,6 +1,5 @@
package org.nl.wms.pda.mps.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
@@ -31,6 +30,13 @@ public interface RawFoilPdaService {
*/
JSONObject needEmptyAxis(JSONObject param);
/**
* 生箔下料 2
* @param param /
* @return /
*/
JSONObject needEmptyAxisV2(JSONObject param);
/**
* 准备就绪
* @param param /

View File

@@ -1,5 +1,6 @@
package org.nl.wms.pda.mps.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
@@ -8,10 +9,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.pda.mps.service.RawFoilPdaService;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.ivt.raw.service.IstIvtSbpointivtService;
import org.nl.wms.pdm.ivt.raw.service.dao.StIvtSbpointivt;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
@@ -19,11 +23,13 @@ import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.tasks.raw.RawCallRollTrussTask;
import org.nl.wms.sch.task_manage.tasks.raw.RawDownAGVTask;
import org.nl.wms.util.TaskUtils;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -46,6 +52,8 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
private ISchBaseTaskService taskService;
@Autowired
private WmsToAcsService wmsToAcsService;
@Autowired
IstIvtSbpointivtService stIvtSbpointivtService;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject needEmptyVehicle(JSONObject param) {
@@ -131,7 +139,6 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
// 当前生箔的点位
param.put("device_code", pointCode);
param.put("create_mode", GeneralDefinition.PDA_CREATION);
param.put("requestNo", "LMS" + IdUtil.getSnowflake(1,1).nextIdStr());
// 判断是否呼叫空辊
if (GeneralDefinition.YES.equals(isCallEmpty)) {
// 创建桁架任务之后创建AGV任务需要备注是四点任务
@@ -153,8 +160,73 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject needEmptyAxisV2(JSONObject param) {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.RAW_DOWN.getTag());
log.info("手持生箔下料: {}", param);
// point_code, order_code, is_call_empty
String pointCode = param.getString("point_code");
String orderCode = param.getString("order_code");
String isCallEmpty = param.getString("is_call_empty");
// 判断是否存在任务
List<SchBaseTask> unFinishTasks = taskService.checkHaveTask(pointCode);
// 判断是否存在对应的桁架任务
List<SchBaseTask> unFinishRelatedTasks = taskService.checkHaveRelatedTaskInRequestParam(pointCode);
if (unFinishTasks.size() > 0 || unFinishRelatedTasks.size() > 0) {
throw new BadRequestException("点位[" + pointCode + "]已经存在任务!");
}
StIvtSbpointivt sbPoint = stIvtSbpointivtService.getByPointCode(pointCode, true);
if (ObjectUtil.isEmpty(sbPoint)) {
throw new BadRequestException("生箔位:" + pointCode + " 不存在,请检查是否被锁住!");
}
// todo: 通过流转卡号到ERP系统查找对应的信息最后生成工单存到LMS
// 创建工单
PdmBiRawfoilworkorder rawOrder = new PdmBiRawfoilworkorder();
rawOrder.setWorkorder_id(IdUtil.getSnowflake(1,1).nextIdStr());
rawOrder.setContainer_name(orderCode);
rawOrder.setResource_name(sbPoint.getExt_code());
rawOrder.setMfg_order_name("$$$$");
rawOrder.setProduct_name("锂电");
rawOrder.setDescription("锂电");
rawOrder.setTheory_height(BigDecimal.valueOf(2000));
rawOrder.setUp_coiler_date(DateUtil.now());
rawOrder.setStatus("01");
TaskUtils.setRawOrderCreateByDefault(rawOrder);
rawOrder.setProduct_area(sbPoint.getProduct_area());
rawOrder.setIs_baking("0");
rawOrder.setOrder_type("1");
rawOrder.setBaking_time("80");
rawOrder.setRoll_type("1");
rawOrder.setBaking_temperature("80");
rawfoilworkorderService.save(rawOrder);
// 组织请求任务参数
// 当前生箔的点位
param.put("device_code", pointCode);
param.put("ext_code", sbPoint.getExt_code());
param.put("create_mode", GeneralDefinition.PDA_CREATION);
// 判断是否呼叫空辊
if (GeneralDefinition.YES.equals(isCallEmpty)) {
// 创建桁架任务之后创建AGV任务需要备注是四点任务
param.put("config_code", "RawCallRollTrussTask");
param.put("is_flag", "1");
rawCallRollTrussTask.apply(param);
} else {
// 创建AGV任务直接到烘箱的任务
param.put("config_code", "RawDownAGVTask");
param.put("is_flag", "0");
rawDownAGVTask.apply(param);
}
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "任务创建成功!");
result.put("data", new JSONObject());
return result;
}
@Override
public JSONObject confirmBlanking(JSONObject param) {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.RAW_READY.getTag());
log.info("手持生箔准备就绪, {}", param);
// param: point_code
String pointCode = param.getString("point_code");
@@ -171,12 +243,12 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
}
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String workorderId = requestObj.getString("workorder_id");
if (ObjectUtil.isNotEmpty(workorderId)) {
String orderCode = requestObj.getString("order_code");
if (ObjectUtil.isNotEmpty(orderCode)) {
rawfoilworkorderService.update(new LambdaUpdateWrapper<PdmBiRawfoilworkorder>()
.set(PdmBiRawfoilworkorder::getStatus, "03")
.eq(PdmBiRawfoilworkorder::getWorkorder_id, workorderId));
log.info("工单修改完毕 - 工单标识 - {}", workorderId);
.eq(PdmBiRawfoilworkorder::getContainer_name, orderCode));
log.info("工单修改完毕 - 工单标识 - {}", orderCode);
}
//下发ACS执行AGV动作
JSONArray paramArr = new JSONArray();
@@ -184,7 +256,7 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
acsParam.put("device_code", pointCode);
acsParam.put("task_code", task.getTask_code());
acsParam.put("product_area", task.getProduct_area());
acsParam.put("option", "1");
acsParam.put("option", "2");
paramArr.add(acsParam);
JSONObject jsonObject = wmsToAcsService.updateTask(paramArr);
log.info("生箔下发ACS执行AGV动作请求参数{},返回结果:{}", paramArr, jsonObject);

View File

@@ -25,6 +25,11 @@ import org.springframework.web.bind.annotation.RestController;
public class OtherPdaController {
@Autowired
private OtherPdaService otherPdaService;
@PostMapping("/startMoveWasteFoil/v2")
@Log("开始搬运废箔信息")
public ResponseEntity<Object> startMoveWasteFoilV2(@RequestBody JSONObject param) {
return new ResponseEntity<>(otherPdaService.startMoveWasteFoilV2(param), HttpStatus.OK);
}
@PostMapping("/startMoveWasteFoil")
@Log("开始搬运废箔信息")
public ResponseEntity<Object> startMoveWasteFoil(@RequestBody JSONObject param) {

View File

@@ -8,6 +8,12 @@ import com.alibaba.fastjson.JSONObject;
* @Date: 2024/8/14
*/
public interface OtherPdaService {
/**
* 开始搬运废箔 2
* @param param /
* @return /
*/
JSONObject startMoveWasteFoilV2(JSONObject param);
/**
* 开始搬运废箔
* @param param /

View File

@@ -70,7 +70,7 @@ public class GxPdaServiceImpl implements GxPdaService {
@Deprecated
@Transactional(rollbackFor = Exception.class)
public JSONObject confirmedInStorage(JSONObject param) {
MDC.put("tag_name", TagNameEnum.GX_IN.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.GX_IN.getTag());
log.info("手持确认管芯入库 - {}", param);
// row: gx_code, material_code, material_spec
// 将每一根存到物料表中,并且创建任务
@@ -138,7 +138,7 @@ public class GxPdaServiceImpl implements GxPdaService {
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject confirmedInStorageV2(JSONObject param) {
MDC.put("tag_name", TagNameEnum.GX_IN.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.GX_IN.getTag());
log.info("手持确认管芯入库 - {}", param);
// 获取管芯库入口
List<SchBasePoint> gxRks = pointService.getPointByConditions("A1", "A1-GXK",
@@ -207,7 +207,7 @@ public class GxPdaServiceImpl implements GxPdaService {
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject confirmedOutStorage(JSONObject param) {
MDC.put("tag_name", TagNameEnum.GX_OUT.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.GX_OUT.getTag());
log.info("手持操作管芯出库 - {}", param);
// param: number, material_code, material_spec
int number = param.getInteger("number");
@@ -238,7 +238,7 @@ public class GxPdaServiceImpl implements GxPdaService {
for (int i = 0; i < number; i++) {
// 由任务完成来清除点位
SchBasePoint point = allPoint.get(i);
// 查找点位最终一次性发给ACS
// 查找点位发给ACS
JSONObject taskParam = new JSONObject();
taskParam.put("product_area", URLEnum.ACS_URL_A1.getProduct_area());
taskParam.put("point_code1", point.getPoint_code());

View File

@@ -70,7 +70,7 @@ public class NbjPdaServiceImpl implements NbjPdaService {
private PdaSendShaftAGVTask pdaSendShaftAGVTask;
@Override
public JSONObject changeLiftStatus(JSONObject param) {
MDC.put("tag_name", TagNameEnum.SWITCH_STATUS_OF_LIFT.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.SWITCH_STATUS_OF_LIFT.getTag());
log.info("货梯切换状态 - {}", param);
// type: 1: 清空, 2放空架子 point_code
String type = param.getString("type");

View File

@@ -43,6 +43,14 @@ public class OtherPdaServiceImpl implements OtherPdaService {
private SlitterSendRollTrussTask slitterSendRollTrussTask;
@Autowired
private WmsToAcsService wmsToAcsService;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject startMoveWasteFoilV2(JSONObject param) {
log.info("手持开始搬运废箔 - {}", param);
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject startMoveWasteFoil(JSONObject param) {

View File

@@ -86,6 +86,13 @@ public interface IpdmBiRawfoilworkorderService extends IService<PdmBiRawfoilwork
* @return /
*/
List<PdmBiRawfoilworkorder> getAllUsedRawPlanOnZc();
/**
* 母卷号唯一,通过母卷号获取生箔工单
* @param code /
* @return /
*/
PdmBiRawfoilworkorder getByContainerName(String code);
}

View File

@@ -71,7 +71,7 @@ public class PdmBiRawfoilworkorderServiceImpl extends ServiceImpl<PdmBiRawfoilwo
*/
@Override
public IPage<PdmBiRawfoilworkorder> query(Map whereJson, PageQuery page) {
IPage<PdmBiRawfoilworkorder> resultPage = new Page<>(page.getPage(), page.getSize());
IPage<PdmBiRawfoilworkorder> resultPage = new Page<>(page.getPage() + 1, page.getSize());
LambdaQueryWrapper<PdmBiRawfoilworkorder> queryWrapper = new LambdaQueryWrapper<>();
if (whereJson.containsKey("product_area")) {
queryWrapper.eq(PdmBiRawfoilworkorder::getProduct_area, whereJson.get("product_area"));
@@ -91,7 +91,7 @@ public class PdmBiRawfoilworkorderServiceImpl extends ServiceImpl<PdmBiRawfoilwo
if (whereJson.containsKey("end_time")) {
queryWrapper.le(PdmBiRawfoilworkorder::getCreate_time, whereJson.get("end_time"));
}
if (whereJson.containsKey("statusX") && "1".equals(whereJson.get("statusX"))) {
if (ObjectUtil.isNotEmpty(whereJson.get("statusX")) && "1".equals(whereJson.get("statusX"))) {
queryWrapper.ne(PdmBiRawfoilworkorder::getStatus, "09");
queryWrapper.eq(ObjectUtil.isNotEmpty(whereJson.get("material_spec")),
PdmBiRawfoilworkorder::getWind_roll, whereJson.get("material_spec"));
@@ -256,5 +256,13 @@ public class PdmBiRawfoilworkorderServiceImpl extends ServiceImpl<PdmBiRawfoilwo
return pdmBiRawfoilworkorderMapper.getAllUsedRawPlanOnZc();
}
@Override
public PdmBiRawfoilworkorder getByContainerName(String code) {
LambdaQueryWrapper<PdmBiRawfoilworkorder> lam = new LambdaQueryWrapper<>();
lam.eq(PdmBiRawfoilworkorder::getContainer_name, code)
.eq(PdmBiRawfoilworkorder::getIs_delete, false);
return this.getOne(lam);
}
}

View File

@@ -43,7 +43,7 @@ public class StIvtCutpointivtServiceImpl extends ServiceImpl<StIvtCutpointivtMap
*/
@Override
public IPage<StIvtCutpointivt> query(Map whereJson, PageQuery page) {
IPage<StIvtCutpointivt> resultPage = new Page<>(page.getPage(), page.getSize());
IPage<StIvtCutpointivt> resultPage = new Page<>(page.getPage() + 1, page.getSize());
LambdaQueryWrapper<StIvtCutpointivt> queryWrapper = new LambdaQueryWrapper<>();
// if (whereJson.containsKey("name")) {
// queryWrapper.like(StIvtCutpointivt::getName, whereJson.get("name"));

View File

@@ -83,6 +83,12 @@ public interface IstIvtHotpointivtService extends IService<StIvtHotpointivt> {
* @return /
*/
StIvtHotpointivt getPointByCode(String pointCode, boolean flag);
/**
* 获取需要烘烤的点位
* @return /
*/
List<StIvtHotpointivt> getNeedBakingPoint();
}

View File

@@ -18,4 +18,6 @@ public interface StIvtHotpointivtMapper extends BaseMapper<StIvtHotpointivt> {
List<StIvtHotpointivt> getNotTaskHotOven(String rollType, String used);
JSONArray getHotDeviceInfoForAcs(String productArea);
List<StIvtHotpointivt> getNeedBakingPoint();
}

View File

@@ -26,4 +26,14 @@
WHERE is_used = '1'
AND ivt.product_area = #{productArea}
</select>
<select id="getNeedBakingPoint" resultType="org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt">
SELECT
hot.*
FROM
`st_ivt_hotpointivt` hot
LEFT JOIN pdm_bi_rawfoilworkorder raw ON hot.workorder_id = raw.workorder_id
WHERE
raw.is_baking = '1' AND hot.point_status = '03'
ORDER BY hot.update_time
</select>
</mapper>

View File

@@ -132,6 +132,11 @@ public class StIvtHotpointivtServiceImpl extends ServiceImpl<StIvtHotpointivtMap
return getOne(lam);
}
@Override
public List<StIvtHotpointivt> getNeedBakingPoint() {
return stIvtHotpointivtMapper.getNeedBakingPoint();
}
/**
* 获取实体基础信息

View File

@@ -26,7 +26,7 @@ public class AutoCallEmptyToWeighTemp {
@Autowired
private CzzcCallEmptyAGVTask czzcCallEmptyAGVTask;
public void run() {
MDC.put("tag_name", TagNameEnum.AUTO_CALL_EMPTY_BY_CZZC.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.AUTO_CALL_EMPTY_BY_CZZC.getTag());
log.info("称重暂存位叫空自动任务开始执行...");
List<SchBasePoint> allZcPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-CZZC",
"1", "1", null, null);

View File

@@ -0,0 +1,71 @@
package org.nl.wms.quartz;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.pdm.ivt.hot.service.IstIvtHotpointivtService;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.quartz.dto.NeedBakingDto;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.tasks.hot.AutoInHotTrussTask;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author: lyd
* @Date: 2024/8/23
* @Description: 自动入烘箱任务
* @see AutoInHotTrussTask
*/
@Slf4j
@Component
public class AutoCreateInHotTask {
private final static String HX_REGION = "A1-HXZC";
@Autowired
private ISchBasePointService pointService;
@Autowired
private IstIvtHotpointivtService hotpointivtService;
@Autowired
private AutoInHotTrussTask autoInHotTrussTask;
@Transactional(rollbackFor = Exception.class)
public void run() {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.AUTO_IN_HOT.getTag());
log.info("自动创建入烘箱任务开始执行...");
// 获取烘箱暂存位点位状态是2待烘烤没任务的点位
List<SchBasePoint> hotNotTaskPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
null, "2");
log.info("找到待烘烤的暂存位:{}", hotNotTaskPoints);
// 获取烘箱点位状态是暂存且需要烘烤的点位数据。
List<StIvtHotpointivt> hotPoints = hotpointivtService.getNeedBakingPoint();
log.info("找到待烘烤的烘箱位:{}", hotPoints);
// 合并一起
List<NeedBakingDto> collect1 = hotNotTaskPoints.stream().map(item -> NeedBakingDto
.builder()
.point_code(item.getPoint_code())
.workorder_id(item.getSource_id())
.update_time(item.getUpdate_time()).build()).collect(Collectors.toList());
List<NeedBakingDto> collect2 = hotPoints.stream().map(item -> NeedBakingDto
.builder()
.point_code(item.getPoint_code())
.workorder_id(item.getWorkorder_id())
.update_time(item.getUpdate_time()).build()).collect(Collectors.toList());
List<NeedBakingDto> combinedList = new ArrayList<>();
combinedList.addAll(collect1);
combinedList.addAll(collect2);
combinedList.sort(Comparator.comparing(NeedBakingDto::getUpdate_time));
log.info("排序后的数据 {}", combinedList);
// 调用自动入烘箱的任务
JSONObject param = new JSONObject();
param.put("intoPoints", combinedList);
autoInHotTrussTask.createTask(param);
}
}

View File

@@ -0,0 +1,22 @@
package org.nl.wms.quartz.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: lyd
* @Description: 需要烘烤的实体
* <p>使用此对象的原因是,两张不同的点位,需要放在一起。</p>
* @Date: 2024/8/23
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NeedBakingDto {
private String point_code;
private String workorder_id;
private String update_time;
}

View File

@@ -111,4 +111,11 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
*/
List<SchBasePoint> getAllBusinessNotTaskPoint(String area, String region, String pointType,
String pointStatus, String vehicleType, String vehicleCode);
/**
* 获取收卷没任务、生箔机指定的收卷的点位
* @param code
* @return
*/
List<SchBasePoint> getWindRollConformRawNotTaskPoints(String code);
}

View File

@@ -20,10 +20,10 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
/**
* 获取指定载具类型,并没有任务的收卷辊点位
* @param vehicleType 载具类型
* @param vehicleCode 载具编码
* @return /
*/
List<SchBasePoint> getWindRollNotTaskPoints(String vehicleType);
List<SchBasePoint> getWindRollNotTaskPoints(String vehicleCode);
/**
* 获取烘箱可用点位
@@ -37,4 +37,11 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
List<SchBasePoint> getAllBusinessNotTaskPoint(String area, String region, String pointType, String pointStatus,
String vehicleType, String vehicleCode);
/**
* 获取收卷没任务、生箔机指定的收卷的点位
* @param code /
* @return /
*/
List<SchBasePoint> getWindRollConformRawNotTaskPoints(String code);
}

View File

@@ -19,7 +19,7 @@
AND p.point_type = '3'
AND p.point_status = '2'
AND p.region_code = 'A1-SJGK'
AND p.vehicle_type = #{vehicleType}
AND p.vehicle_code = #{vehicleCode}
AND p.is_used = TRUE
AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE t.point_code1 = p.point_code AND t.task_status <![CDATA[<]]> '07')
ORDER BY p.update_time
@@ -64,4 +64,20 @@
OR t.point_code4 = p.point_code))
ORDER BY p.in_order_seq, p.update_time
</select>
<select id="getWindRollConformRawNotTaskPoints" resultType="org.nl.wms.sch.point.service.dao.SchBasePoint">
SELECT
p.*
FROM
sch_base_point p
WHERE
p.product_area = 'A1'
AND p.point_type = '3'
AND p.point_status = '2'
AND p.region_code = 'A1-SJGK'
AND (SELECT sb.can_vehicle FROM st_ivt_sbpointivt sb WHERE sb.point_code = #{code}) LIKE CONCAT('%', p.vehicle_code, '%')
AND p.is_used = TRUE
AND 0 = ( SELECT COUNT(*) FROM sch_base_task t WHERE t.point_code1 = p.point_code AND t.task_status <![CDATA[<]]> '07' )
ORDER BY
p.update_time
</select>
</mapper>

View File

@@ -237,4 +237,9 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
return pointMapper.getAllBusinessNotTaskPoint(area, region, pointType, pointStatus, vehicleType, vehicleCode);
}
@Override
public List<SchBasePoint> getWindRollConformRawNotTaskPoints(String code) {
return pointMapper.getWindRollConformRawNotTaskPoints(code);
}
}

View File

@@ -145,6 +145,10 @@ public class SchBaseTask implements Serializable {
@TableField(exist = false)
private String dtl_type;
/** 重量 */
@TableField(exist = false)
private String weight;
private String material_code;

View File

@@ -6,6 +6,8 @@ package org.nl.wms.sch.task_manage.core.constant;
* @Date: 2023/7/13
*/
public class GeneralDefinition {
/** 日志分配MDC的key */
public static final String MDC_KEY = "tag_name";
/** 未知 */
public static final String UNKNOWN = "-";
// 是否

View File

@@ -8,6 +8,7 @@ import org.nl.common.exception.BadRequestException;
import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.service.NbjOperationService;
import org.slf4j.MDC;
@@ -34,7 +35,7 @@ public class NbjOperationServiceImpl implements NbjOperationService {
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject tubeExceptionHandling(JSONObject param) {
MDC.put("tag_name", TagNameEnum.ERROR_GX_IN_OUT.getTag());
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.ERROR_GX_IN_OUT.getTag());
log.info("ACS请求满入/空出异常处理 - {}", param);
// type: 1满入2空出、device_code: 异常点位
String type = param.getString("type");

View File

@@ -1,8 +1,9 @@
package org.nl.wms.sch.task_manage.tasks.auto;
package org.nl.wms.sch.task_manage.tasks.hot;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
@@ -11,6 +12,7 @@ import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.pdm.ivt.hot.service.IstIvtHotpointivtService;
import org.nl.wms.quartz.dto.NeedBakingDto;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
@@ -22,7 +24,6 @@ import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@@ -32,7 +33,8 @@ import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
/**
* @Author: lyd
* @Description: 自动创建入烘箱任务 统一调度执行不合适则换定时任务
* @Description: 自动创建入烘箱任务
* <p>通过定时任务 {@link org.nl.wms.quartz.AutoCreateInHotTask} 调用此类</p>
* @Date: 2024/8/9
*/
@Slf4j
@@ -54,20 +56,18 @@ public class AutoInHotTrussTask extends AbstractTask {
}
@Override
@Transactional(rollbackFor = Exception.class)
protected void autoCreate() {
// 自动创建
log.info("自动创建入烘箱的任务...");
// 获取烘箱暂存位点位状态是2待烘烤没任务的点位
List<SchBasePoint> hotNotTaskPoint = pointService.getHotNotTaskPoint("A1", HX_REGION, null, "2");
log.info("找到待烘烤的暂存位:{}", hotNotTaskPoint);
for (SchBasePoint hotPoint : hotNotTaskPoint) {
public String createTask(JSONObject form) {
// 创建任务
JSONArray intoPoints = form.getJSONArray("intoPoints");
List<NeedBakingDto> needBakingDtos = intoPoints.toJavaList(NeedBakingDto.class);
for (NeedBakingDto bakingDto : needBakingDtos) {
log.info("当前准备入烘箱点位:{}", bakingDto.getPoint_code());
try {
SchBaseTask task = new SchBaseTask();
// 查找可用的烘箱
String workOrderId = hotPoint.getGroup_id();
String workOrderId = bakingDto.getWorkorder_id();
if (ObjectUtil.isEmpty(workOrderId)) {
log.error("点位{}的工单号为空!", hotPoint.getPoint_code());
log.error("点位{}的工单号为空!", bakingDto.getPoint_code());
break;
}
PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workOrderId);
@@ -94,12 +94,11 @@ public class AutoInHotTrussTask extends AbstractTask {
}
JSONObject param = new JSONObject();
param.put("workorder_id", workOrderId);
task.setPoint_code1(hotPoint.getPoint_code());
task.setPoint_code1(bakingDto.getPoint_code());
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setConfig_code("AutoInHotTrussTask");
task.setCreate_mode(GeneralDefinition.AUTO_CREATION);
task.setVehicle_code(hotPoint.getVehicle_code());
task.setRequest_param(JSONObject.toJSONString(param));
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
task.setHandle_status(THIS_CLASS);
@@ -109,7 +108,7 @@ public class AutoInHotTrussTask extends AbstractTask {
log.error("自动创建入烘箱的任务执行异常:{}", e);
}
}
return null;
}
@Override

View File

@@ -1,4 +1,4 @@
package org.nl.wms.sch.task_manage.tasks.auto;
package org.nl.wms.sch.task_manage.tasks.hot;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
@@ -6,7 +6,6 @@ import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.springframework.stereotype.Component;
import org.nl.wms.sch.task_manage.tasks.hot.OutHotTrussTask;
/**
* @Author: lyd

View File

@@ -33,7 +33,7 @@ import static org.nl.wms.util.PointUtils.setHxUpdateByType;
/**
* @Author: lyd
* @Description: 入烘箱的任务类
* @Description: 入烘箱的任务类 todo: 需要修改
* @Date: 2024/8/8
*/
@Slf4j
@@ -66,11 +66,13 @@ public class InHotTrussTask extends AbstractTask {
// 查找烘箱同大卷小卷
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String workorderId = requestObj.getString("workorder_id");
String orderCode = requestObj.getString("order_code");
String flag = "0";
PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workorderId);
PdmBiRawfoilworkorder order = rawfoilworkorderService.getByContainerName(orderCode);
if ("1".equals(order.getIs_baking())) {
String bakingTemperature = order.getBaking_temperature();
requestObj.put("temperature", bakingTemperature);
requestObj.put("time", order.getBaking_time());
// 如果需要烘烤, 先找对应点
List<StIvtHotpointivt> hotList = hotpointivtService.getNotTaskHotOven(order.getRoll_type(), "1");
if (hotList.size() > 0) {
@@ -92,15 +94,18 @@ public class InHotTrussTask extends AbstractTask {
// 没有烘烤位置或者没有找到对应的点就区待烘烤区, 就去待烘烤
if (hotList.size() == 0 || ObjectUtil.isEmpty(task.getPoint_code2())) {
// 找不到就去找暂存区(待烘烤区)
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", HX_REGION, "2", "1");
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", HX_REGION,
"2", "1");
if (hotDjwList.size() > 0) {
SchBasePoint point = hotDjwList.get(0);
task.setPoint_code2(point.getPoint_code());
}
}
// todo: 需要烘烤,且是小卷,但是没有位置,需要将最快结束的烘箱组锁住
} else {
// 不需要烘烤,则送到暂存区(无需烘烤区 - 任务做完需要将点位设置为待分切)
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", HX_REGION, "3", "1");
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", HX_REGION,
"3", "1");
if (hotDjwList.size() > 0) {
SchBasePoint point = hotDjwList.get(0);
task.setPoint_code2(point.getPoint_code());
@@ -108,9 +113,10 @@ public class InHotTrussTask extends AbstractTask {
}
// 如果都没有位置, 就去未开启的烘箱的空位,也是区分大小卷
// todo: (有可能是待烘烤、也有可能是不需要烘烤做为暂存)
// todo: (有可能是待烘烤、也有可能是不需要烘烤做为暂存, 目前是判断未使用的点位,后期可能需要加字段
if (ObjectUtil.isEmpty(task.getPoint_code2())) {
List<StIvtHotpointivt> notTaskHotOven = hotpointivtService.getNotTaskHotOven(order.getRoll_type(), "0");
List<StIvtHotpointivt> notTaskHotOven = hotpointivtService.getNotTaskHotOven(order.getRoll_type(),
"0");
if (notTaskHotOven.size() == 0) {
throw new BadRequestException("未找到可用货位!");
}
@@ -120,9 +126,10 @@ public class InHotTrussTask extends AbstractTask {
task.setPoint_code2(stIvtHotpointivt.getPoint_code());
}
// 保存任务参数
requestObj.put("caching", flag);
task.setRequest_param(requestObj.toJSONString());
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
requestObj.put("caching", flag);
setUpdateByPC(task);
taskService.save(task);
}
@@ -134,19 +141,18 @@ public class InHotTrussTask extends AbstractTask {
// 完成任务,需要设置对应点位状态(可能入的是烘箱,也有可能入的是暂存区)
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String workorderId = requestObj.getString("workorder_id");
String orderCode = requestObj.getString("order_code");
String caching = requestObj.getString("caching");
String endPointCode = taskObj.getPoint_code2();
SchBasePoint hotDjwPoint = pointService.getById(endPointCode);
StIvtHotpointivt hotpointivt = hotpointivtService.getPointByCode(endPointCode, false);
PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workorderId);
PdmBiRawfoilworkorder order = rawfoilworkorderService.getByContainerName(orderCode);
Assert.notNull(order, "工单不能为空!");
if (ObjectUtil.isEmpty(hotpointivt)) {
// 如果是对接位, 判断区域,修改对应的点位状态,并且绑定载具号
hotDjwPoint.setVehicle_code(taskObj.getVehicle_code());
// 如果是对接位, 判断区域,修改对应的点位状态
hotDjwPoint.setPoint_status("1".equals(order.getIs_baking()) ? "2" : "4");
// 此字段存放工单号
hotDjwPoint.setSource_id(workorderId);
hotDjwPoint.setSource_id(order.getWorkorder_id());
setUpdateByType(hotDjwPoint, taskFinishedType);
pointService.update(hotDjwPoint);
} else {

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.task_manage.tasks.nbj;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.sch.point.service.ISchBasePointService;
@@ -11,11 +12,14 @@ import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.TaskUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
@@ -35,11 +39,14 @@ public class SubRollDownAGVTask extends AbstractTask {
private ISchBaseTaskService taskService;
@Autowired
private ISchBasePointService pointService;
@Autowired
private RedissonClient redissonClient;
@Override
public void create() throws BadRequestException {
}
@SneakyThrows
@Override
public void createCompletion(SchBaseTask task) {
// 查找空位没任务的货梯
@@ -49,12 +56,24 @@ public class SubRollDownAGVTask extends AbstractTask {
throw new BadRequestException("暂无可用的货梯!");
}
SchBasePoint liftPoint = lifts.get(0);
task.setPoint_code2(liftPoint.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
RLock lock = redissonClient.getLock(liftPoint.getPoint_code());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
task.setPoint_code2(liftPoint.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
} else {
throw new BadRequestException("点位编码:" + liftPoint.getPoint_code() + "正在使用中,请重试!");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
}
@Override

View File

@@ -48,16 +48,17 @@ public class RawCallRollTrussTask extends AbstractTask {
private IstIvtSbpointivtService stIvtSbpointivtService;
@Override
public void create() throws BadRequestException {
// 此任务不走apply路口创建任务
}
@Override
public void createCompletion(SchBaseTask task) {
log.info("生箔手持呼叫空辊任务创建, 参数:{}", task);
// 查找同类型的起点, 并且没有任务
List<SchBasePoint> startPoints = pointService.getWindRollNotTaskPoints(task.getVehicle_type());
// 查找同类型且与生箔机指定的收卷辊的起点, 并且没有任务
// 先获取生箔机指定的收卷辊
JSONObject requestObj = JSONObject.parseObject(task.getRequest_param());
List<SchBasePoint> startPoints = pointService.getWindRollNotTaskPoints(requestObj.getString("ext_code"));
if (startPoints.size() == 0) {
throw new BadRequestException("找不到同规格的收卷辊!");
throw new BadRequestException("找不到生箔机指定的收卷辊!");
}
// 终点为出口,不校验是否占用
List<SchBasePoint> endPoints = pointService.getPointByConditions("A1", "A1-SJGK",
@@ -112,10 +113,9 @@ public class RawCallRollTrussTask extends AbstractTask {
log.info("桁架任务完毕,开始创建 [{}] 的AGV任务", endAgvPoint);
// 收卷辊库里的载具编码
taskParam.put("vehicle_code", taskObj.getVehicle_code());
taskParam.put("vehicle_type", taskObj.getVehicle_type());
taskParam.put("device_code", endAgvPoint);
taskParam.put("is_flag", flag);
taskParam.put("workorder_id", requestObj.getString("workorder_id"));
taskParam.put("order_code", requestObj.getString("order_code"));
taskParam.put("start_point_code", taskObj.getPoint_code2());
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("create_mode", GeneralDefinition.TASK_CREATION);
@@ -123,7 +123,6 @@ public class RawCallRollTrussTask extends AbstractTask {
if ("1".equals(flag)) {
// 需要的是四点任务
taskParam.put("config_code", "RawDownAGVTask");
taskParam.put("vehicle_code2", requestObj.getString("vehicle_code"));
rawDownAGVTask.apply(taskParam);
} else {
// 单纯送空

View File

@@ -89,12 +89,12 @@ public class RawDownAGVTask extends AbstractTask {
JSONObject taskParam = new JSONObject();
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String workorderId = requestObj.getString("workorder_id");
if (ObjectUtil.isNotEmpty(workorderId)) {
String orderCode = requestObj.getString("order_code");
if (ObjectUtil.isNotEmpty(orderCode)) {
rawfoilworkorderService.update(new LambdaUpdateWrapper<PdmBiRawfoilworkorder>()
.set(PdmBiRawfoilworkorder::getStatus, "04")
.eq(PdmBiRawfoilworkorder::getWorkorder_id, workorderId));
log.info("工单修改完毕 - 工单标识 - {}", workorderId);
.eq(PdmBiRawfoilworkorder::getContainer_name, orderCode));
log.info("工单修改完毕 - 母卷号 - {}", orderCode);
}
String hxPointCode = "";
// 获取点位
@@ -106,7 +106,7 @@ public class RawDownAGVTask extends AbstractTask {
hxPointCode = taskObj.getPoint_code4();
}
log.info("开始创建桁架任务入烘箱....");
taskParam.put("workorder_id", requestObj.getString("workorder_id"));
taskParam.put("order_code", orderCode);
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("device_code", hxPointCode);
taskParam.put("config_code", "InHotTrussTask");

View File

@@ -45,11 +45,6 @@ public class TaskUtils {
taskObj.setCreate_name(SecurityUtils.getCurrentNickName());
taskObj.setCreate_time(DateUtil.now());
}
public static void setRawOrderUpdateByDefault(PdmBiRawfoilworkorder order) {
order.setUpdate_optid(SecurityUtils.getCurrentUserId());
order.setUpdate_optname(SecurityUtils.getCurrentNickName());
order.setUpdate_time(DateUtil.now());
}
public static void setCreateByAcsOrPda(SchBaseTask taskObj, JSONObject param) {
// 如果是人工创建,会带个用户过来
@@ -127,6 +122,25 @@ public class TaskUtils {
}
}
/**
* 设置生箔工单更新人
* @param order 生箔工单
*/
public static void setRawOrderUpdateByDefault(PdmBiRawfoilworkorder order) {
order.setUpdate_optid(SecurityUtils.getCurrentUserId());
order.setUpdate_optname(SecurityUtils.getCurrentNickName());
order.setUpdate_time(DateUtil.now());
}
/**
* 设置生箔工单创建人
* @param order 生箔工单
*/
public static void setRawOrderCreateByDefault(PdmBiRawfoilworkorder order) {
order.setCreate_id(SecurityUtils.getCurrentUserId());
order.setCreate_name(SecurityUtils.getCurrentNickName());
order.setCreate_time(DateUtil.now());
}
/**
* 校验是否有起点终点的任务
*/