package com.galaxis.soap.wms; import com.galaxis.soap.wms.obj.*; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.ClassPathResource; import javax.jws.WebService; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.io.File; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.*; import java.util.function.BiFunction; import java.util.function.Function; @WebService(serviceName = "WMSService", // 与接口中指定的name一致 targetNamespace = "http://service.jztd.com", // 与接口中的命名空间一致,一般是接口的包名倒 endpointInterface = "com.galaxis.soap.wms.WMSService"// 接口地址 ) @Slf4j public class WMSServiceImpl implements WMSService { private static final String errorMsg = "当前下传数据中存在多个仓库的业务数据下传失败,请检查数据,一次只能下传一个仓库的业务数据"; private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor( 512, 512, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>(4096) ); private static final String API = "/wms/api"; // 山西 private static final String SX = "http://127.0.0.1:8082"; // 重庆 private static final String CQ = "http://127.0.0.1:8182"; // 广西 private static final String GX = "http://127.0.0.1:8282"; // 四川 private static final String SC = "http://127.0.0.1:8382"; // 成都 private static final String CD = "http://10.0.30.225:8106"; // 贵州 private static final String GZ = "http://10.0.30.225:8102"; // 海南 private static final String HN = "http://10.0.30.225:8109"; // 河南 private static final String HEN = "http://10.0.30.225:8110"; // 云南 private static final String YN = "http://10.0.30.220:18999"; // 云南D300 private static final String YND300 = "http://10.0.30.220:28999"; // 云南D900 private static final String YND900 = "http://10.0.30.220:38999"; // D112 private static final String D112 = "http://10.0.30.225:8999"; // 物流中心编码与WebService服务映射 private static final ConcurrentMap WMS_MAPPING = new ConcurrentHashMap() {{ put("D104", ""); // 山西鸿翔一心堂药业有限公司 put("D103", SC); // 四川鸿翔一心堂药业有限公司 put("D105", CQ); // 重庆鸿翔一心堂药业有限公司 put("D907", ""); // 上海鸿翔一心堂药业有限公司 put("D101", GX); // 广西鸿翔一心堂药业有限公司 put("D110", HEN); // 河南鸿翔一心堂药业有限公司 put("D115", SX); // 一心堂药业(山西)有限公司 put("D102", GZ); // 贵州鸿翔-一心堂药业有限公司 put("D106", CD); // 成都鸿翔一心堂药业有限公司 put("D109", HN); // 海南鸿翔一心堂药业有限公司 put("D301", HN); // 海南一心堂医药有限公司 put("D100", YN); // 一心堂药业集团股份有限公司 put("D300", YND300); // 云南鸿云药业有限公司 put("D108", ""); // 天津鸿翔一心堂药业有限公司 put("D900", YND900); // 一心到家科技公司(电商仓) put("D504", ""); // 医云医疗产业发展(云南)有限公司 put("D112", D112); // 山西一心堂广生药业连锁有限公司 }}; private static final ConcurrentMap SERVICE_MAPPING = new ConcurrentHashMap<>(WMS_MAPPING.size()); @SneakyThrows public WMSServiceImpl() { // final String wsdl = IOUtils.toString(new ClassPathResource("WMSService.xml").getInputStream(), StandardCharsets.UTF_8); final String wsdl = IOUtils.toString(new ClassPathResource("YN_WMSService.xml.xml").getInputStream(), StandardCharsets.UTF_8); final String usrHome = System.getProperty("user.home"); for (Map.Entry entry : WMS_MAPPING.entrySet()) { final String bwkey = entry.getKey(); final String host = entry.getValue(); log.info("### {} -> {}", bwkey, host); if (StringUtils.isBlank(host)) { continue; } // URL url = new URL(host + API + "?wsdl"); String location = host + API; File file = new File(FilenameUtils.concat(usrHome, bwkey + ".wsdl.xml")); FileUtils.writeStringToFile(file, StringUtils.replace(wsdl, "#{__location}", location), StandardCharsets.UTF_8); URL url = file.toURI().toURL(); QName qName = new QName("http://service.jztd.com", "WMSService"); Service service = Service.create(url, qName); service.setExecutor(EXECUTOR); WMSService wmsService = service.getPort(WMSService.class); SERVICE_MAPPING.put(bwkey, wmsService); } } private List distribute(final String method, List

params, Function getBWKEY, BiFunction, List> execute) { log.info("method={} | params={}", method, params); if (params == null) { params = new ArrayList<>(); } // 拆分参数 final Map> paramsMap = new HashMap<>(); for (P param : params) { paramsMap.computeIfAbsent(getBWKEY.apply(param), bwkey -> new ArrayList<>()).add(param); } // 分发数据 Map>> futureMap = new HashMap<>(paramsMap.size()); for (Map.Entry> entry : paramsMap.entrySet()) { final String bwkey = entry.getKey(); final List

list = entry.getValue(); final WMSService wmsService = SERVICE_MAPPING.get(bwkey); if (wmsService == null || list == null || list.isEmpty()) { log.error("不能分发数据:method={} | bwkey={} | params={}", method, bwkey, list); continue; } Future> future = EXECUTOR.submit(() -> { log.info("分发数据:method={} | bwkey={} | params={}", method, bwkey, list); return execute.apply(wmsService, list); }); futureMap.put(bwkey, future); } // 收集返回数据 final List res = new ArrayList<>(params.size()); for (Map.Entry>> entry : futureMap.entrySet()) { final String bwkey = entry.getKey(); final Future> future = entry.getValue(); try { res.addAll(future.get()); } catch (Exception e) { log.info("分发数据失败:method={} | bwkey={}", method, bwkey, e); } } return res; } @Override public List MT_KUNNR_IN_WMS01(List params) { return distribute( "MT_KUNNR_IN_WMS01", params, DT_KUNNR_IN_01::getBWKEY, WMSService::MT_KUNNR_IN_WMS01 ); } @Override public List MT_KUNNR_IN_WMS02(List params) { return distribute( "MT_KUNNR_IN_WMS02", params, DT_KUNNR_IN_02::getBWKEY, WMSService::MT_KUNNR_IN_WMS02 ); } @Override public List MT_KUNNR_IN_WMS03(List params) { return distribute( "MT_KUNNR_IN_WMS03", params, DT_KUNNR_IN_03::getBWKEY, WMSService::MT_KUNNR_IN_WMS03 ); } @Override public List MT_KUNNR_IN_WMS04(List params) { return distribute( "MT_KUNNR_IN_WMS04", params, DT_KUNNR_IN_04::getBWKEY, WMSService::MT_KUNNR_IN_WMS04 ); } @Override public List MT_KUNNR_IN_WMS06(List params) { return distribute( "MT_KUNNR_IN_WMS06", params, DT_KUNNR_IN_06::getBWKEY, WMSService::MT_KUNNR_IN_WMS06 ); } @Override public List MT_KUNNR_IN_WMS08(List params) { return distribute( "MT_KUNNR_IN_WMS08", params, DT_KUNNR_IN_08::getBWKEY, WMSService::MT_KUNNR_IN_WMS08 ); } @Override public List MT_KUNNR_IN_WMS09(List params) { return distribute( "MT_KUNNR_IN_WMS09", params, DT_KUNNR_IN_09::getBWKEY, WMSService::MT_KUNNR_IN_WMS09 ); } @Override public List MT_KUNNR_IN_WMS14(List params) { return distribute( "MT_KUNNR_IN_WMS14", params, DT_KUNNR_IN_14::getBWKEY, WMSService::MT_KUNNR_IN_WMS14 ); } @Override public List MT_KUNNR_IN_WMS10_2(List params) { return distribute( "MT_KUNNR_IN_WMS10_2", params, DT_KUNNR_IN_10_2::getBWKEY, WMSService::MT_KUNNR_IN_WMS10_2 ); } @Override public List MT_KUNNR_IN_WMS16(List params) { return distribute( "MT_KUNNR_IN_WMS16", params, DT_KUNNR_IN_16::getBWKEY, WMSService::MT_KUNNR_IN_WMS16 ); } @Override public List MT_KUNNR_IN_WMS17(List params) { return distribute( "MT_KUNNR_IN_WMS17", params, DT_KUNNR_IN_17::getBWKEY, WMSService::MT_KUNNR_IN_WMS17 ); } }