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<String> {
|
|
@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<String, String> pathMap = new HashMap<String, String>() {{
|
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<String> start(Order order) {
|
DocType docType = docTypeService.selectById(order.getDocType());
|
if (null == docType) {
|
return SUCCESS;
|
}
|
List<OrderDetl> 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<String, List<Order>> orderMap) {
|
String docName = orderMap.getKey();
|
List<Order> value = orderMap.getValue();
|
String path = pathMap.get(docName);
|
if (path == null) {
|
log.info("单据类型不存在:{}", docName);
|
return;
|
}
|
// 构造请求体
|
List<ReportU8Vo> 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<U8ResultVo> list = JSON.parseArray(response, U8ResultVo.class);
|
if (list != null && list.size() != 0) {
|
List<String> 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<ReportU8Vo> getRequestBody(String docName, List<Order> value) {
|
List<ReportU8Vo> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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<ReportU8Vo.Item> itemList = new ArrayList<>();
|
List<OrderDetl> 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;
|
}
|
|
}
|