package com.zy.asrs.task.kingdee.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.core.common.DateUtils;
|
import com.core.common.SnowflakeIdWorker;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.*;
|
import com.zy.asrs.service.*;
|
import com.zy.asrs.service.impl.ErpSecretServiceImpl;
|
import com.zy.asrs.task.AbstractHandler;
|
import com.zy.asrs.task.core.ReturnT;
|
import com.zy.asrs.utils.OrderInAndOutUtil;
|
import com.zy.erp.kingdee.entity.param.MatLoadParam;
|
import com.zy.erp.kingdee.enums.KingDeeUtilType;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.erp.kingdee.utils.KingDeeUtil;
|
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 org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
|
@Service
|
@Slf4j
|
public class InboundOrderHandler extends AbstractHandler<String> {
|
@Value("${erp.address.URL}")
|
//端口
|
private String URL;
|
|
@Value("${erp.address.inaddress}")
|
//单据,商品档案地址
|
private String inaddress;
|
|
@Autowired
|
private ApiLogService apiLogService;
|
|
@Autowired
|
private LoginAuthenticationHandler loginAuthenticationHandler;
|
|
@Autowired
|
private MatService matService;
|
|
@Autowired
|
private TagService tagService;
|
|
@Autowired
|
private DocTypeService docTypeService;
|
|
@Autowired
|
private OrderService orderService;
|
|
@Autowired
|
private OrderDetlService orderDetlService;
|
|
@Autowired
|
private SnowflakeIdWorker snowflakeIdWorker;
|
|
@Autowired
|
private LocOwnerService locOwnerService;
|
@Autowired
|
private ErpSecretServiceImpl erpSecretService;
|
@Value("${erp.login.accountId}")
|
private String accountId;
|
@Value("${erp.login.xAcfwIdentity}")
|
private String xAcfwIdentity;
|
@Transactional
|
public synchronized ReturnT<String> start() {
|
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");
|
//读取token
|
ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
|
|
|
for(KingDeeUtilType kingDeeUtilType : KingDeeUtilType.values()) {
|
MatLoadParam matLoadParam = new MatLoadParam();
|
DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", kingDeeUtilType.desc));
|
if (Cools.isEmpty(docType) && !kingDeeUtilType.formId.equals("BD_MATERIAL")){
|
docType = docTypeService.selectOrAdd(kingDeeUtilType.desc, kingDeeUtilType.pakIn.equals(1));
|
}
|
String FDocumentStatus=null;
|
//条件和需要获得的结果拼接
|
JSONObject jsonObject = new JSONObject();
|
//物料档案查询
|
if(kingDeeUtilType.formId.equals("BD_MATERIAL")){
|
Tag tag = tagService.selectByName("全部", 1);
|
jsonObject.put("id", null);//id
|
jsonObject.put("number", null);//编码
|
jsonObject.put("createorg_number", null);//创建组织
|
jsonObject.put("start_createtime", "2025-01-01 00:00:00");//创建起始
|
jsonObject.put("end_createtime", sdf1.format(new Date()));//创建截止
|
jsonObject.put("start_modifytime", "2025-01-01 00:00:00");//更新起始
|
jsonObject.put("end_modifytime", sdf1.format(new Date()));//更新截止
|
jsonObject.put("start_approvedate", "2025-01-01");//审核起始
|
jsonObject.put("end_approvedate", sdf2.format(new Date()));//审核截止
|
jsonObject.put("status", Arrays.asList("B", "C"));//数据状态 [A:暂存, B:已提交, C:已审核]
|
|
}else{
|
//获取最新时间
|
//单据状态
|
FDocumentStatus="B";
|
jsonObject.put("FilterString", "FCreateDate>'"+sdf1.format(docType.getCreateTime())+"'"+" and FStockId.Fname='立库'"+" and FDocumentStatus='"+FDocumentStatus+"'");
|
jsonObject.put("FieldKeys", "FBillNo,FCreateDate,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,"+kingDeeUtilType.anfme+",FDocumentStatus");
|
// FBillNo :单据编号;
|
// FCreateDate :单据创建时间;
|
// FMaterialId.FNumber : 物料编码;
|
// FMaterialName :物料名称;
|
// FMaterialId.FSpecification:物料规格
|
// anfme : 物料数量
|
// FDocumentStatus :单据状态;
|
|
}
|
JSONObject jsonObject1 = new JSONObject();
|
jsonObject1.put("data", jsonObject);
|
jsonObject1.put("pageSize", 10);
|
jsonObject1.put("pageNo", 1);
|
String add = jsonObject1.toJSONString();
|
|
//上报
|
String response = "";
|
boolean success = false;
|
try {
|
//获取Cookie值
|
HashMap<String, Object> headers = new HashMap<>();
|
headers.put("accesstoken", erpSecret.getAccessToken());
|
headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头
|
response = new HttpHandler.Builder()
|
.setHeaders(headers)
|
.setUri(URL)
|
.setPath(inaddress)
|
.setJson(add)
|
.build()
|
.doPost();
|
JSONObject jsonResponse = JSON.parseObject(response);
|
if(jsonResponse.getString("errorCode").equals("401")){
|
log.error("检索失败错误信息:{}", jsonResponse.getString("message"));
|
loginAuthenticationHandler.start();
|
continue;
|
}
|
JSONArray data = jsonResponse.getJSONObject("data").getJSONArray("rows");
|
if(data.size()<=0) continue;
|
//商品档案同步
|
if (kingDeeUtilType.formId.equals("BD_MATERIAL")) {
|
Tag tag = tagService.selectByName("全部", 1);
|
|
// 处理分页:根据返回的totalCount和pageSize计算页数
|
int pageSize = jsonResponse.getJSONObject("data").getIntValue("pageSize");
|
int totalCount = jsonResponse.getJSONObject("data").getIntValue("totalCount");
|
int totalPages = (int) Math.ceil((double) totalCount / pageSize);
|
|
for (int page = 1; page <= totalPages; page++) {
|
jsonObject1.put("pageNo", page);
|
add = jsonObject1.toJSONString();
|
// 重新发起请求以获取该页的数据
|
response = new HttpHandler.Builder()
|
.setHeaders(headers)
|
.setUri(URL)
|
.setPath(inaddress)
|
.setJson(add)
|
.build()
|
.doPost();
|
|
jsonResponse = JSON.parseObject(response);
|
data = jsonResponse.getJSONObject("data").getJSONArray("rows");
|
for (int j = 0; j < data.size(); j++) {
|
JSONObject jsonObjectNew = data.getJSONObject(j);
|
Date modifyTime = sdf1.parse(jsonObjectNew.get("modifytime").toString());
|
String matnr = jsonObjectNew.get("number").toString();
|
String name = jsonObjectNew.get("name").toString();
|
String createtime = jsonObjectNew.get("createtime").toString();
|
Double grossweight = jsonObjectNew.get("grossweight") != null ? new BigDecimal(jsonObjectNew.get("grossweight").toString()).doubleValue() : 0.0;
|
Double height = jsonObjectNew.get("height") != null ? new BigDecimal(jsonObjectNew.get("height").toString()).doubleValue() : 0.0;
|
Double width = jsonObjectNew.get("width") != null ? new BigDecimal(jsonObjectNew.get("width").toString()).doubleValue() : 0.0;
|
Double length = jsonObjectNew.get("length") != null ? new BigDecimal(jsonObjectNew.get("length").toString()).doubleValue() : 0.0;
|
|
// 生成商品档案
|
Mat mat = matService.selectByMatnr(matnr);
|
if (mat == null) {
|
mat = new Mat();
|
mat.setMatnr(matnr);
|
mat.setMaktx(name);
|
mat.setTagId(tag.getId());
|
mat.setWeight(grossweight);
|
mat.setManLength(length);
|
mat.setHeight(height);
|
mat.setWidth(width);
|
mat.setCreateTime(sdf1.parse(createtime));
|
mat.setUpdateTime(modifyTime);
|
mat.setStatus(1);
|
if (!matService.insert(mat)) {
|
callApiLogSaveMat(mat, kingDeeUtilType, "同步新物料出错!" + mat, false);
|
log.info("同步新物料出错!参数:[{}]、[{}]", mat, jsonObjectNew);
|
} else {
|
callApiLogSaveMat(mat, kingDeeUtilType, "同步新物料成功!", true);
|
}
|
} else {
|
boolean isUpdated = false;
|
if (mat.getUpdateTime().compareTo(modifyTime) != 0) {
|
// 更新字段
|
if (!mat.getMaktx().equals(name)) mat.setMaktx(name);
|
if (mat.getWeight().compareTo(grossweight) != 0) mat.setWeight(grossweight);
|
if (mat.getManLength().compareTo(length) != 0) mat.setManLength(length);
|
if (mat.getHeight().compareTo(height) != 0) mat.setHeight(height);
|
if (mat.getWidth().compareTo(width) != 0) mat.setWidth(width);
|
if (mat.getCreateTime().compareTo(sdf1.parse(createtime)) != 0)
|
mat.setCreateTime(sdf1.parse(createtime));
|
mat.setUpdateTime(modifyTime);
|
isUpdated = true;
|
}
|
// 执行更新操作
|
if (isUpdated) {
|
mat.setUpdateTime(new Date());
|
if (!matService.updateById(mat)) {
|
callApiLogSaveMat(mat, kingDeeUtilType, "更新物料出错!" + mat, false);
|
log.info("更新物料[商品编号:{}], 更新失败!", mat.getMatnr());
|
} else {
|
callApiLogSaveMat(mat, kingDeeUtilType, "更新物料成功!", true);
|
log.info("更新物料[商品编号:{}]", mat.getMatnr());
|
}
|
}
|
}
|
}
|
}
|
}else if(kingDeeUtilType.formId.equals("BD_RRGANIZATION")){
|
|
} else {
|
for (int j = 0; j < data.size(); j++) {
|
JSONArray jsonArray = data.getJSONArray(j);
|
//最新抓取时间
|
Date jsonDate = KingDeeUtil.KingDeeDate(jsonArray.get(1).toString());
|
docType.setCreateTime(jsonDate);
|
Order order = OrderInAndOutUtil.selectByNo(kingDeeUtilType.pakIn == 1, jsonArray.get(0).toString());
|
// Order order = orderService.selectByNo(jsonArray.get(0).toString());
|
LocOwner locOwner = null;
|
if (!Cools.isEmpty(1)) {
|
locOwner = locOwnerService.selectById(1);
|
} else {
|
locOwner = locOwnerService.selectById(1);
|
}
|
if (Cools.isEmpty(order)) {
|
Date now = new Date();
|
// 单据主档
|
order = new Order(
|
String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空]
|
jsonArray.get(0).toString(), // 订单编号
|
DateUtils.convert(now), // 单据日期
|
docType.getDocId(), // 单据类型
|
null, // 项目编号
|
"1", //项目名称 客户PO号
|
null, // 调拨项目编号
|
null, // 初始票据号
|
null, // 票据号
|
locOwner.getOwnerUuid(), // 客户编号
|
locOwner.getOwner(), // 客户
|
null, // 联系方式
|
null, // 操作人员
|
null, // 合计金额
|
null, // 优惠率
|
null, // 优惠金额
|
null, // 销售或采购费用合计
|
null, // 实付金额
|
null, // 付款类型
|
null, // 业务员
|
null, // 结算天数
|
null, // 邮费支付类型
|
null, // 邮费
|
null, // 付款时间
|
null, // 发货时间
|
null, // 物流名称
|
null, // 物流单号
|
1L, // 订单状态
|
1, // 状态
|
9527L, // 添加人员
|
now, // 添加时间
|
9527L, // 修改人员
|
now, // 修改时间
|
null // 备注
|
);
|
OrderInAndOutUtil.insertOrder(kingDeeUtilType.pakIn == 1, order);
|
|
// if (!orderService.insert(order)) {
|
// if (!jsonDate.equals(docType.getCreateTime())){
|
// callApiLogSaveOrder(order,kingDeeUtilType, "生成单据主档失败,请联系管理员"+order, false);
|
// }
|
// continue;
|
//// throw new CoolException("生成单据主档失败,请联系管理员");
|
// }
|
}
|
//物料编码
|
Mat mat = matService.selectByMatnr(jsonArray.get(2).toString());
|
if (Cools.isEmpty(mat)) {
|
if (!jsonDate.equals(docType.getCreateTime())){
|
callApiLogSaveOrder(order,kingDeeUtilType, "编号商品检索失败,请先添加商品"+jsonArray.get(2).toString(), false);
|
}
|
continue;
|
}
|
// OrderDetl orderDetl1 = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", jsonArray.get(0).toString()).eq("matnr", jsonArray.get(2).toString()));
|
// if (!Cools.isEmpty(orderDetl1)) {
|
// continue;
|
// }
|
Order order1 = OrderInAndOutUtil.selectByNo(kingDeeUtilType.pakIn == 1, jsonArray.get(0).toString());
|
List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(kingDeeUtilType.pakIn == 1, order1.getId());
|
boolean sign = false;
|
for (OrderDetl orderDetl : orderDetls){
|
if (orderDetl.getMatnr().equals( jsonArray.get(2).toString())){
|
sign = true;
|
break;
|
}
|
}
|
if (sign){
|
continue;
|
}
|
OrderDetl orderDetl = new OrderDetl();
|
orderDetl.sync(mat);
|
orderDetl.setBatch(null);
|
orderDetl.setAnfme(Double.parseDouble(jsonArray.get(5).toString()));
|
orderDetl.setOrderId(order.getId());
|
orderDetl.setOrderNo(order.getOrderNo());
|
orderDetl.setCreateBy(9527L);
|
orderDetl.setCreateTime(new Date());
|
orderDetl.setUpdateBy(9527L);
|
orderDetl.setUpdateTime(new Date());
|
orderDetl.setStatus(1);
|
orderDetl.setQty(0.0D);
|
// if (!orderDetlService.insert(orderDetl)) {
|
// callApiLogSaveOrder(order,kingDeeUtilType, "生成单据明细失败,请联系管理员!订单号:"+order.getOrderNo(), false);
|
//// throw new CoolException("生成单据明细失败,请联系管理员");
|
// }
|
OrderInAndOutUtil.insertOrderDetl(kingDeeUtilType.pakIn == 1,order,orderDetl);
|
}
|
docTypeService.updateById(docType);
|
}
|
} catch (Exception e) {
|
log.error("fail", e);
|
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
return FAIL.setMsg(e.getMessage());
|
} finally {
|
// try {
|
// // 保存接口日志
|
// apiLogService.save(
|
// "轮询数据",
|
// URL + inaddress,
|
// null,
|
// "127.0.0.1",
|
// add,
|
// response,
|
// success
|
// );
|
// } catch (Exception e) {
|
// log.error("", e);
|
// }
|
}
|
}
|
return SUCCESS;
|
}
|
|
public void callApiLogSaveMat(Mat mat, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) {
|
apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL,
|
"物料编号:" + mat.getMatnr() + "、物料名称:" + mat.getName() + "、类型:" + mat.getTagId$() + "、状态:" + mat.getStatus$(),
|
response, bool);
|
}
|
|
public void callApiLogSaveOrder(Order order, KingDeeUtilType kingDeeUtilType, String response, Boolean bool) {
|
apiLogService.save("获取"+kingDeeUtilType.desc, kingDeeUtilType.formId, "null", URL,
|
"单据编号:" + order.getId() + "、状态:" + order.getStatus$(),
|
response, bool);
|
}
|
|
}
|