diff --git a/common/src/main/java/com/foreverwin/mesnac/common/constant/CustomFieldConstant.java b/common/src/main/java/com/foreverwin/mesnac/common/constant/CustomFieldConstant.java index bf1b995b..302e2a9d 100644 --- a/common/src/main/java/com/foreverwin/mesnac/common/constant/CustomFieldConstant.java +++ b/common/src/main/java/com/foreverwin/mesnac/common/constant/CustomFieldConstant.java @@ -7,14 +7,7 @@ package com.foreverwin.mesnac.common.constant; * @since 2021-05-12 */ public class CustomFieldConstant { - /** - * 物料 - */ - public static final String ITEM_CUSTOM_FIELD_ACCESSORY_TYPE = "ACCESSORY_TYPE";//辅料类型 - /** - * 工单 - */ /** * 资源 @@ -26,34 +19,30 @@ public class CustomFieldConstant { */ public static final String WORK_CENTER_CUSTOM_FIELD_PROCESS_CONTROL= "PROCESS_CONTROL";//工控程序 - /** - * 物料清单 - */ - public static final String BOM_COMPONENT_CUSTOM_FIELD_STEP_ID = "STEP_ID";//步骤 - - - //工厂 - public static String SO_FACTORY = "FACTORY"; + public static final String SO_FACTORY = "FACTORY"; //工作指令 - public static String SO_WORK_ORDER = "WORK_ORDER"; + public static final String SO_WORK_ORDER = "WORK_ORDER"; //项目号 - public static String SO_ITEM_NUMER = "ITEM_NUMBER"; + public static final String SO_ITEM_NUMBER = "ITEM_NUMBER"; //工单类型 - public static String SO_SHOP_ORDER_TYPE = "SHOP_ORDER_TYPE"; + public static final String SO_SHOP_ORDER_TYPE = "SHOP_ORDER_TYPE"; //产品类型 - public static String SO_PRODUCT_CATEGORY = "PRODUCT_CATEGORY"; + public static final String SO_PRODUCT_CATEGORY = "PRODUCT_CATEGORY"; //工单备注 - public static String SO_COMMENTS = "COMMENTS"; + public static final String SO_COMMENTS = "COMMENTS"; //是否开始生产 - public static String SO_START_PRODUCT = "START_PRODUCT"; + public static final String SO_START_PRODUCT = "START_PRODUCT"; //************************************************************************************** - public static String ROUTER_OP_PROD_TIME = "PROD_TIME"; - public static String ROUTER_OP_OUT_SOURCE = "OUT_SOURCE"; + public static final String ROUTER_OP_PROD_TIME = "PROD_TIME"; + public static final String ROUTER_OP_OUT_SOURCE = "OUT_SOURCE"; //************************************************************************************** - public static String BOM_COM_STEP_ID = "STEP_ID"; + public static final String BOM_COM_STEP_ID = "STEP_ID"; + + + public static final String SFC_DATA_LOCATION = "LOCATION"; } diff --git a/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java b/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java new file mode 100644 index 00000000..9cc7eb63 --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/controller/MobileWorkStationController.java @@ -0,0 +1,42 @@ +package com.foreverwin.mesnac.common.controller; + +import com.foreverwin.mesnac.common.enums.HandleEnum; +import com.foreverwin.mesnac.common.model.MobileWorkStationData; +import com.foreverwin.mesnac.common.service.MobileWorkStationService; +import com.foreverwin.modular.core.util.CommonMethods; +import com.foreverwin.modular.core.util.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * + * @author Syngna + * @since 2020-01-04 + */ +@RestController +@RequestMapping("/mobileWorkStations") +public class MobileWorkStationController { + + @Autowired + public MobileWorkStationService mobileWorkStationService; + + @GetMapping("listMobileWorkStationApplication") + public R listMobileWorkStationApplication(String workStation) { + + List result; + try { + String site = CommonMethods.getSite(); + String user = CommonMethods.getUser(); + String userBo = HandleEnum.USER.getHandle(site, user); + result = mobileWorkStationService.listMobileWorkStationApplication(site, userBo, workStation); + } + catch (Exception e) { + return R.failed(e.getMessage()); + } + return R.ok(result); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java b/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java index fadbd34a..57a6c918 100644 --- a/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java +++ b/common/src/main/java/com/foreverwin/mesnac/common/enums/HandleEnum.java @@ -14,6 +14,9 @@ public enum HandleEnum { /**车间作业控制*/ SFC( "SFCBO:", "SFCBO:{0},{1}" ), + /**用户**/ + USER("UserBO:", "UserBO:{0},{1}"), + /**物料清单**/ BOM("BOMBO:","BOMBO:{0},{1},{2},{3}"), @@ -23,6 +26,8 @@ public enum HandleEnum { /**车间作业控制*/ SFC_BOM( "SFCBOMBO:", "SFCBOMBO:{0}" ), + SFC_DATA( "SFCDataBO:", "SFCDataBO:{0},{1}" ), + /**物料*/ ITEM( "ItemBO:", "ItemBO:{0},{1},{2}" ), diff --git a/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java new file mode 100644 index 00000000..9e052197 --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/mapper/MobileWorkStationMapper.java @@ -0,0 +1,16 @@ +package com.foreverwin.mesnac.common.mapper; + +import com.foreverwin.mesnac.common.model.ActivityOption; +import com.foreverwin.mesnac.common.model.MobileWorkStationData; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface MobileWorkStationMapper { + + List selectActivityOptionList(@Param("activityBoList") List activityBoList); + + List selectMobileWorkStationList(@Param("site") String site, @Param("userBo") String userBo, @Param("workStation") String workStation); +} \ No newline at end of file diff --git a/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java b/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java new file mode 100644 index 00000000..96c7193f --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/model/ActivityOption.java @@ -0,0 +1,34 @@ +package com.foreverwin.mesnac.common.model; + +public class ActivityOption { + + private String activity; + + private String key; + + private String value; + + public String getActivity() { + return activity; + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java b/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java new file mode 100644 index 00000000..0c85d251 --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/model/MobileWorkStationData.java @@ -0,0 +1,156 @@ +package com.foreverwin.mesnac.common.model; + +import java.util.List; + +public class MobileWorkStationData { + + private String workStationBo; + + private String canChangeOperation; + + private String canChangeResource; + + private String defaultOperationBo; + + private String defaultResourceBo; + + private String mainInputPrompt; + + private String sequence; + + private String buttonId; + + private String buttonSize; + + private String label; + + private String imageIcon; + + private String activityBo; + + private String activity; + + private String classOrProgram; + + private List activityOptionList; + + public String getWorkStationBo() { + return workStationBo; + } + + public void setWorkStationBo(String workStationBo) { + this.workStationBo = workStationBo; + } + + public String getCanChangeOperation() { + return canChangeOperation; + } + + public void setCanChangeOperation(String canChangeOperation) { + this.canChangeOperation = canChangeOperation; + } + + public String getCanChangeResource() { + return canChangeResource; + } + + public void setCanChangeResource(String canChangeResource) { + this.canChangeResource = canChangeResource; + } + + public String getDefaultOperationBo() { + return defaultOperationBo; + } + + public void setDefaultOperationBo(String defaultOperationBo) { + this.defaultOperationBo = defaultOperationBo; + } + + public String getDefaultResourceBo() { + return defaultResourceBo; + } + + public void setDefaultResourceBo(String defaultResourceBo) { + this.defaultResourceBo = defaultResourceBo; + } + + public String getMainInputPrompt() { + return mainInputPrompt; + } + + public void setMainInputPrompt(String mainInputPrompt) { + this.mainInputPrompt = mainInputPrompt; + } + + public String getSequence() { + return sequence; + } + + public void setSequence(String sequence) { + this.sequence = sequence; + } + + public String getButtonId() { + return buttonId; + } + + public void setButtonId(String buttonId) { + this.buttonId = buttonId; + } + + public String getButtonSize() { + return buttonSize; + } + + public void setButtonSize(String buttonSize) { + this.buttonSize = buttonSize; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getImageIcon() { + return imageIcon; + } + + public void setImageIcon(String imageIcon) { + this.imageIcon = imageIcon; + } + + public String getActivityBo() { + return activityBo; + } + + public void setActivityBo(String activityBo) { + this.activityBo = activityBo; + } + + public String getActivity() { + return activity; + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public String getClassOrProgram() { + return classOrProgram; + } + + public void setClassOrProgram(String classOrProgram) { + this.classOrProgram = classOrProgram; + } + + public List getActivityOptionList() { + return activityOptionList; + } + + public void setActivityOptionList(List activityOptionList) { + this.activityOptionList = activityOptionList; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java b/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java new file mode 100644 index 00000000..20715d9c --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/service/MobileWorkStationService.java @@ -0,0 +1,20 @@ +package com.foreverwin.mesnac.common.service; + + + +import com.foreverwin.mesnac.common.model.MobileWorkStationData; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author Syngna + * @since 2019-05-30 + */ +public interface MobileWorkStationService { + + List listMobileWorkStationApplication(String site, String userBo, String workStation); +} \ No newline at end of file diff --git a/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java new file mode 100644 index 00000000..cdcce445 --- /dev/null +++ b/common/src/main/java/com/foreverwin/mesnac/common/service/impl/MobileWorkStationServiceImpl.java @@ -0,0 +1,48 @@ +package com.foreverwin.mesnac.common.service.impl; + +import com.foreverwin.mesnac.common.mapper.MobileWorkStationMapper; +import com.foreverwin.mesnac.common.model.ActivityOption; +import com.foreverwin.mesnac.common.model.MobileWorkStationData; +import com.foreverwin.mesnac.common.service.MobileWorkStationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 移动维护服务实现类 + *

+ * + * @author Syngna + * @since 2020-01-04 + */ +@Service +public class MobileWorkStationServiceImpl implements MobileWorkStationService { + + @Autowired + private MobileWorkStationMapper mobileWorkStationMapper; + + @Override + public List listMobileWorkStationApplication(String site, String userBo, String workStation) { + List workStationDataList = mobileWorkStationMapper.selectMobileWorkStationList(site, userBo, workStation); + if(workStationDataList == null || workStationDataList.size() == 0) { + return new ArrayList<>(); + } + List activityList = workStationDataList.stream().map(MobileWorkStationData::getActivityBo).collect(Collectors.toList()); + List activityOptionList = mobileWorkStationMapper.selectActivityOptionList(activityList); + for(MobileWorkStationData mobileWorkStationData : workStationDataList) { + if(mobileWorkStationData.getActivityOptionList() == null) { + mobileWorkStationData.setActivityOptionList(new ArrayList<>()); + } + for(ActivityOption activityOption: activityOptionList) { + if(activityOption.getActivity().equals(mobileWorkStationData.getActivity())) { + mobileWorkStationData.getActivityOptionList().add(activityOption); + } + } + } + return workStationDataList; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java b/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java index b55ccdf2..c483f6fa 100644 --- a/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java +++ b/common/src/main/java/com/foreverwin/mesnac/common/util/ExcelUtils.java @@ -2,6 +2,7 @@ package com.foreverwin.mesnac.common.util; import com.foreverwin.mesnac.common.model.ExcelColumn; import com.foreverwin.modular.core.exception.BusinessException; +import org.apache.commons.fileupload.FileItem; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.CharUtils; import org.apache.commons.lang.StringUtils; @@ -40,12 +41,17 @@ public class ExcelUtils { private final static String EXCEL2003 = "xls"; private final static String EXCEL2007 = "xlsx"; - public static List readExcel(String fileType, Class tClass, MultipartFile multipartFile){ + public static List readExcel(String fileType, Class tClass, MultipartFile multipartFile, FileItem fileItem){ Workbook workbook = null; List dataList = new ArrayList<>(); try { - InputStream inputStream = multipartFile.getInputStream(); + InputStream inputStream = null; + if (multipartFile != null && !multipartFile.isEmpty()) { + inputStream = multipartFile.getInputStream(); + } else { + inputStream = fileItem.getInputStream(); + } //分析文件格式 if (EXCEL2003.equals(fileType)) { diff --git a/common/src/main/resources/mapper/MobileWorkStationMapper.xml b/common/src/main/resources/mapper/MobileWorkStationMapper.xml new file mode 100644 index 00000000..dfb3859e --- /dev/null +++ b/common/src/main/resources/mapper/MobileWorkStationMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java index e3ea8dc8..9561b9ce 100644 --- a/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java +++ b/dispatch/src/main/java/com/foreverwin/mesnac/dispatch/service/impl/SfcDispatchServiceImpl.java @@ -17,11 +17,13 @@ import com.foreverwin.mesnac.dispatch.service.UserResourceService; import com.foreverwin.mesnac.meapi.service.ResrceService; import com.foreverwin.mesnac.meapi.util.StringUtils; import com.foreverwin.modular.core.exception.BusinessException; +import org.apache.commons.fileupload.FileItem; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.time.LocalDateTime; @@ -38,7 +40,7 @@ import java.util.stream.Collectors; * @author Leon.L * @since 2021-06-02 */ -@Service +@Service("sfcDispatchService") @Transactional(rollbackFor = Exception.class) public class SfcDispatchServiceImpl extends ServiceImpl implements SfcDispatchService { @@ -173,7 +175,7 @@ public class SfcDispatchServiceImpl extends ServiceImpl sfcDispatchList; try { - sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, multipartFile); + sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, multipartFile, null); } finally { if (inputStream != null){ try { @@ -190,6 +192,36 @@ public class SfcDispatchServiceImpl extends ServiceImpl sfcDispatchList; + try { + sfcDispatchList = ExcelUtils.readExcel(fileType, SfcDispatchDto.class, null, fileItem); + } finally { + if (inputStream != null){ + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + if (sfcDispatchList == null || sfcDispatchList.size() <= 0) { + throw BusinessException.build("上传的Excel没有数据,或者数据格式不正确"); + } + + + //调用业务处理逻辑 + StringBuffer message = new StringBuffer(); + this.sfcDispatch(site, user, DispatchStatusEnum.IMPORT.getCode(), message, sfcDispatchList); + + return message.toString(); + } + /** @@ -264,14 +296,8 @@ public class SfcDispatchServiceImpl extends ServiceImpl { */ List getSfcListByResrceBO(String resrceBO); + SfcDto findSfcData(@Param("site") String site, @Param("sfc") String sfc); + Sfc findBySfc(@Param("sfc") Sfc sfc); } \ No newline at end of file diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java index d9737fa3..1c815ddf 100644 --- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java +++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/SfcService.java @@ -1,6 +1,8 @@ package com.foreverwin.mesnac.meapi.service; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.foreverwin.mesnac.meapi.dto.SfcDto; +import com.foreverwin.mesnac.meapi.model.Sfc; import com.baomidou.mybatisplus.extension.service.IService; import com.foreverwin.mesnac.meapi.model.Sfc; import com.foreverwin.modular.core.util.FrontPage; @@ -38,4 +40,12 @@ public interface SfcService extends IService { Sfc findBySfc(Sfc sfc); + /** + * 查询生产批次的基本信息 + * + * @param site + * @param sfc + * @return + */ + SfcDto findSfcData(String site, String sfc); } \ No newline at end of file diff --git a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java index a3a32aaa..58b512cc 100644 --- a/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java +++ b/meapi/src/main/java/com/foreverwin/mesnac/meapi/service/impl/SfcServiceImpl.java @@ -1,12 +1,13 @@ package com.foreverwin.mesnac.meapi.service.impl; +import com.foreverwin.mesnac.meapi.dto.SfcDto; +import com.foreverwin.modular.core.util.FrontPage; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.foreverwin.mesnac.meapi.mapper.SfcMapper; import com.foreverwin.mesnac.meapi.model.Sfc; import com.foreverwin.mesnac.meapi.service.SfcService; -import com.foreverwin.modular.core.util.FrontPage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -62,5 +63,8 @@ public class SfcServiceImpl extends ServiceImpl implements SfcSe return sfcMapper.findBySfc(sfc); } - + @Override + public SfcDto findSfcData(String site, String sfc) { + return sfcMapper.findSfcData(site, sfc); + } } \ No newline at end of file diff --git a/meapi/src/main/resources/mapper/OperationMapper.xml b/meapi/src/main/resources/mapper/OperationMapper.xml index deea6d41..f2506945 100644 --- a/meapi/src/main/resources/mapper/OperationMapper.xml +++ b/meapi/src/main/resources/mapper/OperationMapper.xml @@ -599,7 +599,7 @@ + - + diff --git a/production/src/main/java/com/foreverwin/mesnac/production/controller/PodTemplateController.java b/production/src/main/java/com/foreverwin/mesnac/production/controller/PodTemplateController.java index 7efdf9f5..05f1e4d6 100644 --- a/production/src/main/java/com/foreverwin/mesnac/production/controller/PodTemplateController.java +++ b/production/src/main/java/com/foreverwin/mesnac/production/controller/PodTemplateController.java @@ -1,13 +1,12 @@ package com.foreverwin.mesnac.production.controller; -import com.foreverwin.mesnac.meapi.dto.WorkCenterDto; import com.foreverwin.mesnac.meapi.dto.SfcDto; +import com.foreverwin.mesnac.meapi.dto.WorkCenterDto; import com.foreverwin.mesnac.production.service.PodTemplateService; import com.foreverwin.modular.core.util.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @@ -24,7 +23,7 @@ public class PodTemplateController { */ @ResponseBody @GetMapping("/resrceEnter") - public R resrceEnter(@RequestBody WorkCenterDto workCenterDto) { + public R resrceEnter(WorkCenterDto workCenterDto) { return R.ok(podTemplateService.resrceEnter(workCenterDto)); } @@ -35,7 +34,7 @@ public class PodTemplateController { */ @ResponseBody @GetMapping("/sfcEnter") - public R sfcEnter(@RequestBody SfcDto sfcDto) { + public R sfcEnter(SfcDto sfcDto) { return R.ok(podTemplateService.sfcEnter(sfcDto)); } } diff --git a/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java b/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java new file mode 100644 index 00000000..bf567f09 --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/controller/SfcDataController.java @@ -0,0 +1,146 @@ +package com.foreverwin.mesnac.production.controller; + +import com.foreverwin.mesnac.meapi.util.StringUtils; +import com.foreverwin.modular.core.exception.BusinessException; +import com.foreverwin.modular.core.util.R; +import com.foreverwin.modular.core.util.FrontPage; +import com.foreverwin.modular.core.util.CommonMethods; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import com.foreverwin.mesnac.production.service.SfcDataService; +import com.foreverwin.mesnac.production.model.SfcData; +import java.util.List; + +/** + * + * @author Leon.L + * @since 2021-06-29 + */ +@RestController +@RequestMapping("/SFC-DATA") +public class SfcDataController { + + @Autowired + public SfcDataService sfcDataService; + + /** + * 根据id查询 + * + * @param id 主键 + * @return + */ + @ResponseBody + @GetMapping("/{id:.+}") + public R getSfcDataById(@PathVariable String id) { + return R.ok( sfcDataService.getById(id)); + } + + /** + * 查询所有数据 + * + * @return + */ + @ResponseBody + @GetMapping("") + public R getSfcDataList(SfcData sfcData){ + List result; + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(sfcData); + result = sfcDataService.list(queryWrapper); + return R.ok(result); + } + + /** + * 分页查询数据 + * + * @param frontPage 分页信息 + * @return + */ + @ResponseBody + @GetMapping("/page") + public R page(FrontPage frontPage, SfcData sfcData){ + IPage result; + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(sfcData); + if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) { + //TODO modify global query + queryWrapper.lambda().and(wrapper -> wrapper + .like(SfcData::getHandle, frontPage.getGlobalQuery()) + .or().like(SfcData::getSfcBo, frontPage.getGlobalQuery()) + .or().like(SfcData::getDataField, frontPage.getGlobalQuery()) + .or().like(SfcData::getDataAttr, frontPage.getGlobalQuery()) + .or().like(SfcData::getUserBo, frontPage.getGlobalQuery()) + ); + } + result = sfcDataService.page(frontPage.getPagePlus(), queryWrapper); + return R.ok(result); + } + + /** + * 新增 + * @param sfcData 传递的实体 + * @return null 失败 实体成功 + */ + @PostMapping + public R save(@RequestBody SfcData sfcData) { + return R.ok(sfcDataService.save(sfcData)); + } + + /** + * 修改 + * @param sfcData 传递的实体 + * @return null 失败 实体成功 + */ + @PutMapping + public R updateById(@RequestBody SfcData sfcData) { + return R.ok(sfcDataService.updateById(sfcData)); + } + + /** + * 根据id删除对象 + * @param id 实体ID + * @return 0 失败 1 成功 + */ + @ResponseBody + @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}") + public R removeById(@PathVariable("id") String id){ + return R.ok(sfcDataService.removeById(id)); + } + + /** + * 批量删除对象 + * @param ids 实体集合ID + * @return 0 失败 1 成功 + */ + @ResponseBody + @RequestMapping(method = RequestMethod.POST, value = "/delete-batch") + public R removeByIds(List ids){ + return R.ok(sfcDataService.removeByIds(ids)); + } + + + @ResponseBody + @GetMapping("/saveSfcLocation") + public R saveSfcLocation(String sfc, String location) { + try { + if (StringUtils.isBlank(sfc)) { + throw BusinessException.build("SFC不能为空"); + } + if (StringUtils.isBlank(location)) { + throw BusinessException.build("位置不能为空"); + } + + String site = CommonMethods.getSite(); + String user = CommonMethods.getUser(); + sfcDataService.saveSfcLocation(site, user, sfc, location); + } catch (Exception e) { + return R.failed(e.getMessage()); + } + + return R.ok(); + } +} \ No newline at end of file diff --git a/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcCrossMapper.java b/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcCrossMapper.java new file mode 100644 index 00000000..72bc3622 --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcCrossMapper.java @@ -0,0 +1,97 @@ +package com.foreverwin.mesnac.production.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.foreverwin.mesnac.meapi.dto.SfcDto; +import com.foreverwin.mesnac.meapi.model.Sfc; +import com.foreverwin.mesnac.meapi.model.ShopOrder; +import com.foreverwin.mesnac.production.model.StepOperation; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +/** + * 描述: sfc过站 + * 作者: philip + * 时间: 2021-6-29 15:56 + */ +@Repository +public interface SfcCrossMapper extends BaseMapper { + + /** + * 查找绑定的物料条码的SFC数量 + * @param dataField + * @param dataAttr + * @return + */ + List findBindingBarcode(@Param("dataField") String dataField, + @Param("dataAttr") String dataAttr, + @Param("site") String site, + @Param("statusBoList") List statusBoList); + + + /** + * 根据工艺路线查找下面所有的工序, 按照Sequence进行排序 + * @param routerBo + * @return + */ + List findRouterOperationByRouterBo(@Param("site") String site, @Param("routerBo") String routerBo, @Param("locale") String locale); + +// String getDoneSfcItemBo(IPage page, @Param("dataAttr") String dataAttr, +// @Param("site") String site, @Param("statusBo") String statusBo); + + + /** + * 根据工单查找未完成的SFC关联的SN信息 + * @param site + * @param shopOrderRef + * @return + */ + List findOpenStatusSnByShopOrder(@Param("site") String site, @Param("shopOrderRef") String shopOrderRef); + + /** + * 查询某条产线和给定状态的工单列表 + * @param plannedWorkCenterBo + * @param customStatus + * @return + */ + List findShopOrderListByStatus(@Param("plannedWorkCenterBo") String plannedWorkCenterBo, + @Param("status") String customStatus); + + //List> findSfcListBySnList(@Param("site") String site, @Param("snList") List snList); + + /** + * 查找工艺路线的最后一道工序 + * @param page + * @param routerBo + * @return + */ + StepOperation findRouterLastOperationByRouterBo(IPage page, @Param("routerBo") String routerBo); + + /** + * 根据SN查找最后一个有效的SFC信息 + * @param page + * @param site + * @param sn + * @return + */ + Sfc findSfcBySn(IPage page, @Param("site") String site, @Param("sn") String sn); + + /** + * 根据SN查找最后一个有效的SFC信息包含完工状态 + * @param page + * @param site + * @param sn + * @return + */ + Sfc findSfcBySnContainComplete(IPage page, @Param("site") String site, @Param("sn") String sn); + + + List getResourceBySfc(@Param("site") String site, @Param("sfc") String sfc); + + Map querySfcData(@Param("site")String site, @Param("locale")String locale, @Param("dto")SfcDto sfcDto); + + List> querySfcStep(@Param("site")String site, @Param("sfc")String sfc, @Param("operation")String operation); +} diff --git a/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcDataMapper.java b/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcDataMapper.java new file mode 100644 index 00000000..556c728c --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/mapper/SfcDataMapper.java @@ -0,0 +1,18 @@ +package com.foreverwin.mesnac.production.mapper; + +import com.foreverwin.mesnac.production.model.SfcData; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Leon.L + * @since 2021-06-29 + */ +@Repository +public interface SfcDataMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/production/src/main/java/com/foreverwin/mesnac/production/model/SfcData.java b/production/src/main/java/com/foreverwin/mesnac/production/model/SfcData.java new file mode 100644 index 00000000..11e77b50 --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/model/SfcData.java @@ -0,0 +1,141 @@ +package com.foreverwin.mesnac.production.model; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableField; + +/** + *

+ * + *

+ * + * @author Leon.L + * @since 2021-06-29 + */ + +@TableName("SFC_DATA") +public class SfcData extends Model { + + private static final long serialVersionUID = 1L; + + @TableField("HANDLE") + private String handle; + @TableField("SFC_BO") + private String sfcBo; + @TableField("DATE_TIME") + private LocalDateTime dateTime; + @TableField("DATA_FIELD") + private String dataField; + @TableField("DATA_ATTR") + private String dataAttr; + @TableField("USER_BO") + private String userBo; + @TableField("CREATED_DATE_TIME") + private LocalDateTime createdDateTime; + @TableField("MODIFIED_DATE_TIME") + private LocalDateTime modifiedDateTime; + + + public String getHandle() { + return handle; + } + + public void setHandle(String handle) { + this.handle = handle; + } + + public String getSfcBo() { + return sfcBo; + } + + public void setSfcBo(String sfcBo) { + this.sfcBo = sfcBo; + } + + public LocalDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(LocalDateTime dateTime) { + this.dateTime = dateTime; + } + + public String getDataField() { + return dataField; + } + + public void setDataField(String dataField) { + this.dataField = dataField; + } + + public String getDataAttr() { + return dataAttr; + } + + public void setDataAttr(String dataAttr) { + this.dataAttr = dataAttr; + } + + public String getUserBo() { + return userBo; + } + + public void setUserBo(String userBo) { + this.userBo = userBo; + } + + public LocalDateTime getCreatedDateTime() { + return createdDateTime; + } + + public void setCreatedDateTime(LocalDateTime createdDateTime) { + this.createdDateTime = createdDateTime; + } + + public LocalDateTime getModifiedDateTime() { + return modifiedDateTime; + } + + public void setModifiedDateTime(LocalDateTime modifiedDateTime) { + this.modifiedDateTime = modifiedDateTime; + } + + public static final String HANDLE = "HANDLE"; + + public static final String SFC_BO = "SFC_BO"; + + public static final String DATE_TIME = "DATE_TIME"; + + public static final String DATA_FIELD = "DATA_FIELD"; + + public static final String DATA_ATTR = "DATA_ATTR"; + + public static final String USER_BO = "USER_BO"; + + public static final String CREATED_DATE_TIME = "CREATED_DATE_TIME"; + + public static final String MODIFIED_DATE_TIME = "MODIFIED_DATE_TIME"; + + + @Override + protected Serializable pkVal() { + return this.handle; + } + + @Override + public String toString() { + return "SfcData{" + + "handle = " + handle + + ", sfcBo = " + sfcBo + + ", dateTime = " + dateTime + + ", dataField = " + dataField + + ", dataAttr = " + dataAttr + + ", userBo = " + userBo + + ", createdDateTime = " + createdDateTime + + ", modifiedDateTime = " + modifiedDateTime + + "}"; + } +} \ No newline at end of file diff --git a/production/src/main/java/com/foreverwin/mesnac/production/model/StepOperation.java b/production/src/main/java/com/foreverwin/mesnac/production/model/StepOperation.java new file mode 100644 index 00000000..2459a164 --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/model/StepOperation.java @@ -0,0 +1,113 @@ +package com.foreverwin.mesnac.production.model; + +import java.math.BigDecimal; + +/** + * 描述: 工序步骤 + * 作者: philip + * 时间: 2021-6-29 08:48 + */ +public class StepOperation { + + private String operationBo; + + private String operation; + + private String description; + + private String stepId; + + private String erpOperation; + + private BigDecimal sequence; + + /** 步骤排队数量 **/ + private BigDecimal qtyInQueue; + + /** 步骤在制数量 **/ + private BigDecimal qtyInWork; + + private String reportingCenterBo; + + private String resourceBo; + + public String getResourceBo() { + return resourceBo; + } + + public void setResourceBo(String resourceBo) { + this.resourceBo = resourceBo; + } + + public String getOperationBo() { + return operationBo; + } + + public void setOperationBo(String operationBo) { + this.operationBo = operationBo; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getStepId() { + return stepId; + } + + public void setStepId(String stepId) { + this.stepId = stepId; + } + + public BigDecimal getSequence() { + return sequence; + } + + public void setSequence(BigDecimal sequence) { + this.sequence = sequence; + } + + public String getReportingCenterBo() { + return reportingCenterBo; + } + + public void setReportingCenterBo(String reportingCenterBo) { + this.reportingCenterBo = reportingCenterBo; + } + + public BigDecimal getQtyInQueue() { + return qtyInQueue; + } + + public void setQtyInQueue(BigDecimal qtyInQueue) { + this.qtyInQueue = qtyInQueue; + } + + public BigDecimal getQtyInWork() { + return qtyInWork; + } + + public void setQtyInWork(BigDecimal qtyInWork) { + this.qtyInWork = qtyInWork; + } + + public String getErpOperation() { + return erpOperation; + } + + public void setErpOperation(String erpOperation) { + this.erpOperation = erpOperation; + } +} diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/PodTemplateService.java b/production/src/main/java/com/foreverwin/mesnac/production/service/PodTemplateService.java index d6fd1bb0..de7e633e 100644 --- a/production/src/main/java/com/foreverwin/mesnac/production/service/PodTemplateService.java +++ b/production/src/main/java/com/foreverwin/mesnac/production/service/PodTemplateService.java @@ -8,5 +8,5 @@ import java.util.Map; public interface PodTemplateService { Map resrceEnter(WorkCenterDto workCenterDto); - Object sfcEnter(SfcDto workCenterDto); + Map sfcEnter(SfcDto workCenterDto); } diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/SfcDataService.java b/production/src/main/java/com/foreverwin/mesnac/production/service/SfcDataService.java new file mode 100644 index 00000000..1b0669d6 --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/service/SfcDataService.java @@ -0,0 +1,37 @@ +package com.foreverwin.mesnac.production.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.foreverwin.mesnac.production.model.SfcData; +import com.baomidou.mybatisplus.extension.service.IService; +import com.foreverwin.modular.core.util.FrontPage; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author Leon.L + * @since 2021-06-29 + */ +public interface SfcDataService extends IService { + + /** + * 分页查询 + * @param frontPage + * @return + */ + IPage selectPage(FrontPage frontPage, SfcData sfcData); + + List selectList(SfcData sfcData); + + /** + * 保存SFC的跟追位置 + * + * @param site + * @param sfc + * @param location + */ + void saveSfcLocation(String site, String user, String sfc, String location); +} \ No newline at end of file diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java index d1c314e6..ae844a1b 100644 --- a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java +++ b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/PodTemplateServiceImpl.java @@ -5,14 +5,17 @@ import com.foreverwin.mesnac.common.service.CommonService; import com.foreverwin.mesnac.common.util.StringUtil; import com.foreverwin.mesnac.meapi.dto.SfcDto; import com.foreverwin.mesnac.meapi.dto.WorkCenterDto; +import com.foreverwin.mesnac.meapi.model.Operation; import com.foreverwin.mesnac.meapi.model.Resrce; import com.foreverwin.mesnac.meapi.model.Sfc; import com.foreverwin.mesnac.meapi.service.ResrceService; import com.foreverwin.mesnac.meapi.service.SfcService; +import com.foreverwin.mesnac.production.mapper.SfcCrossMapper; import com.foreverwin.mesnac.production.service.PodTemplateService; import com.foreverwin.modular.core.exception.BaseException; import com.foreverwin.modular.core.util.CommonMethods; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +33,8 @@ public class PodTemplateServiceImpl implements PodTemplateService { private SfcService sfcService; @Autowired private CommonService commonService; + @Autowired + private SfcCrossMapper sfcCrossMapper; @Override public Map resrceEnter(WorkCenterDto workCenterDto) { @@ -60,135 +65,135 @@ public class PodTemplateServiceImpl implements PodTemplateService { } @Override - public Object sfcEnter(SfcDto sfcDto) { -// String site = CommonMethods.getSite(); -// String sfc = sfcDto.getSfc(); -// String operation = sfcDto.getOperation(); -// //校验产品条码是否存在 -// Sfc sfcById = sfcService.getById(HandleEnum.SFC.getHandle(site, sfc)); -// if (sfcById==null){ -// throw new BaseException("产品条码"+sfc+"不存在"); -// } -// //校验产品条码是否在当前工序排队 -// Operation operationBySfcBo = commonService.getOperationBySfcBo(sfcById.getHandle()); -// if (!operationBySfcBo.getOperation().equals(operation)){ -// throw new BaseException("产品条码"+sfc+"在"+operationBySfcBo.getDescription()+"工序"); -// } -// //校验SFC+工序+设备+STEP_ID是否与当前设备确认的派工单匹配 -// -// String substep = ""; -// String substepHandle = ""; -// //构造前台所需要的数据 -// Map resultMap = sfcDataMainMapper.querySfcData(paramMap); -// if(resultMap == null){ -// throw new BaseException("根据当前资源未找到条码[" + sfc + "]的基本信息!"); -// } -// List> substepList = sfcDataMainMapper.querySfcStep(site, sfc, operation); -// resultMap.put("SFC_STEP_LIST", substepList); -// -// String stepId = (String) resultMap.get("STEP_ID"); -// //2021/1/20 roc 根据SFC和步骤标识查找是否维护了尾检项 -// List> checkOperationCheckW = sfcDataMainMapper.checkOperationCheckW(site, sfc, stepId); -// if(null != checkOperationCheckW && checkOperationCheckW.size() >0){ -// resultMap.put("IS_CREATE_W", "Y"); -// }else{ -// resultMap.put("IS_CREATE_W", "N"); -// } -// -// String isCreateH = "Y"; -// String isCreateZ = "Y"; -// if(!"403".equals(resultMap.get("STATUS"))) { -// //SFC未开始 -// //判断对否需要进行互检 -// List> checkOperationCheckH = sfcDataMainMapper.checkOperationCheckH(site, sfc, stepId); -// if(checkOperationCheckH.size() > 0 ){ -// resultMap.put("IS_CHECK_H", "Y"); -// //自检/互检 校验是否在当前工序+工序标识 做过检验任务 -// List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId); -// if (checkList.size() > 0) { -// for (int i = 0; i < checkList.size(); i++) { -// if (checkList.get(i).get("STATUS").equals("COMPLETE") && checkList.get(i).get("RESULT").equals("OK")) { -// isCreateH = "N"; -// } -// } -// } -// -// } -// }else{ -// //sfc已开始 -// for (int i = 0; i < substepList.size(); i++) { -// if ("READY".equals(substepList.get(i).get("STATE")) && "true".equals(substepList.get(i).get("IS_SEQTRUE"))) { -// substep = (String) substepList.get(i).get("STEP_ID"); -// substepHandle = (String) substepList.get(i).get("HANDLE"); -// } -// } -// //判断是否存在工步 -// if(StringUtils.isEmpty(substep)){ -// //判断对否需要进行自检(无工步) -// List> checkOperationCheckZ = sfcDataMainMapper.checkOperationCheckZ(site, sfc, stepId); -// if(checkOperationCheckZ.size() > 0 ){ -// resultMap.put("IS_CHECK_Z", "Y"); -// //自检/互检 校验是否在当前工序+工序标识 做过检验任务 -// List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "Z", (String) resultMap.get("OPERATION"), stepId); -// if (checkList.size() > 0) { -// for (int i = 0; i < checkList.size(); i++) { -// if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { -// isCreateZ = "N"; -// } -// } -// } -// -// } -// -// //判断对否需要进行互检(无工步) -// List> checkOperationCheckH = sfcDataMainMapper.checkOperationCheckH(site, sfc, stepId); -// if(checkOperationCheckH.size() > 0 ){ -// resultMap.put("IS_CHECK_H", "Y"); -// //自检/互检 校验是否在当前工序+工序标识 做过检验任务 -// List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId); -// if (checkList.size() > 0) { -// for (int i = 0; i < checkList.size(); i++) { -// if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { -// isCreateH = "N"; -// } -// } -// } -// } -// }else{ -// //判断对否需要进行自检(有工步) -// List> checkSubstepCheckZ = sfcDataMainMapper.checkSubstepCheckZ(substepHandle); -// if(checkSubstepCheckZ.size() > 0 ){ -// resultMap.put("IS_CHECK_Z", "Y"); -// //自检/互检 校验是否在当前工序+工序+工步标识 做过检验任务 -// List> checkList = taskMapper.checkCreateTaskSfcDetail(sfc, site, "Z", (String) resultMap.get("OPERATION"), stepId, substep); -// if (checkList.size() > 0) { -// for (int i = 0; i < checkList.size(); i++) { -// if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { -// isCreateZ = "N"; -// } -// } -// } -// -// } -// -// //判断对否需要进行互检(有工步) -// List> checkSubstepCheckH = sfcDataMainMapper.checkSubstepCheckH(substepHandle); -// if(checkSubstepCheckH.size() > 0 ){ -// resultMap.put("IS_CHECK_H", "Y"); -// //自检/互检 校验是否在当前工序+工序标识 做过检验任务 -// List> checkList = taskMapper.checkCreateTaskSfcDetail(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId, substep); -// if (checkList.size() > 0) { -// for (int i = 0; i < checkList.size(); i++) { -// if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { -// isCreateH = "N"; -// } -// } -// } -// } -// } -// } -// resultMap.put("IS_CREATE_H", isCreateH); -// resultMap.put("IS_CREATE_Z", isCreateZ); + public Map sfcEnter(SfcDto sfcDto) { + String site = CommonMethods.getSite(); + String sfc = sfcDto.getSfc(); + String operation = sfcDto.getOperation(); + String locale = LocaleContextHolder.getLocale().getLanguage(); + //校验产品条码是否存在 + Sfc sfcById = sfcService.getById(HandleEnum.SFC.getHandle(site, sfc)); + if (sfcById==null){ + throw new BaseException("产品条码"+sfc+"不存在"); + } + //校验产品条码是否在当前工序排队 + Operation operationBySfcBo = commonService.getOperationBySfcBo(sfcById.getHandle()); + if (StringUtil.notBlank(operation)&&!operationBySfcBo.getOperation().equals(operation)){ + throw new BaseException("产品条码"+sfc+"在"+operationBySfcBo.getOperation()+"/"+operationBySfcBo.getDescription()+"工序"); + } + //校验SFC+工序+设备+STEP_ID是否与当前设备确认的派工单匹配 + + String substep = ""; + String substepHandle = ""; + //构造前台所需要的数据 + Map resultMap = sfcCrossMapper.querySfcData(site,locale,sfcDto); + if(resultMap == null){ + throw new BaseException("根据当前资源未找到条码[" + sfc + "]的基本信息!"); + } + List> substepList = sfcCrossMapper.querySfcStep(site, sfc, operation); + resultMap.put("SFC_STEP_LIST", substepList); + + String stepId = (String) resultMap.get("STEP_ID"); + //2021/1/20 roc 根据SFC和步骤标识查找是否维护了尾检项 + /*List> checkOperationCheckW = sfcDataMainMapper.checkOperationCheckW(site, sfc, stepId); + if(null != checkOperationCheckW && checkOperationCheckW.size() >0){ + resultMap.put("IS_CREATE_W", "Y"); + }else{ + resultMap.put("IS_CREATE_W", "N"); + }*/ + resultMap.put("IS_CREATE_W", "N"); + + String isCreateH = "N"; + String isCreateZ = "N"; + /*if(!"403".equals(resultMap.get("STATUS"))) { + //SFC未开始 + //判断对否需要进行互检 + *//* List> checkOperationCheckH = sfcDataMainMapper.checkOperationCheckH(site, sfc, stepId); + if(checkOperationCheckH.size() > 0 ){ + resultMap.put("IS_CHECK_H", "Y"); + //自检/互检 校验是否在当前工序+工序标识 做过检验任务 + List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId); + if (checkList.size() > 0) { + for (int i = 0; i < checkList.size(); i++) { + if (checkList.get(i).get("STATUS").equals("COMPLETE") && checkList.get(i).get("RESULT").equals("OK")) { + isCreateH = "N"; + } + } + } + + }*//* + }else{ + //sfc已开始 + for (int i = 0; i < substepList.size(); i++) { + if ("READY".equals(substepList.get(i).get("STATE")) && "true".equals(substepList.get(i).get("IS_SEQTRUE"))) { + substep = (String) substepList.get(i).get("STEP_ID"); + substepHandle = (String) substepList.get(i).get("HANDLE"); + } + } + //判断是否存在工步 + if(StringUtil.isEmpty(substep)){ + //判断对否需要进行自检(无工步) + List> checkOperationCheckZ = sfcDataMainMapper.checkOperationCheckZ(site, sfc, stepId); + if(checkOperationCheckZ.size() > 0 ){ + resultMap.put("IS_CHECK_Z", "Y"); + //自检/互检 校验是否在当前工序+工序标识 做过检验任务 + List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "Z", (String) resultMap.get("OPERATION"), stepId); + if (checkList.size() > 0) { + for (int i = 0; i < checkList.size(); i++) { + if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { + isCreateZ = "N"; + } + } + } + } + //判断对否需要进行互检(无工步) + List> checkOperationCheckH = sfcDataMainMapper.checkOperationCheckH(site, sfc, stepId); + if(checkOperationCheckH.size() > 0 ){ + resultMap.put("IS_CHECK_H", "Y"); + //自检/互检 校验是否在当前工序+工序标识 做过检验任务 + List> checkList = taskMapper.checkCreateTaskSfc(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId); + if (checkList.size() > 0) { + for (int i = 0; i < checkList.size(); i++) { + if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { + isCreateH = "N"; + } + } + } + } + }else{ + //判断对否需要进行自检(有工步) + List> checkSubstepCheckZ = sfcDataMainMapper.checkSubstepCheckZ(substepHandle); + if(checkSubstepCheckZ.size() > 0 ){ + resultMap.put("IS_CHECK_Z", "Y"); + //自检/互检 校验是否在当前工序+工序+工步标识 做过检验任务 + List> checkList = taskMapper.checkCreateTaskSfcDetail(sfc, site, "Z", (String) resultMap.get("OPERATION"), stepId, substep); + if (checkList.size() > 0) { + for (int i = 0; i < checkList.size(); i++) { + if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { + isCreateZ = "N"; + } + } + } + + } + + //判断对否需要进行互检(有工步) + List> checkSubstepCheckH = sfcDataMainMapper.checkSubstepCheckH(substepHandle); + if(checkSubstepCheckH.size() > 0 ){ + resultMap.put("IS_CHECK_H", "Y"); + //自检/互检 校验是否在当前工序+工序标识 做过检验任务 + List> checkList = taskMapper.checkCreateTaskSfcDetail(sfc, site, "H", (String) resultMap.get("OPERATION"), stepId, substep); + if (checkList.size() > 0) { + for (int i = 0; i < checkList.size(); i++) { + if (checkList.get(i).get("STATUS").equals("COMPLETE") && "OK".equals(checkList.get(i).get("RESULT"))) { + isCreateH = "N"; + } + } + } + } + } + }*/ + resultMap.put("IS_CREATE_H", isCreateH); + resultMap.put("IS_CREATE_Z", isCreateZ); return null; } } diff --git a/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SfcDataServiceImpl.java b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SfcDataServiceImpl.java new file mode 100644 index 00000000..d41a2dcc --- /dev/null +++ b/production/src/main/java/com/foreverwin/mesnac/production/service/impl/SfcDataServiceImpl.java @@ -0,0 +1,114 @@ +package com.foreverwin.mesnac.production.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.foreverwin.mesnac.common.constant.CustomFieldConstant; +import com.foreverwin.mesnac.common.enums.HandleEnum; +import com.foreverwin.mesnac.meapi.model.Sfc; +import com.foreverwin.mesnac.meapi.model.WorkCenter; +import com.foreverwin.mesnac.meapi.service.SfcService; +import com.foreverwin.mesnac.meapi.service.WorkCenterService; +import com.foreverwin.modular.core.exception.BusinessException; +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.production.model.SfcData; +import com.foreverwin.mesnac.production.mapper.SfcDataMapper; +import com.foreverwin.mesnac.production.service.SfcDataService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author Leon.L + * @since 2021-06-29 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class SfcDataServiceImpl extends ServiceImpl implements SfcDataService { + + @Autowired + private SfcService sfcService; + @Autowired + private SfcDataMapper sfcDataMapper; + @Autowired + private WorkCenterService workCenterService; + + @Override + public IPage selectPage(FrontPage frontPage, SfcData sfcData) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(sfcData); + return super.page(frontPage.getPagePlus(), queryWrapper); + } + + @Override + public List selectList(SfcData sfcData) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.setEntity(sfcData); + return super.list(queryWrapper); + } + + @Override + public void saveSfcLocation(String site, String user, String sfc, String location) { + String sfcBo = HandleEnum.SFC.getHandle(site, sfc); + Sfc sfcModel = sfcService.getById(sfcBo); + if (sfcModel == null) { + throw BusinessException.build("SFC【" +sfc+"】不存在"); + } + + //位置所录入的字符串“_”前的字符为车间代码 + if (!location.contains("_")) { + throw BusinessException.build("输入的位置【" +location+ "】格式不正确:必须包含符号【_】,并且符号之前必须是车间代码"); + } + String workCenterBo = HandleEnum.WORK_CENTER.getHandle(site, location.split("_")[0]); + WorkCenter workCenterModel = workCenterService.getById(workCenterBo); + if (workCenterModel == null || !"LEVEL4".equals(workCenterModel.getWcCategory())) { + throw BusinessException.build("位置【" +location+"】中符号【_】之前的不是车间代码"); + } + + LocalDateTime nowDate = LocalDateTime.now(); + //查询是否存在 + Map map = new HashMap<>(); + map.put(SfcData.SFC_BO, sfcBo); + map.put(SfcData.DATA_FIELD, CustomFieldConstant.SFC_DATA_LOCATION); + List sfcDataList = sfcDataMapper.selectByMap(map); + + if (sfcDataList == null || sfcDataList.size() <= 0) { + //记录位置到SFC + SfcData sfcData = new SfcData(); + sfcData.setHandle(HandleEnum.SFC_DATA.getHandle(site, sfcBo, CustomFieldConstant.SFC_DATA_LOCATION)); + sfcData.setSfcBo(sfcBo); + sfcData.setDataField(CustomFieldConstant.SFC_DATA_LOCATION); + sfcData.setDataAttr(location); + sfcData.setDateTime(nowDate); + sfcData.setUserBo(HandleEnum.USER.getHandle(site, user)); + sfcData.setCreatedDateTime(nowDate); + sfcDataMapper.insert(sfcData); + } else { + //更新位置到SFC + SfcData sfcData = sfcDataList.get(0); + sfcData.setDataAttr(location); + sfcData.setDateTime(nowDate); + sfcData.setModifiedDateTime(nowDate); + + Wrapper updateWrapper = new UpdateWrapper<>(); + SfcData tjSfcData = new SfcData(); + tjSfcData.setSfcBo(sfcBo); + tjSfcData.setDataField(CustomFieldConstant.SFC_DATA_LOCATION); + ((UpdateWrapper) updateWrapper).setEntity(tjSfcData); + sfcDataMapper.update(sfcData, updateWrapper); + } + } + + +} \ No newline at end of file diff --git a/production/src/main/resources/mapper/SfcCrossMapper.xml b/production/src/main/resources/mapper/SfcCrossMapper.xml new file mode 100644 index 00000000..88d69a6c --- /dev/null +++ b/production/src/main/resources/mapper/SfcCrossMapper.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/production/src/main/resources/mapper/SfcDataMapper.xml b/production/src/main/resources/mapper/SfcDataMapper.xml new file mode 100644 index 00000000..5c4a147f --- /dev/null +++ b/production/src/main/resources/mapper/SfcDataMapper.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + HANDLE, SFC_BO, DATE_TIME, DATA_FIELD, DATA_ATTR, USER_BO, CREATED_DATE_TIME, MODIFIED_DATE_TIME + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO SFC_DATA + + HANDLE, + SFC_BO, + DATE_TIME, + DATA_FIELD, + DATA_ATTR, + USER_BO, + CREATED_DATE_TIME, + MODIFIED_DATE_TIME, + VALUES + + #{handle}, + #{sfcBo}, + #{dateTime}, + #{dataField}, + #{dataAttr}, + #{userBo}, + #{createdDateTime}, + #{modifiedDateTime}, + + + + + INSERT INTO SFC_DATA + + + VALUES + + #{handle}, + #{sfcBo}, + #{dateTime}, + #{dataField}, + #{dataAttr}, + #{userBo}, + #{createdDateTime}, + #{modifiedDateTime}, + + + + + + + + + + UPDATE SFC_DATA + HANDLE=#{et.handle}, + SFC_BO=#{et.sfcBo}, + DATE_TIME=#{et.dateTime}, + DATA_FIELD=#{et.dataField}, + DATA_ATTR=#{et.dataAttr}, + USER_BO=#{et.userBo}, + CREATED_DATE_TIME=#{et.createdDateTime}, + MODIFIED_DATE_TIME=#{et.modifiedDateTime}, + + + + + HANDLE=#{ew.entity.handle} + AND SFC_BO=#{ew.entity.sfcBo} + AND DATE_TIME=#{ew.entity.dateTime} + AND DATA_FIELD=#{ew.entity.dataField} + AND DATA_ATTR=#{ew.entity.dataAttr} + AND USER_BO=#{ew.entity.userBo} + AND CREATED_DATE_TIME=#{ew.entity.createdDateTime} + AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime} + + + ${ew.sqlSegment} + + + + + ${ew.sqlSegment} + + + + + + DELETE FROM SFC_DATA + + + + + ${k} = #{cm[${k}]} + + + + + + + + DELETE FROM SFC_DATA + + + + + HANDLE=#{ew.entity.handle} + + AND SFC_BO=#{ew.entity.sfcBo} + AND DATE_TIME=#{ew.entity.dateTime} + AND DATA_FIELD=#{ew.entity.dataField} + AND DATA_ATTR=#{ew.entity.dataAttr} + AND USER_BO=#{ew.entity.userBo} + AND CREATED_DATE_TIME=#{ew.entity.createdDateTime} + AND MODIFIED_DATE_TIME=#{ew.entity.modifiedDateTime} + + + ${ew.sqlSegment} + + + + + ${ew.sqlSegment} + + + + + +