package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.exception.CoolException; import com.zy.asrs.entity.DocType; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.u8.ReportU8Vo; import com.zy.asrs.entity.u8.U8ResultVo; import com.zy.asrs.mapper.OrderMapper; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.DocTypeService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.constant.MesConstant; import com.zy.common.model.MesPakinParam; import com.zy.common.model.MesPakoutParam; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * Created by vincent on 2020/7/7 */ @Slf4j @Service public class OrderSyncHandler extends AbstractHandler { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; private static final String baseUrl = "127.0.0.1:8081/jsjwms/open/asrs"; private static final Map pathMap = new HashMap() {{ put("采购入库", "/purchasein_import"); put("销售出库", "/saleout_import"); put("产成品入库单", "/productin_import"); put("材料出库单", "/materialout_import"); put("其他入库单", "/otherin_import"); put("其他出库单", "/otherout_import"); }}; @Resource private OrderMapper orderMapper; @Transactional public ReturnT start(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } List orderDetls = orderDetlService.selectByOrderId(order.getId()); // 入库完成上报 if (docType.getPakin() == 1) { MesPakinParam pakinParam = new MesPakinParam(); pakinParam.setPakinTime(DateUtils.convert(order.getUpdateTime())); pakinParam.setLgortFrom("5008"); pakinParam.setLgortTo("5006"); for (OrderDetl orderDetl : orderDetls) { String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch(); pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme())); } String response = ""; boolean success = false; try { response = new HttpHandler.Builder() .setUri(MesConstant.URL) .setPath(MesConstant.PAKIN_URL) .setJson(JSON.toJSONString(pakinParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { success = true; // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } else { log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response); throw new CoolException("上报mes系统失败"); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "成品库入库上报", MesConstant.URL + MesConstant.PAKIN_URL, null, "127.0.0.1", JSON.toJSONString(pakinParam), response, success ); } catch (Exception e) { log.error("", e); } } } // 出库完成上报 if (docType.getPakout() == 1) { MesPakoutParam pakoutParam = new MesPakoutParam(); pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单")); pakoutParam.setPakoutTime(DateUtils.convert(order.getUpdateTime())); pakoutParam.setLgortFrom("5006"); pakoutParam.setLgortTo("1111"); if (!pakoutParam.isTag()) { pakoutParam.setKunnr("C1000"); } pakoutParam.setOrderNo(order.getOrderNo()); for (OrderDetl orderDetl : orderDetls) { String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch(); pakoutParam.getList().add(new MesPakoutParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme())); } String response = ""; boolean success = false; try { response = new HttpHandler.Builder() .setUri(MesConstant.URL) .setPath(MesConstant.PAKOUT_URL) .setJson(JSON.toJSONString(pakoutParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { success = true; // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), 6L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } else { log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKOUT_URL, JSON.toJSONString(pakoutParam), response); throw new CoolException("上报mes系统失败"); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "成品库出库上报", MesConstant.URL + MesConstant.PAKOUT_URL, null, "127.0.0.1", JSON.toJSONString(pakoutParam), response, success ); } catch (Exception e) { log.error("", e); } } } return SUCCESS; } public void startNew(Map.Entry> orderMap) { String docName = orderMap.getKey(); List value = orderMap.getValue(); String path = pathMap.get(docName); if (path == null) { log.info("单据类型不存在:{}", docName); return; } // 构造请求体 List requestBody = getRequestBody(docName, value); String requestJson = JSONObject.toJSONString(requestBody); String response = ""; boolean success = false; String errorMsg = null; String url = baseUrl + path; String nameSpaces = "单据上报"; try { response = new HttpHandler.Builder() .setUri(baseUrl) .setPath(path) .setJson(requestJson) .build() .doPost(); List list = JSON.parseArray(response, U8ResultVo.class); if (list != null && list.size() != 0) { List successReceiptNos = list.stream().filter(u8ResultVo -> "T".equals(u8ResultVo.getResult())).map(U8ResultVo::getReceiptNo).collect(Collectors.toList()); if (!successReceiptNos.isEmpty()) { orderMapper.batchUpdateSettleByOrderNos(successReceiptNos); } log.info("单据上报成功,单据编号:{}", successReceiptNos); success = true; } else { errorMsg = response; log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response); } } catch (Exception e) { errorMsg = e.getMessage(); log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e); } finally { try { apiLogService.save( nameSpaces, url, null, "127.0.0.1", requestJson, response, success, errorMsg ); } catch (Exception e) { log.error(nameSpaces + "保存接口日志失败", e); } } } private List getRequestBody(String docName, List value) { List list = new ArrayList<>(); String now = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); switch (docName) { case "采购入库": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("103"); reportU8Vo.setCrdcode("101"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); String docType$ = order.getDocType$(); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setAutoidPo(orderDetl.getSku()); item.setPoautoidcol(docType$.equals("采购订单") ? "ID" : docType$.equals("采购到货单") || docType$.equals("委外到货单") ? "Autoid" : docType$.equals("委外订单") ? "MODetailsID" : ""); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; case "销售出库": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("101"); reportU8Vo.setCrdcode("201"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); String docType$ = order.getDocType$(); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setAutoidSo(orderDetl.getSku()); item.setSoautoidcol(docType$.equals("发货单") ? "IDLSID" : ""); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; case "产成品入库单": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("101"); reportU8Vo.setCrdcode("201"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setAutoidMo(orderDetl.getSku()); item.setMoautoidcol("MODID"); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; case "材料出库单": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("5"); reportU8Vo.setCrdcode("202"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); String docType$ = order.getDocType$(); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setAutoidAll(orderDetl.getSku()); item.setAllcautoidcol(docType$.equals("生产订单") ? "AllocateId" : docType$.equals("委外订单") ? "MOMaterialsID" : docType$.equals("领料申请单") ? "AutoID" : ""); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; case "其他入库单": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("109"); reportU8Vo.setCrdcode("199"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; case "其他出库单": for (Order order : value) { ReportU8Vo reportU8Vo = new ReportU8Vo(); reportU8Vo.setCaccid("001"); reportU8Vo.setCvouchcode(order.getOrderNo()); reportU8Vo.setDdate(now); reportU8Vo.setCgltype(order.getDocType$()); reportU8Vo.setCwhcode("109"); reportU8Vo.setCrdcode("299"); reportU8Vo.setCmaker(order.getCreateBy$()); reportU8Vo.setChandler(order.getUpdateBy$()); List itemList = new ArrayList<>(); List orderDetlList = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetlList) { ReportU8Vo.Item item = new ReportU8Vo.Item(); item.setCinvcode(orderDetl.getMatnr()); item.setIquantity(orderDetl.getQty()); item.setCbatch(orderDetl.getBatch()); itemList.add(item); } reportU8Vo.setDetailList(itemList); list.add(reportU8Vo); } break; default: } return list; } }