| | |
| | | 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.erp.kingdee.entity.param.InFormIdParam; |
| | | 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 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 |
| | |
| | | @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 sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | //登录金蝶 |
| | | ReturnT<String> start = loginAuthenticationHandler.start(); |
| | | for(KingDeeUtilType kingDeeUtilType : KingDeeUtilType.values()) { |
| | | InFormIdParam inFormIdParam = new InFormIdParam(); |
| | | DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", kingDeeUtilType.desc)); |
| | | inFormIdParam.setFormId(kingDeeUtilType.formId); |
| | | inFormIdParam.setLimit(100); |
| | | inFormIdParam.setStartRow("0"); |
| | | Date time=new Date(); |
| | | String FDocumentStatus=null; |
| | | 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(); |
| | | jsonObject.put("FormId", inFormIdParam.getFormId()); |
| | | jsonObject.put("Limit", inFormIdParam.getLimit()); |
| | | jsonObject.put("StartRow", inFormIdParam.getStartRow()); |
| | | //物料档案查询 |
| | | if(inFormIdParam.getFormId().equals("BD_MATERIAL")){ |
| | | Tag tag = tagService.selectById(20); |
| | | //最新时间 |
| | | time=tag.getCreateTime(); |
| | | //物料状态 FUseOrgId .FNumber |
| | | FDocumentStatus="C"; |
| | | jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(time)+"' and FDocumentStatus='"+FDocumentStatus+"' and FUseOrgId .FNumber='201'"); |
| | | jsonObject.put("FieldKeys", "FName,FNumber,FCreateDate,FSpecification,FDocumentStatus"); |
| | | // FName : 物料名称 ; |
| | | // FNumber :物料编号; |
| | | // FCreateDate :物料创建时间; |
| | | // FSpecification :物料规格; |
| | | // FDocumentStatus :物料状态 |
| | | 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>'"+sdf.format(docType.getCreateTime())+"' and FStockId.Fname='立库'"+" and FDocumentStatus='"+FDocumentStatus+"'"); |
| | | 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 :单据创建时间; |
| | |
| | | } |
| | | 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("Cookie", start.getContent()); |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | |
| | | .setJson(add) |
| | | .build() |
| | | .doPost(); |
| | | JSONArray data = JSON.parseArray(response); |
| | | 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 (data.getJSONArray(0).get(0).toString().length()>=20) continue; |
| | | if (kingDeeUtilType.formId.equals("BD_MATERIAL")) {//物料档案 |
| | | for (int j = 0; j < data.size(); j++) { |
| | | JSONArray jsonArray = data.getJSONArray(j); |
| | | //生成商品档案 |
| | | //商品编号 |
| | | Mat mat = matService.selectByMatnr(jsonArray.get(1).toString()); |
| | | if (mat == null) { |
| | | mat = new Mat(); |
| | | Tag tag = new Tag(); |
| | | mat.setMatnr(jsonArray.get(1).toString()); |
| | | mat.setMaktx(jsonArray.get(0).toString()); |
| | | mat.setSpecs(jsonArray.get(3).toString());//规格 |
| | | mat.setTagId(20L); |
| | | //对美国时间进行转换 |
| | | Date date = KingDeeUtil.KingDeeDate(jsonArray.get(2).toString()); |
| | | mat.setCreateTime(date);//商品创建时间 |
| | | mat.setUpdateTime(new Date()); |
| | | mat.setStatus(1); |
| | | //最新抓取商品时间 |
| | | tag.setCreateTime(date); |
| | | tagService.update(tag, new EntityWrapper<Tag>().eq("id", 20)); |
| | | if (!matService.insert(mat)) { |
| | | throw new CoolException("服务器内部错误,请联系管理员"); |
| | | //商品档案同步 |
| | | 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 { |
| | | log.info("同步新物料[商品编号:{}]", mat.getMatnr()); |
| | | 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); |
| | | Order order = orderService.selectByNo(jsonArray.get(0).toString()); |
| | | //最新抓取时间 |
| | | 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(); |
| | | // 单据主档 |
| | |
| | | DateUtils.convert(now), // 单据日期 |
| | | docType.getDocId(), // 单据类型 |
| | | null, // 项目编号 |
| | | null, // |
| | | "1", //项目名称 客户PO号 |
| | | null, // 调拨项目编号 |
| | | null, // 初始票据号 |
| | | null, // 票据号 |
| | | null, // 客户编号 |
| | | null, // 客户 |
| | | locOwner.getOwnerUuid(), // 客户编号 |
| | | locOwner.getOwner(), // 客户 |
| | | null, // 联系方式 |
| | | null, // 操作人员 |
| | | null, // 合计金额 |
| | |
| | | now, // 修改时间 |
| | | null // 备注 |
| | | ); |
| | | OrderInAndOutUtil.insertOrder(kingDeeUtilType.pakIn == 1, order); |
| | | |
| | | //最新抓取时间 |
| | | Date jsonDate = KingDeeUtil.KingDeeDate(jsonArray.get(2).toString()); |
| | | docType.setCreateTime(jsonDate); |
| | | docTypeService.updateById(docType); |
| | | if (!orderService.insert(order)) { |
| | | throw new CoolException("生成单据主档失败,请联系管理员"); |
| | | } |
| | | // 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)) { |
| | | throw new CoolException(jsonArray.get(2).toString() + "编号商品检索失败,请先添加商品"); |
| | | 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)) { |
| | | // 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.setUpdateTime(new Date()); |
| | | orderDetl.setStatus(1); |
| | | orderDetl.setQty(0.0D); |
| | | Date date = KingDeeUtil.KingDeeDate(jsonArray.get(1).toString()); |
| | | //最新抓取时间 |
| | | docType.setCreateTime(date); |
| | | if (!orderDetlService.insert(orderDetl)) { |
| | | throw new CoolException("生成单据明细失败,请联系管理员"); |
| | | } |
| | | // 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); |
| | | } |
| | | // 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); |
| | | } |
| | | |
| | | } |