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.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.erp.kingdee.entity.param.InFormIdParam; 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.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @Service @Slf4j public class InboundOrderHandler extends AbstractHandler { @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; @Transactional public synchronized ReturnT start() { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //登录金蝶 ReturnT start = loginAuthenticationHandler.start(); for(KingDeeUtilType kingDeeUtilType : KingDeeUtilType.values()) { InFormIdParam inFormIdParam = new InFormIdParam(); DocType docType = docTypeService.selectOne(new EntityWrapper().eq("doc_name", kingDeeUtilType.desc)); if (Cools.isEmpty(docType) && !kingDeeUtilType.formId.equals("BD_MATERIAL")){ docType = docTypeService.selectOrAdd(kingDeeUtilType.desc, kingDeeUtilType.pakIn.equals(1)); } inFormIdParam.setFormId(kingDeeUtilType.formId); inFormIdParam.setLimit(100); inFormIdParam.setStartRow("0"); String FDocumentStatus=null; //条件和需要获得的结果拼接 JSONObject jsonObject = new JSONObject(); jsonObject.put("FormId", inFormIdParam.getFormId()); jsonObject.put("Limit", inFormIdParam.getLimit()); jsonObject.put("StartRow", inFormIdParam.getStartRow()); //物料档案查询 if(kingDeeUtilType.formId.equals("BD_MATERIAL")){ Tag tag = tagService.selectByName("全部", 1); //物料状态 FUseOrgId .FNumber FDocumentStatus="C"; jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(tag.getUpdateTime())+"' and FDocumentStatus='"+FDocumentStatus+"' and FUseOrgId .FNumber='100'"); jsonObject.put("FieldKeys", "FName,FNumber,FCreateDate,FSpecification,FDocumentStatus"); // FName : 物料名称 ; // FNumber :物料编号; // FCreateDate :物料创建时间; // FSpecification :物料规格; // FDocumentStatus :物料状态 }else{ //获取最新时间 //单据状态 FDocumentStatus="B"; jsonObject.put("FilterString", "FCreateDate>'"+sdf.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); String add = jsonObject1.toJSONString(); //上报 String response = ""; boolean success = false; try { //获取Cookie值 HashMap headers = new HashMap<>(); headers.put("Cookie", start.getContent()); response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(inaddress) .setJson(add) .build() .doPost(); JSONArray data = JSON.parseArray(response); if(data.size()<=0) continue; if (data.getJSONArray(0).get(0).toString().length()>=20) continue; if (kingDeeUtilType.formId.equals("BD_MATERIAL")) {//物料档案 Tag tag = tagService.selectByName("全部", 1); for (int j = 0; j < data.size(); j++) { JSONArray jsonArray = data.getJSONArray(j); //对美国时间进行转换 Date jsonDate = KingDeeUtil.KingDeeDate(jsonArray.get(2).toString()); //生成商品档案 //商品编号 Mat mat = matService.selectByMatnr(jsonArray.get(1).toString()); if (mat == null) { mat = new Mat(); mat.setMatnr(jsonArray.get(1).toString()); mat.setMaktx(jsonArray.get(0).toString()); mat.setSpecs(jsonArray.get(3).toString());//规格 mat.setTagId(tag.getId()); mat.setCreateTime(jsonDate);//商品创建时间 mat.setUpdateTime(new Date()); mat.setStatus(1); //最新抓取商品时间 if (!matService.insert(mat)) { // throw new CoolException("服务器内部错误,请联系管理员"); callApiLogSaveMat(mat,kingDeeUtilType, "同步新物料出错!!!"+mat, false); log.info("同步新物料出错!!!参数:[{}]、[{}]",mat,jsonArray); } else { callApiLogSaveMat(mat,kingDeeUtilType, "同步新物料!", true); // log.info("同步新物料[商品编号:{}]", mat.getMatnr()); } }else { if (!jsonDate.equals(tag.getUpdateTime())){ callApiLogSaveMat(mat,kingDeeUtilType, "商品编号重复:"+mat.getMatnr(), false); log.info("同步新物料[商品编号:{}],商品编号重复!!!", mat.getMatnr()); } } tag.setUpdateTime(jsonDate); } tagService.updateById(tag); } 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 = orderService.selectByNo(jsonArray.get(0).toString()); 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, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9527L, // 添加人员 now, // 添加时间 9527L, // 修改人员 now, // 修改时间 null // 备注 ); 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().eq("order_no", jsonArray.get(0).toString()).eq("matnr", jsonArray.get(2).toString())); if (!Cools.isEmpty(orderDetl1)) { 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("生成单据明细失败,请联系管理员"); } } 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); } }