/* * Copyright (c) 2018-2025, ztt All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the pig4cloud.com developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: ztt */ package com.chinaztt.mes.warehouse.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.common.gsm.in.InStorageService; import com.chinaztt.mes.common.gsm.in.InStorageSingleAddModel; import com.chinaztt.mes.common.gsm.out.OutStorageService; import com.chinaztt.mes.common.gsm.out.OutStorageSingleAddModel; import com.chinaztt.mes.warehouse.dto.EscortDTO; import com.chinaztt.mes.warehouse.dto.SendBackDTO; import com.chinaztt.mes.warehouse.entity.Escort; import com.chinaztt.mes.warehouse.entity.EscortDetail; import com.chinaztt.mes.warehouse.entity.SendBack; import com.chinaztt.mes.warehouse.mapper.EscortDetailMapper; import com.chinaztt.mes.warehouse.mapper.EscortMapper; import com.chinaztt.mes.warehouse.mapper.SendBackMapper; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.mes.warehouse.service.SendBackService; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.ztt.common.core.util.R; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.math.BigDecimal; import java.util.List; /** * 退货 * * @author cxf * @date 2021-07-29 11:07:45 */ @Slf4j @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class SendBackServiceImpl extends ServiceImpl implements SendBackService { private EscortServiceImpl escortService; private EscortDetailMapper escortDetailMapper; private EscortMapper escortMapper; private StockUtils stockUtils; private StockMapper stockMapper; private PartMapper partMapper; // private ApplyService applyService; // @Override // public R fullSave(SendBackDTO sendBackDTO) { // if (CollectionUtil.isNotEmpty(sendBackDTO.getEscortList())){ // for (EscortDetailDTO escortDetailDTO:sendBackDTO.getEscortList()){ // sendBackDTO.setEscortDetailId(escortDetailDTO.getId()); // sendBackDTO.setPartNo(escortDetailDTO.getPartNo()); // sendBackDTO.setPartName(escortDetailDTO.getPartName()); // sendBackDTO.setPartBatchNo(escortDetailDTO.getPartBatchNo()); // sendBackDTO.setSystemNo(escortDetailDTO.getSystemNo()); // sendBackDTO.setPartUnit(escortDetailDTO.getPartUnit()); // sendBackDTO.setSendBackLocationId(escortDetailDTO.getLocationId()); // sendBackDTO.setStatus("02completed"); // baseMapper.insert(sendBackDTO); // // //进行移库 库位一样就增加数量 不然在这个库位新增数量 库位号 零件批号 系统编号确定唯一 // Stock stock = stockMapper.selectById(escortDetailDTO.getStockId()); // Long stockId = escortDetailDTO.getStockId(); // if(!stock.getLocationId().equals(sendBackDTO.getSendBackLocationId())){ // stockUtils.updateById(escortDetailDTO.getStockId(), sendBackDTO.getSendBackQuantity(), BigDecimal.ZERO // , escortDetailDTO.getEscortNo(), TransactionType.SALES_ORDER_RETURNS.getValue()); //// }else{ //新增库存记录 // Part part = partMapper.selectOne(Wrappers.lambdaQuery() // .eq(Part::getPartNo,escortDetailDTO.getPartNo())); // Stock stockNew = stockUtils.query(part.getId(), sendBackDTO.getSendBackLocationId(), escortDetailDTO.getPartBatchNo() // ,escortDetailDTO.getSystemNo()); // stockId = stockNew.getId(); // } // stockUtils.updateById(stockId, sendBackDTO.getSendBackQuantity(), BigDecimal.ZERO // , escortDetailDTO.getEscortNo(), TransactionType.SALES_ORDER_RETURNS.getValue()); // // //生成 检测申请 // ApplyDTO applyDTO = new ApplyDTO(); // applyDTO.setApplyType(Apply.BACK_APPLY); // applyDTO.setRemark("退货报检:" + sendBackDTO.getEscortNo()); // // List applyPartList = new ArrayList(); // ApplyPartDTO applyPartDTO = new ApplyPartDTO(); // applyPartDTO.setSystemNo(escortDetailDTO.getSystemNo()); // applyPartDTO.setPartNo(escortDetailDTO.getPartNo()); // applyPartDTO.setPartName(escortDetailDTO.getPartName()); // applyPartDTO.setOutBatchNo(escortDetailDTO.getPartBatchNo()); // applyPartDTO.setQtyArrived(sendBackDTO.getSendBackQuantity().toPlainString()); // applyPartList.add(applyPartDTO); // applyDTO.setApplyPartList(applyPartList); // applyService.saveDto(applyDTO); // // // // //同步gsm 删除发货 入库 // EscortDetail escortDetail = escortDetailMapper.selectById(sendBackDTO.getEscortDetailId()); // EscortDTO escortDTO = new EscortDTO(); // if (escortDetail!=null){ // Escort escort = escortMapper.selectById(escortDetail.getEscortId()); // BeanUtils.copyProperties(escort,escortDTO); // } // try { // escortService.deleteOutStorage(escortDTO,escortDetail); // escortService.deleteInStorage(escortDTO,escortDetail); // } catch (Exception e) { // log.error("退货失败:" + e.getMessage()); // log.error("退货失败:sendBackDTO" + sendBackDTO); // e.printStackTrace(); // } // } // }else { // return R.failed("没有选择已完成发货的明细"); // } // return R.ok(); // } @Override public IPage getSendBackPage(Page page, QueryWrapper gen) { return baseMapper.getSendBackPage(page,gen); } /** * 同步GSM入库单 * * @param escort * @return */ public long syncGsmIn(EscortDTO escort,BigDecimal number) { //补充入库记录 InStorageService inStorageService = new InStorageService(); InStorageSingleAddModel singleAddModel = new InStorageSingleAddModel(); singleAddModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); singleAddModel.setContractid(escort.getEscortNo()); singleAddModel.setContractInfoProductAutoID(escort.getEscortAutoId().toString()); singleAddModel.setEntryPeople(escort.getSalesman()); singleAddModel.setEntryPeopleWorkCode(escort.getSalesmanWorkCode()); singleAddModel.setQuantity(number.toString()); 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 escortDetail * @return */ public long syncGsmOut(EscortDTO escort,EscortDetail escortDetail,BigDecimal number) { OutStorageService outStorageService = new OutStorageService(); OutStorageSingleAddModel outSingleAddModel = new OutStorageSingleAddModel(); outSingleAddModel.setSalesServiceKey("5CEa1840tB4D8e83E1BA886FE42a60C7"); outSingleAddModel.setContractid(escort.getEscortNo()); outSingleAddModel.setContractInfoProductAutoID(escort.getId().toString()); outSingleAddModel.setQualityQueryID(null); outSingleAddModel.setInstorageAutoID(escortDetail.getEscortInAutoId().toString()); outSingleAddModel.setEscortID(escort.getEscortAutoId().toString()); outSingleAddModel.setEntryPeople(escort.getSalesman()); outSingleAddModel.setEntryPeopleWorkCode(escort.getSalesmanWorkCode()); outSingleAddModel.setQuantity(number.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); } } @Override public R updateSendBack(List sendBackList, String event) { String state = "CONFIRM"; if (CollectionUtil.isNotEmpty(sendBackList)){ for (SendBack sendBack:sendBackList){ if (state.equals(event)){ if ("01draft".equals(sendBack.getStatus())){ sendBack.setStatus("02completed"); baseMapper.updateById(sendBack); } }else { if ("02completed".equals(sendBack.getStatus())){ sendBack.setStatus("01draft"); baseMapper.updateById(sendBack); } } } try { //先根据退货明细查询发货明细和押运单 EscortDetail escortDetail = escortDetailMapper.selectById(sendBackList.get(0).getEscortDetailId()); EscortDTO escortDTO = new EscortDTO(); if (escortDetail!=null){ Escort escort = escortMapper.selectById(escortDetail.getEscortId()); BeanUtils.copyProperties(escort,escortDTO); } // escortService.deleteOutStorage(escortDTO,escortDetail); escortService.deleteInStorage(escortDTO,escortDetail); BigDecimal number = BigDecimal.ZERO; for (SendBack sendBack:sendBackList){ if ("01draft".equals(sendBack.getStatus())){ number = number.add(sendBack.getSendBackQuantity()); } } if (number.compareTo(BigDecimal.ZERO)>0 && number.compareTo(escortDetail.getDeliveryQty())<0){ //调用GSM入库并同步到mes系统中 long inAutoId =syncGsmIn(escortDTO,number); escortDetail.setEscortInAutoId(inAutoId); escortDetailMapper.updateById(escortDetail); //调用GSM的发货新增并把发货的id同步到mes系统中 long outAutoId = syncGsmOut(escortDTO,escortDetail,number); escortDetail.setEscortOutAutoId(outAutoId); escortDetailMapper.updateById(escortDetail); } } catch (Exception ex){ log.error("updateSendBack error :" + ex.getMessage()); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return R.failed(ex.getLocalizedMessage()); } } return R.ok(); } }