package com.zy.asrs.task.handler;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.zy.asrs.entity.DocType;
|
import com.zy.asrs.entity.Order;
|
import com.zy.asrs.entity.OrderDetl;
|
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.asrs.task.kingdee.handler.LoginAuthenticationHandler;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.erp.kingdee.enums.KingDeeUtilType;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
|
@Service
|
@Slf4j
|
public class OrderReportHander extends AbstractHandler<String> {
|
|
@Value("${erp.address.URL}")
|
//端口
|
private String URL;
|
|
// @Value("${erp.address.inaddressSave}")
|
// //上报入库地址
|
// private String inaddressSave;
|
@Value("${erp.address.outaddressSave}")
|
//上报出入库地址
|
private String outaddressSave;
|
@Autowired
|
private OrderService orderService;
|
@Autowired
|
private OrderDetlService orderDetlService;
|
@Autowired
|
private ApiLogService apiLogService;
|
@Autowired
|
private DocTypeService docTypeService;
|
@Autowired
|
private LoginAuthenticationHandler loginAuthenticationHandler;
|
|
public ReturnT<String> startPakIn() {
|
// 查出所有数据入库单
|
List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("doc_type", 34));
|
for(Order order : orderList){
|
List<OrderDetl> orderMemoList = orderDetlService.selectList(new EntityWrapper<OrderDetl>()
|
.isNull("memo")
|
.eq("order_No", order.getOrderNo()));//memo为空表示仍未上报
|
|
List<OrderDetl> toReportList = new ArrayList<>();
|
|
// 循环判断 anfme 和 qty 是否相等,相等则表示已完成入库
|
for (OrderDetl orderDetl : orderMemoList) {
|
if (orderDetl.getAnfme() != null && orderDetl.getQty() != null
|
&& orderDetl.getAnfme().doubleValue() == orderDetl.getQty().doubleValue()) {
|
toReportList.add(orderDetl);
|
}
|
}
|
|
// 如果有符合条件的数据,执行上报
|
if (!toReportList.isEmpty()) {
|
boolean flag = reportPakIn(toReportList);
|
if(flag){
|
for (OrderDetl detl : toReportList) {
|
detl.setMemo("1");
|
orderDetlService.updateById(detl);
|
log.info("已完成单据上报 =====> " + detl);
|
}
|
} else {
|
log.warn("入库上报失败,未更新明细 memo 标志");
|
}
|
}
|
}
|
|
return SUCCESS;
|
}
|
|
private boolean reportPakIn(List<OrderDetl> orderDetls) {
|
|
Date now = new Date();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
// 构建主单 JSON 数据
|
JSONObject requestBody = new JSONObject();
|
requestBody.put("billType", "入库单");
|
|
// 从第一个明细中提取订单号等信息
|
if (!orderDetls.isEmpty()) {
|
OrderDetl first = orderDetls.get(0);
|
requestBody.put("orderNo", first.getOrderNo());
|
}
|
|
requestBody.put("createTime", sdf.format(now));
|
|
// 构建物料列表
|
JSONArray matList = new JSONArray();
|
for (OrderDetl detl : orderDetls) {
|
JSONObject mat = new JSONObject();
|
mat.put("matnr", detl.getMatnr());
|
mat.put("maktx", detl.getMaktx());
|
mat.put("batch", detl.getBatch());
|
mat.put("qty", detl.getQty());
|
mat.put("anfme", detl.getAnfme());
|
mat.put("units", detl.getUnits());
|
matList.add(mat);
|
}
|
|
requestBody.put("matList", matList);
|
|
// 发送 POST 请求
|
String response = "";
|
boolean success = false;
|
try {
|
HashMap<String, Object> headers = new HashMap<>();
|
// cookie
|
headers.put("Cookie", loginAuthenticationHandler.start().getContent());
|
|
response = new HttpHandler.Builder()
|
.setHeaders(headers)
|
.setUri(URL)
|
.setPath(outaddressSave) // 设置你的接口路径
|
.setJson(requestBody.toJSONString())
|
.build()
|
.doPost();
|
|
JSONObject data = JSON.parseObject(response);
|
Object isSuccess = findValueByKey(data, "IsSuccess");
|
String bool = isSuccess != null ? isSuccess.toString() : "false";
|
|
if ("true".equals(bool)) {
|
success = true;
|
}
|
} catch (Exception e) {
|
log.error("上报ERP失败", e);
|
} finally {
|
try {
|
apiLogService.save(
|
"入库上报",
|
URL + outaddressSave,
|
null,
|
"127.0.0.1",
|
requestBody.toJSONString(),
|
response,
|
success
|
);
|
} catch (Exception e) {
|
log.error("日志保存失败", e);
|
}
|
}
|
return success;
|
}
|
|
public ReturnT<String> startPakOut() {
|
// 所有数据出库单
|
List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("doc_type", 33));
|
for(Order order : orderList){
|
List<OrderDetl> orderMemoList = orderDetlService.selectList(new EntityWrapper<OrderDetl>()
|
.isNull("memo")
|
.eq("order_No", order.getOrderNo()));
|
|
List<OrderDetl> toReportList = new ArrayList<>();
|
|
// 循环判断 anfme 和 qty 是否相等
|
for (OrderDetl orderDetl : orderMemoList) {
|
if (orderDetl.getAnfme() != null && orderDetl.getQty() != null
|
&& orderDetl.getAnfme().doubleValue() == orderDetl.getQty().doubleValue()) {
|
toReportList.add(orderDetl);
|
}
|
}
|
|
// 如果有符合条件的数据,执行上报
|
if (!toReportList.isEmpty()) {
|
boolean flag = reportPakOut(toReportList);
|
if(flag){
|
for (OrderDetl detl : toReportList) {
|
detl.setMemo("1");
|
orderDetlService.updateById(detl);
|
log.info("已完成单据上报 =====> " + detl);
|
}
|
} else {
|
log.warn("出库上报失败,未更新明细 memo 标志");
|
}
|
}
|
}
|
|
return SUCCESS;
|
}
|
|
private boolean reportPakOut(List<OrderDetl> orderDetls) {
|
|
Date now = new Date();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
// 构建主单 JSON 数据
|
JSONObject requestBody = new JSONObject();
|
requestBody.put("billType", "出库单");
|
|
// 从第一个明细中提取订单号等信息
|
if (!orderDetls.isEmpty()) {
|
OrderDetl first = orderDetls.get(0);
|
requestBody.put("orderNo", first.getOrderNo());
|
}
|
|
requestBody.put("createTime", sdf.format(now));
|
|
// 构建物料列表
|
JSONArray matList = new JSONArray();
|
for (OrderDetl detl : orderDetls) {
|
JSONObject mat = new JSONObject();
|
mat.put("matnr", detl.getMatnr());
|
mat.put("maktx", detl.getMaktx());
|
mat.put("batch", detl.getBatch());
|
mat.put("qty", detl.getQty());
|
mat.put("anfme", detl.getAnfme());
|
mat.put("units", detl.getUnits());
|
matList.add(mat);
|
}
|
|
requestBody.put("matList", matList);
|
|
// 发送 POST 请求
|
String response = "";
|
boolean success = false;
|
try {
|
HashMap<String, Object> headers = new HashMap<>();
|
//cookie
|
headers.put("Cookie", loginAuthenticationHandler.start().getContent());
|
|
response = new HttpHandler.Builder()
|
.setHeaders(headers)
|
.setUri(URL)
|
.setPath(outaddressSave) // 设置你的接口路径
|
.setJson(requestBody.toJSONString())
|
.build()
|
.doPost();
|
|
JSONObject data = JSON.parseObject(response);
|
Object isSuccess = findValueByKey(data, "IsSuccess");
|
String bool = isSuccess != null ? isSuccess.toString() : "false";
|
|
if ("true".equals(bool)) {
|
success = true;
|
}
|
} catch (Exception e) {
|
log.error("上报ERP失败", e);
|
} finally {
|
try {
|
apiLogService.save(
|
"出库上报",
|
URL + outaddressSave,
|
null,
|
"127.0.0.1",
|
requestBody.toJSONString(),
|
response,
|
success
|
);
|
} catch (Exception e) {
|
log.error("日志保存失败", e);
|
}
|
}
|
return success;
|
}
|
|
public static Object findValueByKey(JSONObject json, String key) {
|
Set<String> keySet = json.keySet();
|
for (String k : keySet) {
|
Object v = json.get(k);
|
if (k.equals(key)) {
|
return v;
|
} else if (v instanceof JSONArray) {
|
int size = ((JSONArray) v).size();
|
for (int i = 0; i <= size - 1; i++) {
|
Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
|
if (result != null){
|
return result;
|
}
|
}
|
} else if (v instanceof JSONObject){
|
Object result = findValueByKey((JSONObject) v, key);
|
if (result != null){
|
return result;
|
}
|
}
|
}
|
return null;
|
}
|
|
|
}
|