From c583c1e540cd5443cd446c3f499f2b0481184c79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=98=89=E4=BC=9F?= <1724121454@qq.com>
Date: Fri, 30 Jul 2021 17:34:43 +0800
Subject: [PATCH 1/8] =?UTF-8?q?=E5=91=98=E5=B7=A5=E8=B5=84=E6=BA=90?=
 =?UTF-8?q?=E5=AF=BC=E5=85=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../dataimport/handler/HandlerFactory.java    |   2 +
 .../handler/UserResourceHandler.java          | 112 +++++++-----------
 .../dispatch/service/UserResourceService.java |   3 +-
 .../service/impl/UserResourceServiceImpl.java |  17 ++-
 4 files changed, 62 insertions(+), 72 deletions(-)

diff --git a/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/HandlerFactory.java b/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/HandlerFactory.java
index c0110de6..985693b0 100644
--- a/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/HandlerFactory.java
+++ b/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/HandlerFactory.java
@@ -30,6 +30,8 @@ public class HandlerFactory {
                 //return new MessageTypeHandler();
             case "tool" :
                 return new ToolHandler();
+            case "userResource" :
+                return new UserResourceHandler();
         }
 
         return null;
diff --git a/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/UserResourceHandler.java b/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/UserResourceHandler.java
index e39c28d6..ba1e049d 100644
--- a/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/UserResourceHandler.java
+++ b/dataimport/src/main/java/com/foreverwin/mesnac/dataimport/handler/UserResourceHandler.java
@@ -8,10 +8,13 @@ import com.foreverwin.mesnac.dataimport.reader.FileReader;
 import com.foreverwin.mesnac.dataimport.reader.FileReaderBuilder;
 import com.foreverwin.mesnac.dataimport.reader.RowVisitor;
 import com.foreverwin.mesnac.dataimport.service.MasterObjectDefine;
-import com.foreverwin.mesnac.dataimport.util.AppUtil;
 import com.foreverwin.mesnac.dispatch.mapper.UserResourceMapper;
 import com.foreverwin.mesnac.dispatch.model.UserResource;
 import com.foreverwin.mesnac.dispatch.service.UserResourceService;
+import com.foreverwin.mesnac.meapi.mapper.NwaUserMapper;
+import com.foreverwin.mesnac.meapi.mapper.ResrceMapper;
+import com.foreverwin.mesnac.meapi.model.NwaUser;
+import com.foreverwin.mesnac.meapi.model.Resrce;
 import com.foreverwin.modular.core.exception.BusinessException;
 import com.foreverwin.modular.core.util.CommonMethods;
 import com.foreverwin.modular.core.util.I18nUtil;
@@ -30,11 +33,17 @@ import java.util.Map;
 public class UserResourceHandler extends BaseHandler {
 
     @Autowired
-    private UserResourceMapper userResourceMapper;
+    private ResrceMapper resrceMapper;
 
     @Autowired
     private UserResourceService userResourceService;
 
+    @Autowired
+    private NwaUserMapper nwaUserMapper;
+
+    @Autowired
+    private UserResourceMapper userResourceMapper;
+
     @Override
     public String importFile(String site, InputStream inputStream, String fileType, String mode) throws Exception {
         int row = 0;
@@ -72,18 +81,18 @@ public class UserResourceHandler extends BaseHandler {
 
                 LocalDateTime now = LocalDateTime.now();
                 String user = CommonMethods.getUser();
-                String resrce = StringUtil.toString(jsonObject.getString(jsonObject.getString("resrce")));
-                String resrceDescription = StringUtil.toString(jsonObject.getString(jsonObject.getString("resrceDescription")));
-                String userId = StringUtil.toString(jsonObject.getString(jsonObject.getString("userId")));
-                String userDescription = StringUtil.toString(jsonObject.getString(jsonObject.getString("userDescription")));
-                String temporaryUser = StringUtil.toString(jsonObject.getString(jsonObject.getString("temporaryUser")));
-                String status = StringUtil.toString(jsonObject.getString(jsonObject.getString("status")));
+                String resrce = StringUtil.toString(jsonObject.getString("resrce"));
+               // String resrceDescription = StringUtil.toString(jsonObject.getString("resrceDescription"));
+                String userId = StringUtil.toString(jsonObject.getString("userId"));
+                String userDescription = StringUtil.toString(jsonObject.getString("userDescription"));
+                String temporaryUser = StringUtil.toString(jsonObject.getString("temporaryUser"));
+                String status = StringUtil.toString(jsonObject.getString("status"));
                 UserResource userResource = new UserResource();
                 userResource.setHandle(HandleEnum.USER_RESOURCE.getHandle(site, resrce, userId));
                 userResource.setSite(site);
                 userResource.setResourceBo(HandleEnum.RESOURCE.getHandle(site,resrce));
                 userResource.setResrce(resrce);
-                userResource.setResrceDescription(resrceDescription);
+              //  userResource.setResrceDescription(resrceDescription);
                 userResource.setUserId(userId);
                 userResource.setUserDescription(userDescription);
                 if("Y".equals(temporaryUser)){
@@ -92,12 +101,13 @@ public class UserResourceHandler extends BaseHandler {
                     userResource.setTemporaryUser("false");
                 }
 
-                if("Y".equals(status)){
-                    userResource.setStatus("true");
-                }else {
+                if("N".equals(status)){
                     userResource.setStatus("false");
+                }else {
+                    userResource.setStatus("true");
                 }
 
+                //判断是否是更新还是插入,如果是更新,则没有创建时间和人员
                 UserResource result = userResourceMapper.selectById(userResource.getHandle());
                 if(result == null){
                     userResource.setCreatedUser(user);
@@ -105,66 +115,19 @@ public class UserResourceHandler extends BaseHandler {
                 }
                 userResource.setModifiedUser(user);
                 userResource.setModifiedDateTime(now);
-
-
-
-                Object[] params = new Object[10];
-                //错误信息提示
-                params[0] = index;
-                params[1] = resrce;
-                boolean insert = false;
                 try {
-
                     //如果资源为空或者员工编号为空,则直接跳过
                     if (StringUtil.notEmpty(resrce) && StringUtil.notEmpty(userId)) {
                         //站点
                         jsonObject.put("site", site);
-                        //错误提示信息
-                        boolean resultMessage = false;
-                       // WorkCenterFullConfiguration result = WorkCenterWSClient.find(jsonObject);
-                        if (result != null) {
-                            if (AppUtil.canUpdate(mode)) {
-                                resultMessage = this.update(userResource);
-                                if (resultMessage) {
-                                    return 1;
-                                }
-                            }else{
-                                throw BusinessException.build("第"+index+"行的数据不存在,不能更新,应该选更新插入");
-                            }
-                        } else {
-                            if (AppUtil.canInsert(mode)) {
-                                insert = true;
-                              //  resultMessage = WorkCenterWSClient.insert(userResource);
-//                                if (resultMessage == null) {
-//                                    return 1;
-//                                }
-                            } else if (AppUtil.canUpdate(mode)) {
-                                //resultMessage = "第" +index+ "行:" + I18nUtil.getI18nText("MaterData.import.upDateObjectNotExist") + "\n";
-                            }
-                        }
-
-//                        if (resultMessage != null) {
-//                            params[2] = resultMessage;
-//                            failedNumber[0]++;
-//                            if (insert) {
-//                                buffer.append("第" +index+ "行:" + I18nUtil.getI18nText("MaterData.import.insertfail.workcenter", params) + "\n");
-//                            } else {
-//                                buffer.append("第" +index+ "行:" + I18nUtil.getI18nText("MaterData.import.updatefail.workcenter", params) + "\n");
-//                            }
-//                        }
+                        //不管用户选啥模式,都是更新和插入
+                        this.updateAndInsert(userResource,index);
+                        userResourceService.saveOrUpdate(userResource);
                     }
-                    return 0;
-
+                    return 1;
                 } catch (Exception e) {
-                    params[2] = e.getMessage();
-                    failedNumber[0]++;
-                    if (insert) {
-                        buffer.append("第" +index+ "行:" + I18nUtil.getI18nText("MaterData.import.insertfail.workcenter", new Object[]{e.getMessage()}) + "\n");
-                    } else {
-                        buffer.append("第" +index+ "行:" + I18nUtil.getI18nText("MaterData.import.updatefail.workcenter", new Object[]{e.getMessage()}) + "\n");
-                    }
+                    throw BusinessException.build(e.getMessage());
                 }
-                return 0;
             }
 
             @Override
@@ -172,10 +135,25 @@ public class UserResourceHandler extends BaseHandler {
                 return null;
             }
 
-            boolean update(UserResource userResource){
-
+            boolean updateAndInsert(UserResource userResource,Long index){
+                //判断资源是否存在
+                Resrce resrce = resrceMapper.selectById(userResource.getResourceBo());
 
-                return false;
+                if(resrce == null){
+                    throw BusinessException.build("第"+index+"行的资源不存在");
+                }
+                //设置资源描述
+                userResource.setResrceDescription(resrce.getDescription());
+                //设置员工描述
+                NwaUser nwaUser = nwaUserMapper.selectById(HandleEnum.USER.getHandle(userResource.getSite(), userResource.getUserId()));
+                if(nwaUser != null){
+                    userResource.setUserDescription(nwaUser.getFullName());
+                }else if("true".equals(userResource.getTemporaryUser())){
+                    //不做任何操作
+                }else{
+                    throw BusinessException.build("第"+index+"行的用户不存在,必须为临时员工");
+                }
+                return true;
             }
         };
 
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/UserResourceService.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/UserResourceService.java
index dc14e96d..35fb6aef 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/UserResourceService.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/UserResourceService.java
@@ -7,6 +7,7 @@ import com.foreverwin.mesnac.dispatch.model.UserResource;
 import com.foreverwin.mesnac.meapi.model.NwaUser;
 import com.foreverwin.modular.core.util.FrontPage;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -32,7 +33,7 @@ public interface UserResourceService extends IService<UserResource> {
 
     List<UserResource> findEnableList(String site, String resource, String user);
 
-    List<UserResourceDto> findAll(UserResourceDto userResourceDto);
+    HashMap<String,Object> findAll(UserResourceDto userResourceDto);
 
     void saveAll(List<UserResourceDto> userResourceDtoList,String resource,String user);
 
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/UserResourceServiceImpl.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/UserResourceServiceImpl.java
index c4987f72..f57ea7b5 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/UserResourceServiceImpl.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/UserResourceServiceImpl.java
@@ -20,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 /**
  * <p>
@@ -69,11 +70,18 @@ public class UserResourceServiceImpl extends ServiceImpl<UserResourceMapper, Use
     }
 
     @Override
-    public List<UserResourceDto> findAll(UserResourceDto userResourceDto) {
+    public HashMap<String,Object> findAll(UserResourceDto userResourceDto) {
         String site = CommonMethods.getSite();
         String resource = userResourceDto.getResrce();
         String userId = userResourceDto.getUserId();
-        return userResourceMapper.findAll(site, resource, userId);
+
+        HashMap<String, Object> hashMap = new HashMap<>();;
+        List<NwaUser> nwaUserList = nwaUserService.selectList(null);
+        List<UserResourceDto> userResourceList = userResourceMapper.findAll(site, resource, userId);
+        hashMap.put("users",nwaUserList);
+        hashMap.put("userResources",userResourceList);
+        return hashMap;
+
     }
 
     @Override
@@ -99,7 +107,8 @@ public class UserResourceServiceImpl extends ServiceImpl<UserResourceMapper, Use
                     userByUserName == null){
                 throw BusinessException.build("第"+(i+1)+"行的用户不存在,必须为临时用户");
             }else if(userByUserName != null){
-                userByUserName.setFullName(userResource.getUserDescription());
+                //userByUserName.setFullName(userResource.getUserDescription());
+                userResource.setUserDescription(userByUserName.getFullName());
                 nwaUserService.saveOrUpdate(userByUserName);
             }
             userResource.setStatus(userResourceDto.getStatus());
@@ -117,6 +126,6 @@ public class UserResourceServiceImpl extends ServiceImpl<UserResourceMapper, Use
         if(userResourceList.size() > 0){
             this.saveOrUpdateBatch(userResourceList);
         }
-
     }
+
 }
\ No newline at end of file

From b9b4add3fb94bab754d32f2c7fd0b43653f8c7f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=98=89=E4=BC=9F?= <1724121454@qq.com>
Date: Mon, 2 Aug 2021 10:02:11 +0800
Subject: [PATCH 2/8] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=B6=88=E6=81=AF?=
 =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/AbnormalMessageController.java | 130 -----------------
 .../anomaly/mapper/AbnormalMessageMapper.java |  18 ---
 .../service/AbnormalMessageService.java       |  28 ----
 .../service/impl/AbnormalBillServiceImpl.java |  52 +++----
 .../impl/AbnormalMessageServiceImpl.java      |  46 ------
 .../service/impl/AnomalyJobServiceImpl.java   |  28 ++--
 .../common/controller/MessageController.java  | 132 ++++++++++++++++++
 .../mesnac/common/mapper/MessageMapper.java   |  18 +++
 .../mesnac/common/model/Message.java          |  50 +++----
 .../mesnac/common/service/MessageService.java |  28 ++++
 .../service/impl/MessageServiceImpl.java      |  46 ++++++
 .../main/resources/mapper/MessageMapper.xml   | 112 +++++++--------
 12 files changed, 346 insertions(+), 342 deletions(-)
 delete mode 100644 anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/AbnormalMessageController.java
 delete mode 100644 anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/AbnormalMessageMapper.java
 delete mode 100644 anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/AbnormalMessageService.java
 delete mode 100644 anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalMessageServiceImpl.java
 create mode 100644 common/src/main/java/com/foreverwin/mesnac/common/controller/MessageController.java
 create mode 100644 common/src/main/java/com/foreverwin/mesnac/common/mapper/MessageMapper.java
 rename anomaly/src/main/java/com/foreverwin/mesnac/anomaly/model/AbnormalMessage.java => common/src/main/java/com/foreverwin/mesnac/common/model/Message.java (87%)
 create mode 100644 common/src/main/java/com/foreverwin/mesnac/common/service/MessageService.java
 create mode 100644 common/src/main/java/com/foreverwin/mesnac/common/service/impl/MessageServiceImpl.java
 rename anomaly/src/main/resources/mapper/AbnormalMessageMapper.xml => common/src/main/resources/mapper/MessageMapper.xml (87%)

diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/AbnormalMessageController.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/AbnormalMessageController.java
deleted file mode 100644
index 43057883..00000000
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/controller/AbnormalMessageController.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.foreverwin.mesnac.anomaly.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.foreverwin.mesnac.anomaly.model.AbnormalMessage;
-import com.foreverwin.mesnac.anomaly.service.AbnormalMessageService;
-import com.foreverwin.modular.core.util.FrontPage;
-import com.foreverwin.modular.core.util.R;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- *
- * @author 赵嘉伟
- * @since 2021-07-22
- */
-@RestController
-@RequestMapping("/Z-ABNORMAL-MESSAGE")
-public class AbnormalMessageController {
-
-    @Autowired
-    public AbnormalMessageService abnormalMessageService;
-
-    /**
-    * 根据id查询
-    *
-    * @param id 主键
-    * @return
-    */
-    @ResponseBody
-    @GetMapping("/{id:.+}")
-    public R getAbnormalMessageById(@PathVariable String id) {
-        return R.ok( abnormalMessageService.getById(id));
-    }
-
-    /**
-     * 查询所有数据
-     *
-     * @return
-     */
-    @ResponseBody
-    @GetMapping("")
-    public R getAbnormalMessageList(AbnormalMessage abnormalMessage){
-        List<AbnormalMessage> result;
-        QueryWrapper<AbnormalMessage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.setEntity(abnormalMessage);
-        result = abnormalMessageService.list(queryWrapper);
-        return R.ok(result);
-    }
-
-    /**
-     * 分页查询数据
-     *
-     * @param frontPage  分页信息
-     * @return
-     */
-    @ResponseBody
-    @GetMapping("/page")
-    public R page(FrontPage<AbnormalMessage> frontPage, AbnormalMessage abnormalMessage){
-        IPage result;
-        QueryWrapper<AbnormalMessage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.setEntity(abnormalMessage);
-        if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) {
-            //TODO modify global query
-            queryWrapper.lambda().and(wrapper -> wrapper
-                .like(AbnormalMessage::getHandle, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getSite, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getAbnormalBillBo, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getType, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getMessageType, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getSendUserGroup, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getSendUser, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getContent, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getUpUserGroup, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getUpUser, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getUpMessageType, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getAbnormalNode, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getStatus, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getCreatedUser, frontPage.getGlobalQuery())
-                .or().like(AbnormalMessage::getModifiedUser, frontPage.getGlobalQuery())
-    );
-        }
-        result = abnormalMessageService.page(frontPage.getPagePlus(), queryWrapper);
-        return R.ok(result);
-    }
-
-    /**
-     * 新增
-     * @param abnormalMessage  传递的实体
-     * @return  null 失败  实体成功
-     */
-    @PostMapping
-    public R save(@RequestBody AbnormalMessage abnormalMessage) {
-        return R.ok(abnormalMessageService.save(abnormalMessage));
-    }
-
-    /**
-     * 修改
-     * @param abnormalMessage  传递的实体
-     * @return  null 失败  实体成功
-     */
-    @PutMapping
-    public R updateById(@RequestBody AbnormalMessage abnormalMessage) {
-        return R.ok(abnormalMessageService.updateById(abnormalMessage));
-    }
-
-    /**
-     * 根据id删除对象
-     * @param id  实体ID
-     * @return 0 失败  1 成功
-     */
-    @ResponseBody
-    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}")
-    public R removeById(@PathVariable("id") String id){
-        return R.ok(abnormalMessageService.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(abnormalMessageService.removeByIds(ids));
-    }
-}
\ No newline at end of file
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/AbnormalMessageMapper.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/AbnormalMessageMapper.java
deleted file mode 100644
index 0d14bd7d..00000000
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/mapper/AbnormalMessageMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.foreverwin.mesnac.anomaly.mapper;
-
-import com.foreverwin.mesnac.anomaly.model.AbnormalMessage;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springframework.stereotype.Repository;
-
-/**
- * <p>
- *  Mapper 接口
- * </p>
- *
- * @author 赵嘉伟
- * @since 2021-07-22
- */
-@Repository
-public interface AbnormalMessageMapper extends BaseMapper<AbnormalMessage> {
-
-}
\ No newline at end of file
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/AbnormalMessageService.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/AbnormalMessageService.java
deleted file mode 100644
index 275e7e28..00000000
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/AbnormalMessageService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.foreverwin.mesnac.anomaly.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.foreverwin.mesnac.anomaly.model.AbnormalMessage;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.foreverwin.modular.core.util.FrontPage;
-
-import java.util.List;
-
-/**
- * <p>
- *  服务类
- * </p>
- *
- * @author 赵嘉伟
- * @since 2021-07-22
- */
-public interface AbnormalMessageService extends IService<AbnormalMessage> {
-
-    /**
-     *  分页查询
-     * @param frontPage
-     * @return
-     */
-    IPage<AbnormalMessage> selectPage(FrontPage<AbnormalMessage> frontPage, AbnormalMessage abnormalMessage);
-
-    List<AbnormalMessage> selectList(AbnormalMessage abnormalMessage);
-}
\ No newline at end of file
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
index 871daf86..c57f4187 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
+++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
@@ -8,7 +8,6 @@ import com.foreverwin.mesnac.anomaly.dto.AbnormalBillDisposeDto;
 import com.foreverwin.mesnac.anomaly.dto.AbnormalBillDto;
 import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillDisposeMapper;
 import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillMapper;
-import com.foreverwin.mesnac.anomaly.mapper.AbnormalMessageMapper;
 import com.foreverwin.mesnac.anomaly.model.*;
 import com.foreverwin.mesnac.anomaly.service.*;
 import com.foreverwin.mesnac.anomaly.util.ActiveMQUtil;
@@ -16,7 +15,10 @@ import com.foreverwin.mesnac.common.constant.Constants;
 import com.foreverwin.mesnac.common.dto.ScrapDto;
 import com.foreverwin.mesnac.common.enums.HandleEnum;
 import com.foreverwin.mesnac.common.helper.NextNumberHelper;
+import com.foreverwin.mesnac.common.mapper.MessageMapper;
+import com.foreverwin.mesnac.common.model.Message;
 import com.foreverwin.mesnac.common.service.AnomalyService;
+import com.foreverwin.mesnac.common.service.MessageService;
 import com.foreverwin.mesnac.common.util.StringUtil;
 import com.foreverwin.mesnac.meapi.dto.ShopOrderDto;
 import com.foreverwin.mesnac.meapi.mapper.*;
@@ -129,10 +131,10 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
     private ActiveMQUtil activeMQUtil;
 
     @Autowired
-    private AbnormalMessageMapper abnormalMessageMapper;
+    private MessageMapper messageMapper;
 
     @Autowired
-    private AbnormalMessageService abnormalMessageService;
+    private MessageService messageService;
 
     @Autowired
     private SelfReportService selfReportService;
@@ -828,14 +830,14 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
         String user = CommonMethods.getUser();
         String locale = LocaleContextHolder.getLocale().getLanguage();
         LocalDateTime now = LocalDateTime.now();
-        AbnormalMessage abnormalMessage = new AbnormalMessage();
+        Message abnormalMessage = new Message();
         //发送消息的主键
         String handle = UUID.randomUUID().toString();
         abnormalMessage.setHandle(handle);
         //站点
         abnormalMessage.setSite(site);
         //异常单
-        abnormalMessage.setAbnormalBillBo(abnormalBill.getHandle());
+        abnormalMessage.setObjectBo(abnormalBill.getHandle());
         //异常类型
         abnormalMessage.setType(abnormalBill.getType());
         //根据异常的类型找到消息的类型
@@ -854,45 +856,45 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
         switch (abnormalBill.getStatus()){
             case Constants.NEW://新建
                 abnormalMessage.setSendUserGroup(abnormalBill.getReportSendUserGroup());
-                abnormalMessage.setAbnormalNode(Constants.ABNORMAL_MESSAGE_REPORT);
+                abnormalMessage.setNode(Constants.ABNORMAL_MESSAGE_REPORT);
                 break;
             case Constants.RESPONSE://响应中,设置响应超时的用户的发送的用户组为提报时要升级的用户组
-                QueryWrapper<AbnormalMessage> wrapper = new QueryWrapper<>();
-                AbnormalMessage abnormalMessage1 = new AbnormalMessage();
+                QueryWrapper<Message> wrapper = new QueryWrapper<>();
+                Message abnormalMessage1 = new Message();
                 abnormalMessage1.setSite(site);
-                abnormalMessage1.setAbnormalBillBo(abnormalBill.getHandle());
-                abnormalMessage1.setAbnormalNode(Constants.ABNORMAL_MESSAGE_REPORT);
+                abnormalMessage1.setObjectBo(abnormalBill.getHandle());
+                abnormalMessage1.setNode(Constants.ABNORMAL_MESSAGE_REPORT);
                 wrapper.setEntity(abnormalMessage1);
-                AbnormalMessage _abnormalMessage = abnormalMessageMapper.selectOne(wrapper);
+                Message _abnormalMessage = messageMapper.selectOne(wrapper);
                 abnormalMessage.setUpUserGroup(_abnormalMessage.getUpUserGroup());
                 abnormalMessage.setUpMessageType(_abnormalMessage.getUpMessageType());
                 abnormalMessage.setGrade(_abnormalMessage.getGrade());
                 abnormalMessage.setUpDateTime(_abnormalMessage.getUpDateTime());
-                abnormalMessage.setAbnormalNode(Constants.ABNORMAL_MESSAGE_RESPONSE);
+                abnormalMessage.setNode(Constants.ABNORMAL_MESSAGE_RESPONSE);
                 break;
             case Constants.CORRECTION_CONFIRM://纠纷确认
                 abnormalMessage.setSendUserGroup(abnormalBillDispose.getDutySendUserGroup());
-                abnormalMessage.setAbnormalNode(Constants.ABNORMAL_MESSAGE_CORRECTION_CONFIRM);
+                abnormalMessage.setNode(Constants.ABNORMAL_MESSAGE_CORRECTION_CONFIRM);
                 break;
             case Constants.PROGRAM_CONFIRM://方案确认
                 abnormalMessage.setSendUser(abnormalBillDispose.getResolveSendUser());
-                abnormalMessage.setAbnormalNode(Constants.ABNORMAL_MESSAGE_PROGRAM_CONFIRM);
+                abnormalMessage.setNode(Constants.ABNORMAL_MESSAGE_PROGRAM_CONFIRM);
                 break;
             case Constants.CANCEL://取消
                 abnormalMessage.setSendUserGroup(abnormalBill.getCancelSendUserGroup());
-                abnormalMessage.setAbnormalNode(Constants.ABNORMAL_MESSAGE_CANCEL);
+                abnormalMessage.setNode(Constants.ABNORMAL_MESSAGE_CANCEL);
 
 
                 //异常取消的时候要关闭当前异常单下所有的异常信息
-                UpdateWrapper<AbnormalMessage> messageTypeUpdateWrapper = new UpdateWrapper<>();
+                UpdateWrapper<Message> messageTypeUpdateWrapper = new UpdateWrapper<>();
 //              messageTypeUpdateWrapper.eq("SITE",site);
 //              messageTypeUpdateWrapper.eq("ABNORMAL_BILL_BO",abnormalMessage.getAbnormalBillBo());
-                AbnormalMessage abnormalMessage2 = new AbnormalMessage();
+                Message abnormalMessage2 = new Message();
               //  abnormalMessage2.setAbnormalBillBo(abnormalMessage.getAbnormalBillBo());
                 abnormalMessage2.setStatus("Y");
                 messageTypeUpdateWrapper.eq("STATUS","N");
-                messageTypeUpdateWrapper.eq("ABNORMAL_BILL_BO",abnormalMessage.getAbnormalBillBo());
-                abnormalMessageService.update(abnormalMessage2,messageTypeUpdateWrapper);
+                messageTypeUpdateWrapper.eq("OBJECT_BO",abnormalMessage.getObjectBo());
+                messageService.update(abnormalMessage2,messageTypeUpdateWrapper);
                 break;
             case Constants.SHUT_DOWN:
                 break;
@@ -916,7 +918,7 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
             }
             assert customFieldByGroup != null;
             if(!StringUtil.isBlank(customFieldByGroup.getMessageNoticeLevel())){
-                abnormalMessage.setGrade(Integer.parseInt(customFieldByGroup.getMessageNoticeLevel()));
+                abnormalMessage.setGrade(Double.parseDouble(customFieldByGroup.getMessageNoticeLevel()));
             }
             //得到升级的消息类型
             abnormalMessage.setUpMessageType(abnormalMessage.getMessageType());
@@ -930,8 +932,8 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
 
 
         //设置状态,新建是Y,响应为N,纠防确认是N,方案确认是Y,
-        if(Constants.ABNORMAL_MESSAGE_RESPONSE.equals(abnormalMessage.getAbnormalNode()) ||
-                Constants.ABNORMAL_MESSAGE_CORRECTION_CONFIRM.equals(abnormalMessage.getAbnormalNode())){
+        if(Constants.ABNORMAL_MESSAGE_RESPONSE.equals(abnormalMessage.getNode()) ||
+                Constants.ABNORMAL_MESSAGE_CORRECTION_CONFIRM.equals(abnormalMessage.getNode())){
             abnormalMessage.setStatus("N");
         }else{
             abnormalMessage.setStatus("Y");
@@ -945,10 +947,10 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
 
 
         //判断,如果是方案确认,则发送用户,否则,除了节点是响应之外,则发送用户组
-        if(Constants.ABNORMAL_MESSAGE_PROGRAM_CONFIRM.equals(abnormalMessage.getAbnormalNode())){
+        if(Constants.ABNORMAL_MESSAGE_PROGRAM_CONFIRM.equals(abnormalMessage.getNode())){
             String sendUsers = abnormalMessage.getSendUser().replace(',', '|');
             activeMQUtil.wechatSendMessage(sendUsers,abnormalMessage.getContent());
-        }else if(!Constants.ABNORMAL_MESSAGE_RESPONSE.equals(abnormalMessage.getAbnormalNode())){
+        }else if(!Constants.ABNORMAL_MESSAGE_RESPONSE.equals(abnormalMessage.getNode())){
             List<NwaUser> nwaUsers = nwaUserService.checkUserGroup(site,abnormalMessage.getSendUserGroup());
             StringBuilder sendUsers = new StringBuilder();
             for (int i = 0; i < nwaUsers.size(); i++) {
@@ -960,7 +962,7 @@ public class AbnormalBillServiceImpl extends ServiceImpl<AbnormalBillMapper, Abn
             }
             activeMQUtil.wechatSendMessage(sendUsers.toString(),abnormalMessage.getContent());
         }
-        abnormalMessageService.saveOrUpdate(abnormalMessage);
+        messageService.saveOrUpdate(abnormalMessage);
         return true;
     }
 
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalMessageServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalMessageServiceImpl.java
deleted file mode 100644
index c0bc6d0b..00000000
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalMessageServiceImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.foreverwin.mesnac.anomaly.service.impl;
-
-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.anomaly.model.AbnormalMessage;
-import com.foreverwin.mesnac.anomaly.mapper.AbnormalMessageMapper;
-import com.foreverwin.mesnac.anomaly.service.AbnormalMessageService;
-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;
-/**
- * <p>
- *  服务实现类
- * </p>
- *
- * @author 赵嘉伟
- * @since 2021-07-22
- */
-@Service
-@Transactional(rollbackFor = Exception.class)
-public class AbnormalMessageServiceImpl extends ServiceImpl<AbnormalMessageMapper, AbnormalMessage> implements AbnormalMessageService {
-
-
-    @Autowired
-    private AbnormalMessageMapper abnormalMessageMapper;
-
-    @Override
-    public IPage<AbnormalMessage> selectPage(FrontPage<AbnormalMessage> frontPage, AbnormalMessage abnormalMessage) {
-        QueryWrapper<AbnormalMessage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.setEntity(abnormalMessage);
-        return super.page(frontPage.getPagePlus(), queryWrapper);
-    }
-
-    @Override
-    public List<AbnormalMessage> selectList(AbnormalMessage abnormalMessage) {
-        QueryWrapper<AbnormalMessage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.setEntity(abnormalMessage);
-        return super.list(queryWrapper);
-    }
-
-
-}
\ No newline at end of file
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
index aa2a1702..866ff383 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
+++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
@@ -2,13 +2,13 @@ package com.foreverwin.mesnac.anomaly.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillMapper;
-import com.foreverwin.mesnac.anomaly.mapper.AbnormalMessageMapper;
 import com.foreverwin.mesnac.anomaly.model.AbnormalBill;
-import com.foreverwin.mesnac.anomaly.model.AbnormalMessage;
 import com.foreverwin.mesnac.anomaly.service.AbnormalBillService;
-import com.foreverwin.mesnac.anomaly.service.AbnormalMessageService;
 import com.foreverwin.mesnac.anomaly.service.AnomalyJobService;
 import com.foreverwin.mesnac.anomaly.util.ActiveMQUtil;
+import com.foreverwin.mesnac.common.mapper.MessageMapper;
+import com.foreverwin.mesnac.common.model.Message;
+import com.foreverwin.mesnac.common.service.MessageService;
 import com.foreverwin.mesnac.common.util.StringUtil;
 import com.foreverwin.mesnac.meapi.mapper.UserGroupMapper;
 import com.foreverwin.mesnac.meapi.model.NwaUser;
@@ -32,10 +32,10 @@ import java.util.UUID;
 public class AnomalyJobServiceImpl implements AnomalyJobService {
 
     @Autowired
-    private AbnormalMessageService abnormalMessageService;
+    private MessageService messageService;
 
     @Autowired
-    private AbnormalMessageMapper abnormalMessageMapper;
+    private MessageMapper messageMapper;
 
     @Autowired
     private AbnormalBillMapper abnormalBillMapper;
@@ -58,19 +58,19 @@ public class AnomalyJobServiceImpl implements AnomalyJobService {
         LocalDateTime now = LocalDateTime.now();
         String user = CommonMethods.getUser();
         //找到状态为N,并且升级时间大于当前时间
-        QueryWrapper<AbnormalMessage> abnormalMessageQueryWrapper = new QueryWrapper<>();
+        QueryWrapper<Message> abnormalMessageQueryWrapper = new QueryWrapper<>();
         abnormalMessageQueryWrapper.eq("STATUS","N");
         abnormalMessageQueryWrapper.lt("UP_DATE_TIME",now);
-        List<AbnormalMessage> abnormalMessages = abnormalMessageMapper.selectList(abnormalMessageQueryWrapper);
-        for(AbnormalMessage _abnormalMessage : abnormalMessages){
+        List<Message> abnormalMessages = messageMapper.selectList(abnormalMessageQueryWrapper);
+        for(Message _abnormalMessage : abnormalMessages){
             String uuid = UUID.randomUUID().toString();
-            AbnormalMessage abnormalMessage = new AbnormalMessage();
+            Message abnormalMessage = new Message();
             //设置abnormalMessage的handle
             abnormalMessage.setHandle(uuid);
             //设置abnormalMessage的site
             abnormalMessage.setSite(site);
             //设置abnormalMessage的异常单Bo
-            abnormalMessage.setAbnormalBillBo(_abnormalMessage.getAbnormalBillBo());
+            abnormalMessage.setObjectBo(_abnormalMessage.getObjectBo());
             //设置abnormalMessage的type
             abnormalMessage.setType(_abnormalMessage.getType());
             //设置abnormalMessage的message_type
@@ -89,7 +89,7 @@ public class AnomalyJobServiceImpl implements AnomalyJobService {
                 abnormalMessage.setUpUser(null);
             }
 
-            AbnormalBill abnormalBill = abnormalBillMapper.selectById(abnormalMessage.getAbnormalBillBo());
+            AbnormalBill abnormalBill = abnormalBillMapper.selectById(abnormalMessage.getObjectBo());
 
             String message = abnormalBillService.formatMessage(abnormalBill,abnormalMessage.getMessageType(),site);
 
@@ -101,7 +101,7 @@ public class AnomalyJobServiceImpl implements AnomalyJobService {
 
             abnormalMessage.setGrade(_abnormalMessage.getGrade() + 1);
             abnormalMessage.setResponseDateTime(now);
-            abnormalMessage.setAbnormalNode(_abnormalMessage.getAbnormalNode());
+            abnormalMessage.setNode(_abnormalMessage.getNode());
             abnormalMessage.setStatus("Y");
             _abnormalMessage.setStatus("Y");
 
@@ -128,8 +128,8 @@ public class AnomalyJobServiceImpl implements AnomalyJobService {
                 }
                 activeMQUtil.wechatSendMessage(sendUsers.toString(),abnormalMessage.getContent());
 //            }
-            abnormalMessageService.saveOrUpdate(abnormalMessage);
-            abnormalMessageService.saveOrUpdate(_abnormalMessage);
+            messageService.saveOrUpdate(abnormalMessage);
+            messageService.saveOrUpdate(_abnormalMessage);
         }
     }
 }
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/controller/MessageController.java b/common/src/main/java/com/foreverwin/mesnac/common/controller/MessageController.java
new file mode 100644
index 00000000..45371064
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/controller/MessageController.java
@@ -0,0 +1,132 @@
+package com.foreverwin.mesnac.common.controller;
+
+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.common.service.MessageService;
+import com.foreverwin.mesnac.common.model.Message;
+import java.util.List;
+
+/**
+ *
+ * @author zjw
+ * @since 2021-08-02
+ */
+@RestController
+@RequestMapping("/Z-MESSAGE")
+public class MessageController {
+
+    @Autowired
+    public MessageService messageService;
+
+    /**
+    * 根据id查询
+    *
+    * @param id 主键
+    * @return
+    */
+    @ResponseBody
+    @GetMapping("/{id:.+}")
+    public R getMessageById(@PathVariable String id) {
+        return R.ok( messageService.getById(id));
+    }
+
+    /**
+     * 查询所有数据
+     *
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("")
+    public R getMessageList(Message message){
+        List<Message> result;
+        QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(message);
+        result = messageService.list(queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param frontPage  分页信息
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("/page")
+    public R page(FrontPage<Message> frontPage, Message message){
+        IPage result;
+        QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(message);
+        if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) {
+            //TODO modify global query
+            queryWrapper.lambda().and(wrapper -> wrapper
+                .like(Message::getHandle, frontPage.getGlobalQuery())
+                .or().like(Message::getSite, frontPage.getGlobalQuery())
+                .or().like(Message::getObjectBo, frontPage.getGlobalQuery())
+                .or().like(Message::getType, frontPage.getGlobalQuery())
+                .or().like(Message::getMessageType, frontPage.getGlobalQuery())
+                .or().like(Message::getSendUserGroup, frontPage.getGlobalQuery())
+                .or().like(Message::getSendUser, frontPage.getGlobalQuery())
+                .or().like(Message::getContent, frontPage.getGlobalQuery())
+                .or().like(Message::getUpUserGroup, frontPage.getGlobalQuery())
+                .or().like(Message::getUpUser, frontPage.getGlobalQuery())
+                .or().like(Message::getUpMessageType, frontPage.getGlobalQuery())
+                .or().like(Message::getNode, frontPage.getGlobalQuery())
+                .or().like(Message::getStatus, frontPage.getGlobalQuery())
+                .or().like(Message::getCreatedUser, frontPage.getGlobalQuery())
+                .or().like(Message::getModifiedUser, frontPage.getGlobalQuery())
+    );
+        }
+        result = messageService.page(frontPage.getPagePlus(), queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 新增
+     * @param message  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PostMapping
+    public R save(@RequestBody Message message) {
+        return R.ok(messageService.save(message));
+    }
+
+    /**
+     * 修改
+     * @param message  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PutMapping
+    public R updateById(@RequestBody Message message) {
+        return R.ok(messageService.updateById(message));
+    }
+
+    /**
+     * 根据id删除对象
+     * @param id  实体ID
+     * @return 0 失败  1 成功
+     */
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}")
+    public R removeById(@PathVariable("id") String id){
+        return R.ok(messageService.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(messageService.removeByIds(ids));
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/mapper/MessageMapper.java b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MessageMapper.java
new file mode 100644
index 00000000..e59ec6d2
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MessageMapper.java
@@ -0,0 +1,18 @@
+package com.foreverwin.mesnac.common.mapper;
+
+import com.foreverwin.mesnac.common.model.Message;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zjw
+ * @since 2021-08-02
+ */
+@Repository
+public interface MessageMapper extends BaseMapper<Message> {
+
+}
\ No newline at end of file
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/model/AbnormalMessage.java b/common/src/main/java/com/foreverwin/mesnac/common/model/Message.java
similarity index 87%
rename from anomaly/src/main/java/com/foreverwin/mesnac/anomaly/model/AbnormalMessage.java
rename to common/src/main/java/com/foreverwin/mesnac/common/model/Message.java
index b113c833..a40b12e2 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/model/AbnormalMessage.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/model/Message.java
@@ -1,4 +1,4 @@
-package com.foreverwin.mesnac.anomaly.model;
+package com.foreverwin.mesnac.common.model;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -14,13 +14,13 @@ import java.time.LocalDateTime;
  * 
  * </p>
  *
- * @author 赵嘉伟
- * @since 2021-07-22
+ * @author zjw
+ * @since 2021-08-02
  */
 
-@TableName("Z_ABNORMAL_MESSAGE")
+@TableName("Z_MESSAGE")
 
-public class AbnormalMessage extends Model<AbnormalMessage> {
+public class Message extends Model<Message> {
 
     private static final long serialVersionUID = 1L;
 
@@ -37,8 +37,8 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
     /**
      * 异常单
      */
-   @TableField("ABNORMAL_BILL_BO")
-   private String abnormalBillBo;
+   @TableField("OBJECT_BO")
+   private String objectBo;
     /**
      * 异常类型
      */
@@ -88,7 +88,7 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
      * 等级
      */
    @TableField("GRADE")
-   private Integer grade;
+   private Double grade;
     /**
      * 消息触发时间
      */
@@ -97,8 +97,8 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
     /**
      * 异常节点
      */
-   @TableField("ABNORMAL_NODE")
-   private String abnormalNode;
+   @TableField("NODE")
+   private String node;
     /**
      * 状态
      */
@@ -142,12 +142,12 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
       this.site = site;
    }
 
-   public String getAbnormalBillBo() {
-      return abnormalBillBo;
+   public String getObjectBo() {
+      return objectBo;
    }
 
-   public void setAbnormalBillBo(String abnormalBillBo) {
-      this.abnormalBillBo = abnormalBillBo;
+   public void setObjectBo(String objectBo) {
+      this.objectBo = objectBo;
    }
 
    public String getType() {
@@ -222,11 +222,11 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
       this.upDateTime = upDateTime;
    }
 
-   public Integer getGrade() {
+   public Double getGrade() {
       return grade;
    }
 
-   public void setGrade(Integer grade) {
+   public void setGrade(Double grade) {
       this.grade = grade;
    }
 
@@ -238,12 +238,12 @@ public class AbnormalMessage extends Model<AbnormalMessage> {
       this.responseDateTime = responseDateTime;
    }
 
-   public String getAbnormalNode() {
-      return abnormalNode;
+   public String getNode() {
+      return node;
    }
 
-   public void setAbnormalNode(String abnormalNode) {
-      this.abnormalNode = abnormalNode;
+   public void setNode(String node) {
+      this.node = node;
    }
 
    public String getStatus() {
@@ -290,7 +290,7 @@ public static final String HANDLE = "HANDLE";
 
 public static final String SITE = "SITE";
 
-public static final String ABNORMAL_BILL_BO = "ABNORMAL_BILL_BO";
+public static final String OBJECT_BO = "OBJECT_BO";
 
 public static final String TYPE = "TYPE";
 
@@ -314,7 +314,7 @@ public static final String GRADE = "GRADE";
 
 public static final String RESPONSE_DATE_TIME = "RESPONSE_DATE_TIME";
 
-public static final String ABNORMAL_NODE = "ABNORMAL_NODE";
+public static final String NODE = "NODE";
 
 public static final String STATUS = "STATUS";
 
@@ -334,10 +334,10 @@ public static final String MODIFIED_DATE_TIME = "MODIFIED_DATE_TIME";
 
    @Override
    public String toString() {
-      return "AbnormalMessage{" +
+      return "Message{" +
          "handle = " + handle +
          ", site = " + site +
-         ", abnormalBillBo = " + abnormalBillBo +
+         ", objectBo = " + objectBo +
          ", type = " + type +
          ", messageType = " + messageType +
          ", sendUserGroup = " + sendUserGroup +
@@ -349,7 +349,7 @@ public static final String MODIFIED_DATE_TIME = "MODIFIED_DATE_TIME";
          ", upDateTime = " + upDateTime +
          ", grade = " + grade +
          ", responseDateTime = " + responseDateTime +
-         ", abnormalNode = " + abnormalNode +
+         ", node = " + node +
          ", status = " + status +
          ", createdUser = " + createdUser +
          ", createdDateTime = " + createdDateTime +
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/MessageService.java b/common/src/main/java/com/foreverwin/mesnac/common/service/MessageService.java
new file mode 100644
index 00000000..ca38a076
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/service/MessageService.java
@@ -0,0 +1,28 @@
+package com.foreverwin.mesnac.common.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.common.model.Message;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.foreverwin.modular.core.util.FrontPage;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zjw
+ * @since 2021-08-02
+ */
+public interface MessageService extends IService<Message> {
+
+    /**
+     *  分页查询
+     * @param frontPage
+     * @return
+     */
+    IPage<Message> selectPage(FrontPage<Message> frontPage, Message message);
+
+    List<Message> selectList(Message message);
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MessageServiceImpl.java b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MessageServiceImpl.java
new file mode 100644
index 00000000..07f75498
--- /dev/null
+++ b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MessageServiceImpl.java
@@ -0,0 +1,46 @@
+package com.foreverwin.mesnac.common.service.impl;
+
+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.common.model.Message;
+import com.foreverwin.mesnac.common.mapper.MessageMapper;
+import com.foreverwin.mesnac.common.service.MessageService;
+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;
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zjw
+ * @since 2021-08-02
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> implements MessageService {
+
+
+    @Autowired
+    private MessageMapper messageMapper;
+
+    @Override
+    public IPage<Message> selectPage(FrontPage<Message> frontPage, Message message) {
+        QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(message);
+        return super.page(frontPage.getPagePlus(), queryWrapper);
+    }
+
+    @Override
+    public List<Message> selectList(Message message) {
+        QueryWrapper<Message> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(message);
+        return super.list(queryWrapper);
+    }
+
+
+}
\ No newline at end of file
diff --git a/anomaly/src/main/resources/mapper/AbnormalMessageMapper.xml b/common/src/main/resources/mapper/MessageMapper.xml
similarity index 87%
rename from anomaly/src/main/resources/mapper/AbnormalMessageMapper.xml
rename to common/src/main/resources/mapper/MessageMapper.xml
index 345bbf1c..194046bb 100644
--- a/anomaly/src/main/resources/mapper/AbnormalMessageMapper.xml
+++ b/common/src/main/resources/mapper/MessageMapper.xml
@@ -1,12 +1,12 @@
 <?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.anomaly.mapper.AbnormalMessageMapper">
+<mapper namespace="com.foreverwin.mesnac.common.mapper.MessageMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.foreverwin.mesnac.anomaly.model.AbnormalMessage">
+    <resultMap id="BaseResultMap" type="com.foreverwin.mesnac.common.model.Message">
         <id column="HANDLE" property="handle" />
         <result column="SITE" property="site" />
-        <result column="ABNORMAL_BILL_BO" property="abnormalBillBo" />
+        <result column="OBJECT_BO" property="objectBo" />
         <result column="TYPE" property="type" />
         <result column="MESSAGE_TYPE" property="messageType" />
         <result column="SEND_USER_GROUP" property="sendUserGroup" />
@@ -18,7 +18,7 @@
         <result column="UP_DATE_TIME" property="upDateTime" />
         <result column="GRADE" property="grade" />
         <result column="RESPONSE_DATE_TIME" property="responseDateTime" />
-        <result column="ABNORMAL_NODE" property="abnormalNode" />
+        <result column="NODE" property="node" />
         <result column="STATUS" property="status" />
         <result column="CREATED_USER" property="createdUser" />
         <result column="CREATED_DATE_TIME" property="createdDateTime" />
@@ -28,17 +28,17 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        HANDLE, SITE, ABNORMAL_BILL_BO, TYPE, MESSAGE_TYPE, SEND_USER_GROUP, SEND_USER, CONTENT, UP_USER_GROUP, UP_USER, UP_MESSAGE_TYPE, UP_DATE_TIME, GRADE, RESPONSE_DATE_TIME, ABNORMAL_NODE, STATUS, CREATED_USER, CREATED_DATE_TIME, MODIFIED_USER, MODIFIED_DATE_TIME
+        HANDLE, SITE, OBJECT_BO, TYPE, MESSAGE_TYPE, SEND_USER_GROUP, SEND_USER, CONTENT, UP_USER_GROUP, UP_USER, UP_MESSAGE_TYPE, UP_DATE_TIME, GRADE, RESPONSE_DATE_TIME, NODE, STATUS, CREATED_USER, CREATED_DATE_TIME, MODIFIED_USER, MODIFIED_DATE_TIME
     </sql>
 
     <!-- BaseMapper标准查询/修改/删除 -->
     <select id="selectById" resultMap="BaseResultMap">
-        SELECT <include refid="Base_Column_List"></include> FROM Z_ABNORMAL_MESSAGE WHERE HANDLE=#{handle}
+        SELECT <include refid="Base_Column_List"></include> FROM Z_MESSAGE WHERE HANDLE=#{handle}
     </select>
 
     <select id="selectByMap" resultMap="BaseResultMap">
         SELECT <include refid="Base_Column_List"></include>
-        FROM Z_ABNORMAL_MESSAGE
+        FROM Z_MESSAGE
         <if test="cm!=null and !cm.isEmpty">
             <where>
                 <foreach collection="cm.keys" item="k" separator="AND">
@@ -52,19 +52,19 @@
 
     <select id="selectBatchIds" resultMap="BaseResultMap">
         SELECT <include refid="Base_Column_List"></include>
-        FROM Z_ABNORMAL_MESSAGE WHERE HANDLE IN (
+        FROM Z_MESSAGE WHERE HANDLE IN (
         <foreach item="item" index="index" collection="coll" separator=",">#{item}
         </foreach>)
     </select>
 
     <select id="selectOne" resultMap="BaseResultMap">
-        SELECT <include refid="Base_Column_List"></include> FROM Z_ABNORMAL_MESSAGE
+        SELECT <include refid="Base_Column_List"></include> FROM Z_MESSAGE
         <where>
             <if test="ew.entity.handle!=null">
               HANDLE=#{ew.handle}
             </if>
             <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-            <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+            <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
             <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
             <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
             <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -76,7 +76,7 @@
             <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
             <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
             <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-            <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+            <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
             <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
             <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
             <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -86,7 +86,7 @@
     </select>
 
     <select id="selectCount" resultType="Integer">
-        SELECT COUNT(1) FROM Z_ABNORMAL_MESSAGE
+        SELECT COUNT(1) FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -94,7 +94,7 @@
                     HANDLE=#{ew.entity.handle}
                 </if>
                 <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                 <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                 <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                 <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -106,7 +106,7 @@
                 <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                 <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                 <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                 <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                 <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                 <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -124,7 +124,7 @@
     </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 Z_ABNORMAL_MESSAGE
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -132,7 +132,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -144,7 +144,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -162,7 +162,7 @@
     </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 Z_ABNORMAL_MESSAGE
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -170,7 +170,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -182,7 +182,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -200,7 +200,7 @@
     </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 Z_ABNORMAL_MESSAGE
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -208,7 +208,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -220,7 +220,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -238,7 +238,7 @@
     </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 Z_ABNORMAL_MESSAGE
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -246,7 +246,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -258,7 +258,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -276,7 +276,7 @@
     </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 Z_ABNORMAL_MESSAGE
+        SELECT <choose><when test="ew != null and ew.sqlSelect != null">${ew.sqlSelect}</when><otherwise><include refid="Base_Column_List"></include></otherwise></choose> FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -284,7 +284,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -296,7 +296,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -313,12 +313,12 @@
         </if>
     </select>
 
-    <insert id="insert" parameterType="com.foreverwin.mesnac.anomaly.model.AbnormalMessage">
-        INSERT INTO Z_ABNORMAL_MESSAGE
+    <insert id="insert" parameterType="com.foreverwin.mesnac.common.model.Message">
+        INSERT INTO Z_MESSAGE
         <trim prefix="(" suffix=")" suffixOverrides=",">
             HANDLE,
             <if test="site!=null">SITE,</if>
-            <if test="abnormalBillBo!=null">ABNORMAL_BILL_BO,</if>
+            <if test="objectBo!=null">OBJECT_BO,</if>
             <if test="type!=null">TYPE,</if>
             <if test="messageType!=null">MESSAGE_TYPE,</if>
             <if test="sendUserGroup!=null">SEND_USER_GROUP,</if>
@@ -330,7 +330,7 @@
             <if test="upDateTime!=null">UP_DATE_TIME,</if>
             <if test="grade!=null">GRADE,</if>
             <if test="responseDateTime!=null">RESPONSE_DATE_TIME,</if>
-            <if test="abnormalNode!=null">ABNORMAL_NODE,</if>
+            <if test="node!=null">NODE,</if>
             <if test="status!=null">STATUS,</if>
             <if test="createdUser!=null">CREATED_USER,</if>
             <if test="createdDateTime!=null">CREATED_DATE_TIME,</if>
@@ -340,7 +340,7 @@
         <trim prefix="(" suffix=")" suffixOverrides=",">
             #{handle},
             <if test="site!=null">#{site},</if>
-            <if test="abnormalBillBo!=null">#{abnormalBillBo},</if>
+            <if test="objectBo!=null">#{objectBo},</if>
             <if test="type!=null">#{type},</if>
             <if test="messageType!=null">#{messageType},</if>
             <if test="sendUserGroup!=null">#{sendUserGroup},</if>
@@ -352,7 +352,7 @@
             <if test="upDateTime!=null">#{upDateTime},</if>
             <if test="grade!=null">#{grade},</if>
             <if test="responseDateTime!=null">#{responseDateTime},</if>
-            <if test="abnormalNode!=null">#{abnormalNode},</if>
+            <if test="node!=null">#{node},</if>
             <if test="status!=null">#{status},</if>
             <if test="createdUser!=null">#{createdUser},</if>
             <if test="createdDateTime!=null">#{createdDateTime},</if>
@@ -361,15 +361,15 @@
         </trim>
     </insert>
 
-    <insert id="insertAllColumn" parameterType="com.foreverwin.mesnac.anomaly.model.AbnormalMessage">
-        INSERT INTO Z_ABNORMAL_MESSAGE
+    <insert id="insertAllColumn" parameterType="com.foreverwin.mesnac.common.model.Message">
+        INSERT INTO Z_MESSAGE
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <include refid="Base_Column_List"></include>
         </trim> VALUES
         <trim prefix="(" suffix=")" suffixOverrides=",">
             #{handle},
             #{site},
-            #{abnormalBillBo},
+            #{objectBo},
             #{type},
             #{messageType},
             #{sendUserGroup},
@@ -381,7 +381,7 @@
             #{upDateTime},
             #{grade},
             #{responseDateTime},
-            #{abnormalNode},
+            #{node},
             #{status},
             #{createdUser},
             #{createdDateTime},
@@ -392,9 +392,9 @@
 
 
     <update id="updateById">
-        UPDATE Z_ABNORMAL_MESSAGE <trim prefix="SET" suffixOverrides=",">
+        UPDATE Z_MESSAGE <trim prefix="SET" suffixOverrides=",">
         <if test="et.site!=null">SITE=#{et.site},</if>
-        <if test="et.abnormalBillBo!=null">ABNORMAL_BILL_BO=#{et.abnormalBillBo},</if>
+        <if test="et.objectBo!=null">OBJECT_BO=#{et.objectBo},</if>
         <if test="et.type!=null">TYPE=#{et.type},</if>
         <if test="et.messageType!=null">MESSAGE_TYPE=#{et.messageType},</if>
         <if test="et.sendUserGroup!=null">SEND_USER_GROUP=#{et.sendUserGroup},</if>
@@ -406,7 +406,7 @@
         <if test="et.upDateTime!=null">UP_DATE_TIME=#{et.upDateTime},</if>
         <if test="et.grade!=null">GRADE=#{et.grade},</if>
         <if test="et.responseDateTime!=null">RESPONSE_DATE_TIME=#{et.responseDateTime},</if>
-        <if test="et.abnormalNode!=null">ABNORMAL_NODE=#{et.abnormalNode},</if>
+        <if test="et.node!=null">NODE=#{et.node},</if>
         <if test="et.status!=null">STATUS=#{et.status},</if>
         <if test="et.createdUser!=null">CREATED_USER=#{et.createdUser},</if>
         <if test="et.createdDateTime!=null">CREATED_DATE_TIME=#{et.createdDateTime},</if>
@@ -417,9 +417,9 @@
 
 
     <update id="updateAllColumnById">
-        UPDATE Z_ABNORMAL_MESSAGE <trim prefix="SET" suffixOverrides=",">
+        UPDATE Z_MESSAGE <trim prefix="SET" suffixOverrides=",">
         SITE=#{et.site},
-        ABNORMAL_BILL_BO=#{et.abnormalBillBo},
+        OBJECT_BO=#{et.objectBo},
         TYPE=#{et.type},
         MESSAGE_TYPE=#{et.messageType},
         SEND_USER_GROUP=#{et.sendUserGroup},
@@ -431,7 +431,7 @@
         UP_DATE_TIME=#{et.upDateTime},
         GRADE=#{et.grade},
         RESPONSE_DATE_TIME=#{et.responseDateTime},
-        ABNORMAL_NODE=#{et.abnormalNode},
+        NODE=#{et.node},
         STATUS=#{et.status},
         CREATED_USER=#{et.createdUser},
         CREATED_DATE_TIME=#{et.createdDateTime},
@@ -442,9 +442,9 @@
 
 
     <update id="update">
-        UPDATE Z_ABNORMAL_MESSAGE <trim prefix="SET" suffixOverrides=",">
+        UPDATE Z_MESSAGE <trim prefix="SET" suffixOverrides=",">
         <if test="et.site!=null">SITE=#{et.site},</if>
-        <if test="et.abnormalBillBo!=null">ABNORMAL_BILL_BO=#{et.abnormalBillBo},</if>
+        <if test="et.objectBo!=null">OBJECT_BO=#{et.objectBo},</if>
         <if test="et.type!=null">TYPE=#{et.type},</if>
         <if test="et.messageType!=null">MESSAGE_TYPE=#{et.messageType},</if>
         <if test="et.sendUserGroup!=null">SEND_USER_GROUP=#{et.sendUserGroup},</if>
@@ -456,7 +456,7 @@
         <if test="et.upDateTime!=null">UP_DATE_TIME=#{et.upDateTime},</if>
         <if test="et.grade!=null">GRADE=#{et.grade},</if>
         <if test="et.responseDateTime!=null">RESPONSE_DATE_TIME=#{et.responseDateTime},</if>
-        <if test="et.abnormalNode!=null">ABNORMAL_NODE=#{et.abnormalNode},</if>
+        <if test="et.node!=null">NODE=#{et.node},</if>
         <if test="et.status!=null">STATUS=#{et.status},</if>
         <if test="et.createdUser!=null">CREATED_USER=#{et.createdUser},</if>
         <if test="et.createdDateTime!=null">CREATED_DATE_TIME=#{et.createdDateTime},</if>
@@ -468,7 +468,7 @@
                 <if test="ew.entity!=null">
                     HANDLE=#{ew.entity.handle}
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -480,7 +480,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -498,11 +498,11 @@
     </update>
 
     <delete id="deleteById">
-        DELETE FROM Z_ABNORMAL_MESSAGE WHERE HANDLE=#{handle}
+        DELETE FROM Z_MESSAGE WHERE HANDLE=#{handle}
     </delete>
 
     <delete id="deleteByMap">
-        DELETE FROM Z_ABNORMAL_MESSAGE
+        DELETE FROM Z_MESSAGE
         <if test="cm!=null and !cm.isEmpty">
             <where>
                 <foreach collection="cm.keys" item="k" separator="AND">
@@ -515,7 +515,7 @@
     </delete>
 
     <delete id="delete">
-        DELETE FROM Z_ABNORMAL_MESSAGE
+        DELETE FROM Z_MESSAGE
         <where>
             <if test="ew!=null">
                 <if test="ew.entity!=null">
@@ -523,7 +523,7 @@
                         HANDLE=#{ew.entity.handle}
                     </if>
                     <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
-                    <if test="ew.entity.abnormalBillBo!=null"> AND ABNORMAL_BILL_BO=#{ew.entity.abnormalBillBo}</if>
+                    <if test="ew.entity.objectBo!=null"> AND OBJECT_BO=#{ew.entity.objectBo}</if>
                     <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
                     <if test="ew.entity.messageType!=null"> AND MESSAGE_TYPE=#{ew.entity.messageType}</if>
                     <if test="ew.entity.sendUserGroup!=null"> AND SEND_USER_GROUP=#{ew.entity.sendUserGroup}</if>
@@ -535,7 +535,7 @@
                     <if test="ew.entity.upDateTime!=null"> AND UP_DATE_TIME=#{ew.entity.upDateTime}</if>
                     <if test="ew.entity.grade!=null"> AND GRADE=#{ew.entity.grade}</if>
                     <if test="ew.entity.responseDateTime!=null"> AND RESPONSE_DATE_TIME=#{ew.entity.responseDateTime}</if>
-                    <if test="ew.entity.abnormalNode!=null"> AND ABNORMAL_NODE=#{ew.entity.abnormalNode}</if>
+                    <if test="ew.entity.node!=null"> AND NODE=#{ew.entity.node}</if>
                     <if test="ew.entity.status!=null"> AND STATUS=#{ew.entity.status}</if>
                     <if test="ew.entity.createdUser!=null"> AND CREATED_USER=#{ew.entity.createdUser}</if>
                     <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
@@ -553,7 +553,7 @@
     </delete>
 
     <delete id="deleteBatchIds">
-        DELETE FROM Z_ABNORMAL_MESSAGE WHERE HANDLE IN (
+        DELETE FROM Z_MESSAGE WHERE HANDLE IN (
         <foreach item="item" index="index" collection="coll" separator=",">#{item}
         </foreach>)
     </delete>

From e3432be4359666c19bfa45eaac9c13a88326ff7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=98=89=E4=BC=9F?= <1724121454@qq.com>
Date: Mon, 2 Aug 2021 11:33:01 +0800
Subject: [PATCH 3/8] ActiveMQ

---
 .../mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java    | 2 +-
 .../mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java      | 2 +-
 .../java/com/foreverwin/mesnac/common}/util/ActiveMQUtil.java   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
 rename {anomaly/src/main/java/com/foreverwin/mesnac/anomaly => common/src/main/java/com/foreverwin/mesnac/common}/util/ActiveMQUtil.java (97%)

diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
index c57f4187..7ec9bd4e 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
+++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AbnormalBillServiceImpl.java
@@ -10,7 +10,6 @@ import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillDisposeMapper;
 import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillMapper;
 import com.foreverwin.mesnac.anomaly.model.*;
 import com.foreverwin.mesnac.anomaly.service.*;
-import com.foreverwin.mesnac.anomaly.util.ActiveMQUtil;
 import com.foreverwin.mesnac.common.constant.Constants;
 import com.foreverwin.mesnac.common.dto.ScrapDto;
 import com.foreverwin.mesnac.common.enums.HandleEnum;
@@ -19,6 +18,7 @@ import com.foreverwin.mesnac.common.mapper.MessageMapper;
 import com.foreverwin.mesnac.common.model.Message;
 import com.foreverwin.mesnac.common.service.AnomalyService;
 import com.foreverwin.mesnac.common.service.MessageService;
+import com.foreverwin.mesnac.common.util.ActiveMQUtil;
 import com.foreverwin.mesnac.common.util.StringUtil;
 import com.foreverwin.mesnac.meapi.dto.ShopOrderDto;
 import com.foreverwin.mesnac.meapi.mapper.*;
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
index 866ff383..38e29b7d 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
+++ b/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/service/impl/AnomalyJobServiceImpl.java
@@ -5,10 +5,10 @@ import com.foreverwin.mesnac.anomaly.mapper.AbnormalBillMapper;
 import com.foreverwin.mesnac.anomaly.model.AbnormalBill;
 import com.foreverwin.mesnac.anomaly.service.AbnormalBillService;
 import com.foreverwin.mesnac.anomaly.service.AnomalyJobService;
-import com.foreverwin.mesnac.anomaly.util.ActiveMQUtil;
 import com.foreverwin.mesnac.common.mapper.MessageMapper;
 import com.foreverwin.mesnac.common.model.Message;
 import com.foreverwin.mesnac.common.service.MessageService;
+import com.foreverwin.mesnac.common.util.ActiveMQUtil;
 import com.foreverwin.mesnac.common.util.StringUtil;
 import com.foreverwin.mesnac.meapi.mapper.UserGroupMapper;
 import com.foreverwin.mesnac.meapi.model.NwaUser;
diff --git a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/util/ActiveMQUtil.java b/common/src/main/java/com/foreverwin/mesnac/common/util/ActiveMQUtil.java
similarity index 97%
rename from anomaly/src/main/java/com/foreverwin/mesnac/anomaly/util/ActiveMQUtil.java
rename to common/src/main/java/com/foreverwin/mesnac/common/util/ActiveMQUtil.java
index 762efce9..b351f462 100644
--- a/anomaly/src/main/java/com/foreverwin/mesnac/anomaly/util/ActiveMQUtil.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/util/ActiveMQUtil.java
@@ -1,4 +1,4 @@
-package com.foreverwin.mesnac.anomaly.util;
+package com.foreverwin.mesnac.common.util;
 
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.json.JSONObject;

From b934709378fda8d67928be9b9ff32f74de433e6a Mon Sep 17 00:00:00 2001
From: Leon <3066758958@qq.com>
Date: Mon, 2 Aug 2021 16:43:19 +0800
Subject: [PATCH 4/8] =?UTF-8?q?=E6=8A=A5=E5=BA=9F=E8=B0=83=E7=94=A8?=
 =?UTF-8?q?=E6=B4=BE=E5=B7=A5=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../service/SfcDispatchCommonService.java     |  12 +
 .../mesnac/common/util/DateUtil.java          |   2 +
 .../controller/SfcDispatchController.java     |  22 +-
 .../dispatch/model/ShopOrderRelease.java      |   9 +
 .../dispatch/service/SfcDispatchService.java  |  10 +
 .../service/ShopOrderReleaseService.java      |  29 +++
 .../service/impl/SfcDispatchServiceImpl.java  | 212 +++++++++++++++++-
 .../impl/ShopOrderReleaseServiceImpl.java     |   6 +
 .../resources/mapper/SfcDispatchMapper.xml    |   5 +-
 .../mesnac/meapi/dto/WorkCenterLinkDTO.java   |  34 +++
 .../meapi/mapper/WorkCenterMemberMapper.java  |   4 +
 .../service/WorkCenterMemberService.java      |   3 +
 .../impl/WorkCenterMemberServiceImpl.java     |   6 +
 .../mapper/WorkCenterMemberMapper.xml         |   9 +
 14 files changed, 344 insertions(+), 19 deletions(-)
 create mode 100644 meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/WorkCenterLinkDTO.java

diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/SfcDispatchCommonService.java b/common/src/main/java/com/foreverwin/mesnac/common/service/SfcDispatchCommonService.java
index 83354a86..7ced1e8e 100644
--- a/common/src/main/java/com/foreverwin/mesnac/common/service/SfcDispatchCommonService.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/service/SfcDispatchCommonService.java
@@ -11,6 +11,18 @@ import com.foreverwin.mesnac.common.dto.SfcDispatchDto;
  */
 public interface SfcDispatchCommonService {
 
+    /**
+     * 报废保存派工数据
+     *
+     * @param site
+     * @param user
+     * @param workCenter
+     * @param sfc
+     * @param shopOrder
+     * @param routerBo
+     */
+    void saveSfcDispatch(String site, String user, String workCenter,String sfc, String shopOrder, String routerBo);
+
     /**
      * 修改派工单状态
      *
diff --git a/common/src/main/java/com/foreverwin/mesnac/common/util/DateUtil.java b/common/src/main/java/com/foreverwin/mesnac/common/util/DateUtil.java
index 65740276..344e6632 100644
--- a/common/src/main/java/com/foreverwin/mesnac/common/util/DateUtil.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/util/DateUtil.java
@@ -20,6 +20,8 @@ import java.util.*;
 
 public class DateUtil
 {
+
+
 	public static final String[] YEARS = {"2017年", "2018年", "2019年", "2020年", "2021年", "2022年", "2023年", "2024年", "2025年", "2026年", "2027年"};
 	public static final String[] YEARS_SHORT = {"2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027"};
 	public static final String[] MONTHS = {"01月", "02月", "03月", "04月", "05月", "06月", "07月", "08月", "09月", "10月", "11月", "12月"};
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
index a01eb0b3..07b79f8c 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
@@ -2,8 +2,11 @@ package com.foreverwin.mesnac.dispatch.controller;
 
 import cn.hutool.core.date.DateUtil;
 import com.foreverwin.mesnac.common.dto.SfcDispatchDto;
+import com.foreverwin.mesnac.common.enums.DispatchStatusEnum;
 import com.foreverwin.mesnac.common.util.StringUtil;
+import com.foreverwin.mesnac.dispatch.dto.WorkCenterWorkTimeDTO;
 import com.foreverwin.mesnac.dispatch.model.ShopOrderRelease;
+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;
@@ -331,24 +334,23 @@ public class SfcDispatchController {
 
         try {
             String site = CommonMethods.getSite();
-            if (StringUtil.notBlank(shopOrderRelease.getStartFromDate_S())) {
-                shopOrderRelease.setStartFromDate(DateUtil.parseDate(shopOrderRelease.getStartFromDate_S()));
+            if (StringUtil.isBlank(shopOrderRelease.getStartFromDate_S())) {
+                throw BusinessException.build("派工开始时间不能为空!");
             }
-            if (StringUtil.notBlank(shopOrderRelease.getStartToDate_S())) {
-                shopOrderRelease.setStartToDate(DateUtil.parseDate(shopOrderRelease.getStartToDate_S()));
+            if (StringUtil.isBlank(shopOrderRelease.getStartToDate_S())) {
+                throw BusinessException.build("派工开始时间不能为空!");
             }
             shopOrderRelease.setSite(site);
+            shopOrderRelease.setDispatchStatus(DispatchStatusEnum.RELEASE.getCode());
+            shopOrderRelease.setStartFromDate(DateUtil.parseDate(shopOrderRelease.getStartFromDate_S()));
+            shopOrderRelease.setStartToDate(DateUtil.parseDate(shopOrderRelease.getStartToDate_S()));
 
-            //查询派工数据
-            List<ShopOrderRelease> scheduleList = sfcDispatchService.findSfcDispatchList(shopOrderRelease);
-            result.put("schedules", scheduleList);
 
-            //查询工作中心工作时间
-            result.put("workCenterWorkTimes", "");
+            result = sfcDispatchService.ganttList(site, shopOrderRelease);
         } catch (Exception e) {
             return R.failed(e.getMessage());
         }
 
-        return R.ok();
+        return R.ok(result);
     }
 }
\ No newline at end of file
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/model/ShopOrderRelease.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/model/ShopOrderRelease.java
index 7a1b5345..98e9eac0 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/model/ShopOrderRelease.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/model/ShopOrderRelease.java
@@ -63,6 +63,7 @@ public class ShopOrderRelease extends SfcDispatch {
     private BigDecimal completedQty;
     private String userName;
 
+    private String resourceWorkCenter;
     private LocalDateTime dispatchCompleteDate;
 
     /**
@@ -222,6 +223,14 @@ public class ShopOrderRelease extends SfcDispatch {
         this.completedQty = completedQty;
     }
 
+    public String getResourceWorkCenter() {
+        return resourceWorkCenter;
+    }
+
+    public void setResourceWorkCenter(String resourceWorkCenter) {
+        this.resourceWorkCenter = resourceWorkCenter;
+    }
+
     public String getUserName() {
         return userName;
     }
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/SfcDispatchService.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/SfcDispatchService.java
index aecfc5ea..1c8f15db 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/SfcDispatchService.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/SfcDispatchService.java
@@ -7,6 +7,7 @@ import com.foreverwin.mesnac.dispatch.model.ShopOrderRelease;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -100,4 +101,13 @@ public interface SfcDispatchService extends IService<SfcDispatch> {
      * @param multipartFile
      */
     Boolean importDispatch(String site, String user, String fileType, StringBuffer message, MultipartFile multipartFile) throws Exception;
+
+    /**
+     * 甘特图数据查询
+     *
+     * @param site
+     * @param shopOrderRelease
+     * @return
+     */
+    Map<String, Object> ganttList(String site, ShopOrderRelease shopOrderRelease);
 }
\ No newline at end of file
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 a357a6b5..d484c17a 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
@@ -1,6 +1,9 @@
 package com.foreverwin.mesnac.dispatch.service;
 
+import com.foreverwin.mesnac.dispatch.dto.RouterDTO;
 import com.foreverwin.mesnac.dispatch.model.ShopOrderRelease;
+import com.foreverwin.mesnac.meapi.model.Sfc;
+import com.foreverwin.mesnac.meapi.model.ShopOrder;
 
 import java.util.List;
 
@@ -21,6 +24,20 @@ import java.util.List;
 
 public interface ShopOrderReleaseService {
 
+    /**
+     * 查询工艺路线工艺步骤
+     *
+     * @param routerBo
+     * @return
+     */
+    List<RouterDTO> selectShopOrderRouter(String routerBo);
+
+    /**
+     * 查询工单信息
+     *
+     * @param shopOrderRelease
+     * @return
+     */
     List<ShopOrderRelease> findShopOrderList(ShopOrderRelease shopOrderRelease);
 
     /**
@@ -47,4 +64,16 @@ public interface ShopOrderReleaseService {
      * @param shopOrderList
      */
     void dispatchRefresh(String site, String user, List<ShopOrderRelease> shopOrderList);
+
+    /**
+     * 保存派工数据
+     *
+     * @param site
+     * @param user
+     * @param workCenter
+     * @param shopOrderModel
+     * @param sfcModel
+     * @param routerList
+     */
+    void sfcDispatch(String site, String user, String workCenter, ShopOrder shopOrderModel, Sfc sfcModel, List<RouterDTO> routerList);
 }
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 5aa8cb75..c6fd58f1 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
@@ -1,5 +1,8 @@
 package com.foreverwin.mesnac.dispatch.service.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.foreverwin.mesnac.common.constant.Constants;
 import com.foreverwin.mesnac.common.dto.SfcDispatchDto;
@@ -7,21 +10,28 @@ import com.foreverwin.mesnac.common.enums.DispatchStatusEnum;
 import com.foreverwin.mesnac.common.enums.HandleEnum;
 import com.foreverwin.mesnac.common.service.ProdReadyTaskService;
 import com.foreverwin.mesnac.common.service.SfcDispatchCommonService;
+import com.foreverwin.mesnac.common.util.DateUtil;
 import com.foreverwin.mesnac.common.util.ExcelUtils;
 import com.foreverwin.mesnac.common.util.StringUtil;
+import com.foreverwin.mesnac.dispatch.dto.RouterDTO;
+import com.foreverwin.mesnac.dispatch.dto.WorkCenterWorkTimeDTO;
 import com.foreverwin.mesnac.dispatch.mapper.SfcDispatchMapper;
 import com.foreverwin.mesnac.dispatch.model.CallItem;
 import com.foreverwin.mesnac.dispatch.model.SfcDispatch;
 import com.foreverwin.mesnac.dispatch.model.ShopOrderRelease;
 import com.foreverwin.mesnac.dispatch.model.UserResource;
-import com.foreverwin.mesnac.dispatch.service.CallItemService;
-import com.foreverwin.mesnac.dispatch.service.SfcDispatchService;
-import com.foreverwin.mesnac.dispatch.service.UserResourceService;
-import com.foreverwin.mesnac.meapi.service.ResrceService;
+import com.foreverwin.mesnac.dispatch.service.*;
+import com.foreverwin.mesnac.meapi.dto.WorkCenterLinkDTO;
+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.service.*;
 import com.foreverwin.mesnac.meapi.util.StringUtils;
+import com.foreverwin.modular.core.exception.BaseException;
 import com.foreverwin.modular.core.exception.BusinessException;
 import com.foreverwin.modular.core.util.CommonMethods;
 import org.apache.commons.fileupload.FileItem;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,9 +41,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -48,17 +56,28 @@ import java.util.stream.Collectors;
 @Transactional(rollbackFor = Exception.class)
 public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDispatch> implements SfcDispatchService, SfcDispatchCommonService {
 
-
+    @Autowired
+    private SfcService sfcService;
+    @Autowired
+    private RouterService routerService;
     @Autowired
     private ResrceService resourceService;
     @Autowired
     private CallItemService callItemService;
     @Autowired
+    private ShopOrderService shopOrderService;
+    @Autowired
     private SfcDispatchMapper sfcDispatchMapper;
     @Autowired
     private UserResourceService userResourceService;
     @Autowired
     private ProdReadyTaskService prodReadyTaskService;
+    @Autowired
+    private ShopOrderReleaseService shopOrderReleaseService;
+    @Autowired
+    private WorkCenterMemberService workCenterMemberService;
+    @Autowired
+    private ProductionCalendarService productionCalendarService;
 
     @Override
     public List<SfcDispatch> findSfcDispatch(String site, String sfc, String operation, String stepId) {
@@ -222,6 +241,29 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
         return this.sfcDispatch(site, user, DispatchStatusEnum.IMPORT.getCode(), message, sfcDispatchList);
     }
 
+    @Override
+    public Map<String, Object> ganttList(String site, ShopOrderRelease shopOrderRelease) {
+        Map<String, Object> map = new HashMap<>();
+
+        //查询派工数据
+        List<ShopOrderRelease> scheduleList = this.findSfcDispatchList(shopOrderRelease);
+        if (scheduleList == null || scheduleList.size() <= 0) {
+            return map;
+        }
+        map.put("schedules", scheduleList);
+
+        Set<String> workCenterList = new TreeSet<>();
+        scheduleList.forEach(s -> {
+            if (s.getWorkCenter() != null) {
+                workCenterList.add(StringUtils.trimHandle(s.getWorkCenter()));
+            }
+        });
+
+        Map<String, Map<String, List<WorkCenterWorkTimeDTO>>> processedMap = this.processWorkCenterWorkTimes(site, workCenterList, shopOrderRelease.getStartFromDate(), shopOrderRelease.getStartToDate());
+        map.put("workCenterWorkTimes", processedMap);
+
+        return map;
+    }
 
 
     public String importDispatch(FileItem fileItem, HttpServletRequest httpServletRequest) {
@@ -441,6 +483,38 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
         return flag;
     }
 
+    @Override
+    public void saveSfcDispatch(String site, String user, String workCenter, String sfc, String shopOrder, String routerBo) {
+        //查询工单信息
+        String shopOrderBo = HandleEnum.SHOP_ORDER.getHandle(site, shopOrder);
+        ShopOrder shopOrderModel = shopOrderService.getById(shopOrderBo);
+        if (shopOrderModel == null) {
+            throw new BaseException("工单[" + shopOrder + "]不存在");
+        }
+
+        //查询生产批次信息
+        String sfcBo = HandleEnum.SFC.getHandle(site, sfc);
+        Sfc sfcModel =  sfcService.getById(sfcBo);
+        if (sfcModel == null) {
+            throw new BaseException("生产批次[" + sfc + "]不存在");
+        }
+
+        //查询工艺路线
+        Router routerModel = routerService.getById(routerBo);
+        if (routerModel == null) {
+            throw new BaseException("工艺路线[" +StringUtils.trimHandle(routerBo)+ "]不存在");
+        }
+
+        //查询工艺路线详细
+        List<RouterDTO> routerList = shopOrderReleaseService.selectShopOrderRouter(routerBo);
+        if (routerList == null || routerList.size() <= 0) {
+            throw new BaseException("工艺路线[" +StringUtils.trimHandle(routerBo)+ "]主数据不完整,请确认");
+        }
+
+
+        shopOrderReleaseService.sfcDispatch(site, user, workCenter, shopOrderModel, sfcModel, routerList);
+    }
+
     @Override
     public void updateSfcDispatchStatus(String site, String user, String dispatchNo, String dispatchStatus) {
         LocalDateTime nowDateTime = LocalDateTime.now();
@@ -459,4 +533,126 @@ public class SfcDispatchServiceImpl extends ServiceImpl<SfcDispatchMapper, SfcDi
         String site = CommonMethods.getSite();
         return sfcDispatchMapper.findSfcDispatchBySfc(site,sfcDispatch);
     }
+
+    public Map<String, Map<String, List<WorkCenterWorkTimeDTO>>> processWorkCenterWorkTimes(String site, Set<String> workCenterList, Date startDate, Date endDate) {
+
+        // 设备对应的工作中心
+        List<WorkCenterLinkDTO> workCenterLinkDTOList = workCenterMemberService.listWorkCenterLink(site);
+        String startDateId = DateUtil.formatDate(startDate);
+        String endDateId = DateUtil.formatDate(endDate);
+        List<DateTime> dateList = cn.hutool.core.date.DateUtil.rangeToList(cn.hutool.core.date.DateUtil.beginOfDay(startDate), cn.hutool.core.date.DateUtil.beginOfDay(endDate), DateField.DAY_OF_YEAR);
+
+        List<WorkCenterWorkTimeDTO> workCenterWorkTimeDTOList = productionCalendarService.listWorkTimeByRange(site, startDateId, endDateId);
+        // workCenter->dateId: List<WorkCenterWorkTimeDTO>
+        Map<String, Map<String, List<WorkCenterWorkTimeDTO>>> map = new HashMap<>();
+        for (WorkCenterWorkTimeDTO workCenterWorkTimeDTO : workCenterWorkTimeDTOList) {
+            Map<String, List<WorkCenterWorkTimeDTO>> dateIdMap = map.get(workCenterWorkTimeDTO.getWorkCenter());
+            if (dateIdMap == null) {
+                dateIdMap = new HashMap<>();
+                List<WorkCenterWorkTimeDTO> newList = new ArrayList<>();
+                newList.add(workCenterWorkTimeDTO);
+                dateIdMap.put(workCenterWorkTimeDTO.getDateId(), newList);
+                map.put(workCenterWorkTimeDTO.getWorkCenter(), dateIdMap);
+            } else {
+                List<WorkCenterWorkTimeDTO> existsDateIdList = dateIdMap.get(workCenterWorkTimeDTO.getDateId());
+                if (existsDateIdList == null) {
+                    existsDateIdList = new ArrayList<>();
+                    dateIdMap.put(workCenterWorkTimeDTO.getDateId(), existsDateIdList);
+                }
+                existsDateIdList.add(workCenterWorkTimeDTO);
+            }
+        }
+        for (Map.Entry<String, Map<String, List<WorkCenterWorkTimeDTO>>> entry : map.entrySet()) {
+            Map<String, List<WorkCenterWorkTimeDTO>> map1 = entry.getValue();
+            for (Map.Entry<String, List<WorkCenterWorkTimeDTO>> entry1 : map1.entrySet()) {
+                entry1.setValue(this.processWorkingTime(entry1.getValue()));
+            }
+        }
+        // 根据设备工作中心依次向上查找父工作中心,获取设备工作中心全部的工作日历设定(子工作中心未设定的继续找父工作中心,如果有则补上)
+        Map<String, Map<String, List<WorkCenterWorkTimeDTO>>> processedMap = new HashMap<>();
+        for (String workCenter : workCenterList) {
+            Map<String, List<WorkCenterWorkTimeDTO>> dateIdMap = map.get(workCenter);
+            if (dateIdMap == null) {
+                dateIdMap = new HashMap<>();
+                map.put(workCenter, dateIdMap);
+            }
+            processedMap.put(workCenter, dateIdMap);
+            while (dateIdMap.size() < dateList.size()) {
+                // 查找上级工作中心
+                workCenter = getParentWorkCenter(workCenter, workCenterLinkDTOList);
+                if (StrUtil.isBlank(workCenter)) {
+                    break;
+                }
+                Map<String, List<WorkCenterWorkTimeDTO>> parentDateIdMap = map.get(workCenter);
+                if (parentDateIdMap != null) {
+                    for (Map.Entry<String, List<WorkCenterWorkTimeDTO>> entry : parentDateIdMap.entrySet()) {
+                        dateIdMap.putIfAbsent(entry.getKey(), entry.getValue());
+                    }
+                }
+            }
+        }
+        return processedMap;
+    }
+
+    private String getParentWorkCenter(String workCenter, List<WorkCenterLinkDTO> workCenterLinkDTOList) {
+        for (WorkCenterLinkDTO workCenterLinkDTO : workCenterLinkDTOList) {
+            if (workCenterLinkDTO.getWorkCenter().equals(workCenter)) {
+                return workCenterLinkDTO.getParent();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 跨天时间拆分后按开始时间排序
+     *
+     * @param workCenterWorkTimeDTOList
+     */
+    private List<WorkCenterWorkTimeDTO> processWorkingTime(List<WorkCenterWorkTimeDTO> workCenterWorkTimeDTOList) {
+
+        List<WorkCenterWorkTimeDTO> result = new ArrayList<>();
+        for (int i = 0; i < workCenterWorkTimeDTOList.size(); i++) {
+            WorkCenterWorkTimeDTO workCenterWorkTimeDTO = workCenterWorkTimeDTOList.get(i);
+            String startTime = workCenterWorkTimeDTO.getStartTime();
+            String endTime = workCenterWorkTimeDTO.getEndTime();
+            if (StrUtil.isBlank(startTime) && StrUtil.isBlank(startTime)) {
+                // 认定为休息日
+                result.add(new WorkCenterWorkTimeDTO());
+            }
+            if (!StringUtils.isBlank(startTime) && startTime.indexOf(":") > 0 && !StringUtils.isBlank(endTime) && endTime.indexOf(":") > 0) {
+
+                int startHour = Integer.parseInt(startTime.split(":")[0]);
+                int startMinute = Integer.parseInt(startTime.split(":")[1]);
+                int endHour = Integer.parseInt(endTime.split(":")[0]);
+                int endMinute = Integer.parseInt(endTime.split(":")[1]);
+                int startTotalMinutes = startHour * 60 + startMinute;
+                int endTotalMinutes = endHour * 60 + endMinute;
+
+                if (startTotalMinutes > endTotalMinutes) {
+                    // 时间拆分
+                    WorkCenterWorkTimeDTO workCenterWorkTime1 = new WorkCenterWorkTimeDTO();
+                    BeanUtils.copyProperties(workCenterWorkTimeDTO, workCenterWorkTime1);
+                    workCenterWorkTime1.setStartMinute(startTotalMinutes);
+                    workCenterWorkTime1.setEndMinute(24 * 60); // 24:00
+                    workCenterWorkTime1.setEndTime("24:00");
+                    result.add(workCenterWorkTime1);
+
+                    WorkCenterWorkTimeDTO workCenterWorkTime2 = new WorkCenterWorkTimeDTO();
+                    BeanUtils.copyProperties(workCenterWorkTimeDTO, workCenterWorkTime2);
+                    workCenterWorkTime2.setStartMinute(0); // 00:00
+                    workCenterWorkTime2.setStartTime("00:00");
+                    workCenterWorkTime2.setEndMinute(endTotalMinutes);
+                    result.add(workCenterWorkTime2);
+                } else {
+                    WorkCenterWorkTimeDTO normalWorkCenterWorkTime = new WorkCenterWorkTimeDTO();
+                    BeanUtils.copyProperties(workCenterWorkTimeDTO, normalWorkCenterWorkTime);
+                    normalWorkCenterWorkTime.setStartMinute(startTotalMinutes);
+                    normalWorkCenterWorkTime.setEndMinute(endTotalMinutes);
+                    result.add(normalWorkCenterWorkTime);
+                }
+                result.sort(Comparator.comparing(WorkCenterWorkTimeDTO::getStartMinute));
+            }
+        }
+        return result;
+    }
 }
\ No newline at end of file
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 7e607884..1da336de 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
@@ -68,6 +68,11 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService {
     @Autowired
     private ShopOrderReleaseMapper shopOrderReleaseMapper;
 
+    @Override
+    public List<RouterDTO> selectShopOrderRouter(String routerBo) {
+        return shopOrderReleaseMapper.selectShopOrderRouter(routerBo);
+    }
+
     @Override
     public List<ShopOrderRelease> findShopOrderList(ShopOrderRelease shopOrderRelease) {
         return shopOrderReleaseMapper.findShopOrderList(shopOrderRelease);
@@ -170,6 +175,7 @@ public class ShopOrderReleaseServiceImpl implements ShopOrderReleaseService {
 
     //------------------------------------------------------------------------------------------------------------------
     /**派工--按工序**/
+    @Override
     public void sfcDispatch(String site, String user, String workCenter, ShopOrder shopOrderModel, Sfc sfcModel, List<RouterDTO> routerList) {
         LocalDateTime nowDate = LocalDateTime.now();
 
diff --git a/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml b/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
index ebb9a183..432ed72b 100644
--- a/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
+++ b/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
@@ -66,6 +66,7 @@
         <result column="USER_NAME" property="userName" />
         <result column="COMPONENT_DESCRIPTION" property="componentDescription" />
         <result column="OPERATION_DESCRIPTION" property="operationDescription" />
+        <result column="RESOURCE_WORK_CENTER" property="resourceWorkCenter" />
     </resultMap>
 
 
@@ -995,7 +996,7 @@
                     CASE WHEN OTHER_1 = 'true' THEN SD.DISPATCH_QTY ELSE 0 END COMPLETED_QTY, SD.PLANNED_START_DATE, SD.PLANNED_COMP_DATE, SD.WORK_CENTER, SD.IS_DISPATCH,
                     SD.ACTUAL_START_DATE, SD.ACTUAL_COMPLETE_DATE, SD.REMARK, SD.DISPATCH_SEQ, SD.DISPATCH_SEQ-1 BEFORE_SEQ, SD.DISPATCH_SEQ+1 AFTER_SEQ,
                     CASE WHEN SD.TURN_OPERATION = 'true' THEN N'是' ELSE N'否' END TURN_OPERATION, SD.BLANKING_SIZE,
-                    CASE WHEN IM.LOT_SIZE = 1 THEN N'是' ELSE N'否' END IS_MAJOR
+                    CASE WHEN IM.LOT_SIZE = 1 THEN N'是' ELSE N'否' END IS_MAJOR, WR.WORK_CENTER RESOURCE_WORK_CENTER
             FROM Z_SFC_DISPATCH SD
             INNER JOIN SHOP_ORDER SO ON SO.SITE = SD.SITE AND SO.SHOP_ORDER = SD.SHOP_ORDER
             LEFT JOIN CUSTOM_FIELDS C1 ON C1.HANDLE = SO.HANDLE AND C1."ATTRIBUTE" = 'WORK_ORDER'
@@ -1007,6 +1008,8 @@
             INNER JOIN BOM_COMPONENT BC ON BC.BOM_BO = SO.BOM_BO
             INNER JOIN ITEM CP ON CP.HANDLE = BC.COMPONENT_GBO
             LEFT JOIN ITEM_T CPT ON CPT.ITEM_BO = CP.HANDLE AND CPT.LOCALE = 'zh'
+            LEFT JOIN WORK_CENTER_MEMBER WCM ON WCM.WORK_CENTER_OR_RESOURCE_GBO = 'ResourceBO:' || SD.SITE || ',' || SD.RESRCE
+            LEFT JOIN WORK_CENTER WR ON WR.HANDLE = WCM.WORK_CENTER_BO
             WHERE SD.SITE = #{site}
             <if test="workCenter != null and workCenter != ''">
                 AND SD.WORK_CENTER = #{workCenter}
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/WorkCenterLinkDTO.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/WorkCenterLinkDTO.java
new file mode 100644
index 00000000..b73ea2d9
--- /dev/null
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/dto/WorkCenterLinkDTO.java
@@ -0,0 +1,34 @@
+package com.foreverwin.mesnac.meapi.dto;
+
+import com.foreverwin.mesnac.meapi.model.WorkCenter;
+
+public class WorkCenterLinkDTO extends WorkCenter {
+
+    private String parent;
+    private String parentBo;
+    private WorkCenterLinkDTO workCenterParent;
+
+    public String getParent() {
+        return parent;
+    }
+
+    public void setParent(String parent) {
+        this.parent = parent;
+    }
+
+    public String getParentBo() {
+        return parentBo;
+    }
+
+    public void setParentBo(String parentBo) {
+        this.parentBo = parentBo;
+    }
+
+    public WorkCenterLinkDTO getWorkCenterParent() {
+        return workCenterParent;
+    }
+
+    public void setWorkCenterParent(WorkCenterLinkDTO workCenterParent) {
+        this.workCenterParent = workCenterParent;
+    }
+}
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/WorkCenterMemberMapper.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/WorkCenterMemberMapper.java
index 8e42e2e6..fb2ea263 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/WorkCenterMemberMapper.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/WorkCenterMemberMapper.java
@@ -1,10 +1,13 @@
 package com.foreverwin.mesnac.meapi.mapper;
 
+import com.foreverwin.mesnac.meapi.dto.WorkCenterLinkDTO;
 import com.foreverwin.mesnac.meapi.model.WorkCenterMember;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -18,4 +21,5 @@ public interface WorkCenterMemberMapper extends BaseMapper<WorkCenterMember> {
 
     Integer selectMaxSeq(@Param("workCenterBo") String workCenterBo);
 
+    List<WorkCenterLinkDTO> listWorkCenterLink(@Param("site") String site);
 }
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/WorkCenterMemberService.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/WorkCenterMemberService.java
index d88ed3e7..39503f05 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/WorkCenterMemberService.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/WorkCenterMemberService.java
@@ -2,6 +2,7 @@ package com.foreverwin.mesnac.meapi.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.meapi.dto.WorkCenterLinkDTO;
 import com.foreverwin.mesnac.meapi.model.WorkCenterMember;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.foreverwin.modular.core.util.FrontPage;
@@ -30,4 +31,6 @@ public interface WorkCenterMemberService extends IService<WorkCenterMember> {
     List<WorkCenterMember> selectList(QueryWrapper queryWrapper);
 
     Integer selectMaxSeq(String workCenterBo);
+
+    List<WorkCenterLinkDTO> listWorkCenterLink(String site);
 }
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/WorkCenterMemberServiceImpl.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/WorkCenterMemberServiceImpl.java
index 0470d846..0122ee5d 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/WorkCenterMemberServiceImpl.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/WorkCenterMemberServiceImpl.java
@@ -1,5 +1,6 @@
 package com.foreverwin.mesnac.meapi.service.impl;
 
+import com.foreverwin.mesnac.meapi.dto.WorkCenterLinkDTO;
 import com.foreverwin.modular.core.util.FrontPage;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -51,4 +52,9 @@ public class WorkCenterMemberServiceImpl extends ServiceImpl<WorkCenterMemberMap
     public Integer selectMaxSeq(String workCenterBo) {
         return workCenterMemberMapper.selectMaxSeq(workCenterBo);
     }
+
+    @Override
+    public List<WorkCenterLinkDTO> listWorkCenterLink(String site) {
+        return workCenterMemberMapper.listWorkCenterLink(site);
+    }
 }
\ No newline at end of file
diff --git a/meapi/src/main/resources/mapper/WorkCenterMemberMapper.xml b/meapi/src/main/resources/mapper/WorkCenterMemberMapper.xml
index e794583c..f2112264 100644
--- a/meapi/src/main/resources/mapper/WorkCenterMemberMapper.xml
+++ b/meapi/src/main/resources/mapper/WorkCenterMemberMapper.xml
@@ -306,4 +306,13 @@
         FROM WORK_CENTER_MEMBER
         WHERE WORK_CENTER_BO = #{workCenterBo}
     </select>
+
+    <select id="listWorkCenterLink" resultType="com.foreverwin.mesnac.meapi.dto.WorkCenterLinkDTO">
+        SELECT WC.HANDLE, WC.SITE, WC.WORK_CENTER, WC.ROUTER_BO, WC.CAN_BE_RELEASED_TO, WC.WC_CATEGORY, WC.STATUS_BO, WC.WC_TYPE, WC.ASSIGNMENT_ENFORCEMENT, WCM.WORK_CENTER_BO AS PARENT_BO, WCP.WORK_CENTER AS PARENT
+        FROM WORK_CENTER WC
+        LEFT JOIN WORK_CENTER_MEMBER WCM ON WCM.WORK_CENTER_OR_RESOURCE_GBO = WC.HANDLE AND WCM.PRIMARY_WORK_CENTER = 'true'
+        LEFT JOIN WORK_CENTER WCP
+          ON WCP.HANDLE = WCM.WORK_CENTER_BO
+        WHERE WC.SITE = #{site}
+    </select>
 </mapper>

From 9daa13c2e2daac74a5f6064fc4accc8a0e0a3ca1 Mon Sep 17 00:00:00 2001
From: Leon <3066758958@qq.com>
Date: Mon, 2 Aug 2021 17:37:07 +0800
Subject: [PATCH 5/8] =?UTF-8?q?=E6=B4=BE=E5=B7=A5=E4=BF=AE=E6=94=B9?=
 =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/foreverwin/mesnac/common/dto/SfcDispatchDto.java | 9 +++++++++
 .../dispatch/controller/SfcDispatchController.java       | 3 ++-
 .../mesnac/dispatch/mapper/SfcDispatchMapper.java        | 6 ++++++
 dispatch/src/main/resources/mapper/SfcDispatchMapper.xml | 3 +++
 4 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/common/src/main/java/com/foreverwin/mesnac/common/dto/SfcDispatchDto.java b/common/src/main/java/com/foreverwin/mesnac/common/dto/SfcDispatchDto.java
index 34746857..96bfb08f 100644
--- a/common/src/main/java/com/foreverwin/mesnac/common/dto/SfcDispatchDto.java
+++ b/common/src/main/java/com/foreverwin/mesnac/common/dto/SfcDispatchDto.java
@@ -174,6 +174,7 @@ public class SfcDispatchDto implements Serializable{
     private String isCompleted;
     private BigDecimal completedQty;
     private String userName;
+    private String resourceWorkCenter;
 
     private String status;
     private String locale;
@@ -584,6 +585,14 @@ public class SfcDispatchDto implements Serializable{
         this.userName = userName;
     }
 
+    public String getResourceWorkCenter() {
+        return resourceWorkCenter;
+    }
+
+    public void setResourceWorkCenter(String resourceWorkCenter) {
+        this.resourceWorkCenter = resourceWorkCenter;
+    }
+
     public String getLocale() {
         return locale;
     }
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
index 07b79f8c..f4a3cdfa 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/controller/SfcDispatchController.java
@@ -70,7 +70,7 @@ public class SfcDispatchController {
     @ResponseBody
     @GetMapping("getSfcDispatch")
     public R getSfcDispatch(String workCenter, String dispatchStatus, String item, String itemNumber, String workOrder, String shopOrder,
-                            String resrce, String resourceType, String operation, String sfc, String componentDescription, String turnOperation,
+                            String resrce, String resourceType, String operation, String sfc, String component, String componentDescription, String turnOperation,
                             String isDispatch, String startFromDate_S, String startToDate_S, String completeFromDate_S, String completeToDate_S) {
         List<ShopOrderRelease> list;
         try {
@@ -86,6 +86,7 @@ public class SfcDispatchController {
             shopOrderRelease.setResourceType(resourceType);
             shopOrderRelease.setOperation(operation);
             shopOrderRelease.setSfc(sfc);
+            shopOrderRelease.setComponent(component);
             shopOrderRelease.setComponentDescription(componentDescription);
             shopOrderRelease.setTurnOperation(turnOperation);
             shopOrderRelease.setIsDispatch(isDispatch);
diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/mapper/SfcDispatchMapper.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/mapper/SfcDispatchMapper.java
index 6cee0e1f..8334a760 100644
--- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/mapper/SfcDispatchMapper.java
+++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/mapper/SfcDispatchMapper.java
@@ -24,6 +24,12 @@ public interface SfcDispatchMapper extends BaseMapper<SfcDispatch> {
 
     List<SfcDispatch> findSfcDispatch(@Param("site") String site, @Param("sfc") String sfc, @Param("operation") String operation, @Param("stepId") String stepId);
 
+    /**
+     * 查询派工生产批次数据
+     *
+     * @param shopOrderRelease
+     * @return
+     */
     List<ShopOrderRelease> findSfcDispatchList(ShopOrderRelease shopOrderRelease);
 
     /**
diff --git a/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml b/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
index 432ed72b..9c6bc92a 100644
--- a/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
+++ b/dispatch/src/main/resources/mapper/SfcDispatchMapper.xml
@@ -1044,6 +1044,9 @@
             <if test="turnOperation != null and turnOperation != ''">
                 AND SD.TURN_OPERATION = #{turnOperation}
             </if>
+            <if test="component != null and component != ''">
+                AND CP.ITEM = #{component}
+            </if>
             <if test="componentDescription != null and componentDescription != ''">
                 AND CPT.DESCRIPTION LIKE '%' || #{componentDescription} || '%'
             </if>

From 78d90e78cea545b301eafef88e397a135a3d0d85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=98=89=E4=BC=9F?= <1724121454@qq.com>
Date: Mon, 2 Aug 2021 22:04:38 +0800
Subject: [PATCH 6/8] =?UTF-8?q?=E8=B4=A8=E9=87=8F=E5=BC=82=E5=B8=B8?=
 =?UTF-8?q?=E6=8F=90=E6=8A=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 meapi/src/main/resources/mapper/NcCodeMapper.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meapi/src/main/resources/mapper/NcCodeMapper.xml b/meapi/src/main/resources/mapper/NcCodeMapper.xml
index d389af87..e25daaf2 100644
--- a/meapi/src/main/resources/mapper/NcCodeMapper.xml
+++ b/meapi/src/main/resources/mapper/NcCodeMapper.xml
@@ -428,7 +428,7 @@
         LEFT JOIN NC_GROUP_MEMBER NGM ON NGM.NC_CODE_OR_GROUP_GBO = NC.HANDLE
         LEFT JOIN NC_GROUP NG ON NG.HANDLE = NGM.NC_GROUP_BO
         <where>
-            NC.SITE = #{site} AND NC.NC_CODE IN UPPER(#{ncCode})
+            NC.SITE = #{site} AND NC.NC_CODE IN UPPER(${ncCode})
         </where>
     </select>
 </mapper>

From 083a8379e500b8c3d8224405f904386a09dae3f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=98=89=E4=BC=9F?= <1724121454@qq.com>
Date: Mon, 2 Aug 2021 22:25:43 +0800
Subject: [PATCH 7/8] =?UTF-8?q?=E8=B4=A8=E9=87=8F=E5=BC=82=E5=B8=B8?=
 =?UTF-8?q?=E6=8F=90=E6=8A=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/foreverwin/mesnac/meapi/mapper/NcCodeMapper.java    | 2 +-
 .../mesnac/meapi/service/impl/NcCodeServiceImpl.java        | 6 +++++-
 meapi/src/main/resources/mapper/NcCodeMapper.xml            | 5 ++++-
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/NcCodeMapper.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/NcCodeMapper.java
index bff2bf4b..638b8ae5 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/NcCodeMapper.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/mapper/NcCodeMapper.java
@@ -39,5 +39,5 @@ public interface NcCodeMapper extends BaseMapper<NcCode> {
     List<NcCode> findNcCodeByNcGroup(@Param("ncGroup")NcGroup ncGroup);
 
 
-    List<NcCodeDto> findNcCodeDescriptionByNcCode(@Param("site")String site, @Param("locale")String locale, @Param("ncCode")String ncCode);
+    List<NcCodeDto> findNcCodeDescriptionByNcCode(@Param("site")String site, @Param("locale")String locale, @Param("ncCode")String[] ncCode);
 }
\ No newline at end of file
diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/NcCodeServiceImpl.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/NcCodeServiceImpl.java
index fa1e9033..e8b1b57c 100644
--- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/NcCodeServiceImpl.java
+++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/NcCodeServiceImpl.java
@@ -19,6 +19,7 @@ import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -86,7 +87,10 @@ public class NcCodeServiceImpl extends ServiceImpl<NcCodeMapper, NcCode> impleme
     public List<NcCodeDto> findNcCodeDescriptionByNcCode(String ncCode) {
         String site = CommonMethods.getSite();
         String locale = LocaleContextHolder.getLocale().getLanguage();
-        return ncCodeMapper.findNcCodeDescriptionByNcCode(site,locale,ncCode);
+        ArrayList<String> ncCodeList = new ArrayList<>();
+        String[] split = ncCode.split(",");
+
+        return ncCodeMapper.findNcCodeDescriptionByNcCode(site,locale,split);
     }
 
 
diff --git a/meapi/src/main/resources/mapper/NcCodeMapper.xml b/meapi/src/main/resources/mapper/NcCodeMapper.xml
index e25daaf2..f5408f42 100644
--- a/meapi/src/main/resources/mapper/NcCodeMapper.xml
+++ b/meapi/src/main/resources/mapper/NcCodeMapper.xml
@@ -428,7 +428,10 @@
         LEFT JOIN NC_GROUP_MEMBER NGM ON NGM.NC_CODE_OR_GROUP_GBO = NC.HANDLE
         LEFT JOIN NC_GROUP NG ON NG.HANDLE = NGM.NC_GROUP_BO
         <where>
-            NC.SITE = #{site} AND NC.NC_CODE IN UPPER(${ncCode})
+            NC.SITE = #{site} AND NC.NC_CODE IN
+            <foreach collection="ncCode" open="(" close=")" item="item" separator=",">
+                UPPER(#{item})
+            </foreach>
         </where>
     </select>
 </mapper>

From be05ddfdc4661ca6cf999965b143beb07c576221 Mon Sep 17 00:00:00 2001
From: philip <244793088@qq.com>
Date: Mon, 2 Aug 2021 23:59:45 +0800
Subject: [PATCH 8/8] =?UTF-8?q?=E8=BD=A6=E9=97=B4=E8=BD=AC=E5=85=A5?=
 =?UTF-8?q?=E8=BD=AC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../mesnac/meapi/mapper/SfcMapper.java        |   2 -
 .../WorkShopTransferController.java           | 140 +++++
 .../production/dto/WorkShopTransferDto.java   | 110 ++++
 .../mapper/WorkShopTransferMapper.java        |  21 +
 .../production/model/WorkShopTransfer.java    | 281 ++++++++++
 .../service/WorkShopTransferService.java      |  32 ++
 .../service/impl/SplitSfcServiceImpl.java     |   9 +-
 .../impl/WorkShopTransferServiceImpl.java     | 155 ++++++
 .../main/resources/mapper/SplitSfcMapper.xml  |   2 +-
 .../mapper/WorkShopTransferMapper.xml         | 513 ++++++++++++++++++
 10 files changed, 1261 insertions(+), 4 deletions(-)
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/controller/WorkShopTransferController.java
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/dto/WorkShopTransferDto.java
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/mapper/WorkShopTransferMapper.java
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/model/WorkShopTransfer.java
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/service/WorkShopTransferService.java
 create mode 100644 production/src/main/java/com/foreverwin/mesnac/production/service/impl/WorkShopTransferServiceImpl.java
 create mode 100644 production/src/main/resources/mapper/WorkShopTransferMapper.xml

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 cbcd832d..9dc9a0fe 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
@@ -28,8 +28,6 @@ public interface SfcMapper extends BaseMapper<Sfc> {
 
     SfcDto findSfcData(@Param("site") String site, @Param("sfc") String sfc);
 
-    Sfc findBySfc(@Param("sfc") Sfc sfc);
-
     IPage pageByResrce(Page<Sfc> pagePlus,@Param("ew") QueryWrapper<SfcDto> queryWrapper,@Param("locale")String locale);
 
     String findOperationBySfc(@Param("site")String site,@Param("sfc")String sfc);
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/controller/WorkShopTransferController.java b/production/src/main/java/com/foreverwin/mesnac/production/controller/WorkShopTransferController.java
new file mode 100644
index 00000000..706f738d
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/controller/WorkShopTransferController.java
@@ -0,0 +1,140 @@
+package com.foreverwin.mesnac.production.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.production.model.WorkShopTransfer;
+import com.foreverwin.mesnac.production.service.WorkShopTransferService;
+import com.foreverwin.modular.core.util.FrontPage;
+import com.foreverwin.modular.core.util.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ * @author Philip
+ * @since 2021-08-02
+ */
+@RestController
+@RequestMapping("/Z-WORK-SHOP-TRANSFER")
+public class WorkShopTransferController {
+
+    @Autowired
+    public WorkShopTransferService workShopTransferService;
+
+    @ResponseBody
+    @GetMapping("/sfcEnter")
+    public R sfcEnter(WorkShopTransfer workShopTransfer) {
+        return R.ok(workShopTransferService.sfcEnter(workShopTransfer));
+    }
+
+    @ResponseBody
+    @GetMapping("/transfer")
+    public R transfer(WorkShopTransfer workShopTransfer) {
+        return R.ok(workShopTransferService.transfer(workShopTransfer));
+    }
+
+    /**
+    * 根据id查询
+    *
+    * @param id 主键
+    * @return
+    */
+    @ResponseBody
+    @GetMapping("/{id:.+}")
+    public R getWorkShopTransferById(@PathVariable String id) {
+        return R.ok( workShopTransferService.getById(id));
+    }
+
+    /**
+     * 查询所有数据
+     *
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("")
+    public R getWorkShopTransferList(WorkShopTransfer workShopTransfer){
+        List<WorkShopTransfer> result;
+        QueryWrapper<WorkShopTransfer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(workShopTransfer);
+        result = workShopTransferService.list(queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 分页查询数据
+     *
+     * @param frontPage  分页信息
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("/page")
+    public R page(FrontPage<WorkShopTransfer> frontPage, WorkShopTransfer workShopTransfer){
+        IPage result;
+        QueryWrapper<WorkShopTransfer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(workShopTransfer);
+        if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) {
+            //TODO modify global query
+            queryWrapper.lambda().and(wrapper -> wrapper
+                .like(WorkShopTransfer::getHandle, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getSite, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getWorkCenter, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getSfc, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getShopOrder, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getItem, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getLastOperation, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getStepId, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getOperation, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getType, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getIsOutSource, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getComments, frontPage.getGlobalQuery())
+                .or().like(WorkShopTransfer::getCreateUser, frontPage.getGlobalQuery())
+    );
+        }
+        result = workShopTransferService.page(frontPage.getPagePlus(), queryWrapper);
+        return R.ok(result);
+    }
+
+    /**
+     * 新增
+     * @param workShopTransfer  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PostMapping
+    public R save(@RequestBody WorkShopTransfer workShopTransfer) {
+        return R.ok(workShopTransferService.save(workShopTransfer));
+    }
+
+    /**
+     * 修改
+     * @param workShopTransfer  传递的实体
+     * @return  null 失败  实体成功
+     */
+    @PutMapping
+    public R updateById(@RequestBody WorkShopTransfer workShopTransfer) {
+        return R.ok(workShopTransferService.updateById(workShopTransfer));
+    }
+
+    /**
+     * 根据id删除对象
+     * @param id  实体ID
+     * @return 0 失败  1 成功
+     */
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}")
+    public R removeById(@PathVariable("id") String id){
+        return R.ok(workShopTransferService.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(workShopTransferService.removeByIds(ids));
+    }
+}
\ No newline at end of file
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/dto/WorkShopTransferDto.java b/production/src/main/java/com/foreverwin/mesnac/production/dto/WorkShopTransferDto.java
new file mode 100644
index 00000000..9164444f
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/dto/WorkShopTransferDto.java
@@ -0,0 +1,110 @@
+package com.foreverwin.mesnac.production.dto;
+
+import com.foreverwin.mesnac.production.model.WorkShopTransfer;
+
+import java.math.BigDecimal;
+
+public class WorkShopTransferDto extends WorkShopTransfer {
+    private String lastOperation;
+    private String lastOperationDesc;
+    private String map;
+    private String workOrder;
+    private String itemDesc;
+    private String itemNumber;
+    private String operationDesc;
+    private BigDecimal qty;
+    private String status;
+    private String dispatchNo;
+    private String resrce;
+
+    public String getResrce() {
+        return resrce;
+    }
+
+    public void setResrce(String resrce) {
+        this.resrce = resrce;
+    }
+
+    public String getDispatchNo() {
+        return dispatchNo;
+    }
+
+    public void setDispatchNo(String dispatchNo) {
+        this.dispatchNo = dispatchNo;
+    }
+
+    @Override
+    public String getLastOperation() {
+        return lastOperation;
+    }
+
+    @Override
+    public void setLastOperation(String lastOperation) {
+        this.lastOperation = lastOperation;
+    }
+
+    public String getLastOperationDesc() {
+        return lastOperationDesc;
+    }
+
+    public void setLastOperationDesc(String lastOperationDesc) {
+        this.lastOperationDesc = lastOperationDesc;
+    }
+
+    public String getMap() {
+        return map;
+    }
+
+    public void setMap(String map) {
+        this.map = map;
+    }
+
+    public String getWorkOrder() {
+        return workOrder;
+    }
+
+    public void setWorkOrder(String workOrder) {
+        this.workOrder = workOrder;
+    }
+
+    public String getItemDesc() {
+        return itemDesc;
+    }
+
+    public void setItemDesc(String itemDesc) {
+        this.itemDesc = itemDesc;
+    }
+
+    public String getItemNumber() {
+        return itemNumber;
+    }
+
+    public void setItemNumber(String itemNumber) {
+        this.itemNumber = itemNumber;
+    }
+
+    public String getOperationDesc() {
+        return operationDesc;
+    }
+
+    public void setOperationDesc(String operationDesc) {
+        this.operationDesc = operationDesc;
+    }
+
+    @Override
+    public BigDecimal getQty() {
+        return qty;
+    }
+
+    public void setQty(BigDecimal qty) {
+        this.qty = qty;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/mapper/WorkShopTransferMapper.java b/production/src/main/java/com/foreverwin/mesnac/production/mapper/WorkShopTransferMapper.java
new file mode 100644
index 00000000..54869e04
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/mapper/WorkShopTransferMapper.java
@@ -0,0 +1,21 @@
+package com.foreverwin.mesnac.production.mapper;
+
+import com.foreverwin.mesnac.production.dto.WorkShopTransferDto;
+import com.foreverwin.mesnac.production.model.WorkShopTransfer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 车间转移记录 Mapper 接口
+ * </p>
+ *
+ * @author Philip
+ * @since 2021-07-30
+ */
+@Repository
+public interface WorkShopTransferMapper extends BaseMapper<WorkShopTransfer> {
+
+    WorkShopTransferDto getSfcData(@Param("site") String site,@Param("sfc") String sfc);
+}
\ No newline at end of file
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/model/WorkShopTransfer.java b/production/src/main/java/com/foreverwin/mesnac/production/model/WorkShopTransfer.java
new file mode 100644
index 00000000..2edda834
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/model/WorkShopTransfer.java
@@ -0,0 +1,281 @@
+package com.foreverwin.mesnac.production.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 车间转移记录
+ * </p>
+ *
+ * @author Philip
+ * @since 2021-08-02
+ */
+
+@TableName("Z_WORK_SHOP_TRANSFER")
+
+public class WorkShopTransfer extends Model<WorkShopTransfer> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+   @TableId(value = "HANDLE", type = IdType.INPUT)
+   private String handle;
+    /**
+     * 站点
+     */
+   @TableField("SITE")
+   private String site;
+    /**
+     * 车间
+     */
+   @TableField("WORK_CENTER")
+   private String workCenter;
+    /**
+     * 产品条码
+     */
+   @TableField("SFC")
+   private String sfc;
+    /**
+     * 工单
+     */
+   @TableField("SHOP_ORDER")
+   private String shopOrder;
+    /**
+     * 物料
+     */
+   @TableField("ITEM")
+   private String item;
+    /**
+     * 上工序
+     */
+   @TableField("LAST_OPERATION")
+   private String lastOperation;
+    /**
+     * 步骤
+     */
+   @TableField("STEP_ID")
+   private String stepId;
+    /**
+     * 转入或转出工序
+     */
+   @TableField("OPERATION")
+   private String operation;
+    /**
+     * 数量
+     */
+   @TableField("QTY")
+   private BigDecimal qty;
+    /**
+     * 类型:转入转出
+     */
+   @TableField("TYPE")
+   private String type;
+    /**
+     * 是否外协工序
+     */
+   @TableField("IS_OUT_SOURCE")
+   private String isOutSource;
+    /**
+     * 备注
+     */
+   @TableField("COMMENTS")
+   private String comments;
+    /**
+     * 创建人
+     */
+   @TableField("CREATE_USER")
+   private String createUser;
+    /**
+     * 创建时间
+     */
+   @TableField("CREATED_DATE_TIME")
+   private LocalDateTime createdDateTime;
+
+
+   public String getHandle() {
+      return handle;
+   }
+
+   public void setHandle(String handle) {
+      this.handle = handle;
+   }
+
+   public String getSite() {
+      return site;
+   }
+
+   public void setSite(String site) {
+      this.site = site;
+   }
+
+   public String getWorkCenter() {
+      return workCenter;
+   }
+
+   public void setWorkCenter(String workCenter) {
+      this.workCenter = workCenter;
+   }
+
+   public String getSfc() {
+      return sfc;
+   }
+
+   public void setSfc(String sfc) {
+      this.sfc = sfc;
+   }
+
+   public String getShopOrder() {
+      return shopOrder;
+   }
+
+   public void setShopOrder(String shopOrder) {
+      this.shopOrder = shopOrder;
+   }
+
+   public String getItem() {
+      return item;
+   }
+
+   public void setItem(String item) {
+      this.item = item;
+   }
+
+   public String getLastOperation() {
+      return lastOperation;
+   }
+
+   public void setLastOperation(String lastOperation) {
+      this.lastOperation = lastOperation;
+   }
+
+   public String getStepId() {
+      return stepId;
+   }
+
+   public void setStepId(String stepId) {
+      this.stepId = stepId;
+   }
+
+   public String getOperation() {
+      return operation;
+   }
+
+   public void setOperation(String operation) {
+      this.operation = operation;
+   }
+
+   public BigDecimal getQty() {
+      return qty;
+   }
+
+   public void setQty(BigDecimal qty) {
+      this.qty = qty;
+   }
+
+   public String getType() {
+      return type;
+   }
+
+   public void setType(String type) {
+      this.type = type;
+   }
+
+   public String getIsOutSource() {
+      return isOutSource;
+   }
+
+   public void setIsOutSource(String isOutSource) {
+      this.isOutSource = isOutSource;
+   }
+
+   public String getComments() {
+      return comments;
+   }
+
+   public void setComments(String comments) {
+      this.comments = comments;
+   }
+
+   public String getCreateUser() {
+      return createUser;
+   }
+
+   public void setCreateUser(String createUser) {
+      this.createUser = createUser;
+   }
+
+   public LocalDateTime getCreatedDateTime() {
+      return createdDateTime;
+   }
+
+   public void setCreatedDateTime(LocalDateTime createdDateTime) {
+      this.createdDateTime = createdDateTime;
+   }
+
+public static final String HANDLE = "HANDLE";
+
+public static final String SITE = "SITE";
+
+public static final String WORK_CENTER = "WORK_CENTER";
+
+public static final String SFC = "SFC";
+
+public static final String SHOP_ORDER = "SHOP_ORDER";
+
+public static final String ITEM = "ITEM";
+
+public static final String LAST_OPERATION = "LAST_OPERATION";
+
+public static final String STEP_ID = "STEP_ID";
+
+public static final String OPERATION = "OPERATION";
+
+public static final String QTY = "QTY";
+
+public static final String TYPE = "TYPE";
+
+public static final String IS_OUT_SOURCE = "IS_OUT_SOURCE";
+
+public static final String COMMENTS = "COMMENTS";
+
+public static final String CREATE_USER = "CREATE_USER";
+
+public static final String CREATED_DATE_TIME = "CREATED_DATE_TIME";
+
+
+   @Override
+   protected Serializable pkVal() {
+      return this.handle;
+   }
+
+   @Override
+   public String toString() {
+      return "WorkShopTransfer{" +
+         "handle = " + handle +
+         ", site = " + site +
+         ", workCenter = " + workCenter +
+         ", sfc = " + sfc +
+         ", shopOrder = " + shopOrder +
+         ", item = " + item +
+         ", lastOperation = " + lastOperation +
+         ", stepId = " + stepId +
+         ", operation = " + operation +
+         ", qty = " + qty +
+         ", type = " + type +
+         ", isOutSource = " + isOutSource +
+         ", comments = " + comments +
+         ", createUser = " + createUser +
+         ", createdDateTime = " + createdDateTime +
+         "}";
+   }
+}
\ No newline at end of file
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/WorkShopTransferService.java b/production/src/main/java/com/foreverwin/mesnac/production/service/WorkShopTransferService.java
new file mode 100644
index 00000000..73918e73
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/service/WorkShopTransferService.java
@@ -0,0 +1,32 @@
+package com.foreverwin.mesnac.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.foreverwin.mesnac.production.model.WorkShopTransfer;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.foreverwin.modular.core.util.FrontPage;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 车间转移记录 服务类
+ * </p>
+ *
+ * @author Philip
+ * @since 2021-07-30
+ */
+public interface WorkShopTransferService extends IService<WorkShopTransfer> {
+
+    /**
+     *  分页查询
+     * @param frontPage
+     * @return
+     */
+    IPage<WorkShopTransfer> selectPage(FrontPage<WorkShopTransfer> frontPage, WorkShopTransfer workShopTransfer);
+
+    List<WorkShopTransfer> selectList(WorkShopTransfer workShopTransfer);
+
+    WorkShopTransfer sfcEnter(WorkShopTransfer workShopTransfer);
+
+    Object transfer(WorkShopTransfer workShopTransfer);
+}
\ No newline at end of file
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SplitSfcServiceImpl.java b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SplitSfcServiceImpl.java
index 9c5f0fcb..54b6ccee 100644
--- a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SplitSfcServiceImpl.java
+++ b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SplitSfcServiceImpl.java
@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.foreverwin.mesnac.common.enums.HandleEnum;
+import com.foreverwin.mesnac.common.service.SfcDispatchCommonService;
 import com.foreverwin.mesnac.common.util.ExceptionUtil;
 import com.foreverwin.mesnac.common.util.StringUtil;
 import com.foreverwin.mesnac.meapi.dto.SfcDto;
+import com.foreverwin.mesnac.meapi.service.ShopOrderService;
 import com.foreverwin.mesnac.production.dto.SplitSfcDto;
 import com.foreverwin.mesnac.production.mapper.SplitSfcMapper;
 import com.foreverwin.mesnac.production.model.SplitSfc;
@@ -44,7 +46,10 @@ public class SplitSfcServiceImpl extends ServiceImpl<SplitSfcMapper, SplitSfc> i
 
     @Autowired
     private SplitSfcMapper splitSfcMapper;
-
+    @Autowired
+    private SfcDispatchCommonService sfcDispatchCommonService;
+    @Autowired
+    private ShopOrderService shopOrderService;
     @Override
     public IPage<SplitSfc> selectPage(FrontPage<SplitSfc> frontPage, SplitSfc splitSfc) {
         QueryWrapper<SplitSfc> queryWrapper = new QueryWrapper<>();
@@ -157,6 +162,8 @@ public class SplitSfcServiceImpl extends ServiceImpl<SplitSfcMapper, SplitSfc> i
             splitSfc.setCreateUser(CommonMethods.getUser());
             splitSfc.setCreatedDateTime(LocalDateTime.now());
             save(splitSfc);
+            String workCenterBo = shopOrderService.getById(HandleEnum.SHOP_ORDER.getHandle(site, sfcData.getShopOrder())).getPlannedWorkCenterBo();
+            sfcDispatchCommonService.saveSfcDispatch(site,CommonMethods.getUser(),StringUtil.trimHandle(workCenterBo),sfc, sfcData.getShopOrder(),routerBo);
             return splitSfc;
         } catch (Exception e) {
             ExceptionUtil.throwException(e);
diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/WorkShopTransferServiceImpl.java b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/WorkShopTransferServiceImpl.java
new file mode 100644
index 00000000..d42af850
--- /dev/null
+++ b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/WorkShopTransferServiceImpl.java
@@ -0,0 +1,155 @@
+package com.foreverwin.mesnac.production.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.foreverwin.mesnac.common.enums.DispatchStatusEnum;
+import com.foreverwin.mesnac.common.enums.HandleEnum;
+import com.foreverwin.mesnac.common.service.SfcDispatchCommonService;
+import com.foreverwin.mesnac.common.util.ExceptionUtil;
+import com.foreverwin.mesnac.common.util.StringUtil;
+import com.foreverwin.mesnac.meapi.model.Operation;
+import com.foreverwin.mesnac.meapi.model.Router;
+import com.foreverwin.mesnac.meapi.service.OperationService;
+import com.foreverwin.mesnac.meapi.service.RouterService;
+import com.foreverwin.mesnac.production.dto.WorkShopTransferDto;
+import com.foreverwin.mesnac.production.mapper.SfcCrossMapper;
+import com.foreverwin.mesnac.production.mapper.WorkShopTransferMapper;
+import com.foreverwin.mesnac.production.model.StepOperation;
+import com.foreverwin.mesnac.production.model.WorkShopTransfer;
+import com.foreverwin.mesnac.production.service.SfcCrossService;
+import com.foreverwin.mesnac.production.service.WorkShopTransferService;
+import com.foreverwin.modular.core.exception.BaseException;
+import com.foreverwin.modular.core.util.CommonMethods;
+import com.foreverwin.modular.core.util.FrontPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * <p>
+ * 车间转移记录 服务实现类
+ * </p>
+ *
+ * @author Philip
+ * @since 2021-07-30
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class WorkShopTransferServiceImpl extends ServiceImpl<WorkShopTransferMapper, WorkShopTransfer> implements WorkShopTransferService {
+
+    @Autowired
+    private SfcDispatchCommonService sfcDispatchCommonService;
+    @Autowired
+    private WorkShopTransferMapper workShopTransferMapper;
+    @Autowired
+    private OperationService operationService;
+    @Autowired
+    private SfcCrossService sfcCrossService;
+    @Autowired
+    private SfcCrossMapper sfcCrossMapper;
+    @Autowired
+    private RouterService routerService;
+
+    @Override
+    public IPage<WorkShopTransfer> selectPage(FrontPage<WorkShopTransfer> frontPage, WorkShopTransfer workShopTransfer) {
+        QueryWrapper<WorkShopTransfer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(workShopTransfer);
+        return super.page(frontPage.getPagePlus(), queryWrapper);
+    }
+
+    @Override
+    public List<WorkShopTransfer> selectList(WorkShopTransfer workShopTransfer) {
+        QueryWrapper<WorkShopTransfer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.setEntity(workShopTransfer);
+        return super.list(queryWrapper);
+    }
+
+    @Override
+    public WorkShopTransferDto sfcEnter(WorkShopTransfer workShopTransfer) {
+        //条码是否在工作中心下
+        String site = CommonMethods.getSite();
+        String sfc = workShopTransfer.getSfc();
+        String workCenter = workShopTransfer.getWorkCenter();
+        if (StringUtil.isBlank(sfc)) {
+            throw new BaseException("产品条码不能为空");
+        }
+
+        WorkShopTransferDto dto = workShopTransferMapper.getSfcData(site, sfc);
+        if (dto == null) {
+            throw new BaseException("未找到该产品条码");
+        }
+        if (StringUtil.isBlank(dto.getWorkCenter()) || !dto.getWorkCenter().equals(workCenter)) {
+            throw new BaseException("产品条码不在所选车间");
+        }
+        //查询上一工序
+        Router router = routerService.getRouterBySfcBo(HandleEnum.SFC.getHandle(site, sfc));
+        int seq = 0;
+        List<StepOperation> stepOperationList = sfcCrossMapper.findRouterOperationByRouterBo(site, router.getHandle(), LocaleContextHolder.getLocale().getLanguage());
+        for (int i = 0; i < stepOperationList.size(); i++) {
+            StepOperation stepOperation = stepOperationList.get(i);
+            if (stepOperation.getStepId().equals(dto.getStepId())) {
+                seq = i;
+            }
+        }
+        if (seq != 0) {
+            StepOperation stepOperation = stepOperationList.get(seq - 1);
+            dto.setLastOperation(stepOperation.getOperation());
+            dto.setLastOperationDesc(stepOperation.getDescription());
+        }
+        return dto;
+    }
+
+    @Override
+    public Object transfer(WorkShopTransfer workShopTransfer) {
+        String site = CommonMethods.getSite();
+        String user = CommonMethods.getUser();
+        WorkShopTransferDto dto = sfcEnter(workShopTransfer);
+        String isOutSource = dto.getIsOutSource();
+        String sfcBO = HandleEnum.SFC.getHandle(site, workShopTransfer.getSfc());
+        if (StringUtil.notBlank(isOutSource) && isOutSource.equals("Y")) {
+            //转出开始
+            try {
+                Operation currentRevisionRef = operationService.getCurrentRevisionRef(site, dto.getOperation());
+                if (workShopTransfer.getType().equals("OUT")) {
+                    sfcCrossService.startAction(site, currentRevisionRef.getHandle(), dto.getResrce(), sfcBO, dto.getQty());
+                    //更改派工单状态
+                    sfcDispatchCommonService.updateSfcDispatchStatus(site, CommonMethods.getUser(), dto.getDispatchNo(), DispatchStatusEnum.START.getCode());
+                } else {
+                    //转入完成
+                    sfcCrossService.completeAction(site, currentRevisionRef.getHandle(),  dto.getResrce(), sfcBO, dto.getQty());
+                    //更改派工单状态
+                    sfcDispatchCommonService.updateSfcDispatchStatus(site, CommonMethods.getUser(), dto.getDispatchNo(), DispatchStatusEnum.COMPLETE.getCode());
+                }
+            } catch (Exception e) {
+                ExceptionUtil.throwException(e);
+            }
+        }
+
+        WorkShopTransfer transferLog = new WorkShopTransfer();
+        transferLog.setHandle(UUID.randomUUID().toString());
+        transferLog.setSite(site);
+        transferLog.setWorkCenter(dto.getWorkCenter());
+        transferLog.setSfc(dto.getSfc());
+        transferLog.setShopOrder(dto.getShopOrder());
+        transferLog.setItem(dto.getItem());
+        transferLog.setLastOperation(dto.getLastOperation());
+        transferLog.setStepId(dto.getStepId());
+        transferLog.setOperation(dto.getOperation());
+        transferLog.setQty(dto.getQty());
+        transferLog.setType(workShopTransfer.getType());
+        transferLog.setIsOutSource(isOutSource);
+        transferLog.setComments(workShopTransfer.getComments());
+        transferLog.setCreateUser(user);
+        transferLog.setCreatedDateTime(LocalDateTime.now());
+        save(transferLog);
+        return null;
+    }
+
+
+}
\ No newline at end of file
diff --git a/production/src/main/resources/mapper/SplitSfcMapper.xml b/production/src/main/resources/mapper/SplitSfcMapper.xml
index da57dfc6..10a68aa5 100644
--- a/production/src/main/resources/mapper/SplitSfcMapper.xml
+++ b/production/src/main/resources/mapper/SplitSfcMapper.xml
@@ -379,7 +379,7 @@
     <select id="getAbnormalQty" resultType="com.foreverwin.mesnac.production.dto.SplitSfcDto">
     SELECT zab.NC_QTY,zsbd.ROUTER_BO,zab.NC_CODE FROM Z_ABNORMAL_BILL zab
     JOIN Z_ABNORMAL_BILL_DISPOSE zsbd ON zab.HANDLE=ZSBD.ABNORMAL_BILL_BO
-    WHERE  ZAB.SFC=#{sfc} AND zab.SITE=#{site} AND ZAB.OPERATION=#{operation} AND zab.STATUS='F' AND zab."TYPE"='Z'
+    WHERE  ZAB.SFC=#{sfc} AND zab.SITE=#{site} AND ZAB.OPERATION=#{operation} AND zab.STATUS='F' AND zab."TYPE"='Z' AND zsbd.ABNORMAL_METHOD='F'
     </select>
 
 </mapper>
diff --git a/production/src/main/resources/mapper/WorkShopTransferMapper.xml b/production/src/main/resources/mapper/WorkShopTransferMapper.xml
new file mode 100644
index 00000000..e4a76d85
--- /dev/null
+++ b/production/src/main/resources/mapper/WorkShopTransferMapper.xml
@@ -0,0 +1,513 @@
+<?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.production.mapper.WorkShopTransferMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.foreverwin.mesnac.production.model.WorkShopTransfer">
+        <id column="HANDLE" property="handle" />
+        <result column="SITE" property="site" />
+        <result column="WORK_CENTER" property="workCenter" />
+        <result column="SFC" property="sfc" />
+        <result column="SHOP_ORDER" property="shopOrder" />
+        <result column="ITEM" property="item" />
+        <result column="LAST_OPERATION" property="lastOperation" />
+        <result column="STEP_ID" property="stepId" />
+        <result column="OPERATION" property="operation" />
+        <result column="QTY" property="qty" />
+        <result column="TYPE" property="type" />
+        <result column="IS_OUT_SOURCE" property="isOutSource" />
+        <result column="COMMENTS" property="comments" />
+        <result column="CREATE_USER" property="createUser" />
+        <result column="CREATED_DATE_TIME" property="createdDateTime" />
+    </resultMap>
+    <resultMap id="FullResultMap" type="com.foreverwin.mesnac.production.dto.WorkShopTransferDto">
+        <result column="MAP" property="map" />
+        <result column="WORK_ORDER" property="workOrder" />
+        <result column="ITEM_DESC" property="itemDesc" />
+        <result column="ITEM_NUMBER" property="itemNumber" />
+        <result column="OPERATION_DESC" property="operationDesc" />
+        <result column="QTY" property="qty" />
+        <result column="STATUS" property="status" />
+        <result column="DISPATCH_NO" property="dispatchNo" />
+        <result column="RESRCE" property="resrce" />
+    </resultMap>
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        HANDLE, SITE, WORK_CENTER, SFC, SHOP_ORDER, ITEM, LAST_OPERATION, STEP_ID, OPERATION, QTY, TYPE, IS_OUT_SOURCE, COMMENTS, CREATE_USER, CREATED_DATE_TIME
+    </sql>
+
+    <!-- BaseMapper标准查询/修改/删除 -->
+    <select id="selectById" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include> FROM Z_WORK_SHOP_TRANSFER WHERE HANDLE=#{handle}
+    </select>
+
+    <select id="selectByMap" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include>
+        FROM Z_WORK_SHOP_TRANSFER
+        <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="selectBatchIds" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include>
+        FROM Z_WORK_SHOP_TRANSFER WHERE HANDLE IN (
+        <foreach item="item" index="index" collection="coll" separator=",">#{item}
+        </foreach>)
+    </select>
+
+    <select id="selectOne" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"></include> FROM Z_WORK_SHOP_TRANSFER
+        <where>
+            <if test="ew.entity.handle!=null">
+              HANDLE=#{ew.handle}
+            </if>
+            <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
+            <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+            <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+            <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+            <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+            <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+            <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+            <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+            <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+            <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+            <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+            <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+            <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+            <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</if>
+        </where>
+    </select>
+
+    <select id="selectCount" resultType="Integer">
+        SELECT COUNT(1) FROM Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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.production.model.WorkShopTransfer">
+        INSERT INTO Z_WORK_SHOP_TRANSFER
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            HANDLE,
+            <if test="site!=null">SITE,</if>
+            <if test="workCenter!=null">WORK_CENTER,</if>
+            <if test="sfc!=null">SFC,</if>
+            <if test="shopOrder!=null">SHOP_ORDER,</if>
+            <if test="item!=null">ITEM,</if>
+            <if test="lastOperation!=null">LAST_OPERATION,</if>
+            <if test="stepId!=null">STEP_ID,</if>
+            <if test="operation!=null">OPERATION,</if>
+            <if test="qty!=null">QTY,</if>
+            <if test="type!=null">TYPE,</if>
+            <if test="isOutSource!=null">IS_OUT_SOURCE,</if>
+            <if test="comments!=null">COMMENTS,</if>
+            <if test="createUser!=null">CREATE_USER,</if>
+            <if test="createdDateTime!=null">CREATED_DATE_TIME,</if>
+        </trim> VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            #{handle},
+            <if test="site!=null">#{site},</if>
+            <if test="workCenter!=null">#{workCenter},</if>
+            <if test="sfc!=null">#{sfc},</if>
+            <if test="shopOrder!=null">#{shopOrder},</if>
+            <if test="item!=null">#{item},</if>
+            <if test="lastOperation!=null">#{lastOperation},</if>
+            <if test="stepId!=null">#{stepId},</if>
+            <if test="operation!=null">#{operation},</if>
+            <if test="qty!=null">#{qty},</if>
+            <if test="type!=null">#{type},</if>
+            <if test="isOutSource!=null">#{isOutSource},</if>
+            <if test="comments!=null">#{comments},</if>
+            <if test="createUser!=null">#{createUser},</if>
+            <if test="createdDateTime!=null">#{createdDateTime},</if>
+        </trim>
+    </insert>
+
+    <insert id="insertAllColumn" parameterType="com.foreverwin.mesnac.production.model.WorkShopTransfer">
+        INSERT INTO Z_WORK_SHOP_TRANSFER
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <include refid="Base_Column_List"></include>
+        </trim> VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            #{handle},
+            #{site},
+            #{workCenter},
+            #{sfc},
+            #{shopOrder},
+            #{item},
+            #{lastOperation},
+            #{stepId},
+            #{operation},
+            #{qty},
+            #{type},
+            #{isOutSource},
+            #{comments},
+            #{createUser},
+            #{createdDateTime},
+        </trim>
+    </insert>
+
+
+    <update id="updateById">
+        UPDATE Z_WORK_SHOP_TRANSFER <trim prefix="SET" suffixOverrides=",">
+        <if test="et.site!=null">SITE=#{et.site},</if>
+        <if test="et.workCenter!=null">WORK_CENTER=#{et.workCenter},</if>
+        <if test="et.sfc!=null">SFC=#{et.sfc},</if>
+        <if test="et.shopOrder!=null">SHOP_ORDER=#{et.shopOrder},</if>
+        <if test="et.item!=null">ITEM=#{et.item},</if>
+        <if test="et.lastOperation!=null">LAST_OPERATION=#{et.lastOperation},</if>
+        <if test="et.stepId!=null">STEP_ID=#{et.stepId},</if>
+        <if test="et.operation!=null">OPERATION=#{et.operation},</if>
+        <if test="et.qty!=null">QTY=#{et.qty},</if>
+        <if test="et.type!=null">TYPE=#{et.type},</if>
+        <if test="et.isOutSource!=null">IS_OUT_SOURCE=#{et.isOutSource},</if>
+        <if test="et.comments!=null">COMMENTS=#{et.comments},</if>
+        <if test="et.createUser!=null">CREATE_USER=#{et.createUser},</if>
+        <if test="et.createdDateTime!=null">CREATED_DATE_TIME=#{et.createdDateTime},</if>
+        </trim> WHERE HANDLE=#{et.handle} <if test="et instanceof java.util.Map"><if test="et.MP_OPTLOCK_VERSION_ORIGINAL!=null">and ${et.MP_OPTLOCK_VERSION_COLUMN}=#{et.MP_OPTLOCK_VERSION_ORIGINAL}</if></if>
+    </update>
+
+
+    <update id="updateAllColumnById">
+        UPDATE Z_WORK_SHOP_TRANSFER <trim prefix="SET" suffixOverrides=",">
+        SITE=#{et.site},
+        WORK_CENTER=#{et.workCenter},
+        SFC=#{et.sfc},
+        SHOP_ORDER=#{et.shopOrder},
+        ITEM=#{et.item},
+        LAST_OPERATION=#{et.lastOperation},
+        STEP_ID=#{et.stepId},
+        OPERATION=#{et.operation},
+        QTY=#{et.qty},
+        TYPE=#{et.type},
+        IS_OUT_SOURCE=#{et.isOutSource},
+        COMMENTS=#{et.comments},
+        CREATE_USER=#{et.createUser},
+        CREATED_DATE_TIME=#{et.createdDateTime},
+     </trim> WHERE HANDLE=#{et.handle} <if test="et instanceof java.util.Map"><if test="et.MP_OPTLOCK_VERSION_ORIGINAL!=null">and ${et.MP_OPTLOCK_VERSION_COLUMN}=#{et.MP_OPTLOCK_VERSION_ORIGINAL}</if></if>
+    </update>
+
+
+    <update id="update">
+        UPDATE Z_WORK_SHOP_TRANSFER <trim prefix="SET" suffixOverrides=",">
+        <if test="et.site!=null">SITE=#{et.site},</if>
+        <if test="et.workCenter!=null">WORK_CENTER=#{et.workCenter},</if>
+        <if test="et.sfc!=null">SFC=#{et.sfc},</if>
+        <if test="et.shopOrder!=null">SHOP_ORDER=#{et.shopOrder},</if>
+        <if test="et.item!=null">ITEM=#{et.item},</if>
+        <if test="et.lastOperation!=null">LAST_OPERATION=#{et.lastOperation},</if>
+        <if test="et.stepId!=null">STEP_ID=#{et.stepId},</if>
+        <if test="et.operation!=null">OPERATION=#{et.operation},</if>
+        <if test="et.qty!=null">QTY=#{et.qty},</if>
+        <if test="et.type!=null">TYPE=#{et.type},</if>
+        <if test="et.isOutSource!=null">IS_OUT_SOURCE=#{et.isOutSource},</if>
+        <if test="et.comments!=null">COMMENTS=#{et.comments},</if>
+        <if test="et.createUser!=null">CREATE_USER=#{et.createUser},</if>
+        <if test="et.createdDateTime!=null">CREATED_DATE_TIME=#{et.createdDateTime},</if>
+    </trim>
+        <where>
+            <if test="ew!=null">
+                <if test="ew.entity!=null">
+                    HANDLE=#{ew.entity.handle}
+                    <if test="ew.entity.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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="deleteById">
+        DELETE FROM Z_WORK_SHOP_TRANSFER WHERE HANDLE=#{handle}
+    </delete>
+
+    <delete id="deleteByMap">
+        DELETE FROM Z_WORK_SHOP_TRANSFER
+        <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 Z_WORK_SHOP_TRANSFER
+        <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.site!=null"> AND SITE=#{ew.entity.site}</if>
+                    <if test="ew.entity.workCenter!=null"> AND WORK_CENTER=#{ew.entity.workCenter}</if>
+                    <if test="ew.entity.sfc!=null"> AND SFC=#{ew.entity.sfc}</if>
+                    <if test="ew.entity.shopOrder!=null"> AND SHOP_ORDER=#{ew.entity.shopOrder}</if>
+                    <if test="ew.entity.item!=null"> AND ITEM=#{ew.entity.item}</if>
+                    <if test="ew.entity.lastOperation!=null"> AND LAST_OPERATION=#{ew.entity.lastOperation}</if>
+                    <if test="ew.entity.stepId!=null"> AND STEP_ID=#{ew.entity.stepId}</if>
+                    <if test="ew.entity.operation!=null"> AND OPERATION=#{ew.entity.operation}</if>
+                    <if test="ew.entity.qty!=null"> AND QTY=#{ew.entity.qty}</if>
+                    <if test="ew.entity.type!=null"> AND TYPE=#{ew.entity.type}</if>
+                    <if test="ew.entity.isOutSource!=null"> AND IS_OUT_SOURCE=#{ew.entity.isOutSource}</if>
+                    <if test="ew.entity.comments!=null"> AND COMMENTS=#{ew.entity.comments}</if>
+                    <if test="ew.entity.createUser!=null"> AND CREATE_USER=#{ew.entity.createUser}</if>
+                    <if test="ew.entity.createdDateTime!=null"> AND CREATED_DATE_TIME=#{ew.entity.createdDateTime}</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>
+
+    <delete id="deleteBatchIds">
+        DELETE FROM Z_WORK_SHOP_TRANSFER WHERE HANDLE IN (
+        <foreach item="item" index="index" collection="coll" separator=",">#{item}
+        </foreach>)
+    </delete>
+    <!-- BaseMapper标准查询/修改/删除 -->
+    <select id="getSfcData" resultMap="FullResultMap">
+        SELECT ZSD.STEP_ID,ZSD.RESRCE,ZSD.DISPATCH_NO,ZSD.WORK_CENTER,SC.SFC, SO.SHOP_ORDER,SO_CF3.VALUE "MAP", SO_CF2.VALUE WORK_ORDER,SO_CF.VALUE ITEM_NUMBER,SC.QTY,  IM.ITEM, IT.DESCRIPTION ITEM_DESC, OP.OPERATION, OT.DESCRIPTION OPERATION_DESC,
+        CASE WHEN ST.STATUS='403'  THEN '活动中'  WHEN ST.STATUS='402'  THEN '排队中' WHEN ST.STATUS='401'  THEN '新建' ELSE TO_CHAR(ST.STATUS) END STATUS,RO_CF.VALUE IS_OUT_SOURCE
+        FROM SFC SC
+        INNER JOIN SHOP_ORDER SO ON SO.HANDLE = SC.SHOP_ORDER_BO
+        LEFT JOIN CUSTOM_FIELDS SO_CF3 ON SO_CF3.HANDLE = SO.HANDLE AND SO_CF3."ATTRIBUTE" = 'MAP'
+        LEFT JOIN CUSTOM_FIELDS SO_CF2 ON SO_CF2.HANDLE = SO.HANDLE AND SO_CF2."ATTRIBUTE" = 'WORK_ORDER'
+        LEFT JOIN CUSTOM_FIELDS SO_CF ON SO_CF.HANDLE = SO.HANDLE AND SO_CF."ATTRIBUTE" = 'ITEM_NUMBER'
+        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  AND (SP.QTY_IN_QUEUE > 0 OR SP.QTY_IN_WORK > 0)
+        INNER JOIN ROUTER_STEP RS ON RS.ROUTER_BO = SR.ROUTER_BO AND RS.STEP_ID = SP.STEP_ID
+        INNER JOIN ROUTER_OPERATION RO ON RO.ROUTER_STEP_BO = RS.HANDLE
+        LEFT JOIN CUSTOM_FIELDS RO_CF ON RO_CF.HANDLE = RO.HANDLE AND RO_CF."ATTRIBUTE" = 'OUT_SOURCE'
+        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'
+        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
+        WHERE SC.SITE = #{site} AND SC.SFC = #{sfc}
+    </select>
+</mapper>