diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/ShopOrderReleaseController.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/ShopOrderReleaseController.java index ee6d5fef..23738a35 100644 --- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/ShopOrderReleaseController.java +++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/ShopOrderReleaseController.java @@ -63,6 +63,27 @@ public class ShopOrderReleaseController { return R.ok(list); } + /** + * 工单整理- 修改工单BOM组件的数量 + * + * @param shopOrderList + * @return + */ + @ResponseBody + @PostMapping("shopOrderBomComponentUpdate") + public R shopOrderBomComponentUpdate(@RequestBody List<ShopOrderRelease> shopOrderList) { + + try { + String site = CommonMethods.getSite(); + String user = CommonMethods.getUser(); + shopOrderReleaseService.shopOrderBomComponentUpdate(site, user, shopOrderList); + } catch (Exception e) { + return R.failed(e.getMessage()); + } + + return R.ok(); + } + /** * 工单整理- 下达 * diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/ShopOrderReleaseService.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/ShopOrderReleaseService.java index 4e671f02..421170ea 100644 --- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/ShopOrderReleaseService.java +++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/ShopOrderReleaseService.java @@ -40,6 +40,18 @@ public interface ShopOrderReleaseService { */ List<ShopOrderRelease> findShopOrderList(ShopOrderRelease shopOrderRelease); + /** + * 工单整理- 更新工单BOM组件数据 + * + * 1.校验数据是否已更新 + * 2.将未更新的数据进行更新 + * + * @param site + * @param user + * @param shopOrderList + */ + void shopOrderBomComponentUpdate(String site, String user, List<ShopOrderRelease> shopOrderList); + /** * 工单整理- 下达 * diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/ShopOrderReleaseServiceImpl.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/ShopOrderReleaseServiceImpl.java index bfc60c6c..5b7a976b 100644 --- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/ShopOrderReleaseServiceImpl.java +++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/ShopOrderReleaseServiceImpl.java @@ -11,10 +11,8 @@ import com.foreverwin.mesnac.dispatch.model.SfcDispatch; import com.foreverwin.mesnac.dispatch.model.ShopOrderRelease; import com.foreverwin.mesnac.dispatch.service.SfcDispatchService; import com.foreverwin.mesnac.dispatch.service.ShopOrderReleaseService; -import com.foreverwin.mesnac.meapi.model.Router; -import com.foreverwin.mesnac.meapi.model.Sfc; -import com.foreverwin.mesnac.meapi.model.ShopOrder; -import com.foreverwin.mesnac.meapi.model.WorkCenter; +import com.foreverwin.mesnac.meapi.mapper.BomComponentMapper; +import com.foreverwin.mesnac.meapi.model.*; import com.foreverwin.mesnac.meapi.service.*; import com.foreverwin.mesnac.meapi.util.StringUtils; import com.foreverwin.modular.core.exception.BaseException; @@ -67,6 +65,12 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService { private SfcDispatchService sfcDispatchService; @Autowired private ShopOrderReleaseMapper shopOrderReleaseMapper; + @Autowired + private CustomFieldsService customFieldsService; + @Autowired + private BomComponentService bomComponentService; + @Autowired + private BomService bomService; @Override public List<RouterDTO> selectShopOrderRouter(String routerBo) { @@ -78,6 +82,53 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService { return shopOrderReleaseMapper.findShopOrderList(shopOrderRelease); } + @Override + public void shopOrderBomComponentUpdate(String site, String user, List<ShopOrderRelease> shopOrderList) { + if (shopOrderList == null || shopOrderList.size() <= 0) { + throw new BaseException("请至少选择一笔需要更新的工单"); + } + for (ShopOrderRelease shopOrderReleaseModel : shopOrderList) { + Bom bom = isUpdateBomComponent(shopOrderReleaseModel, true); + if (bom==null){ + continue; + } + //查询工单信息 + String shopOrder = shopOrderReleaseModel.getShopOrder(); + String shopOrderBo = shopOrderReleaseModel.getShopOrderBo(); + ShopOrder shopOrderModel = shopOrderService.getById(shopOrderBo); + if (shopOrderModel == null) { + throw new BaseException("工单[" + shopOrder + "]不存在"); + } + /*if (!"H".equals(bom.getBomType())){ + throw BusinessException.build("工单["+shopOrder+"]的计划物料清单["+plannedBomBo+"]的类型不是'工单'!"); + }*/ + Double qtyToBuild = shopOrderModel.getQtyToBuild(); + // 更新工单BOM的组件数据 + List<BomComponent> bomComponents = bomComponentService.listByBomBo(bom.getHandle()); + List<BomComponent> bomComponentList = new ArrayList<>(); + for (BomComponent bomComponent:bomComponents) { + try{ + BigDecimal bomComponentQty = new BigDecimal(bomComponent.getQty()); + BigDecimal qty = new BigDecimal(qtyToBuild); + BigDecimal resultQty = bomComponentQty.divide(qty,4,BigDecimal.ROUND_DOWN); + bomComponent.setQty(resultQty.doubleValue()); + }catch (Exception e){ + throw BusinessException.build("工单组件数量除以工单数量时出现异常,请查看工单["+shopOrder+"],工单BOM["+bom.getBom()+"]组件的数量!"); + } + bomComponent.setModifiedDateTime(LocalDateTime.now()); + bomComponentList.add(bomComponent); + } + bomComponentService.saveOrUpdateBatch(bomComponentList); + + CustomFields customFields = new CustomFields(); + customFields.setHandle(bom.getHandle()); + customFields.setAttribute("IS_CHANGE_QTY"); + customFields.setValue("TRUE"); + customFields.setCreatedDateTime(new Date()); + customFieldsService.save(customFields); + } + } + @Override public void shopOrderRelease(String site, String user, List<ShopOrderRelease> shopOrderList) { if (shopOrderList == null || shopOrderList.size() <= 0) { @@ -102,6 +153,9 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService { throw new BaseException("工单[" + shopOrder + "]不存在"); } + // 校验工单对应的工单BOM是否更新了组件数据 + isUpdateBomComponent(shopOrderReleaseModel,false); + String statusBo = shopOrderModel.getStatusBo(); String routerBo = shopOrderModel.getPlannedRouterBo(); BigDecimal qtyToBuild = new BigDecimal(shopOrderModel.getQtyToBuild()); @@ -515,4 +569,40 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService { return prodHours; } + + /** 校验工单BOM是否已更新 **/ + public Bom isUpdateBomComponent(ShopOrderRelease shopOrderRelease,Boolean bl){ + String shopOrder = shopOrderRelease.getShopOrder(); + String shopOrderBo = shopOrderRelease.getShopOrderBo(); + ShopOrder shopOrderModel = shopOrderService.getById(shopOrderBo); + if (shopOrderModel == null) { + throw new BaseException("工单[" + shopOrder + "]不存在"); + } + String statusBo = shopOrderModel.getStatusBo(); + if (!"501".equals(StringUtils.trimHandle(statusBo)) && bl) { + throw BusinessException.build("工单[" +shopOrder+ "]不是可下达状态,无法更新工单BOM"); + } + String plannedBomBo = shopOrderModel.getPlannedBomBo(); + String bomNo = plannedBomBo.split(",")[1]; + Bom bom = new Bom(); + bom.setBom(bomNo); + bom.setCurrentRevision("true"); + List<Bom> boms = bomService.selectList(bom); + if (boms == null || boms.isEmpty()){ + throw BusinessException.build("工单["+shopOrder+"]的计划物料清单["+plannedBomBo+"]不存在,请维护主数据!"); + } + if (boms.size() > 1){ + throw BusinessException.build("工单["+shopOrder+"]的计划物料清单["+plannedBomBo+"]存在多个当前版本,请修改主数据!"); + } + String handle = boms.get(0).getHandle(); + String customFieldsValue = customFieldsService.getCustomFieldsValue(handle, "IS_CHANGE_QTY"); + if ("TRUE".equals(customFieldsValue)){ + return null; + }else { + if (bl){ + return boms.get(0); + } + throw BusinessException.build("工单[" +shopOrder+ "]未更新工单BOM,不能点击下达;请先更新工单BOM后,再下达工单!"); + } + } } diff --git a/meapi/src/main/resources/mapper/SfcMapper.xml b/meapi/src/main/resources/mapper/SfcMapper.xml index 9bfe3252..4bd762d0 100644 --- a/meapi/src/main/resources/mapper/SfcMapper.xml +++ b/meapi/src/main/resources/mapper/SfcMapper.xml @@ -676,16 +676,10 @@ JOIN Z_SFC_DISPATCH zsd ON S.SFC=zsd.SFC AND S.SITE=zsd.SITE LEFT JOIN Z_SFC_DISPATCH PREZSD ON zsd.SFC=PREZSD.SFC AND PREZSD.DISPATCH_SEQ=TO_NUMBER(zsd.DISPATCH_SEQ)-1 AND zsd.ROUTER_BO=PREZSD.ROUTER_BO JOIN Z_PROD_READY_TASK zprt ON ZPRT.SFC_DISPATCH_BO=zsd.HANDLE - JOIN SFC S ON S.SFC=ZSD.SFC AND S.SITE=ZSD.SITE JOIN SFC_ROUTING SR ON SR.SFC_BO=S.HANDLE JOIN SFC_ROUTER SR2 ON SR.HANDLE =SR2.SFC_ROUTING_BO AND SR2.IN_USE = 'true' - LEFT JOIN SFC_STEP SS ON SR2.HANDLE =SS.SFC_ROUTER_BO AND (SS.QTY_IN_QUEUE>0 or SS.QTY_IN_WORK>0) + JOIN SFC_STEP SS ON SR2.HANDLE =SS.SFC_ROUTER_BO AND (SS.QTY_IN_QUEUE>0 or SS.QTY_IN_WORK>0) AND ZSD.STEP_ID = SS.STEP_ID WHERE S.SITE=#{ew.entity.site} AND ZSD.RESRCE=#{ew.entity.resrce} AND (ZSD.DISPATCH_STATUS='RELEASE' OR ZSD.DISPATCH_STATUS='START') - AND SS.OPERATION_BO LIKE '%' || ( SELECT RT.RESOURCE_TYPE FROM RESRCE r - LEFT JOIN RESOURCE_TYPE_RESOURCE rtr ON RTR.RESOURCE_BO = R.HANDLE - LEFT JOIN RESOURCE_TYPE rt ON RT.HANDLE = RTR.RESOURCE_TYPE_BO - WHERE R.RESRCE = #{ew.entity.resrce} AND R.SITE = #{ew.entity.site} ) || '%' - AND SS.BYPASSED = 'false' AND S.STATUS_BO IN ('StatusBO:'||#{ew.entity.site}||',401','StatusBO:'||#{ew.entity.site}||',402','StatusBO:'||#{ew.entity.site}||',403','StatusBO:'||#{ew.entity.site}||',404') AND zprt.STATUS='FINISH' AND ZPRT."RESULT"='OK' AND SS.BYPASSED = 'false' ) T diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java index cb8f73a9..47c5c856 100644 --- a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java +++ b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java @@ -22,6 +22,8 @@ import com.foreverwin.mesnac.common.service.SfcDispatchCommonService; import com.foreverwin.mesnac.common.util.ERPAPI; import com.foreverwin.mesnac.common.util.ExceptionUtil; import com.foreverwin.mesnac.common.util.StringUtil; +import com.foreverwin.mesnac.dispatch.model.SfcDispatch; +import com.foreverwin.mesnac.dispatch.service.SfcDispatchService; import com.foreverwin.mesnac.integration.model.IntegrationLog; import com.foreverwin.mesnac.integration.service.IntegrationLogService; import com.foreverwin.mesnac.meapi.dto.BomComponentDto; @@ -103,7 +105,8 @@ public class PodTemplateServiceImpl implements PodTemplateService { private SfcDispatchCommonService sfcDispatchCommonService; @Autowired private ResrceMapper resrceMapper; - + @Autowired + private SfcDispatchService sfcDispatchService; @Override @@ -273,6 +276,7 @@ public class PodTemplateServiceImpl implements PodTemplateService { String stepId = sfcDto.getStepId(); String dispatchNo = sfcDto.getDispatchNo(); + SfcDispatch sfcDispatchById = sfcDispatchService.getById(HandleEnum.SFC_DISPATCH.getHandle(site, dispatchNo)); Sfc sfcServiceById = sfcService.getById(HandleEnum.SFC.getHandle(site, sfc)); String status = StringUtil.trimHandle(sfcServiceById.getStatusBo()); if (status.equals("404")) { @@ -337,7 +341,9 @@ public class PodTemplateServiceImpl implements PodTemplateService { inspectionTaskService.createTask(paramMap); } //计算工时 - LocalDateTime startTime = sfcService.getSfcStartTime(HandleEnum.SFC.getHandle(site, sfc)); + //LocalDateTime startTime = sfcService.getSfcStartTime(HandleEnum.SFC.getHandle(site, sfc)); + // 派工表实际开始时间 + LocalDateTime startTime = sfcDispatchById.getActualStartDate(); long workHourSeconds = Duration.between(startTime, LocalDateTime.now()).getSeconds(); workHour = new BigDecimal(workHourSeconds).divide(BigDecimal.valueOf(3600), 2, RoundingMode.HALF_UP); //减去暂停时间