package com.chinaztt.mes.warehouse.state.escort; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.chinaztt.mes.common.gsm.escort.EscortServiceGsm; import com.chinaztt.mes.common.gsm.escort.EscortSingleAddModel; import com.chinaztt.mes.common.gsm.escort.EscortSingleDeleteModel; import com.chinaztt.mes.common.gsm.in.InStorageService; import com.chinaztt.mes.common.gsm.in.InStorageSingleAddModel; import com.chinaztt.mes.common.gsm.in.InStorageSingleDeleteModel; import com.chinaztt.mes.common.gsm.out.OutStorageService; import com.chinaztt.mes.common.gsm.out.OutStorageSingleAddModel; import com.chinaztt.mes.common.gsm.out.OutStorageSingleDeleteModel; import com.chinaztt.mes.common.handler.StateMachineHandler; import com.chinaztt.mes.common.wrapper.QueryWrapperUtil; import com.chinaztt.mes.warehouse.dto.EscortDetailDTO; import com.chinaztt.mes.warehouse.entity.Escort; import com.chinaztt.mes.warehouse.entity.EscortDetail; import com.chinaztt.mes.warehouse.mapper.EscortDetailMapper; import com.chinaztt.mes.warehouse.mapper.EscortMapper; import com.chinaztt.mes.warehouse.mapper.JoinStockOrderMapper; import com.chinaztt.mes.warehouse.state.escort.constant.EscortEvents; import com.chinaztt.mes.warehouse.state.escort.constant.EscortStateStringValues; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.mes.warehouse.util.TransactionType; import lombok.AllArgsConstructor; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.springframework.messaging.Message; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.annotation.OnTransition; import org.springframework.statemachine.annotation.WithStateMachine; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.format.DateTimeFormatter; import java.util.List; /** * @Author: cxf * @Date: 2020-07-24 9:51 */ @AllArgsConstructor @Component @WithStateMachine(id = "escortStateMachine") public class EscortStateListener { private StockUtils stockUtils; private EscortMapper escortMapper; private EscortDetailMapper escortDetailMapper; private JoinStockOrderMapper joinStockOrderMapper; /** * 完成 */ @OnTransition(source = EscortStateStringValues.DRAFT, target = EscortStateStringValues.COMPLETED) public boolean complete(StateMachine stateMachine, Message msg) { Escort escort = (Escort) msg.getHeaders().get("escort"); // 1.更新状态 escort.setStatus(EscortStateStringValues.COMPLETED); escortMapper.updateById(escort); // 2.更新实时库存和预留数量 EscortDetailDTO escortDetail = new EscortDetailDTO(); escortDetail.setEscortId(escort.getId()); List detailList = escortDetailMapper.getEscortDetailList(QueryWrapperUtil.gen(escortDetail)); // boolean isFirstCompleted = (null == escort.getEscortAutoId()) ; //区分是否首次点击完成 同步gsm 是的话 同步即可 如果是非首次 需要先删除 后新增 // StringBuffer escortOutAutoId = new StringBuffer(); // String outAutoIdStr = null; if (CollectionUtil.isNotEmpty(detailList)) { for (EscortDetailDTO detail : detailList) { try { stockUtils.updateById(detail.getStockId(), detail.getDeliveryQty().negate(), detail.getDeliveryQty() .negate(), BigDecimal.ZERO, BigDecimal.ZERO, escort.getEscortNo(), TransactionType.SALES_ORDER_DELIVERY.getValue()); //同步gsm //调用GSM入库并把入库的id同步到mes系统中 // long inAutoId =syncGsmIn(escort,detail); // detail.setEscortInAutoId(inAutoId); // escortDetailMapper.updateById(detail); // //调用GSM的发货新增并把发货的id同步到mes系统中 // long outAutoId = syncGsmOut(escort,detail); // detail.setEscortOutAutoId(outAutoId); // escortDetailMapper.updateById(detail); // //拼接GSM发货id // escortOutAutoId.append(outAutoId).append(","); } catch (RuntimeException e) { stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, escort.getEscortNo() + "#" + detail.getPartBatchNo() + ":" + e.getMessage()); return false; } } // outAutoIdStr = escortOutAutoId.deleteCharAt(escortOutAutoId.length() - 1).toString(); } //调用押运单的同步 // long escortAutoId = syncGsmEscort(escort,outAutoIdStr); //将返回的GSM押运单的id存到mes的押运单中 // escort.setEscortAutoId(escortAutoId); escortMapper.updateById(escort); // 3.更新发货数量 updateDeliveryQuantity(escort.getId(), "+"); //同步gsm // 2.保存发货明细 // StringBuffer escortOutAutoId = new StringBuffer(); // try { //// if(!isFirstCompleted){ //// deleteEscortStorage(escort); //// } // if (CollectionUtil.isNotEmpty(detailList)) { // for (EscortDetailDTO escortDetailEn: detailList) { //// if(!isFirstCompleted){ //非首次确定同步 需要先删除 后新增 //// deleteOutStorage(escort,escortDetailEn); //// deleteInStorage(escort,escortDetailEn); //// } // //调用GSM入库并把入库的id同步到mes系统中 // long inAutoId =syncGsmIn(escort,escortDetailEn); // escortDetailEn.setEscortInAutoId(inAutoId); // escortDetailMapper.updateById(escortDetailEn); // //调用GSM的发货新增并把发货的id同步到mes系统中 // long outAutoId = syncGsmOut(escort,escortDetailEn); // escortDetailEn.setEscortOutAutoId(outAutoId); // escortDetailMapper.updateById(escortDetailEn); // //拼接GSM发货id // escortOutAutoId.append(outAutoId).append(","); // } // } // String outAutoIdStr = escortOutAutoId.deleteCharAt(escortOutAutoId.length() - 1).toString(); // //调用押运单的同步 // long escortAutoId = syncGsmEscort(escort,outAutoIdStr); //// //将返回的GSM押运单的id存到mes的押运单中 // escort.setEscortAutoId(escortAutoId); // escortMapper.updateById(escort); // } catch (Exception e) { // e.printStackTrace(); // stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, escort.getEscortNo() // + "#" + ":" + e.getMessage()); // return false; // } return true; } /** * 取消 * 同步gsm删除 * * @param stateMachine * @param msg * @return */ @OnTransition(source = EscortStateStringValues.COMPLETED, target = EscortStateStringValues.DRAFT) public boolean cancel(StateMachine stateMachine, Message msg) { Escort escort = (Escort) msg.getHeaders().get("escort"); // 1.更新状态 escort.setStatus(EscortStateStringValues.DRAFT); escortMapper.updateById(escort); // 2.更新实时库存和预留数量 EscortDetailDTO escortDetail = new EscortDetailDTO(); escortDetail.setEscortId(escort.getId()); List detailList = escortDetailMapper.getEscortDetailList(QueryWrapperUtil.gen(escortDetail)); try { // deleteEscortStorage(escort); if (CollectionUtil.isNotEmpty(detailList)) { for (EscortDetailDTO detail : detailList) { stockUtils.updateById(detail.getStockId(), detail.getDeliveryQty(), detail.getDeliveryQty(), BigDecimal.ZERO, BigDecimal.ZERO, escort.getEscortNo(), TransactionType.CANCEL_SALES_ORDER_DELIVERY.getValue()); //同步gsm // deleteOutStorage(escort, detail); // deleteInStorage(escort, detail); } } } catch (Exception e) { stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY , escort.getEscortNo() + "#" + ":" + e.getMessage()); return false; } // 3.更新发货数量 updateDeliveryQuantity(escort.getId(), "-"); return true; } public synchronized void updateDeliveryQuantity(Long escortId, String plusOrMinus) { escortMapper.updateStockOrderById(escortId, plusOrMinus); escortMapper.updateCustomerOrderById(escortId); } /** * 删除GSM的押运单 * * @param escort */ public void deleteEscortStorage(Escort escort) throws Exception { String inAutoId = String.valueOf(escort.getEscortAutoId()); if (!StringUtils.isEmpty(inAutoId)) { EscortServiceGsm escortServiceGsm = new EscortServiceGsm(); EscortSingleDeleteModel escortSingleDeleteModel = new EscortSingleDeleteModel(); escortSingleDeleteModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); escortSingleDeleteModel.setID(inAutoId); escortSingleDeleteModel.setEscortNo(escort.getEscortNo()); escortSingleDeleteModel.setEntryPeople(StringUtils.isBlank(escort.getSalesman()) ? "1" : escort.getSalesman()); escortSingleDeleteModel.setEntryPeopleWorkCode(escort.getSalesmanWorkCode() == null ? "1" : escort.getSalesmanWorkCode()); escortSingleDeleteModel.setIsJosn("0"); Document deleteDocument = DocumentHelper.parseText(escortServiceGsm.getEscortServiceSoap().singleDelete(escortSingleDeleteModel)); Element deleteRootElement = deleteDocument.getRootElement(); //错误代码 String inErrorCode = deleteRootElement.element("miap_header").element("errorcode").getText(); if (!inErrorCode.equals("0")) { //获取错误信息 String deleteErrorMessage = deleteRootElement.element("miap_header").element("errormsg").getText(); //抛出错误 if (!inErrorCode.equals("90") && !inErrorCode.equals("88") && !inErrorCode.equals("89") && !inErrorCode.equals("87")) { throw new RuntimeException("GSM入库记录删除失败,原因:" + deleteErrorMessage + "请手动删除"); } } } } /** * 删除GSM的出库记录 * * @param escort * @param escortDetail */ public void deleteOutStorage(Escort escort, EscortDetail escortDetail) throws Exception { //查找发货绑定的客户订单的GSM的合同产品id Long id = escortMapper.selectCustomerOrder(escort.getCustomerOrderId()); //发货明细的出库id String outAutoId = escortDetail.getEscortOutAutoId().toString(); if (!StringUtils.isEmpty(outAutoId)) { OutStorageService outStorageService = new OutStorageService(); OutStorageSingleDeleteModel singleDeleteModel = new OutStorageSingleDeleteModel(); singleDeleteModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); singleDeleteModel.setAutoID(outAutoId); singleDeleteModel.setContractid(escort.getCustomerOrderNo()); singleDeleteModel.setContractInfoProductAutoID(String.valueOf(id)); singleDeleteModel.setEntryPeople(StringUtils.isBlank(escort.getSalesman()) ? "1" : escort.getSalesman()); singleDeleteModel.setEntryPeopleWorkCode(escort.getSalesmanWorkCode() == null ? "1" : escort.getSalesmanWorkCode()); singleDeleteModel.setIsJosn("0"); Document deleteDocument = DocumentHelper.parseText(outStorageService.getOutStorageServiceSoap().singleDelete(singleDeleteModel)); Element deleteRootElement = deleteDocument.getRootElement(); //错误代码 String outErrorCode = deleteRootElement.element("miap_header").element("errorcode").getText(); if (!outErrorCode.equals("0")) { //获取错误信息 String deleteErrorMessage = deleteRootElement.element("miap_header").element("errormsg").getText(); //抛出错误 if (!outErrorCode.equals("90") && !outErrorCode.equals("88") && !outErrorCode.equals("89") && !outErrorCode.equals("87")) { throw new RuntimeException("GSM出库记录删除失败,原因:" + deleteErrorMessage + "请手动删除"); } } } } /** * 删除GSM的入库记录 * * @param escort * @param escortDetail */ public void deleteInStorage(Escort escort, EscortDetail escortDetail) throws Exception { //查找发货绑定的客户订单的GSM的合同产品id Long id = escortMapper.selectCustomerOrder(escort.getCustomerOrderId()); String inAutoId = String.valueOf(escortDetail.getEscortInAutoId()); if (!StringUtils.isEmpty(inAutoId)) { InStorageService inStorageService = new InStorageService(); InStorageSingleDeleteModel singleDeleteModel = new InStorageSingleDeleteModel(); singleDeleteModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); singleDeleteModel.setAutoID(inAutoId); singleDeleteModel.setContractid(escort.getCustomerOrderNo()); singleDeleteModel.setContractInfoProductAutoID(String.valueOf(id)); singleDeleteModel.setEntryPeople(StringUtils.isBlank(escort.getSalesman()) ? "1" : escort.getSalesman()); singleDeleteModel.setEntryPeopleWorkCode(escort.getSalesmanWorkCode() == null ? "1" : escort.getSalesmanWorkCode()); singleDeleteModel.setIsJosn("0"); Document deleteDocument = DocumentHelper.parseText(inStorageService.getInStorageServiceSoap().singleDelete(singleDeleteModel)); Element deleteRootElement = deleteDocument.getRootElement(); //错误代码 String inErrorCode = deleteRootElement.element("miap_header").element("errorcode").getText(); if (!inErrorCode.equals("0")) { //获取错误信息 String deleteErrorMessage = deleteRootElement.element("miap_header").element("errormsg").getText(); //抛出错误 if (!inErrorCode.equals("90") && !inErrorCode.equals("88") && !inErrorCode.equals("89") && !inErrorCode.equals("87")) { throw new RuntimeException("GSM入库记录删除失败,原因:" + deleteErrorMessage + "请手动删除"); } } } } /** * 同步GSM出库单 * * @param escort * @param escortDetail * @return */ public long syncGsmOut(Escort escort, EscortDetail escortDetail) { //查找发货绑定的客户订单的GSM的合同产品id Long id = escortMapper.selectCustomerOrder(escort.getCustomerOrderId()); OutStorageService outStorageService = new OutStorageService(); OutStorageSingleAddModel outSingleAddModel = new OutStorageSingleAddModel(); outSingleAddModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); outSingleAddModel.setContractid(escort.getCustomerOrderNo()); outSingleAddModel.setContractInfoProductAutoID(String.valueOf(id)); outSingleAddModel.setQualityQueryID(null); outSingleAddModel.setInstorageAutoID(String.valueOf(escortDetail.getEscortInAutoId())); if (escort.getEscortAutoId() != null) { outSingleAddModel.setEscortID(String.valueOf(escort.getEscortAutoId())); } else { outSingleAddModel.setEscortID(null); } outSingleAddModel.setEntryPeople("1"); outSingleAddModel.setEntryPeopleWorkCode("1"); outSingleAddModel.setQuantity(escortDetail.getDeliveryQty().toString()); outSingleAddModel.setIsJosn("1"); String res = outStorageService.getOutStorageServiceSoap().singleAdd(outSingleAddModel); JSONObject obj = JSONObject.parseObject(res); int errorcode = obj.getJSONObject("miap_header").getIntValue("errorcode"); if (errorcode == 0) { return obj.getJSONObject("miap_Body").getLong("AutoID"); } else { String msg = obj.getJSONObject("miap_header").getString("errormsg"); throw new RuntimeException("GSM出库记录创建失败,原因:" + msg); } } /** * 同步GSM入库单 * * @param escort * @return */ public long syncGsmIn(Escort escort, EscortDetail escortDetail) { //查找发货绑定的客户订单的GSM的合同产品id Long id = escortMapper.selectCustomerOrder(escort.getCustomerOrderId()); //补充入库记录 InStorageService inStorageService = new InStorageService(); InStorageSingleAddModel singleAddModel = new InStorageSingleAddModel(); singleAddModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); singleAddModel.setContractid(escort.getCustomerOrderNo()); singleAddModel.setContractInfoProductAutoID(String.valueOf(id)); singleAddModel.setEntryPeople("1"); singleAddModel.setEntryPeopleWorkCode("1"); singleAddModel.setQuantity(String.valueOf(escortDetail.getDeliveryQty())); singleAddModel.setIsJosn("1"); String res = inStorageService.getInStorageServiceSoap().singleAdd(singleAddModel); JSONObject obj = JSONObject.parseObject(res); int errorcode = obj.getJSONObject("miap_header").getIntValue("errorcode"); if (errorcode == 0) { return obj.getJSONObject("miap_Body").getLong("AutoID"); } else { String msg = obj.getJSONObject("miap_header").getString("errormsg"); throw new RuntimeException("GSM入库记录创建失败,原因:" + msg); } } /** * 同步GSM押运单 * * @param escort * @param outAutoIdStr * @return */ public long syncGsmEscort(Escort escort, String outAutoIdStr) { EscortServiceGsm escortService = new EscortServiceGsm(); EscortSingleAddModel escortAddModel = new EscortSingleAddModel(); //秘钥 escortAddModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); //押运单号 escortAddModel.setEscortNo(escort.getEscortNo()); //承运商 escortAddModel.setCarrier("111"); //收货人 escortAddModel.setReceiver(escort.getCustomerName()); //收货地址 escortAddModel.setAddress(escort.getAddress()); //收货人联系电话 escortAddModel.setPhone(escort.getPhone()); DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); //要求到货时间 escortAddModel.setRequestDate(dateFormat.format(escort.getRequestDate())); //发货日期 escortAddModel.setDeliveryDate("2021-10-16"); //车牌号 escortAddModel.setVehicleNo("1"); //司机 escortAddModel.setDriver("1"); //司机电话 escortAddModel.setDriverPhone("1"); //检测报告份数 escortAddModel.setTestCount("1"); //合格证份数 escortAddModel.setCertificateCount("1"); //出厂报告份数 escortAddModel.setOuterReportCount("1"); //质保书份数 escortAddModel.setQtyCount("1"); //货物清单份数 escortAddModel.setGoodsCount("1"); //备注 escortAddModel.setMarktext(escort.getRemark() == null ? "备注为空" : escort.getRemark()); //录入人 escortAddModel.setEntryPeople("1"); //录入人编号 escortAddModel.setEntryPeopleWorkCode("1"); //发货的autoid escortAddModel.setOutStorageAuotoIDs(outAutoIdStr); //返回文件格式 escortAddModel.setIsJosn("1"); //合同号 escortAddModel.setContractid(escort.getCustomerOrderNo()); String res = escortService.getEscortServiceSoap().singleAdd(escortAddModel); JSONObject obj = JSONObject.parseObject(res); int errorcode = obj.getJSONObject("miap_header").getIntValue("errorcode"); if (errorcode == 0) { return obj.getJSONObject("miap_Body").getLong("AutoID"); } else { String msg = obj.getJSONObject("miap_header").getString("errormsg"); throw new RuntimeException("GSM押运单创建失败,原因:" + msg); } } }