diff --git a/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java b/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java
new file mode 100644
index 00000000..9cc7eb63
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java
@@ -0,0 +1,42 @@
+package com.foreverwin.mesnac.common.controller;
+
+import com.foreverwin.mesnac.common.enums.HandleEnum;
+import com.foreverwin.mesnac.common.model.MobileWorkStationData;
+import com.foreverwin.mesnac.common.service.MobileWorkStationService;
+import com.foreverwin.modular.core.util.CommonMethods;
+import com.foreverwin.modular.core.util.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *
+ * @author Syngna
+ * @since 2020-01-04
+ */
+@RestController
+@RequestMapping("/mobileWorkStations")
+public class MobileWorkStationController {
+
+    @Autowired
+    public MobileWorkStationService mobileWorkStationService;
+
+    @GetMapping("listMobileWorkStationApplication")
+    public R listMobileWorkStationApplication(String workStation) {
+
+        List<MobileWorkStationData> result;
+        try {
+            String site = CommonMethods.getSite();
+            String user = CommonMethods.getUser();
+            String userBo = HandleEnum.USER.getHandle(site, user);
+            result = mobileWorkStationService.listMobileWorkStationApplication(site, userBo, workStation);
+        }
+        catch (Exception e) {
+            return R.failed(e.getMessage());
+        }
+        return R.ok(result);
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java b/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java
index bb699136..7f84e4c9 100644
--- a/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java
@@ -14,6 +14,9 @@ public enum HandleEnum {
     /**车间作业控制*/
     SFC( "SFCBO:", "SFCBO:{0},{1}" ),
 
+    /**用户**/
+    USER("UserBO:", "UserBO:{0},{1}"),
+
     /**物料清单**/
     BOM("BOMBO:","BOMBO:{0},{1},{2},{3}"),
 
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java
new file mode 100644
index 00000000..9e052197
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java
@@ -0,0 +1,16 @@
+package com.foreverwin.mesnac.common.mapper;
+
+import com.foreverwin.mesnac.common.model.ActivityOption;
+import com.foreverwin.mesnac.common.model.MobileWorkStationData;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface MobileWorkStationMapper {
+
+    List<ActivityOption> selectActivityOptionList(@Param("activityBoList") List<String> activityBoList);
+
+    List<MobileWorkStationData> selectMobileWorkStationList(@Param("site") String site, @Param("userBo") String userBo, @Param("workStation") String workStation);
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java b/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java
new file mode 100644
index 00000000..96c7193f
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java
@@ -0,0 +1,34 @@
+package com.foreverwin.mesnac.common.model;
+
+public class ActivityOption {
+
+    private String activity;
+
+    private String key;
+
+    private String value;
+
+    public String getActivity() {
+        return activity;
+    }
+
+    public void setActivity(String activity) {
+        this.activity = activity;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java b/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java
new file mode 100644
index 00000000..0c85d251
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java
@@ -0,0 +1,156 @@
+package com.foreverwin.mesnac.common.model;
+
+import java.util.List;
+
+public class MobileWorkStationData {
+
+    private String workStationBo;
+
+    private String canChangeOperation;
+
+    private String canChangeResource;
+
+    private String defaultOperationBo;
+
+    private String defaultResourceBo;
+
+    private String mainInputPrompt;
+
+    private String sequence;
+
+    private String buttonId;
+
+    private String buttonSize;
+
+    private String label;
+
+    private String imageIcon;
+
+    private String activityBo;
+
+    private String activity;
+
+    private String classOrProgram;
+
+    private List<ActivityOption> activityOptionList;
+
+    public String getWorkStationBo() {
+        return workStationBo;
+    }
+
+    public void setWorkStationBo(String workStationBo) {
+        this.workStationBo = workStationBo;
+    }
+
+    public String getCanChangeOperation() {
+        return canChangeOperation;
+    }
+
+    public void setCanChangeOperation(String canChangeOperation) {
+        this.canChangeOperation = canChangeOperation;
+    }
+
+    public String getCanChangeResource() {
+        return canChangeResource;
+    }
+
+    public void setCanChangeResource(String canChangeResource) {
+        this.canChangeResource = canChangeResource;
+    }
+
+    public String getDefaultOperationBo() {
+        return defaultOperationBo;
+    }
+
+    public void setDefaultOperationBo(String defaultOperationBo) {
+        this.defaultOperationBo = defaultOperationBo;
+    }
+
+    public String getDefaultResourceBo() {
+        return defaultResourceBo;
+    }
+
+    public void setDefaultResourceBo(String defaultResourceBo) {
+        this.defaultResourceBo = defaultResourceBo;
+    }
+
+    public String getMainInputPrompt() {
+        return mainInputPrompt;
+    }
+
+    public void setMainInputPrompt(String mainInputPrompt) {
+        this.mainInputPrompt = mainInputPrompt;
+    }
+
+    public String getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
+    }
+
+    public String getButtonId() {
+        return buttonId;
+    }
+
+    public void setButtonId(String buttonId) {
+        this.buttonId = buttonId;
+    }
+
+    public String getButtonSize() {
+        return buttonSize;
+    }
+
+    public void setButtonSize(String buttonSize) {
+        this.buttonSize = buttonSize;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public String getImageIcon() {
+        return imageIcon;
+    }
+
+    public void setImageIcon(String imageIcon) {
+        this.imageIcon = imageIcon;
+    }
+
+    public String getActivityBo() {
+        return activityBo;
+    }
+
+    public void setActivityBo(String activityBo) {
+        this.activityBo = activityBo;
+    }
+
+    public String getActivity() {
+        return activity;
+    }
+
+    public void setActivity(String activity) {
+        this.activity = activity;
+    }
+
+    public String getClassOrProgram() {
+        return classOrProgram;
+    }
+
+    public void setClassOrProgram(String classOrProgram) {
+        this.classOrProgram = classOrProgram;
+    }
+
+    public List<ActivityOption> getActivityOptionList() {
+        return activityOptionList;
+    }
+
+    public void setActivityOptionList(List<ActivityOption> activityOptionList) {
+        this.activityOptionList = activityOptionList;
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java b/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java
new file mode 100644
index 00000000..20715d9c
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java
@@ -0,0 +1,20 @@
+package com.foreverwin.mesnac.common.service;
+
+
+
+import com.foreverwin.mesnac.common.model.MobileWorkStationData;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Syngna
+ * @since 2019-05-30
+ */
+public interface MobileWorkStationService {
+
+    List<MobileWorkStationData> listMobileWorkStationApplication(String site, String userBo, String workStation);
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java
new file mode 100644
index 00000000..cdcce445
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java
@@ -0,0 +1,48 @@
+package com.foreverwin.mesnac.common.service.impl;
+
+import com.foreverwin.mesnac.common.mapper.MobileWorkStationMapper;
+import com.foreverwin.mesnac.common.model.ActivityOption;
+import com.foreverwin.mesnac.common.model.MobileWorkStationData;
+import com.foreverwin.mesnac.common.service.MobileWorkStationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  移动维护服务实现类
+ * </p>
+ *
+ * @author Syngna
+ * @since 2020-01-04
+ */
+@Service
+public class MobileWorkStationServiceImpl implements MobileWorkStationService {
+
+    @Autowired
+    private MobileWorkStationMapper mobileWorkStationMapper;
+
+    @Override
+    public List<MobileWorkStationData> listMobileWorkStationApplication(String site, String userBo, String workStation) {
+        List<MobileWorkStationData> workStationDataList = mobileWorkStationMapper.selectMobileWorkStationList(site, userBo, workStation);
+        if(workStationDataList == null || workStationDataList.size() == 0) {
+            return new ArrayList<>();
+        }
+        List<String> activityList = workStationDataList.stream().map(MobileWorkStationData::getActivityBo).collect(Collectors.toList());
+        List<ActivityOption> activityOptionList = mobileWorkStationMapper.selectActivityOptionList(activityList);
+        for(MobileWorkStationData mobileWorkStationData : workStationDataList) {
+            if(mobileWorkStationData.getActivityOptionList() == null) {
+                mobileWorkStationData.setActivityOptionList(new ArrayList<>());
+            }
+            for(ActivityOption activityOption: activityOptionList) {
+                if(activityOption.getActivity().equals(mobileWorkStationData.getActivity())) {
+                    mobileWorkStationData.getActivityOptionList().add(activityOption);
+                }
+            }
+        }
+        return workStationDataList;
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java b/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java
index b55ccdf2..c483f6fa 100644
--- a/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java
@@ -2,6 +2,7 @@ package com.foreverwin.mesnac.common.util;
 
 import com.foreverwin.mesnac.common.model.ExcelColumn;
 import com.foreverwin.modular.core.exception.BusinessException;
+import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.CharUtils;
 import org.apache.commons.lang.StringUtils;
@@ -40,12 +41,17 @@ public class ExcelUtils {
     private final static String EXCEL2003 = "xls";
     private final static String EXCEL2007 = "xlsx";
 
-    public static <T> List<T> readExcel(String fileType, Class<T> tClass, MultipartFile multipartFile){
+    public static <T> List<T> readExcel(String fileType, Class<T> tClass, MultipartFile multipartFile, FileItem fileItem){
 
         Workbook workbook = null;
         List<T> dataList = new ArrayList<>();
         try {
-            InputStream inputStream = multipartFile.getInputStream();
+            InputStream inputStream = null;
+            if (multipartFile != null && !multipartFile.isEmpty()) {
+                inputStream = multipartFile.getInputStream();
+            } else {
+                inputStream = fileItem.getInputStream();
+            }
 
             //分析文件格式
             if (EXCEL2003.equals(fileType)) {
diff --git a/common/src/main/resources/mapper/MobileWorkStationMapper.xml b/common/src/main/resources/mapper/MobileWorkStationMapper.xml
new file mode 100644
index 00000000..dfb3859e
--- /dev/null
+++ b/common/src/main/resources/mapper/MobileWorkStationMapper.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.foreverwin.mesnac.common.mapper.MobileWorkStationMapper">
+  <resultMap id="BaseResultMap" type="com.foreverwin.mesnac.common.model.MobileWorkStationData">
+    <result column="WORKSTATION_BO"  property="workStationBo" />
+    <result column="CAN_CHANGE_OPERATION"  property="canChangeOperation" />
+    <result column="CAN_CHANGE_RESOURCE"  property="canChangeResource" />
+    <result column="DEFAULT_OPERATION_BO"  property="defaultOperationBo" />
+    <result column="DEFAULT_RESOURCE_BO"  property="defaultResourceBo" />
+    <result column="MAIN_INPUT_PROMPT"  property="mainInputPrompt" />
+    <result column="SEQUENCE"  property="sequence" />
+    <result column="BUTTON_ID"  property="buttonId" />
+    <result column="BUTTON_SIZE"  property="buttonSize" />
+    <result column="LABEL" property="label" />
+    <result column="IMAGE_ICON"  property="imageIcon" />
+    <result column="ACTIVITY_BO"  property="activityBo" />
+    <result column="ACTIVITY"  property="activity" />
+    <result column="CLASS_OR_PROGRAM"  property="classOrProgram" />
+  </resultMap>
+
+  <resultMap id="ActivityOptionMap" type="com.foreverwin.mesnac.common.model.ActivityOption">
+    <result column="ACTIVITY"  property="activity" />
+    <result column="KEY"  property="key" />
+    <result column="VALUE"  property="value" />
+  </resultMap>
+
+  <select id="selectActivityOptionList" resultMap="ActivityOptionMap">
+    SELECT AC.ACTIVITY, AO.EXEC_UNIT_OPTION AS KEY, SETTING AS VALUE
+    FROM ACTIVITY_OPTION AO
+    INNER JOIN ACTIVITY AC ON AC.HANDLE = AO.ACTIVITY_BO
+    WHERE AC.HANDLE IN
+      <foreach collection="activityBoList" item="item" separator="," close=")" open="(">
+        #{item}
+      </foreach>
+  </select>
+
+  <select id="selectMobileWorkStationList" resultMap="BaseResultMap">
+    SELECT PC.WORKSTATION_BO, PC.CAN_CHANGE_OPERATION, PC.CAN_CHANGE_RESOURCE, PC.DEFAULT_OPERATION_BO, PC.DEFAULT_RESOURCE_BO, PC.MAIN_INPUT_PROMPT,
+           PB.SEQUENCE, PB.BUTTON_ID, PB.BUTTON_SIZE, PB.LABEL, PB.IMAGE_ICON, PA.ACTIVITY_BO, AC.ACTIVITY, AC.CLASS_OR_PROGRAM
+    FROM WORKSTATION WC
+    INNER JOIN POD_CONFIG PC ON WC.HANDLE = PC.WORKSTATION_BO
+    INNER JOIN POD_BUTTON PB ON PB.POD_CONFIG_BO = PC.HANDLE
+    INNER JOIN POD_ACTIVITY PA ON PA.POD_BUTTON_BO = PB.HANDLE
+    INNER JOIN ACTIVITY AC ON AC.HANDLE = PA.ACTIVITY_BO AND AC.ENABLED = 'true'
+    INNER JOIN(
+        SELECT AP.ACTIVITY_OR_GROUP_GBO AS ACTIVITY_BO
+        FROM USER_GROUP_MEMBER UGM
+        INNER JOIN ACTIVITY_PERM AP ON UGM.USER_GROUP_BO = AP.USER_OR_GROUP_GBO
+        WHERE UGM.USER_OR_GROUP_GBO = #{userBo}
+        GROUP BY AP.ACTIVITY_OR_GROUP_GBO
+    )AP ON AP.ACTIVITY_BO = PA.ACTIVITY_BO
+    WHERE WC.SITE = #{site}
+      AND WC.WORKSTATION = #{workStation}
+      AND WC.WORKSTATION_TYPE = 'C'
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java
index e3ea8dc8..9561b9ce 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java
@@ -17,11 +17,13 @@ import com.foreverwin.mesnac.dispatch.service.UserResourceService;
 import com.foreverwin.mesnac.meapi.service.ResrceService;
 import com.foreverwin.mesnac.meapi.util.StringUtils;
 import com.foreverwin.modular.core.exception.BusinessException;
+import org.apache.commons.fileupload.FileItem;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.LocalDateTime;
@@ -38,7 +40,7 @@ import java.util.stream.Collectors;
  * @author Leon.L
  * @since 2021-06-02
  */
-@Service
+@Service("sfcDispatchService")
 @Transactional(rollbackFor = Exception.class)
 public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDispatch> implements SfcDispatchService {
 
@@ -173,7 +175,7 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
         InputStream inputStream = null;
         List<SfcDispatchDto> sfcDispatchList;
         try {
-            sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, multipartFile);
+            sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, multipartFile, null);
         } finally {
             if (inputStream != null){
                 try {
@@ -190,6 +192,36 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
         return this.sfcDispatch(site, user, DispatchStatusEnum.IMPORT.getCode(), message, sfcDispatchList);
     }
 
+    public String importDispatch(FileItem fileItem, HttpServletRequest httpServletRequest) {
+        String site = httpServletRequest.getParameter("site");
+        String user = httpServletRequest.getParameter("user");
+        String fileType = httpServletRequest.getParameter("fileType");
+
+        InputStream inputStream = null;
+        List<SfcDispatchDto> sfcDispatchList;
+        try {
+            sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, null, fileItem);
+        } finally {
+            if (inputStream != null){
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (sfcDispatchList == null || sfcDispatchList.size() <= 0) {
+            throw BusinessException.build("上传的Excel没有数据,或者数据格式不正确");
+        }
+
+
+        //调用业务处理逻辑
+        StringBuffer message = new StringBuffer();
+        this.sfcDispatch(site, user, DispatchStatusEnum.IMPORT.getCode(), message, sfcDispatchList);
+
+        return message.toString();
+    }
+
 
 
     /**
@@ -264,14 +296,8 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
                 }
                 resourceType = sfcDispatchModel.getResourceType();
 
-                //资源、计划时间必输
-                if (StringUtils.isBlank(resource) || sfcDispatchDto.getPlannedStartDate() == null || sfcDispatchDto.getPlannedCompDate() == null) {
-                    flag = false;
-                    message.append(seq++%3 == 0 ? "\n" : "|   |");
-                    message.append("派工单[" + dispatchNo + "]的资源、计划开始或完成时间没维护,不允许发布");
-                    continue;
-                }
 
+                type = sfcDispatch.getDispatchStatus();
                 sfcDispatch.setHandle(handle);
                 //是否导入
                 sfcDispatch.setIsImport(Constants.BOOL_TRUE);
diff --git a/generator/src/main/java/com/foreverwin/minth/generator/GeneratorApplication.java b/generator/src/main/java/com/foreverwin/minth/generator/GeneratorApplication.java
index ccb0aadd..099e1337 100644
--- a/generator/src/main/java/com/foreverwin/minth/generator/GeneratorApplication.java
+++ b/generator/src/main/java/com/foreverwin/minth/generator/GeneratorApplication.java
@@ -33,9 +33,9 @@ public class GeneratorApplication {
         dataSourceConfig.setTypeConvert( new OracleTypeConvert() );
         MpGenerator mpGenerator = mpGeneratorBuilder.dataSourceConfig(dataSourceConfig)
                 .tablePrefix( "APS_", "DS_", "Z_" )
-                .packageName( "com.foreverwin.mesnac.equip" )
-                .tables("Z_RESOURCE_INSPECT_PLAN","Z_RESOURCE_INSPECT_RESOURCE","Z_RESOURCE_INSPECT_TASK","Z_RESOURCE_INSPECT_TASK_PARAM")
-                .author("pavel.Liu")
+                .packageName( "com.foreverwin.mesnac.meapi" )
+                .tables("SFC_DATA")
+                .author("Leon.L")
                 .uiAppId("com.foreverwin.me")
                 .uiPackage("com.foreverwin.me.migration")
                 .build();
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/controller/SfcController.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/controller/SfcController.java
index 58799f31..9c9d03e3 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/controller/SfcController.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/controller/SfcController.java
@@ -1,5 +1,8 @@
 package com.foreverwin.mesnac.meapi.controller;
 
+import com.foreverwin.mesnac.meapi.dto.SfcDto;
+import com.foreverwin.mesnac.meapi.util.StringUtils;
+import com.foreverwin.modular.core.exception.BusinessException;
 import com.foreverwin.modular.core.util.R;
 import com.foreverwin.modular.core.util.FrontPage;
 import com.foreverwin.modular.core.util.CommonMethods;
@@ -26,6 +29,25 @@ public class SfcController {
     public SfcService sfcService;
 
 
+    @ResponseBody
+    @GetMapping("/findSfcData")
+    public R findSfcData(String sfc) {
+        SfcDto sfcDto = null;
+
+        try {
+            if (StringUtils.isBlank(sfc)) {
+                throw BusinessException.build("SFC不能为空");
+            }
+
+            String site = CommonMethods.getSite();
+            sfcDto = sfcService.findSfcData(site, sfc);
+        } catch (Exception e) {
+            return R.failed(e.getMessage());
+        }
+
+        return R.ok(sfcDto);
+    }
+
     /**
      * 查询所有数据
      *
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/SfcDto.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/SfcDto.java
index 407259e6..fd6bdb53 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/SfcDto.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/SfcDto.java
@@ -3,9 +3,47 @@ package com.foreverwin.mesnac.meapi.dto;
 import com.foreverwin.mesnac.meapi.model.Sfc;
 
 public class SfcDto extends Sfc {
-    String resrce;
 
-    String operation;
+    private String shopOrder;
+    private String status;
+    private String item;
+    private String itemDescription;
+    private String operation;
+    private String operationDescription;
+    private String prepositionOperation;
+    private String resrce;
+
+    public String getShopOrder() {
+        return shopOrder;
+    }
+
+    public void setShopOrder(String shopOrder) {
+        this.shopOrder = shopOrder;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getItem() {
+        return item;
+    }
+
+    public void setItem(String item) {
+        this.item = item;
+    }
+
+    public String getItemDescription() {
+        return itemDescription;
+    }
+
+    public void setItemDescription(String itemDescription) {
+        this.itemDescription = itemDescription;
+    }
 
     public String getOperation() {
         return operation;
@@ -15,6 +53,22 @@ public class SfcDto extends Sfc {
         this.operation = operation;
     }
 
+    public String getOperationDescription() {
+        return operationDescription;
+    }
+
+    public void setOperationDescription(String operationDescription) {
+        this.operationDescription = operationDescription;
+    }
+
+    public String getPrepositionOperation() {
+        return prepositionOperation;
+    }
+
+    public void setPrepositionOperation(String prepositionOperation) {
+        this.prepositionOperation = prepositionOperation;
+    }
+
     public String getResrce() {
         return resrce;
     }
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcDataMapper.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcDataMapper.java
new file mode 100644
index 00000000..d486be66
--- /dev/null
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcDataMapper.java
@@ -0,0 +1,18 @@
+package com.foreverwin.mesnac.meapi.mapper;
+
+import com.foreverwin.mesnac.meapi.model.SfcData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Leon.L
+ * @since 2021-06-29
+ */
+@Repository
+public interface SfcDataMapper extends BaseMapper<SfcData> {
+
+}
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcMapper.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcMapper.java
index 29d76ead..42dfb822 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcMapper.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/SfcMapper.java
@@ -1,7 +1,9 @@
 package com.foreverwin.mesnac.meapi.mapper;
 
+import com.foreverwin.mesnac.meapi.dto.SfcDto;
 import com.foreverwin.mesnac.meapi.model.Sfc;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -20,4 +22,6 @@ public interface SfcMapper extends BaseMapper<Sfc> {
      * 获取资源上活动的sfc
      */
     List<Sfc> getSfcListByResrceBO(String resrceBO);
+
+    SfcDto findSfcData(@Param("site") String site, @Param("sfc") String sfc);
 }
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/model/SfcData.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/model/SfcData.java
new file mode 100644
index 00000000..7e65fd09
--- /dev/null
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/model/SfcData.java
@@ -0,0 +1,143 @@
+package com.foreverwin.mesnac.meapi.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Leon.L
+ * @since 2021-06-29
+ */
+
+@TableName("SFC_DATA")
+public class SfcData extends Model<SfcData> {
+
+   private static final long serialVersionUID = 1L;
+
+   @TableField("HANDLE")
+   private String handle;
+   @TableField("SFC_BO")
+   private String sfcBo;
+   @TableField("DATE_TIME")
+   private LocalDateTime dateTime;
+   @TableField("DATA_FIELD")
+   private String dataField;
+   @TableField("DATA_ATTR")
+   private String dataAttr;
+   @TableField("USER_BO")
+   private String userBo;
+   @TableField("CREATED_DATE_TIME")
+   private LocalDateTime createdDateTime;
+   @TableField("MODIFIED_DATE_TIME")
+   private LocalDateTime modifiedDateTime;
+
+
+   public String getHandle() {
+      return handle;
+   }
+
+   public void setHandle(String handle) {
+      this.handle = handle;
+   }
+
+   public String getSfcBo() {
+      return sfcBo;
+   }
+
+   public void setSfcBo(String sfcBo) {
+      this.sfcBo = sfcBo;
+   }
+
+   public LocalDateTime getDateTime() {
+      return dateTime;
+   }
+
+   public void setDateTime(LocalDateTime dateTime) {
+      this.dateTime = dateTime;
+   }
+
+   public String getDataField() {
+      return dataField;
+   }
+
+   public void setDataField(String dataField) {
+      this.dataField = dataField;
+   }
+
+   public String getDataAttr() {
+      return dataAttr;
+   }
+
+   public void setDataAttr(String dataAttr) {
+      this.dataAttr = dataAttr;
+   }
+
+   public String getUserBo() {
+      return userBo;
+   }
+
+   public void setUserBo(String userBo) {
+      this.userBo = userBo;
+   }
+
+   public LocalDateTime getCreatedDateTime() {
+      return createdDateTime;
+   }
+
+   public void setCreatedDateTime(LocalDateTime createdDateTime) {
+      this.createdDateTime = createdDateTime;
+   }
+
+   public LocalDateTime getModifiedDateTime() {
+      return modifiedDateTime;
+   }
+
+   public void setModifiedDateTime(LocalDateTime modifiedDateTime) {
+      this.modifiedDateTime = modifiedDateTime;
+   }
+
+   public static final String HANDLE = "HANDLE";
+
+   public static final String SFC_BO = "SFC_BO";
+
+   public static final String DATE_TIME = "DATE_TIME";
+
+   public static final String DATA_FIELD = "DATA_FIELD";
+
+   public static final String DATA_ATTR = "DATA_ATTR";
+
+   public static final String USER_BO = "USER_BO";
+
+   public static final String CREATED_DATE_TIME = "CREATED_DATE_TIME";
+
+   public static final String MODIFIED_DATE_TIME = "MODIFIED_DATE_TIME";
+
+
+   @Override
+   protected Serializable pkVal() {
+      return this.handle;
+   }
+
+   @Override
+   public String toString() {
+      return "SfcData{" +
+         "handle = " + handle +
+         ", sfcBo = " + sfcBo +
+         ", dateTime = " + dateTime +
+         ", dataField = " + dataField +
+         ", dataAttr = " + dataAttr +
+         ", userBo = " + userBo +
+         ", createdDateTime = " + createdDateTime +
+         ", modifiedDateTime = " + modifiedDateTime +
+         "}";
+   }
+}
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcDataService.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcDataService.java
new file mode 100644
index 00000000..05366856
--- /dev/null
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcDataService.java
@@ -0,0 +1,37 @@
+package com.foreverwin.mesnac.meapi.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.meapi.model.SfcData;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.foreverwin.modular.core.util.FrontPage;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Leon.L
+ * @since 2021-06-29
+ */
+public interface SfcDataService extends IService<SfcData> {
+
+    /**
+     *  分页查询
+     * @param frontPage
+     * @return
+     */
+    IPage<SfcData> selectPage(FrontPage<SfcData> frontPage, SfcData sfcData);
+
+    List<SfcData> selectList(SfcData sfcData);
+
+    /**
+     * 保存SFC的跟追位置
+     *
+     * @param site
+     * @param sfc
+     * @param location
+     */
+    void saveSfcLocation(String site, String sfc, String location);
+}
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java
index 7fec1cc5..5a7f5ac7 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java
@@ -1,6 +1,7 @@
 package com.foreverwin.mesnac.meapi.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.meapi.dto.SfcDto;
 import com.foreverwin.mesnac.meapi.model.Sfc;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.foreverwin.modular.core.util.FrontPage;
@@ -35,4 +36,13 @@ public interface SfcService extends IService<Sfc> {
      * 获取资源上活动的sfc
      */
     List<Sfc> getSfcListByResrceBO(String resrceBO);
+
+    /**
+     * 查询生产批次的基本信息
+     *
+     * @param site
+     * @param sfc
+     * @return
+     */
+    SfcDto findSfcData(String site, String sfc);
 }
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcDataServiceImpl.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcDataServiceImpl.java
new file mode 100644
index 00000000..5c14c8ad
--- /dev/null
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcDataServiceImpl.java
@@ -0,0 +1,58 @@
+package com.foreverwin.mesnac.meapi.service.impl;
+
+import com.foreverwin.mesnac.meapi.service.SfcService;
+import com.foreverwin.mesnac.meapi.service.WorkCenterService;
+import com.foreverwin.modular.core.util.FrontPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.meapi.model.SfcData;
+import com.foreverwin.mesnac.meapi.mapper.SfcDataMapper;
+import com.foreverwin.mesnac.meapi.service.SfcDataService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.logging.Handler;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Leon.L
+ * @since 2021-06-29
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class SfcDataServiceImpl extends ServiceImpl<SfcDataMapper, SfcData> implements SfcDataService {
+
+    @Autowired
+    private SfcService sfcService;
+    @Autowired
+    private SfcDataMapper sfcDataMapper;
+    @Autowired
+    private WorkCenterService workCenterService;
+
+    @Override
+    public IPage<SfcData> selectPage(FrontPage<SfcData> frontPage, SfcData sfcData) {
+        QueryWrapper<SfcData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(sfcData);
+        return super.page(frontPage.getPagePlus(), queryWrapper);
+    }
+
+    @Override
+    public List<SfcData> selectList(SfcData sfcData) {
+        QueryWrapper<SfcData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(sfcData);
+        return super.list(queryWrapper);
+    }
+
+    @Override
+    public void saveSfcLocation(String site, String sfc, String location) {
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java
index 52e18561..5871376d 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java
@@ -1,5 +1,6 @@
 package com.foreverwin.mesnac.meapi.service.impl;
 
+import com.foreverwin.mesnac.meapi.dto.SfcDto;
 import com.foreverwin.modular.core.util.FrontPage;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -57,5 +58,10 @@ public class SfcServiceImpl extends ServiceImpl<SfcMapper, Sfc> implements SfcSe
         return sfc;
     }
 
+    @Override
+    public SfcDto findSfcData(String site, String sfc) {
+        return sfcMapper.findSfcData(site, sfc);
+    }
+
 
 }
\ No newline at end of file
diff --git a/meapi/src/main/resources/mapper/SfcDataMapper.xml b/meapi/src/main/resources/mapper/SfcDataMapper.xml
new file mode 100644
index 00000000..1d330bb8
--- /dev/null
+++ b/meapi/src/main/resources/mapper/SfcDataMapper.xml
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.foreverwin.mesnac.meapi.mapper.SfcDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.foreverwin.mesnac.meapi.model.SfcData">
+        <result column="HANDLE" property="handle" />
+        <result column="SFC_BO" property="sfcBo" />
+        <result column="DATE_TIME" property="dateTime" />
+        <result column="DATA_FIELD" property="dataField" />
+        <result column="DATA_ATTR" property="dataAttr" />
+        <result column="USER_BO" property="userBo" />
+        <result column="CREATED_DATE_TIME" property="createdDateTime" />
+        <result column="MODIFIED_DATE_TIME" property="modifiedDateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        HANDLE, SFC_BO, DATE_TIME, DATA_FIELD, DATA_ATTR, USER_BO, CREATED_DATE_TIME, MODIFIED_DATE_TIME
+    </sql>
+
+    <!-- BaseMapper标准查询/修改/删除 -->
+
+    <select id="selectByMap" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include>
+        FROM SFC_DATA
+        <if test="cm!=null and !cm.isEmpty">
+            <where>
+                <foreach collection="cm.keys" item="k" separator="AND">
+                    <if test="cm[k] != null">
+                        ${k} = #{cm[${k}]}
+                    </if>
+                </foreach>
+            </where>
+        </if>
+    </select>
+
+
+    <select id="selectOne" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include> FROM SFC_DATA
+        <where>
+            <if test="ew.entity.handle!=null">
+              HANDLE=#{ew.handle}
+            </if>
+            <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+            <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+            <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+            <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+            <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+            <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+            <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+        </where>
+    </select>
+
+    <select id="selectCount" resultType="Integer">
+        SELECT COUNT(1) FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                <if test="ew.entity.handle!=null">
+                    HANDLE=#{ew.entity.handle}
+                </if>
+                <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectList" resultMap="BaseResultMap">
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectMaps" resultType="HashMap">
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectObjs" resultType="Object">
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectPage" resultMap="BaseResultMap">
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <select id="selectMapsPage" resultType="HashMap">
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </select>
+
+    <insert id="insert" parameterType="com.foreverwin.mesnac.meapi.model.SfcData">
+        INSERT INTO SFC_DATA
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            HANDLE,
+            <if test="sfcBo!=null">SFC_BO,</if>
+            <if test="dateTime!=null">DATE_TIME,</if>
+            <if test="dataField!=null">DATA_FIELD,</if>
+            <if test="dataAttr!=null">DATA_ATTR,</if>
+            <if test="userBo!=null">USER_BO,</if>
+            <if test="createdDateTime!=null">CREATED_DATE_TIME,</if>
+            <if test="modifiedDateTime!=null">MODIFIED_DATE_TIME,</if>
+        </trim> VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            #{handle},
+            <if test="sfcBo!=null">#{sfcBo},</if>
+            <if test="dateTime!=null">#{dateTime},</if>
+            <if test="dataField!=null">#{dataField},</if>
+            <if test="dataAttr!=null">#{dataAttr},</if>
+            <if test="userBo!=null">#{userBo},</if>
+            <if test="createdDateTime!=null">#{createdDateTime},</if>
+            <if test="modifiedDateTime!=null">#{modifiedDateTime},</if>
+        </trim>
+    </insert>
+
+    <insert id="insertAllColumn" parameterType="com.foreverwin.mesnac.meapi.model.SfcData">
+        INSERT INTO SFC_DATA
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <include refid="Base_Column_List"></include>
+        </trim> VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            #{handle},
+            #{sfcBo},
+            #{dateTime},
+            #{dataField},
+            #{dataAttr},
+            #{userBo},
+            #{createdDateTime},
+            #{modifiedDateTime},
+        </trim>
+    </insert>
+
+
+
+
+
+
+    <update id="update">
+        UPDATE SFC_DATA <trim prefix="SET" suffixOverrides=",">
+        <if test="et.handle!=null">HANDLE=#{et.handle},</if>
+        <if test="et.sfcBo!=null">SFC_BO=#{et.sfcBo},</if>
+        <if test="et.dateTime!=null">DATE_TIME=#{et.dateTime},</if>
+        <if test="et.dataField!=null">DATA_FIELD=#{et.dataField},</if>
+        <if test="et.dataAttr!=null">DATA_ATTR=#{et.dataAttr},</if>
+        <if test="et.userBo!=null">USER_BO=#{et.userBo},</if>
+        <if test="et.createdDateTime!=null">CREATED_DATE_TIME=#{et.createdDateTime},</if>
+        <if test="et.modifiedDateTime!=null">MODIFIED_DATE_TIME=#{et.modifiedDateTime},</if>
+    </trim>
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    HANDLE=#{ew.entity.handle}
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </update>
+
+
+    <delete id="deleteByMap">
+        DELETE FROM SFC_DATA
+        <if test="cm!=null and !cm.isEmpty">
+            <where>
+                <foreach collection="cm.keys" item="k" separator="AND">
+                    <if test="cm[k] != null">
+                        ${k} = #{cm[${k}]}
+                    </if>
+                </foreach>
+            </where>
+        </if>
+    </delete>
+
+    <delete id="delete">
+        DELETE FROM SFC_DATA
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    <if test="ew.entity.handle!=null">
+                        HANDLE=#{ew.entity.handle}
+                    </if>
+                    <if test="ew.entity.sfcBo!=null"> AND SFC_BO=#{ew.entity.sfcBo}</if>
+                    <if test="ew.entity.dateTime!=null"> AND DATE_TIME=#{ew.entity.dateTime}</if>
+                    <if test="ew.entity.dataField!=null"> AND DATA_FIELD=#{ew.entity.dataField}</if>
+                    <if test="ew.entity.dataAttr!=null"> AND DATA_ATTR=#{ew.entity.dataAttr}</if>
+                    <if test="ew.entity.userBo!=null"> AND USER_BO=#{ew.entity.userBo}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+                    <if test="ew.entity.modifiedDateTime!=null"> AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime}</if>
+                </if>
+                <if test="ew!=null and ew.sqlSegment!=null and ew.nonEmptyOfWhere">
+                    ${ew.sqlSegment}
+                </if>
+            </if>
+        </where>
+        <if test="ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere">
+            ${ew.sqlSegment}
+        </if>
+    </delete>
+
+    <!-- BaseMapper标准查询/修改/删除 -->
+
+</mapper>
diff --git a/meapi/src/main/resources/mapper/SfcMapper.xml b/meapi/src/main/resources/mapper/SfcMapper.xml
index e765d0cf..e61d6e16 100644
--- a/meapi/src/main/resources/mapper/SfcMapper.xml
+++ b/meapi/src/main/resources/mapper/SfcMapper.xml
@@ -35,6 +35,16 @@
         <result column="PARTITION_DATE" property="partitionDate" />
     </resultMap>
 
+    <resultMap id="FullResultMap" type="com.foreverwin.mesnac.meapi.dto.SfcDto">
+        <result column="SHOP_ORDER" property="shopOrder" />
+        <result column="STATUS" property="status" />
+        <result column="ITEM" property="item" />
+        <result column="ITEM_DESCRIPTION" property="itemDescription" />
+        <result column="OPERATION" property="operation" />
+        <result column="OPERATION_DESCRIPTION" property="operationDescription" />
+        <result column="PREPOSITION_OPERATION" property="prepositionOperation" />
+        <result column="RESRCE" property="resrce" />
+    </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         HANDLE, CHANGE_STAMP, SITE, SFC, STATUS_BO, SHOP_ORDER_BO, QTY, QTY_DONE, QTY_SCRAPPED, QTY_HISTORICAL_MIN, QTY_HISTORICAL_MAX, ITEM_BO, PRIORITY, LOCATION, RMA_MAX_TIMES_PROCESSED, LCC_BO, ORIGINAL_STATUS_BO, QTY_MULT_PERFORMED, ACTUAL_COMP_DATE, PREV_SITE, ORIGINAL_TRANSFER_KEY, IMMEDIATE_ARCHIVE, TRANSFER_DATETIME, TRANSFER_USER, SN_DONE, AIN_EQUIPMENT_ID, CREATED_DATE_TIME, MODIFIED_DATE_TIME, PARTITION_DATE
@@ -634,4 +644,21 @@
         WHERE RES.HANDLE = #{resrceBO}
         ORDER BY IW.DATE_STARTED DESC
     </select>
+    
+    <select id="findSfcData" resultMap="FullResultMap">
+        SELECT SC.SITE, SC.SFC, SO.SHOP_ORDER, SC.QTY, SC.QTY_DONE, ST.STATUS, IM.ITEM, IT.DESCRIPTION ITEM_DESCRIPTION, OP.OPERATION, OT.DESCRIPTION OPERATION_DESCRIPTION, OTT.DESCRIPTION PREPOSITION_OPERATION
+        FROM SFC SC
+        INNER JOIN SHOP_ORDER SO ON SO.HANDLE = SC.SHOP_ORDER_BO
+        INNER JOIN STATUS ST ON ST.HANDLE = SC.STATUS_BO AND ST.STATUS_GROUP = 'SFC'
+        INNER JOIN ITEM IM ON IM.HANDLE = SC.ITEM_BO
+        LEFT JOIN ITEM_T IT ON IT.ITEM_BO = IM.HANDLE AND IT.LOCALE = 'zh'
+        INNER JOIN SFC_ROUTING SG ON SG.SFC_BO = SC.HANDLE
+        INNER JOIN SFC_ROUTER SR ON SR.SFC_ROUTING_BO = SG.HANDLE AND SR.IN_USE = 'true'
+        INNER JOIN SFC_STEP SP ON SP.SFC_ROUTER_BO = SR.HANDLE
+        INNER JOIN OPERATION OP ON SP.OPERATION_BO = 'OperationBO:'||OP.SITE||','||OP.OPERATION||',#' AND OP.CURRENT_REVISION = 'true'
+        LEFT JOIN OPERATION_T OT ON OT.OPERATION_BO = OP.HANDLE AND OT.LOCALE = 'zh'
+        LEFT JOIN Z_SFC_DISPATCH ZSD ON ZSD.SITE = SC.SITE AND ZSD.SFC = SC.SFC AND ZSD.OPERATION = OP.OPERATION AND ZSD.STEP_ID = SP.STEP_ID
+        LEFT JOIN OPERATION_T OTT ON SPLIT(OTT.OPERATION_BO,2) = ZSD.PREPOSITION_OPERATION AND OTT.LOCALE = 'zh'
+        WHERE SC.SITE = #{site} AND SC.SFC = #{sfc}
+    </select>
 </mapper>
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java b/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java
new file mode 100644
index 00000000..971159cf
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java
@@ -0,0 +1,145 @@
+package com.foreverwin.mesnac.production.controller;
+
+import com.foreverwin.mesnac.meapi.util.StringUtils;
+import com.foreverwin.modular.core.exception.BusinessException;
+import com.foreverwin.modular.core.util.R;
+import com.foreverwin.modular.core.util.FrontPage;
+import com.foreverwin.modular.core.util.CommonMethods;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import com.foreverwin.mesnac.meapi.service.SfcDataService;
+import com.foreverwin.mesnac.meapi.model.SfcData;
+import java.util.List;
+
+/**
+ *
+ * @author Leon.L
+ * @since 2021-06-29
+ */
+@RestController
+@RequestMapping("/SFC-DATA")
+public class SfcDataController {
+
+    @Autowired
+    public SfcDataService sfcDataService;
+
+    /**
+    * 根据id查询
+    *
+    * @param id 主键
+    * @return
+    */
+    @ResponseBody
+    @GetMapping("/{id:.+}")
+    public R getSfcDataById(@PathVariable String id) {
+        return R.ok( sfcDataService.getById(id));
+    }
+
+    /**
+     * 查询所有数据
+     *
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("")
+    public R getSfcDataList(SfcData sfcData){
+        List<SfcData> result;
+        QueryWrapper<SfcData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(sfcData);
+        result = sfcDataService.list(queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param frontPage  分页信息
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("/page")
+    public R page(FrontPage<SfcData> frontPage, SfcData sfcData){
+        IPage result;
+        QueryWrapper<SfcData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(sfcData);
+        if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) {
+            //TODO modify global query
+            queryWrapper.lambda().and(wrapper -> wrapper
+                .like(SfcData::getHandle, frontPage.getGlobalQuery())
+                .or().like(SfcData::getSfcBo, frontPage.getGlobalQuery())
+                .or().like(SfcData::getDataField, frontPage.getGlobalQuery())
+                .or().like(SfcData::getDataAttr, frontPage.getGlobalQuery())
+                .or().like(SfcData::getUserBo, frontPage.getGlobalQuery())
+    );
+        }
+        result = sfcDataService.page(frontPage.getPagePlus(), queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 新增
+     * @param sfcData  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PostMapping
+    public R save(@RequestBody SfcData sfcData) {
+        return R.ok(sfcDataService.save(sfcData));
+    }
+
+    /**
+     * 修改
+     * @param sfcData  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PutMapping
+    public R updateById(@RequestBody SfcData sfcData) {
+        return R.ok(sfcDataService.updateById(sfcData));
+    }
+
+    /**
+     * 根据id删除对象
+     * @param id  实体ID
+     * @return 0 失败  1 成功
+     */
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}")
+    public R removeById(@PathVariable("id") String id){
+        return R.ok(sfcDataService.removeById(id));
+    }
+
+    /**
+     * 批量删除对象
+     * @param ids 实体集合ID
+     * @return  0 失败  1 成功
+     */
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/delete-batch")
+    public R removeByIds(List<String> ids){
+        return R.ok(sfcDataService.removeByIds(ids));
+    }
+
+
+    @ResponseBody
+    @GetMapping("/saveSfcLocation")
+    public R saveSfcLocation(String sfc, String location) {
+        try {
+            if (StringUtils.isBlank(sfc)) {
+                throw BusinessException.build("SFC不能为空");
+            }
+            if (StringUtils.isBlank(location)) {
+                throw BusinessException.build("位置不能为空");
+            }
+
+            String site = CommonMethods.getSite();
+            sfcDataService.saveSfcLocation(site, sfc, location);
+        } catch (Exception e) {
+            return R.failed(e.getMessage());
+        }
+
+        return R.ok();
+    }
+}
\ No newline at end of file