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);
             //减去暂停时间