|
@@ -0,0 +1,486 @@
|
|
|
|
|
+package com.jeesite.modules.mes.service;
|
|
|
|
|
+
|
|
|
|
|
+import com.jeesite.common.config.Global;
|
|
|
|
|
+import com.jeesite.common.entity.Page;
|
|
|
|
|
+import com.jeesite.common.lang.StringUtils;
|
|
|
|
|
+import com.jeesite.common.service.CrudService;
|
|
|
|
|
+import com.jeesite.common.service.ServiceException;
|
|
|
|
|
+import com.jeesite.common.utils.excel.ExcelImport;
|
|
|
|
|
+import com.jeesite.modules.mes.dao.MesWorkOrderDao;
|
|
|
|
|
+import com.jeesite.modules.mes.entity.MesLine;
|
|
|
|
|
+import com.jeesite.modules.mes.entity.MesProductCate;
|
|
|
|
|
+import com.jeesite.modules.mes.entity.MesWorkOrder;
|
|
|
|
|
+import com.jeesite.modules.mes.entity.MesWorkOrderSn;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.HashSet;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Set;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 工单Service。维护单据,并在上线时校验、回写完工数量。
|
|
|
|
|
+ * @author mes
|
|
|
|
|
+ * @version 2026-10-10
|
|
|
|
|
+ */
|
|
|
|
|
+@Service
|
|
|
|
|
+public class MesWorkOrderService extends CrudService<MesWorkOrderDao, MesWorkOrder> {
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MesLineService mesLineService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MesProductCateService mesProductCateService;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public MesWorkOrder get(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
+ return super.get(mesWorkOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Page<MesWorkOrder> findPage(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
+ return super.findPage(mesWorkOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<MesWorkOrder> findList(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
+ return super.findList(mesWorkOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 上线匹配结果。code 为空表示可以生产。
|
|
|
|
|
+ */
|
|
|
|
|
+ public static class OnlineMatch {
|
|
|
|
|
+ private String code;
|
|
|
|
|
+ private MesWorkOrder order;
|
|
|
|
|
+
|
|
|
|
|
+ public boolean isOk() {
|
|
|
|
|
+ return code == null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public String getCode() {
|
|
|
|
|
+ return code;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public MesWorkOrder getOrder() {
|
|
|
|
|
+ return order;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 参数 mes.workOrder.check 为 1 时,上线校验工单并回写完工数量。
|
|
|
|
|
+ */
|
|
|
|
|
+ public boolean isCheckEnabled() {
|
|
|
|
|
+ return "1".equals(Global.getConfig("mes.workOrder.check"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 按产线和工件类型匹配一张已下达或生产中的工单。
|
|
|
|
|
+ * 开关关闭时不校验,order 为空。
|
|
|
|
|
+ */
|
|
|
|
|
+ public OnlineMatch matchOnline(String lineSn, String sn, String lineCate) {
|
|
|
|
|
+ OnlineMatch match = new OnlineMatch();
|
|
|
|
|
+ if (!isCheckEnabled()) {
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(lineSn)) {
|
|
|
|
|
+ match.code = "WO";
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<MesWorkOrder> orders = dao.findOnline(lineSn.trim());
|
|
|
|
|
+ if (orders == null || orders.isEmpty()) {
|
|
|
|
|
+ match.code = "WO";
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean anyCate = false;
|
|
|
|
|
+ for (MesWorkOrder order : orders) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(order.getCateSn())) {
|
|
|
|
|
+ anyCate = true;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!anyCate) {
|
|
|
|
|
+ match.code = "WC";
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ String scannedSn = null;
|
|
|
|
|
+ if (StringUtils.isNotBlank(sn)) {
|
|
|
|
|
+ MesProductCate scanned = mesProductCateService.getCateBySn(sn.trim());
|
|
|
|
|
+ if (scanned != null) {
|
|
|
|
|
+ scannedSn = scanned.getSn();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ List<MesWorkOrder> matched = new ArrayList<MesWorkOrder>();
|
|
|
|
|
+ for (MesWorkOrder order : orders) {
|
|
|
|
|
+ if (StringUtils.isBlank(order.getCateSn())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isNotBlank(scannedSn)) {
|
|
|
|
|
+ if (order.getCateSn().equalsIgnoreCase(scannedSn)) {
|
|
|
|
|
+ matched.add(order);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (orders.size() == 1 || order.getCateSn().equalsIgnoreCase(lineCate == null ? "" : lineCate)) {
|
|
|
|
|
+ matched.add(order);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (matched.isEmpty()) {
|
|
|
|
|
+ match.code = "WT";
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ MesWorkOrder order = matched.get(0);
|
|
|
|
|
+ int done = order.getDoneQty() == null ? 0 : order.getDoneQty();
|
|
|
|
|
+ int plan = order.getPlanQty() == null ? 0 : order.getPlanQty();
|
|
|
|
|
+ if (done >= plan) {
|
|
|
|
|
+ match.code = "WQ";
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ match.order = order;
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void refreshDoneQty(String workNo) {
|
|
|
|
|
+ if (StringUtils.isBlank(workNo)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ MesWorkOrder order = findByWorkNo(workNo);
|
|
|
|
|
+ if (order == null || !MesWorkOrder.STATUS_NORMAL.equals(order.getStatus())) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!MesWorkOrder.STATE_ISSUED.equals(order.getState()) && !MesWorkOrder.STATE_PRODUCING.equals(order.getState())) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ int done = dao.countOnlineOk(workNo);
|
|
|
|
|
+ order.setDoneQty(done);
|
|
|
|
|
+ if (order.getPlanQty() != null && done >= order.getPlanQty()) {
|
|
|
|
|
+ order.setState(MesWorkOrder.STATE_DONE);
|
|
|
|
|
+ } else if (MesWorkOrder.STATE_ISSUED.equals(order.getState())) {
|
|
|
|
|
+ order.setState(MesWorkOrder.STATE_PRODUCING);
|
|
|
|
|
+ }
|
|
|
|
|
+ dao.updateDone(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Page<MesWorkOrderSn> findSnPage(MesWorkOrderSn query) {
|
|
|
|
|
+ Page<MesWorkOrderSn> page = query.getPage();
|
|
|
|
|
+ page.setList(dao.findSnList(query));
|
|
|
|
|
+ return page;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public MesWorkOrder findByWorkNo(String workNo) {
|
|
|
|
|
+ if (StringUtils.isBlank(workNo)) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return dao.findByWorkNo(workNo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void save(MesWorkOrder order) {
|
|
|
|
|
+ normalize(order);
|
|
|
|
|
+ if (order.getIsNewRecord()) {
|
|
|
|
|
+ insertFromForm(order);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ updateFromForm(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void delete(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = get(order);
|
|
|
|
|
+ if (old == null) {
|
|
|
|
|
+ throw new ServiceException(text("工单不存在"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!MesWorkOrder.STATE_DRAFT.equals(old.getState())) {
|
|
|
|
|
+ throw new ServiceException(text("只有待下达的工单可以删除"));
|
|
|
|
|
+ }
|
|
|
|
|
+ super.delete(old);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void issue(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = required(order);
|
|
|
|
|
+ if (!MesWorkOrder.STATE_DRAFT.equals(old.getState())) {
|
|
|
|
|
+ throw new ServiceException(text("只有待下达的工单可以下达"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(old.getLineSn())) {
|
|
|
|
|
+ throw new ServiceException(text("请先选择产线再下达"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(old.getCateSn())) {
|
|
|
|
|
+ throw new ServiceException(text("请先选择工件类型再下达"));
|
|
|
|
|
+ }
|
|
|
|
|
+ checkLine(old.getLineSn());
|
|
|
|
|
+ checkCate(old.getCateSn());
|
|
|
|
|
+ old.setState(MesWorkOrder.STATE_ISSUED);
|
|
|
|
|
+ super.save(old);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void recall(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = required(order);
|
|
|
|
|
+ if (!MesWorkOrder.STATE_ISSUED.equals(old.getState())) {
|
|
|
|
|
+ throw new ServiceException(text("只有已下达的工单可以撤回"));
|
|
|
|
|
+ }
|
|
|
|
|
+ old.setState(MesWorkOrder.STATE_DRAFT);
|
|
|
|
|
+ super.save(old);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public void close(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = required(order);
|
|
|
|
|
+ if (!MesWorkOrder.STATE_DRAFT.equals(old.getState()) && !MesWorkOrder.STATE_ISSUED.equals(old.getState())) {
|
|
|
|
|
+ throw new ServiceException(text("当前状态不能关闭"));
|
|
|
|
|
+ }
|
|
|
|
|
+ old.setState(MesWorkOrder.STATE_CLOSED);
|
|
|
|
|
+ super.save(old);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 样表第 1 行是说明,第 2 行是表头,数据从第 3 行开始。
|
|
|
|
|
+ */
|
|
|
|
|
+ @Transactional
|
|
|
|
|
+ public String importData(MultipartFile file) {
|
|
|
|
|
+ if (file == null) {
|
|
|
|
|
+ throw new ServiceException(text("请选择导入的数据文件!"));
|
|
|
|
|
+ }
|
|
|
|
|
+ int successNum = 0;
|
|
|
|
|
+ int failureNum = 0;
|
|
|
|
|
+ StringBuilder successMsg = new StringBuilder();
|
|
|
|
|
+ StringBuilder failureMsg = new StringBuilder();
|
|
|
|
|
+ Set<String> seen = new HashSet<String>();
|
|
|
|
|
+ try (ExcelImport ei = new ExcelImport(file, 2, 0)) {
|
|
|
|
|
+ List<MesWorkOrder> list = ei.getDataList(MesWorkOrder.class);
|
|
|
|
|
+ for (MesWorkOrder order : list) {
|
|
|
|
|
+ normalize(order);
|
|
|
|
|
+ if (isBlankRow(order)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ String label = StringUtils.defaultIfBlank(order.getWorkNo(), "空工单号");
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (StringUtils.isNotBlank(order.getWorkNo()) && !seen.add(order.getWorkNo())) {
|
|
|
|
|
+ throw new ServiceException(text("文件中工单号重复"));
|
|
|
|
|
+ }
|
|
|
|
|
+ saveImported(order);
|
|
|
|
|
+ successNum++;
|
|
|
|
|
+ successMsg.append("<br/>").append(successNum).append("、工单 ").append(label).append(" 导入成功");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ failureNum++;
|
|
|
|
|
+ failureMsg.append("<br/>").append(failureNum).append("、工单 ").append(label).append(" 导入失败:")
|
|
|
|
|
+ .append(e.getMessage());
|
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (ServiceException e) {
|
|
|
|
|
+ throw e;
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
|
+ throw new ServiceException(e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (successNum == 0 && failureNum == 0) {
|
|
|
|
|
+ throw new ServiceException(text("没有可导入的数据"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (failureNum > 0) {
|
|
|
|
|
+ failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据不正确,错误如下:");
|
|
|
|
|
+ throw new ServiceException(failureMsg.toString());
|
|
|
|
|
+ }
|
|
|
|
|
+ successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
|
|
|
|
|
+ return successMsg.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void insertFromForm(MesWorkOrder order) {
|
|
|
|
|
+ validateCore(order);
|
|
|
|
|
+ checkLine(order.getLineSn());
|
|
|
|
|
+ checkCate(order.getCateSn());
|
|
|
|
|
+ MesWorkOrder exist = findByWorkNo(order.getWorkNo());
|
|
|
|
|
+ if (exist != null && !MesWorkOrder.STATUS_DELETE.equals(exist.getStatus())) {
|
|
|
|
|
+ throw new ServiceException(text("工单号已存在"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (exist != null) {
|
|
|
|
|
+ revive(exist, order, true);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ order.setState(MesWorkOrder.STATE_DRAFT);
|
|
|
|
|
+ order.setDoneQty(0);
|
|
|
|
|
+ super.save(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void updateFromForm(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = get(order);
|
|
|
|
|
+ if (old == null) {
|
|
|
|
|
+ throw new ServiceException(text("工单不存在"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!StringUtils.equals(old.getWorkNo(), order.getWorkNo())) {
|
|
|
|
|
+ throw new ServiceException(text("工单号不能修改"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (MesWorkOrder.STATE_DRAFT.equals(old.getState())) {
|
|
|
|
|
+ validateCore(order);
|
|
|
|
|
+ checkLine(order.getLineSn());
|
|
|
|
|
+ checkCate(order.getCateSn());
|
|
|
|
|
+ order.setState(old.getState());
|
|
|
|
|
+ order.setDoneQty(old.getDoneQty() == null ? 0 : old.getDoneQty());
|
|
|
|
|
+ super.save(order);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (MesWorkOrder.STATE_ISSUED.equals(old.getState())) {
|
|
|
|
|
+ if (StringUtils.isBlank(order.getLineSn())) {
|
|
|
|
|
+ throw new ServiceException(text("已下达工单不能清空产线"));
|
|
|
|
|
+ }
|
|
|
|
|
+ checkLine(order.getLineSn());
|
|
|
|
|
+ if (order.getOpenDate() == null || order.getProduceDate() == null) {
|
|
|
|
|
+ throw new ServiceException(text("开单日期和生产日期不能为空"));
|
|
|
|
|
+ }
|
|
|
|
|
+ old.setLineSn(order.getLineSn());
|
|
|
|
|
+ old.setOpenDate(order.getOpenDate());
|
|
|
|
|
+ old.setProduceDate(order.getProduceDate());
|
|
|
|
|
+ old.setSaleOrderNo(order.getSaleOrderNo());
|
|
|
|
|
+ old.setRemarks(order.getRemarks());
|
|
|
|
|
+ super.save(old);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ throw new ServiceException(text("当前状态不能修改"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void saveImported(MesWorkOrder incoming) {
|
|
|
|
|
+ validateCore(incoming);
|
|
|
|
|
+ MesWorkOrder exist = findByWorkNo(incoming.getWorkNo());
|
|
|
|
|
+ if (exist == null) {
|
|
|
|
|
+ incoming.setIsNewRecord(true);
|
|
|
|
|
+ incoming.setState(MesWorkOrder.STATE_DRAFT);
|
|
|
|
|
+ incoming.setDoneQty(0);
|
|
|
|
|
+ incoming.setLineSn(null);
|
|
|
|
|
+ super.save(incoming);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (MesWorkOrder.STATUS_DELETE.equals(exist.getStatus())) {
|
|
|
|
|
+ revive(exist, incoming, false);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!MesWorkOrder.STATE_DRAFT.equals(exist.getState())) {
|
|
|
|
|
+ throw new ServiceException(text("不是待下达,不能通过导入覆盖"));
|
|
|
|
|
+ }
|
|
|
|
|
+ copySchedule(exist, incoming);
|
|
|
|
|
+ super.save(exist);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void revive(MesWorkOrder exist, MesWorkOrder incoming, boolean fromForm) {
|
|
|
|
|
+ exist.setStatus(MesWorkOrder.STATUS_NORMAL);
|
|
|
|
|
+ updateStatus(exist);
|
|
|
|
|
+ if (fromForm) {
|
|
|
|
|
+ copySchedule(exist, incoming);
|
|
|
|
|
+ exist.setLineSn(incoming.getLineSn());
|
|
|
|
|
+ exist.setRemarks(incoming.getRemarks());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ copySchedule(exist, incoming);
|
|
|
|
|
+ exist.setLineSn(null);
|
|
|
|
|
+ exist.setRemarks(null);
|
|
|
|
|
+ }
|
|
|
|
|
+ exist.setState(MesWorkOrder.STATE_DRAFT);
|
|
|
|
|
+ exist.setDoneQty(0);
|
|
|
|
|
+ super.save(exist);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void copySchedule(MesWorkOrder target, MesWorkOrder source) {
|
|
|
|
|
+ target.setProjectCode(source.getProjectCode());
|
|
|
|
|
+ target.setMaterialSn(source.getMaterialSn());
|
|
|
|
|
+ target.setSpecName(source.getSpecName());
|
|
|
|
|
+ target.setDrawingNo(source.getDrawingNo());
|
|
|
|
|
+ target.setPlanQty(source.getPlanQty());
|
|
|
|
|
+ target.setOpenDate(source.getOpenDate());
|
|
|
|
|
+ target.setProduceDate(source.getProduceDate());
|
|
|
|
|
+ target.setSaleOrderNo(source.getSaleOrderNo());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private MesWorkOrder required(MesWorkOrder order) {
|
|
|
|
|
+ MesWorkOrder old = get(order);
|
|
|
|
|
+ if (old == null) {
|
|
|
|
|
+ throw new ServiceException(text("工单不存在"));
|
|
|
|
|
+ }
|
|
|
|
|
+ return old;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void validateCore(MesWorkOrder order) {
|
|
|
|
|
+ if (StringUtils.isBlank(order.getWorkNo()) || !order.getWorkNo().matches("M.+")) {
|
|
|
|
|
+ throw new ServiceException(text("工单号必须以M开头"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getWorkNo().length() > 64) {
|
|
|
|
|
+ throw new ServiceException(text("工单号长度不能超过 64 个字符"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(order.getMaterialSn()) || !order.getMaterialSn().matches("1.+")) {
|
|
|
|
|
+ throw new ServiceException(text("总成料号必须以1开头"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getMaterialSn().length() > 64) {
|
|
|
|
|
+ throw new ServiceException(text("总成料号长度不能超过 64 个字符"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getPlanQty() == null || order.getPlanQty() < 1) {
|
|
|
|
|
+ throw new ServiceException(text("需生产数量必须是大于 0 的整数"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getOpenDate() == null) {
|
|
|
|
|
+ throw new ServiceException(text("开单日期不能为空"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (order.getProduceDate() == null) {
|
|
|
|
|
+ throw new ServiceException(text("生产日期不能为空"));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void checkLine(String lineSn) {
|
|
|
|
|
+ if (StringUtils.isBlank(lineSn)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ MesLine query = new MesLine();
|
|
|
|
|
+ query.setSn(lineSn);
|
|
|
|
|
+ query.setStatus(MesLine.STATUS_NORMAL);
|
|
|
|
|
+ MesLine line = mesLineService.findInfo(query);
|
|
|
|
|
+ if (line == null) {
|
|
|
|
|
+ throw new ServiceException(text("产线不存在:" + lineSn));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void checkCate(String cateSn) {
|
|
|
|
|
+ if (StringUtils.isBlank(cateSn)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ MesProductCate cate = mesProductCateService.findBySn(cateSn);
|
|
|
|
|
+ if (cate == null || !MesProductCate.STATUS_NORMAL.equals(cate.getStatus())) {
|
|
|
|
|
+ throw new ServiceException(text("工件类型不存在:" + cateSn));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void normalize(MesWorkOrder order) {
|
|
|
|
|
+ order.setWorkNo(plain(order.getWorkNo()));
|
|
|
|
|
+ order.setProjectCode(plain(order.getProjectCode()));
|
|
|
|
|
+ order.setMaterialSn(plain(order.getMaterialSn()));
|
|
|
|
|
+ order.setDrawingNo(plain(order.getDrawingNo()));
|
|
|
|
|
+ order.setSaleOrderNo(plain(order.getSaleOrderNo()));
|
|
|
|
|
+ order.setLineSn(plain(order.getLineSn()));
|
|
|
|
|
+ order.setCateSn(plain(order.getCateSn()));
|
|
|
|
|
+ if (order.getSpecName() != null) {
|
|
|
|
|
+ order.setSpecName(order.getSpecName().trim());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String plain(String value) {
|
|
|
|
|
+ if (value == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ String text = value.trim();
|
|
|
|
|
+ if (text.matches("\\d+\\.0+")) {
|
|
|
|
|
+ return text.substring(0, text.indexOf('.'));
|
|
|
|
|
+ }
|
|
|
|
|
+ return text;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean isBlankRow(MesWorkOrder order) {
|
|
|
|
|
+ return StringUtils.isBlank(order.getWorkNo())
|
|
|
|
|
+ && StringUtils.isBlank(order.getProjectCode())
|
|
|
|
|
+ && StringUtils.isBlank(order.getMaterialSn())
|
|
|
|
|
+ && StringUtils.isBlank(order.getSpecName())
|
|
|
|
|
+ && StringUtils.isBlank(order.getDrawingNo())
|
|
|
|
|
+ && (order.getPlanQty() == null || order.getPlanQty() == 0)
|
|
|
|
|
+ && order.getOpenDate() == null
|
|
|
|
|
+ && order.getProduceDate() == null
|
|
|
|
|
+ && StringUtils.isBlank(order.getSaleOrderNo());
|
|
|
|
|
+ }
|
|
|
|
|
+}
|