|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package org.springblade.desk.produce.service.impl; |
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
@ -10,20 +11,28 @@ import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.springblade.core.log.exception.ServiceException; |
|
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl; |
|
|
|
|
import org.springblade.core.secure.utils.AuthUtil; |
|
|
|
|
import org.springblade.desk.dashboard.mapper.BsProcessSetMapper; |
|
|
|
|
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; |
|
|
|
|
import org.springblade.desk.dashboard.pojo.entity.DsTaskingEntity; |
|
|
|
|
import org.springblade.desk.dashboard.service.IDsTaskingService; |
|
|
|
|
import org.springblade.desk.logistics.pojo.entity.PrWorkOrder; |
|
|
|
|
import org.springblade.desk.order.mapper.YieldOrderMapper; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.YieldOrder; |
|
|
|
|
import org.springblade.desk.produce.mapper.DisTaskingMapper; |
|
|
|
|
import org.springblade.desk.produce.pojo.dto.TaskCompleteDTO; |
|
|
|
|
import org.springblade.desk.produce.pojo.dto.TaskCompleteOrderDTO; |
|
|
|
|
import org.springblade.desk.produce.pojo.dto.WorkPlanPreserveDTO; |
|
|
|
|
import org.springblade.desk.produce.pojo.entity.*; |
|
|
|
|
import org.springblade.desk.produce.pojo.vo.AllWorkPlanVO; |
|
|
|
|
import org.springblade.desk.produce.pojo.vo.ByCardNoByPlanVO; |
|
|
|
|
import org.springblade.desk.produce.pojo.vo.TaskCompleteVO; |
|
|
|
|
import org.springblade.desk.produce.pojo.vo.WorkInProcessVO; |
|
|
|
|
import org.springblade.desk.produce.service.IDisTaskingService; |
|
|
|
|
import org.springblade.desk.produce.service.IWorkOrderRunService; |
|
|
|
|
import org.springblade.desk.produce.service.IWorkOrderService; |
|
|
|
|
import org.springblade.desk.produce.service.IWorkPlanService; |
|
|
|
|
import org.springblade.desk.produce.service.*; |
|
|
|
|
import org.springblade.desk.quality.pojo.entity.InspectionTask; |
|
|
|
|
import org.springblade.desk.quality.pojo.entity.ReviewSheet; |
|
|
|
|
import org.springblade.desk.quality.pojo.entity.WorkPlanItem; |
|
|
|
|
import org.springblade.desk.quality.service.IInspectionTaskService; |
|
|
|
|
import org.springblade.desk.quality.service.IReviewSheetService; |
|
|
|
|
import org.springblade.desk.quality.service.IWorkPlanItemService; |
|
|
|
|
import org.springblade.system.cache.UserCache; |
|
|
|
|
import org.springblade.system.pojo.entity.User; |
|
|
|
|
@ -55,6 +64,22 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
|
|
|
|
|
private final IWorkPlanItemService workPlanItemService; |
|
|
|
|
|
|
|
|
|
private final IWorkPlanPreserveService workPlanPreserveService; |
|
|
|
|
|
|
|
|
|
private final YieldOrderMapper yieldOrderMapper; |
|
|
|
|
|
|
|
|
|
private final BsProcessSetMapper bsProcessSetMapper; |
|
|
|
|
|
|
|
|
|
private final IHandoverRecordService handoverRecordService; |
|
|
|
|
|
|
|
|
|
private final IPlateAroundService plateAroundService; |
|
|
|
|
|
|
|
|
|
private final IReviewSheetService reviewSheetService; |
|
|
|
|
|
|
|
|
|
private final IInspectionTaskService inspectionTaskService; |
|
|
|
|
|
|
|
|
|
private final IMakeRecService makeRecService; |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public IPage<TaskCompleteVO> disTaskHandle(IPage<TaskCompleteVO> page, TaskCompleteDTO taskCompleteDTO) { |
|
|
|
|
IPage<TaskCompleteVO> iPage = page.setRecords(baseMapper.disTaskHandle(page, taskCompleteDTO)); |
|
|
|
|
@ -76,9 +101,7 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
String oem = workOrder.getOem(); |
|
|
|
|
if ("1".equals(oem)) { |
|
|
|
|
WorkOrderRun workOrderRun = workOrderRunService.getById(workOrder.getWorId()); |
|
|
|
|
if (!(WorkOrderRun.RUN_STATUS_DELIVERED.equals(workOrderRun.getRunStatus()) |
|
|
|
|
|| WorkOrderRun.RUN_STATUS_COMPLETED.equals(workOrderRun.getRunStatus()) |
|
|
|
|
|| WorkOrderRun.RUN_STATUS_VOIDED.equals(workOrderRun.getRunStatus()))) { |
|
|
|
|
if (!(WorkOrderRun.RUN_STATUS_DELIVERED.equals(workOrderRun.getRunStatus()) || WorkOrderRun.RUN_STATUS_COMPLETED.equals(workOrderRun.getRunStatus()) || WorkOrderRun.RUN_STATUS_VOIDED.equals(workOrderRun.getRunStatus()))) { |
|
|
|
|
throw new ServiceException("外协订单不允许修改!"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -127,8 +150,7 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
prWorkOrder.setRunStatus(WorkOrder.RUN_STATUS_RECEIVE); |
|
|
|
|
//判定是否是检验项目,并且还有未检验
|
|
|
|
|
WorkPlan wp = workPlanService.getById(prWorkOrder.getWpId()); |
|
|
|
|
List<WorkPlanItem> list = workPlanItemService.list(Wrappers.lambdaQuery(WorkPlanItem.class) |
|
|
|
|
.eq(WorkPlanItem::getWpId, wp.getId()).eq(WorkPlanItem::getCheckResult, 0)); |
|
|
|
|
List<WorkPlanItem> list = workPlanItemService.list(Wrappers.lambdaQuery(WorkPlanItem.class).eq(WorkPlanItem::getWpId, wp.getId()).eq(WorkPlanItem::getCheckResult, 0)); |
|
|
|
|
if (list != null && !list.isEmpty()) { |
|
|
|
|
prWorkOrder.setRunStatus(WorkOrder.RUN_STATUS_CHECK); |
|
|
|
|
} |
|
|
|
|
@ -159,16 +181,13 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
List<DsTaskingEntity> dsTaskingEntities; |
|
|
|
|
if (isAll) { |
|
|
|
|
// 全量同步
|
|
|
|
|
dsTaskingEntities = dsTaskingService.list(Wrappers.lambdaQuery(DsTaskingEntity.class) |
|
|
|
|
.eq(DsTaskingEntity::getInProduction, "1").ne(DsTaskingEntity::getWipTake, "继续使用")); |
|
|
|
|
dsTaskingEntities = dsTaskingService.list(Wrappers.lambdaQuery(DsTaskingEntity.class).eq(DsTaskingEntity::getInProduction, "1").ne(DsTaskingEntity::getWipTake, "继续使用")); |
|
|
|
|
} else { |
|
|
|
|
// 获取上一个小时的开始结束时间
|
|
|
|
|
Date startTime = Date.from(getLastHourStart().atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
|
Date endTime = Date.from(getLastHourEnd().atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
|
// 获取30分钟之前到现在的工艺任务分派数据
|
|
|
|
|
dsTaskingEntities = dsTaskingService.list(Wrappers.lambdaQuery(DsTaskingEntity.class) |
|
|
|
|
.eq(DsTaskingEntity::getInProduction, "1").ne(DsTaskingEntity::getWipTake, "继续使用") |
|
|
|
|
.between(DsTaskingEntity::getSyncTime, startTime, endTime)); |
|
|
|
|
dsTaskingEntities = dsTaskingService.list(Wrappers.lambdaQuery(DsTaskingEntity.class).eq(DsTaskingEntity::getInProduction, "1").ne(DsTaskingEntity::getWipTake, "继续使用").between(DsTaskingEntity::getSyncTime, startTime, endTime)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(dsTaskingEntities)) { |
|
|
|
|
@ -176,10 +195,7 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Set<String> partCodes = dsTaskingEntities.stream() |
|
|
|
|
.map(DsTaskingEntity::getPartCode) |
|
|
|
|
.filter(Objects::nonNull) |
|
|
|
|
.collect(Collectors.toSet()); |
|
|
|
|
Set<String> partCodes = dsTaskingEntities.stream().map(DsTaskingEntity::getPartCode).filter(Objects::nonNull).collect(Collectors.toSet()); |
|
|
|
|
|
|
|
|
|
if (partCodes.isEmpty()) { |
|
|
|
|
return false; |
|
|
|
|
@ -246,13 +262,179 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
return saveResult; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public List<AllWorkPlanVO> getByCardNoByPlanAll(String cardNo) { |
|
|
|
|
WorkOrder wo = workOrderService.getWorkOrderByCardNoAll(cardNo); |
|
|
|
|
if (wo == null) { |
|
|
|
|
throw new ServiceException("车间订单不存在!"); |
|
|
|
|
} |
|
|
|
|
return workPlanService.getByCardNoByPlanAll(wo.getId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
|
public boolean returnThisProcess(WorkPlanPreserveDTO workPlanPreserveDTO) { |
|
|
|
|
WorkPlan prWorkPlan = workPlanService.getById(workPlanPreserveDTO.getWpId()); |
|
|
|
|
List<WorkPlan> prWorkPlanList = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class) |
|
|
|
|
.eq(WorkPlan::getWoId, prWorkPlan.getWoId()).ge(WorkPlan::getOrders, prWorkPlan.getOrders()) |
|
|
|
|
.gt(WorkPlan::getStatus, WorkPlan.STATUS_NO_START).orderByDesc(WorkPlan::getOrders)); |
|
|
|
|
|
|
|
|
|
// 构建操作记录
|
|
|
|
|
WorkPlanPreserve workPlanPreserve = new WorkPlanPreserve(); |
|
|
|
|
workPlanPreserve.setMemo(workPlanPreserveDTO.getMemo()); |
|
|
|
|
workPlanPreserve.setOrders(prWorkPlan.getOrders()); |
|
|
|
|
BsProcessSetEntity processSet = bsProcessSetMapper.selectById(prWorkPlan.getPpsId()); |
|
|
|
|
workPlanPreserve.setPpsName(processSet != null ? processSet.getName() : ""); |
|
|
|
|
if (prWorkPlanList != null && !prWorkPlanList.isEmpty()) { |
|
|
|
|
for (WorkPlan workPlan : prWorkPlanList) { |
|
|
|
|
// 删除本序对应的数据
|
|
|
|
|
this.returnThisProcessSon(workPlan); |
|
|
|
|
// 如果本序是外协需要删除erp外协订单、加工单位、是否外协类型、 并判断上序是否是外协
|
|
|
|
|
this.oemProcess(workPlan); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//修改prWorkOrder
|
|
|
|
|
//拿到车间订单
|
|
|
|
|
WorkOrder prWorkOrder = workOrderService.getById(prWorkPlan.getWoId()); |
|
|
|
|
//拿到车间订单的当前工序
|
|
|
|
|
WorkPlan workPlan = workPlanService.getById(prWorkOrder.getWpId()); |
|
|
|
|
//车间订单的入库数清零
|
|
|
|
|
prWorkOrder.setInventoryQty(0d); |
|
|
|
|
// 2025-07-23 线上迁移修改if判断条件
|
|
|
|
|
//如果回退工序的前道工序不为空,将车间订单执行状态改为3,车间订单加工数量改为前工序完成数
|
|
|
|
|
if (prWorkPlan.getFrontWpId() != null) { |
|
|
|
|
WorkPlan frontWp = workPlanService.getById(prWorkPlan.getFrontWpId()); |
|
|
|
|
prWorkOrder.setMakeQty(frontWp.getWorkQty()); |
|
|
|
|
prWorkOrder.setRunStatus(WorkOrder.RUN_STATUS_RECEIVE); |
|
|
|
|
} |
|
|
|
|
//如果回退工序的前道工序为空,代表回退至首工序,将车间订单执行状态改为2,车间订单加工数量改为需求数量
|
|
|
|
|
else { |
|
|
|
|
prWorkOrder.setRunStatus(WorkOrder.RUN_STATUS_ISSUED); |
|
|
|
|
YieldOrder yieldOrder = yieldOrderMapper.selectById(prWorkOrder.getYoId()); |
|
|
|
|
prWorkOrder.setMakeQty(yieldOrder.getYpQty()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<WorkPlan> prWorkPlanListSmall = workPlanService.list(Wrappers.lambdaQuery(WorkPlan.class) |
|
|
|
|
.eq(WorkPlan::getWoId, prWorkPlan.getWoId()).le(WorkPlan::getOrders, workPlan.getOrders()) |
|
|
|
|
.gt(WorkPlan::getStatus, WorkPlan.STATUS_NO_START).orderByDesc(WorkPlan::getOrders)); |
|
|
|
|
double sumScrapQtySmall = 0d; |
|
|
|
|
double sumTestQtySmall = 0; |
|
|
|
|
double sumLossQtySmall = 0; |
|
|
|
|
if (prWorkPlanListSmall != null && !prWorkPlanListSmall.isEmpty()) { |
|
|
|
|
for (WorkPlan workPlanSmall : prWorkPlanListSmall) { |
|
|
|
|
sumScrapQtySmall = sumScrapQtySmall + workPlanSmall.getScrapQty(); |
|
|
|
|
sumTestQtySmall = sumTestQtySmall + workPlanSmall.getTestQty(); |
|
|
|
|
sumLossQtySmall = sumLossQtySmall + workPlanSmall.getLossQty(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
prWorkOrder.setScrapQty(sumScrapQtySmall); |
|
|
|
|
prWorkOrder.setTestQty(sumTestQtySmall); |
|
|
|
|
prWorkOrder.setLossQty(sumLossQtySmall); |
|
|
|
|
prWorkOrder.setOemType(-1); |
|
|
|
|
workOrderService.updateById(prWorkOrder); |
|
|
|
|
workPlanPreserve.setCardNo(prWorkOrder.getCardNo()); |
|
|
|
|
workPlanPreserve.setWoCode(prWorkOrder.getWoCode()); |
|
|
|
|
workPlanPreserve.setPartCode(prWorkOrder.getPartCode()); |
|
|
|
|
workPlanPreserve.setBatchNo(prWorkOrder.getBatchNo()); |
|
|
|
|
workPlanPreserve.setUpdateName(AuthUtil.getUserName()); |
|
|
|
|
// WorkPlan workPlan1 = workPlanService.getById(prWorkOrder.getWpId());
|
|
|
|
|
// if (workPlan1.getFrontWpId() == null) {
|
|
|
|
|
// if (workPlan1.getOcId() == null && workPlan1.getMakeTeam() == null) {
|
|
|
|
|
// //调用自动分派处理类
|
|
|
|
|
// pjAutomaticDispatchService.beforePlatingAutomatic(prWorkOrder.getCardNo(), curUserInfo);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
} |
|
|
|
|
return workPlanPreserveService.save(workPlanPreserve); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public List<WorkPlanPreserve> getWorkPlanPreserve(String cardNo) { |
|
|
|
|
return workPlanPreserveService.list(Wrappers.lambdaQuery(WorkPlanPreserve.class).like(WorkPlanPreserve::getCardNo, cardNo).orderByDesc(WorkPlanPreserve::getCreateTime)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void oemProcess(WorkPlan workPlan) { |
|
|
|
|
if (workPlan.getOcId() != null) { |
|
|
|
|
workPlan.setOem("1"); |
|
|
|
|
workPlan.setOcId(null); |
|
|
|
|
workPlan.setPlanStartTime(null); |
|
|
|
|
workPlan.setPlanEndTime(null); |
|
|
|
|
workPlanService.updateById(workPlan); |
|
|
|
|
|
|
|
|
|
WorkOrder workOrder = workOrderService.getById(workPlan.getWoId()); |
|
|
|
|
WorkOrderRun workOrderRun = workOrderRunService.getById(workOrder.getWorId()); |
|
|
|
|
workOrderRun.setWoCode(workOrder.getWoCode()); |
|
|
|
|
workOrderRunService.updateById(workOrderRun); |
|
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(workPlan.getWxNo())) { |
|
|
|
|
workOrderService.returnOemErpByWxno(workPlan.getWxNo()); |
|
|
|
|
} |
|
|
|
|
//删除前工序镀前镀后出入库记录
|
|
|
|
|
WorkPlan frontWorkPlan1 = workPlanService.getById(workPlan.getFrontWpId()); |
|
|
|
|
if (frontWorkPlan1 != null) { |
|
|
|
|
plateAroundService.remove(Wrappers.lambdaQuery(PlateAround.class).eq(PlateAround::getWpId, frontWorkPlan1.getId())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (frontWorkPlan1 != null && frontWorkPlan1.getOcId() != null) { |
|
|
|
|
this.returnThisProcessSon(frontWorkPlan1); |
|
|
|
|
// 调用自己
|
|
|
|
|
this.oemProcess(frontWorkPlan1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void returnThisProcessSon(WorkPlan workPlan) { |
|
|
|
|
List<HandoverRecord> handoverRecords = handoverRecordService.list(Wrappers.lambdaQuery(HandoverRecord.class).eq(HandoverRecord::getWoId, workPlan.getWoId())); |
|
|
|
|
if (CollectionUtils.isEmpty(handoverRecords)) { |
|
|
|
|
for (HandoverRecord handoverRecord : handoverRecords) { |
|
|
|
|
if (handoverRecord.getStatus().equals(HandoverRecord.RUN_STATUS_COMPLETE)) { |
|
|
|
|
handoverRecordService.returnHandoverRecord(handoverRecord.getHrCode(), handoverRecord.getPartCode(), handoverRecord.getBatchNo()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
handoverRecordService.removeBatchByIds(handoverRecords); |
|
|
|
|
} |
|
|
|
|
//删除prPlateAround
|
|
|
|
|
plateAroundService.remove(Wrappers.lambdaQuery(PlateAround.class).eq(PlateAround::getWpId, workPlan.getId())); |
|
|
|
|
//清除prWorkPLanItem记录
|
|
|
|
|
workPlanItemService.remove(Wrappers.lambdaQuery(WorkPlanItem.class).eq(WorkPlanItem::getWpId, workPlan.getId())); |
|
|
|
|
//删除qcReviewSheet
|
|
|
|
|
reviewSheetService.remove(Wrappers.lambdaQuery(ReviewSheet.class).eq(ReviewSheet::getWpId, workPlan.getId())); |
|
|
|
|
//删除prWorkCheck
|
|
|
|
|
inspectionTaskService.remove(Wrappers.lambdaQuery(InspectionTask.class).eq(InspectionTask::getWpId, workPlan.getId())); |
|
|
|
|
//删除prMakeRec
|
|
|
|
|
makeRecService.remove(Wrappers.lambdaQuery(MakeRec.class).eq(MakeRec::getWpId, workPlan.getId())); |
|
|
|
|
//修改prworkplan
|
|
|
|
|
workPlan.setFactStartTime(null); |
|
|
|
|
workPlan.setFactEndTime(null); |
|
|
|
|
workPlan.setStatus(1); |
|
|
|
|
WorkPlan frontWorkPlan = workPlanService.getById(workPlan.getFrontWpId()); |
|
|
|
|
WorkOrder workOrder = workOrderService.getById(workPlan.getWoId()); |
|
|
|
|
if (frontWorkPlan != null) { |
|
|
|
|
frontWorkPlan.setStatus(3); |
|
|
|
|
frontWorkPlan.setFactEndTime(null); |
|
|
|
|
workOrder.setWpId(frontWorkPlan.getId()); |
|
|
|
|
workPlanService.updateById(frontWorkPlan); |
|
|
|
|
} else { |
|
|
|
|
workOrder.setWpId(workPlan.getId()); |
|
|
|
|
} |
|
|
|
|
workOrderService.updateById(workOrder); |
|
|
|
|
|
|
|
|
|
workPlan.setTestQty(0d); |
|
|
|
|
workPlan.setLossQty(0d); |
|
|
|
|
workPlan.setQualifiedQty(0d); |
|
|
|
|
workPlan.setScrapQty(0d); |
|
|
|
|
workPlan.setUnqualifiedQty(0d); |
|
|
|
|
workPlan.setWorkQty(0d); |
|
|
|
|
workPlan.setReceiveMan(null); |
|
|
|
|
workPlanService.updateById(workPlan); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取上一小时的开始时间 |
|
|
|
|
* 例:当前是 2025-12-29 15:34:22 → 返回 2025-12-29 14:00:00 |
|
|
|
|
*/ |
|
|
|
|
private static LocalDateTime getLastHourStart() { |
|
|
|
|
return LocalDateTime.now() |
|
|
|
|
.minusHours(1) // 减1小时
|
|
|
|
|
return LocalDateTime.now().minusHours(1) // 减1小时
|
|
|
|
|
.withMinute(0) // 分归零
|
|
|
|
|
.withSecond(0) // 秒归零
|
|
|
|
|
.withNano(0); // 纳秒归零
|
|
|
|
|
@ -263,10 +445,6 @@ public class DisTaskingServiceImpl extends BaseServiceImpl<DisTaskingMapper, Dis |
|
|
|
|
* 例:当前是 2025-12-29 15:34:22 → 返回 2025-12-29 14:59:59.999999999 |
|
|
|
|
*/ |
|
|
|
|
private static LocalDateTime getLastHourEnd() { |
|
|
|
|
return LocalDateTime.now() |
|
|
|
|
.minusHours(1) |
|
|
|
|
.withMinute(59) |
|
|
|
|
.withSecond(59) |
|
|
|
|
.withNano(999_999_999); // 保留毫秒/纳秒精度
|
|
|
|
|
return LocalDateTime.now().minusHours(1).withMinute(59).withSecond(59).withNano(999_999_999); // 保留毫秒/纳秒精度
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|