Merge remote-tracking branch 'origin/jshdasrs' into jshdasrs
| | |
| | | .where("loc_no like '" + row + "%'"); |
| | | } |
| | | List<LocDetl> list = locDetlService.selectList(wrapper); |
| | | List<AbnormalLocDetlParam> result = new ArrayList<>(); |
| | | List<LocDetl> result = new ArrayList<>(); |
| | | |
| | | Page<LocDetl> groupLocDetl = locDetlService.getStockStatis2(toPage(1, 10000, param, LocDetl.class)); |
| | | for (LocDetl locDetl : groupLocDetl.getRecords()) { |
| | | AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam(); |
| | | Mat mat = matService.selectOne(new EntityWrapper<Mat>() |
| | | .eq("matnr", locDetl.getMatnr())); |
| | | if (Cools.isEmpty(mat)) { |
| | | continue; |
| | | } |
| | | if (!Cools.isEmpty(mat .getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) { |
| | | abnormalLocDetlParam.setStoreMax(mat.getStoreMax()); |
| | | abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate()); |
| | | abnormalLocDetlParam.setStoreMin(mat.getStoreMin()); |
| | | abnormalLocDetlParam.setAnfme(locDetl.getAnfme()); |
| | | abnormalLocDetlParam.setMaktx(mat.getMaktx()); |
| | | abnormalLocDetlParam.setMatnr(mat.getMatnr()); |
| | | abnormalLocDetlParam.setSpecs(mat.getSpecs()); |
| | | abnormalLocDetlParam.setBatch(locDetl.getBatch()); |
| | | |
| | | // for (LocDetl locDetl : groupLocDetl.getRecords()) { |
| | | for (LocDetl locDetl : list) { |
| | | // AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam(); |
| | | // Mat mat = matService.selectOne(new EntityWrapper<Mat>() |
| | | // .eq("matnr", locDetl.getMatnr())); |
| | | // if (Cools.isEmpty(mat)) { |
| | | // continue; |
| | | // } |
| | | // if (!Cools.isEmpty(mat.getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) { |
| | | // abnormalLocDetlParam.setStoreMax(mat.getStoreMax()); |
| | | // abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate()); |
| | | // abnormalLocDetlParam.setStoreMin(mat.getStoreMin()); |
| | | // abnormalLocDetlParam.setAnfme(locDetl.getAnfme());//数量 |
| | | // abnormalLocDetlParam.setMaktx(mat.getMaktx());//商品名称 |
| | | // abnormalLocDetlParam.setMatnr(mat.getMatnr());//商品编号 |
| | | // abnormalLocDetlParam.setSpecs(mat.getSpecs()); |
| | | // abnormalLocDetlParam.setBatch(locDetl.getBatch()); |
| | | // abnormalLocDetlParam.setLocNo(locDetl.getLocNo());//库位号 |
| | | // abnormalLocDetlParam.setZpallet(locDetl.getZpallet());//托盘条码 |
| | | // abnormalLocDetlParam.setBarcode(locDetl.getStandby2());//条码upc |
| | | // abnormalLocDetlParam.setUnit(locDetl.getStandby1());//客户po |
| | | // abnormalLocDetlParam.setSku(locDetl.getSku());//客户sku |
| | | // abnormalLocDetlParam.setSupp(locDetl.getSupp());//供应商 |
| | | // abnormalLocDetlParam.setManu(locDetl.getBoxType1());//货主 |
| | | // abnormalLocDetlParam.setOrderNo(locDetl.getOrderNo());//采购单号 |
| | | // abnormalLocDetlParam.setMemo(locDetl.getMemo());//备注 |
| | | // abnormalLocDetlParam.setModiTime(locDetl.getModiTime());//修改时间 |
| | | // SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd"); |
| | | // Date maxDate = simple.parse(locDetl.getBatch()); |
| | | // long time = maxDate.getTime(); |
| | |
| | | // long time1 = now.getTime(); |
| | | // abnormalLocDetlParam.setNowTime((int) ((time1 - time) / (1000 * 60 * 60 * 24))); |
| | | |
| | | if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) { |
| | | result.add(abnormalLocDetlParam); |
| | | } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) { |
| | | result.add(abnormalLocDetlParam); |
| | | } |
| | | } |
| | | // if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) { |
| | | result.add(locDetl); |
| | | // } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) { |
| | | // result.add(abnormalLocDetlParam); |
| | | // } |
| | | // } |
| | | } |
| | | return R.ok(exportSupport(result, fields)); |
| | | } |
| | |
| | | @Param("boxType3")String boxType3, @Param("workQty")Double workQty); |
| | | |
| | | List<OrderDetlPakin> selectOrderDetls(@Param("orderNo")String orderNo,@Param("sku")String sku,@Param("upc") String upc); |
| | | List<OrderDetlPakin> selectOrderDetlsByOrderNo(@Param("orderNo")String orderNo); |
| | | |
| | | } |
| | |
| | | List<Order> selectComplete1(); |
| | | List<Order> selectComplete99(); |
| | | List<Order> selectComplete8(); |
| | | |
| | | List<Order> selectComplete10(); |
| | | List<Order> selectComplete9(); |
| | | int addToLogTable(Order order); |
| | | |
| | | List<Order> selectorderNoL(@Param("orderNo")String orderNo); |
| | |
| | | |
| | | List<OrderPakin> selectComplete(); |
| | | List<OrderPakin> selectComplete8(); |
| | | List<OrderPakin> selectComplete9(); |
| | | List<OrderPakin> selectComplete10(); |
| | | |
| | | int addToLogTable(OrderPakin order); |
| | | |
| | |
| | | |
| | | List<OrderPakout> selectComplete(); |
| | | List<OrderPakout> selectComplete8(); |
| | | |
| | | List<OrderPakout> selectComplete9(); |
| | | List<OrderPakout> selectComplete10(); |
| | | int addToLogTable(OrderPakout order); |
| | | |
| | | List<OrderPakout> selectorderNoL(@Param("orderNo")String orderNo); |
| | |
| | | , String boxType1, String boxType2, String boxType3, Double workQty); |
| | | |
| | | List<OrderDetlPakin> selectOrderDetls(OrderDetlByCode orderDetlByCode); |
| | | List<OrderDetlPakin> selectOrderDetlsByOrderNo(String orderNo); |
| | | |
| | | } |
| | |
| | | |
| | | List<OrderPakin> selectComplete(); |
| | | List<OrderPakin> selectComplete8(); |
| | | List<OrderPakin> selectComplete9(); |
| | | List<OrderPakin> selectComplete10(); |
| | | |
| | | boolean addToLogTable(OrderPakin order); |
| | | |
| | |
| | | |
| | | List<OrderPakout> selectComplete(); |
| | | List<OrderPakout> selectComplete8(); |
| | | List<OrderPakout> selectComplete9(); |
| | | List<OrderPakout> selectComplete10(); |
| | | |
| | | boolean addToLogTable(OrderPakout order); |
| | | |
| | |
| | | List<Order> selectComplete1(); |
| | | List<Order> selectComplete99(); |
| | | List<Order> selectComplete8(); |
| | | List<Order> selectComplete10(); |
| | | List<Order> selectComplete9(); |
| | | |
| | | boolean addToLogTable(Order order); |
| | | |
| | |
| | | String sku = orderDetlByCode.getSku(); |
| | | return this.baseMapper.selectOrderDetls(orderNo,sku,upc); |
| | | } |
| | | |
| | | @Override |
| | | public List<OrderDetlPakin> selectOrderDetlsByOrderNo(String orderNo){ |
| | | return this.baseMapper.selectOrderDetlsByOrderNo(orderNo); |
| | | } |
| | | } |
| | |
| | | public List<OrderPakin> selectComplete() { |
| | | return this.baseMapper.selectComplete(); |
| | | } |
| | | @Override |
| | | public List<OrderPakin> selectComplete9() { |
| | | return this.baseMapper.selectComplete9(); |
| | | } |
| | | |
| | | @Override |
| | | public List<OrderPakin> selectComplete10() { |
| | | return this.baseMapper.selectComplete10(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public List<OrderPakin> selectComplete8() { |
| | |
| | | public List<OrderPakout> selectComplete8() { |
| | | return this.baseMapper.selectComplete8(); |
| | | } |
| | | @Override |
| | | public List<OrderPakout> selectComplete9() { |
| | | return this.baseMapper.selectComplete8(); |
| | | } |
| | | @Override |
| | | public List<OrderPakout> selectComplete10() { |
| | | return this.baseMapper.selectComplete8(); |
| | | } |
| | | |
| | | @Override |
| | | public boolean addToLogTable(OrderPakout order) { |
| | |
| | | public List<Order> selectComplete8() { |
| | | return this.baseMapper.selectComplete8(); |
| | | } |
| | | @Override |
| | | public List<Order> selectComplete10() { |
| | | return this.baseMapper.selectComplete10(); |
| | | } |
| | | @Override |
| | | public List<Order> selectComplete9() { |
| | | return this.baseMapper.selectComplete9(); |
| | | } |
| | | |
| | | @Override |
| | | public boolean addToLogTable(Order order) { |
| | |
| | | } |
| | | String erpReport = Parameter.get().getErpReport(); |
| | | if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) { |
| | | List<Order> orders = orderService.selectComplete(); |
| | | List<Order> orders = orderService.selectComplete8(); |
| | | for (Order order : orders) { |
| | | try { |
| | | ReturnT<String> result = orderSyncHandler.startOrderReport(order); |
| | |
| | | if (detail.getAnfme().equals(0D)){ |
| | | continue; |
| | | } |
| | | DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(), |
| | | DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(), |
| | | detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme()); |
| | | if (DetlDto.has(list, dto)) { |
| | | DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getStandby1(),dto.getStandby2(),dto.getStandby3(),dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3()); |
| | |
| | | String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch(); |
| | | pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getQty())); |
| | | } |
| | | |
| | | String response = ""; |
| | | boolean success = false; |
| | | // |
| | | // String response = ""; |
| | | // boolean success = false; |
| | | try { |
| | | if (pakinParam.getList().size()==0){ |
| | | success = true; |
| | | // 修改订单状态 4.完成 ===>> 6.已上报 |
| | | // 修改订单状态 8新增提交审核完成 ===>> 6.已上报 |
| | | if (!orderService.updateSettle(order.getId(), settle, null)) { |
| | | throw new CoolException("服务器内部错误,请联系管理员"); |
| | | } |
| | | } else { |
| | | // 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)) { |
| | | if (true) { |
| | | success = true; |
| | | // 修改订单状态 4.完成 ===>> 6.已上报 |
| | | if (order.getSettle() == 8L) { |
| | | // 修改订单状态 8新增提交审核完成 ===>> 6.已上报 |
| | | if (!orderService.updateSettle(order.getId(), settle, null)) { |
| | | throw new CoolException("服务器内部错误,请联系管理员"); |
| | | } |
| | | } else { |
| | | log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response); |
| | | throw new CoolException("上报mes系统失败"); |
| | | log.error("8转6失败请查看流程中是否存在异常"); |
| | | throw new CoolException("8转6失败"); |
| | | } |
| | | } |
| | | } 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); } |
| | | } |
| | | } |
| | | // 出库完成上报 |
| | |
| | | try { |
| | | // 保存接口日志 |
| | | apiLogService.save( |
| | | "成品库出库上报", |
| | | "出库上报", |
| | | MesConstant.URL + MesConstant.PAKOUT_URL, |
| | | null, |
| | | "127.0.0.1", |
| | |
| | | @Value("${erp.switch.ReviewOrderSwitch}") |
| | | private boolean ReviewOrderSwitch; |
| | | |
| | | // @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Async("orderThreadPool") |
| | | public void completeAndReport(){ |
| | | if(!ReviewOrderSwitch){ |
| | |
| | | } |
| | | String erpReport = Parameter.get().getErpReport(); |
| | | if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) { |
| | | // List<Order> orders = orderService.selectComplete(); |
| | | List<Order> orders = OrderInAndOutUtil.selectComplete(null); |
| | | // List<Order> orders = OrderInAndOutUtil.selectComplete9(null);//查询9提交完成的 |
| | | List<Order> orders = orderService.selectComplete9(); |
| | | for (Order order : orders) { |
| | | ReturnT<String> result = reviewOrderSyncHandler.start(order); |
| | | if (!result.isSuccess()) { |
| | |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.service.OrderService; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.task.kingdee.handler.SaveOrderSyncHandler; |
| | | import com.zy.asrs.task.kingdee.handler.SubmitOrderSyncHandler; |
| | | import com.zy.asrs.utils.OrderInAndOutUtil; |
| | | import com.zy.common.entity.Parameter; |
| | |
| | | public class SaveOrderSyncScheduler { |
| | | |
| | | @Autowired |
| | | private SubmitOrderSyncHandler submitOrderSyncHandler; |
| | | private SaveOrderSyncHandler saveOrderSyncHandler; |
| | | @Autowired |
| | | private OrderService orderService; |
| | | |
| | | @Value("${erp.switch.ReviewOrderSwitch}") |
| | | private boolean ReviewOrderSwitch; |
| | | |
| | | // @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Async("orderThreadPool") |
| | | public void completeAndReport(){ |
| | | if (1==1) return; |
| | | if(!ReviewOrderSwitch){ |
| | | return; |
| | | } |
| | | String erpReport = Parameter.get().getErpReport(); |
| | | if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) { |
| | | // List<Order> orders = orderService.selectComplete8(); |
| | | List<Order> orders = OrderInAndOutUtil.selectComplete8(null); |
| | | // List<Order> orders = OrderInAndOutUtil.selectComplete(null); |
| | | List<Order> orders = orderService.selectComplete(); |
| | | |
| | | for (Order order : orders) { |
| | | ReturnT<String> result = submitOrderSyncHandler.start(order); |
| | | ReturnT<String> result = saveOrderSyncHandler.start(order);//4已完成 |
| | | if (!result.isSuccess()) { |
| | | log.error("单据[orderNo={}]提交至erp失败", order.getOrderNo()); |
| | | log.error("单据[orderNo={}]新增保存至erp失败", order.getOrderNo()); |
| | | } |
| | | } |
| | | } |
| | |
| | | public class SubmitOrderSyncScheduler { |
| | | |
| | | @Autowired |
| | | private SaveOrderSyncHandler saveOrderSyncHandler; |
| | | private SubmitOrderSyncHandler submitOrderSyncHandler; |
| | | @Autowired |
| | | private OrderService orderService; |
| | | |
| | | @Value("${erp.switch.ReviewOrderSwitch}") |
| | | private boolean ReviewOrderSwitch; |
| | | |
| | | // @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | @Async("orderThreadPool") |
| | | public void completeAndReport(){ |
| | | if(!ReviewOrderSwitch){ |
| | |
| | | } |
| | | String erpReport = Parameter.get().getErpReport(); |
| | | if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) { |
| | | // List<Order> orders = orderService.selectComplete8(); |
| | | List<Order> orders = OrderInAndOutUtil.selectComplete8(null); |
| | | // List<Order> orders = OrderInAndOutUtil.selectComplete10(null); //查询10新增上报完成 |
| | | List<Order> orders = orderService.selectComplete10(); |
| | | |
| | | for (Order order : orders) { |
| | | ReturnT<String> result = saveOrderSyncHandler.start(order); |
| | | ReturnT<String> result = submitOrderSyncHandler.start(order); |
| | | if (!result.isSuccess()) { |
| | | log.error("单据[orderNo={}]保存至erp失败", order.getOrderNo()); |
| | | } |
| | |
| | | docType = docTypeService.selectOrAdd(kingDeeUtilType.desc, kingDeeUtilType.pakIn.equals(1)); |
| | | } |
| | | String FDocumentStatus=null; |
| | | if (Arrays.asList("INR").contains(kingDeeUtilType.formId)) { |
| | | continue; |
| | | } |
| | | //条件和需要获得的结果拼接 |
| | | JSONObject jsonObject = new JSONObject(); |
| | | String path = null; |
| | |
| | | // jsonObject.put("start_biztime", latestUpdateTime);//业务起始日期 |
| | | jsonObject.put("start_biztime", "2025-01-01 00:00:00");//业务起始日期 |
| | | jsonObject.put("end_biztime", sdf1.format(now));//业务结束日期 |
| | | jsonObject.put("billno", "CGSL-251126-000001"); |
| | | jsonObject.put("billno", null); |
| | | jsonObject.put("billstatus", Arrays.asList("C"));//数据状态 [A:暂存, B:已提交, C:已审核] |
| | | jsonObject.put("start_auditdate", "2025-11-25 00:00:00"); |
| | | jsonObject.put("end_auditdate", sdf1.format(now)); |
| | |
| | | String billNo = jsonObjectNew.get("billno").toString();//单据编号 |
| | | String owner = jsonObjectNew.get("org_name").toString();//货主名称 |
| | | String ownerUuid = jsonObjectNew.get("org_number").toString();//erp货主编号 |
| | | String orderId = jsonObjectNew.get("id").toString(); |
| | | JSONObject detailParam = new JSONObject(); |
| | | JSONObject dataObj = new JSONObject(); |
| | | dataObj.put("billno", billNo); |
| | |
| | | createTime.toString(), // 单据日期 |
| | | docType.getDocId(), // 单据类型 |
| | | null, // 项目编号 |
| | | null, //项目名称 客户PO号 暂时不知道字段是哪个 |
| | | orderId, //收料单id |
| | | null, // 调拨项目编号 |
| | | null, // 初始票据号 |
| | | null, // 票据号 |
| | |
| | | String s2 = entry.getString("eap7_textfield5"); //条码UPC |
| | | String memo = entry.getString("eap7_textfield6"); //备注(英文描述) |
| | | String s1 = entry.getString("eap7_textfield7"); //客户PO |
| | | String detlId = entry.getString("id"); //明细id |
| | | Long seq = entry.getLong("seq"); //分录行号 |
| | | // String |
| | | if(anfme == 0){ |
| | | callApiLogSaveOrder(order,kingDeeUtilType, "单据数量异常"+matnr, false); |
| | | continue; |
| | |
| | | if(locSupp != null){supp = locSupp.getOwner();} |
| | | OrderDetl orderDetl = new OrderDetl(); |
| | | orderDetl.sync(mat); |
| | | orderDetl.setThreeCode(detlId);//ERP明细id |
| | | orderDetl.setLineNumber(seq);//分录行号 |
| | | orderDetl.setAnfme(anfme);//总箱数 |
| | | orderDetl.setErpAnfme(anfme); |
| | | orderDetl.setErpAnfme(anfme);//erp数据 |
| | | orderDetl.setOrderId(order.getId()); |
| | | orderDetl.setOrderNo(order.getOrderNo());//表头单据 |
| | | orderDetl.setSupp(supp);//供应商名称(货源) |
| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.ErpSecret; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.service.ApiLogService; |
| | | import com.zy.asrs.service.DocTypeService; |
| | | import com.zy.asrs.service.OrderService; |
| | | 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 org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Arrays; |
| | | import java.util.HashMap; |
| | | import java.util.Set; |
| | | |
| | |
| | | //端口 |
| | | private String URL; |
| | | |
| | | @Value("${erp.address.outaddressAudit}") |
| | | @Value("${erp.address.imPurinbillBatchAudit}") |
| | | //审核地址 |
| | | private String outaddressAudit; |
| | | private String imPurinbillBatchAudit; |
| | | |
| | | @Autowired |
| | | private OrderService orderService; |
| | |
| | | @Autowired |
| | | private DocTypeService docTypeService; |
| | | @Autowired |
| | | private ErpSecretServiceImpl erpSecretService; |
| | | @Autowired |
| | | private LoginAuthenticationHandler loginAuthenticationHandler; |
| | | |
| | | @Value("${erp.login.accountId}") |
| | | private String accountId; |
| | | @Value("${erp.login.xAcfwIdentity}") |
| | | private String xAcfwIdentity; |
| | | private String path; |
| | | @Transactional |
| | | public ReturnT<String> start(Order order) { |
| | | //登录金蝶r |
| | | ReturnT<String> start = loginAuthenticationHandler.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)); |
| | | |
| | | // 获取 DocType |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (null == docType) { |
| | | return SUCCESS; |
| | | } |
| | | if (docType == null) return SUCCESS; |
| | | |
| | | // 获取 KingDee 类型 |
| | | KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName()); |
| | | |
| | | //条件拼接 |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("Numbers",order.getOrderNo()); |
| | | JSONObject jsonObject1 = new JSONObject(); |
| | | jsonObject1.put("data", jsonObject); |
| | | jsonObject1.put("FormId",kingDeeUtilType.formId); |
| | | String add = jsonObject1.toJSONString(); |
| | | //上报 |
| | | // 构建请求参数 |
| | | JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2); |
| | | if (add == null) return FAIL.setMsg("请求参数构建失败"); |
| | | |
| | | // 发送请求并处理响应 |
| | | return sendRequestAndProcessResponse(order, erpSecret, add); |
| | | } |
| | | |
| | | private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, |
| | | SimpleDateFormat sdf1, SimpleDateFormat sdf2) { |
| | | switch (kingDeeUtilType.formId) { |
| | | case "PUR_RECEIVEBIll": // 进仓通知单提交 |
| | | path = imPurinbillBatchAudit; |
| | | JSONArray idArray = new JSONArray(); |
| | | idArray.add(order.getNumber()); |
| | | JSONObject dataObj = new JSONObject(); |
| | | dataObj.fluentPut("id", idArray); |
| | | return new JSONObject().fluentPut("data", dataObj); |
| | | |
| | | default: |
| | | throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId); |
| | | } |
| | | } |
| | | |
| | | private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) { |
| | | String response = ""; |
| | | boolean success = false; |
| | | |
| | | try { |
| | | //获取Cookie值 |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("Cookie", start.getContent()); |
| | | // 设置请求头 |
| | | HashMap<String, Object> headers = buildRequestHeaders(erpSecret); |
| | | |
| | | // 发送请求,将 JSONObject 转换为 String |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(outaddressAudit) |
| | | .setJson(add) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | JSONObject data = JSON.parseObject(response); |
| | | Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess"); |
| | | String bool=IsSuccess.toString(); |
| | | //审核完成原订单4转8 8.审核完成 |
| | | if(bool.equals("true")){ |
| | | |
| | | // 解析响应 |
| | | JSONObject jsonResponse = JSON.parseObject(response); |
| | | |
| | | // 判断是否因为 token 过期 (errorCode = 401) |
| | | if ("401".equals(jsonResponse.getString("errorCode"))) { |
| | | log.error("认证失败,尝试重新获取 Token"); |
| | | loginAuthenticationHandler.start(); // 刷新 token |
| | | // 重新获取新的 token |
| | | erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token |
| | | // 使用新的 token 重试请求 |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | } |
| | | // 解析返回的响应 |
| | | JSONObject data = jsonResponse.getJSONObject("data"); |
| | | String errorCode = jsonResponse.getString("errorCode"); |
| | | boolean status = jsonResponse.getBooleanValue("status"); |
| | | if ("0".equals(errorCode) && status) { |
| | | // 获取成功与失败的数量 |
| | | int successCount = data.getInteger("successCount"); |
| | | int failCount = data.getInteger("failCount"); |
| | | |
| | | if (failCount == 0) { |
| | | success = true; |
| | | order.setSettle(8L); |
| | | // orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo())); |
| | | OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 8L, null); |
| | | log.info("接口调用成功,成功的操作数量: {}", successCount); |
| | | } else { |
| | | log.error("接口调用失败,失败的操作数量: {}", failCount); |
| | | // 如果有失败的单据,遍历 result 数组查看失败的详细信息 |
| | | JSONArray resultArray = data.getJSONArray("result"); |
| | | for (int i = 0; i < resultArray.size(); i++) { |
| | | JSONObject resultItem = resultArray.getJSONObject(i); |
| | | if (!resultItem.getBoolean("billStatus")) { |
| | | // 单据处理失败,记录错误信息 |
| | | String billNo = resultItem.getString("number"); // 获取返回的单据号 |
| | | JSONArray errors = resultItem.getJSONArray("errors"); // 获取错误信息 |
| | | |
| | | // 打印单据号和错误信息 |
| | | log.error("单据号: {}, 错误信息: {}", billNo, errors); |
| | | } |
| | | } |
| | | } |
| | | |
| | | order.setSettle(8L); // 更新状态为已上报审核 9->8 |
| | | orderService.updateById(order); |
| | | } else { |
| | | log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message")); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("fail", e); |
| | | // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | log.error("请求失败", e); |
| | | return FAIL.setMsg(e.getMessage()); |
| | | } finally { |
| | | try { |
| | | // 保存接口日志 |
| | | saveApiLog(add, response, success); |
| | | } |
| | | |
| | | return success ? SUCCESS : FAIL; |
| | | } |
| | | |
| | | private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) { |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 |
| | | return headers; |
| | | } |
| | | |
| | | private void saveApiLog(JSONObject add, String response, boolean success) { |
| | | try { |
| | | apiLogService.save( |
| | | "审核", |
| | | URL+ outaddressAudit, |
| | | "单据上报审核", |
| | | URL + imPurinbillBatchAudit, |
| | | null, |
| | | "127.0.0.1", |
| | | add, |
| | | add.toJSONString(), |
| | | response, |
| | | success |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error("", 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; |
| | | } |
| | | } |
| | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.ApiLogService; |
| | | import com.zy.asrs.service.DocTypeService; |
| | | import com.zy.asrs.service.OrderService; |
| | | import com.zy.asrs.service.impl.ErpSecretServiceImpl; |
| | | import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl; |
| | | import com.zy.asrs.service.impl.OrderDetlServiceImpl; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.utils.OrderInAndOutUtil; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Set; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * Created by Monkey D. Luffy on 2023.10.21 |
| | |
| | | @Service |
| | | public class SaveOrderSyncHandler extends AbstractHandler<String> { |
| | | @Value("${erp.address.URL}") |
| | | //端口 |
| | | private String URL; |
| | | |
| | | @Value("${erp.address.outaddressSave}") |
| | | //审核地址 |
| | | private String outaddressSave; |
| | | @Value("${erp.address.imPurinbillAdd}") |
| | | private String imPurinbillAdd; |
| | | |
| | | @Autowired |
| | | private OrderService orderService; |
| | |
| | | private DocTypeService docTypeService; |
| | | @Autowired |
| | | private LoginAuthenticationHandler loginAuthenticationHandler; |
| | | @Autowired |
| | | private ErpSecretServiceImpl erpSecretService; |
| | | @Autowired |
| | | private OrderDetlPakinServiceImpl orderDetlPakinService; |
| | | @Autowired |
| | | private OrderDetlServiceImpl orderDetlService; |
| | | |
| | | @Value("${erp.login.accountId}") |
| | | private String accountId; |
| | | @Value("${erp.login.xAcfwIdentity}") |
| | | private String xAcfwIdentity; |
| | | String path; |
| | | @Transactional |
| | | public ReturnT<String> start(Order order) { |
| | | //登录金蝶r |
| | | ReturnT<String> start = loginAuthenticationHandler.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)); |
| | | |
| | | // 获取 DocType |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (null == docType) { |
| | | return SUCCESS; |
| | | } |
| | | if (docType == null) return SUCCESS; |
| | | |
| | | // 获取 KingDee 类型 |
| | | KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName()); |
| | | |
| | | //条件拼接 |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("Numbers",order.getOrderNo()); |
| | | JSONObject jsonObject1 = new JSONObject(); |
| | | jsonObject1.put("data", jsonObject); |
| | | jsonObject1.put("FormId",kingDeeUtilType.correspondingFormId); |
| | | String add = jsonObject1.toJSONString(); |
| | | //上报 |
| | | // 构建请求参数 |
| | | JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2); |
| | | if (add == null) return FAIL.setMsg("请求参数构建失败"); |
| | | |
| | | // 发送请求并处理响应 |
| | | return sendRequestAndProcessResponse(order, erpSecret, add); |
| | | } |
| | | |
| | | private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, SimpleDateFormat sdf1, SimpleDateFormat sdf2) { |
| | | List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",order.getOrderNo())); |
| | | |
| | | switch (kingDeeUtilType.formId) { |
| | | case "PUR_RECEIVEBIll": // 进仓通知单 |
| | | path = imPurinbillAdd; |
| | | JSONArray billentryLkArray = new JSONArray(); |
| | | JSONArray billentryArray = new JSONArray(); // 用于存储 billentry 对象 |
| | | String suppCode = null; // 供应商 |
| | | String boxType2 = null; // 货主/货源 |
| | | |
| | | // 遍历订单详情 |
| | | for (OrderDetl orderDetl : orderDetlList) { |
| | | suppCode = orderDetl.getSuppCode(); |
| | | boxType2 = orderDetl.getBoxType2(); |
| | | if (orderDetl.getQty() == 0) { |
| | | continue; |
| | | } |
| | | |
| | | // 创建 billentry_lk 对象 |
| | | JSONObject billentryLk = new JSONObject() |
| | | .fluentPut("id", Long.parseLong(orderDetl.getThreeCode())) |
| | | .fluentPut("seq", orderDetl.getLineNumber()) |
| | | .fluentPut("billentry_lk_stableid", 677270092232273922L) |
| | | .fluentPut("billentry_lk_sbillid", Long.parseLong(order.getItemName())) // 主单ID |
| | | .fluentPut("billentry_lk_sid", Long.parseLong(orderDetl.getThreeCode())) // 明细ID |
| | | .fluentPut("billentry_lk_baseqty_old", orderDetl.getErpAnfme()) // ERP数量 |
| | | .fluentPut("billentry_lk_baseqty", orderDetl.getQty()); // 作业数量 |
| | | billentryLkArray.add(billentryLk); |
| | | // 创建 billentry 对象,填充缺失的字段 |
| | | JSONObject billentry = new JSONObject() |
| | | .fluentPut("id", Long.parseLong(orderDetl.getThreeCode())) |
| | | .fluentPut("warehouse_number", orderDetl.getManu()) // 仓库编号 |
| | | .fluentPut("invstatus_number", "110") // 库存状态 |
| | | .fluentPut("invtype_number", "110") // 库存类型 |
| | | .fluentPut("outinvstatus_number", "110") |
| | | .fluentPut("linetype_number", "010") // 行号类型 |
| | | .fluentPut("qty", orderDetl.getQty()) // 数量 |
| | | .fluentPut("material_number", orderDetl.getMatnr()) // 物料编号 |
| | | .fluentPut("billentry_lk", billentryLkArray); // 将 billentry_lk 添加到 billentry |
| | | |
| | | billentryArray.add(billentry); |
| | | } |
| | | Date now = new Date(); |
| | | // 生成 INR 相关请求参数 |
| | | return new JSONObject() |
| | | .fluentPut("data", new JSONArray(Arrays.asList( |
| | | new JSONObject() |
| | | .fluentPut("billno", order.getOrderNo()) |
| | | .fluentPut("trdbillno", UUID.randomUUID().toString().replace("-", "")) |
| | | .fluentPut("billtype_number", "im_PurInBill_STD_BT_S") |
| | | .fluentPut("biztime", sdf1.format(now)) |
| | | .fluentPut("exratedate", sdf1.format(now)) |
| | | .fluentPut("bizorg_number", boxType2) |
| | | .fluentPut("biztype_number", "110") // 货主/货源 |
| | | .fluentPut("org_number", boxType2) // 货主/货源 |
| | | .fluentPut("paymode", "CREDIT") |
| | | .fluentPut("invscheme_number", "110") |
| | | .fluentPut("billtype_number", "im_PurInBill_STD_BT_S") |
| | | .fluentPut("supplier_number", suppCode) // 供应商编号 |
| | | .fluentPut("billno", order.getOrderNo()) |
| | | .fluentPut("billentry", billentryArray) // 将 billentry 数组添加到请求参数 |
| | | ))); |
| | | |
| | | default: |
| | | // 默认处理:可以抛出异常或返回空对象 |
| | | throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId); |
| | | } |
| | | } |
| | | |
| | | |
| | | private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) { |
| | | String response = ""; |
| | | boolean success = false; |
| | | |
| | | try { |
| | | //获取Cookie值 |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("Cookie", start.getContent()); |
| | | // 设置请求头 |
| | | HashMap<String, Object> headers = buildRequestHeaders(erpSecret); |
| | | |
| | | // 发送请求,将 JSONObject 转换为 String |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(outaddressSave) |
| | | .setJson(add) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | JSONObject data = JSON.parseObject(response); |
| | | Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess"); |
| | | String bool=IsSuccess.toString(); |
| | | //保存完成原订单8转6 |
| | | if(bool.equals("true")){ |
| | | success = true; |
| | | order.setSettle(6L); |
| | | // orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo())); |
| | | OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null); |
| | | |
| | | // 解析响应 |
| | | JSONObject jsonResponse = JSON.parseObject(response); |
| | | |
| | | // 判断是否因为 token 过期 (errorCode = 401) |
| | | if ("401".equals(jsonResponse.getString("errorCode"))) { |
| | | log.error("认证失败,尝试重新获取 Token"); |
| | | loginAuthenticationHandler.start(); // 刷新 token |
| | | // 重新获取新的 token |
| | | erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token |
| | | // 使用新的 token 重试请求 |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | } |
| | | |
| | | // 解析返回的响应 |
| | | JSONObject data = jsonResponse.getJSONObject("data"); |
| | | String errorCode = jsonResponse.getString("errorCode"); |
| | | boolean status = jsonResponse.getBooleanValue("status"); |
| | | |
| | | // 检查接口调用的整体状态 |
| | | if ("0".equals(errorCode) && status) { |
| | | // 获取成功与失败的数量 |
| | | int successCount = data.getInteger("successCount"); |
| | | int failCount = data.getInteger("failCount"); |
| | | |
| | | if (failCount == 0) { |
| | | success = true; |
| | | log.info("接口调用成功,成功的操作数量: {}", successCount); |
| | | // 获取返回的单据号和ID |
| | | JSONArray resultArray = data.getJSONArray("result"); |
| | | for (int i = 0; i < resultArray.size(); i++) { |
| | | JSONObject resultItem = resultArray.getJSONObject(i); |
| | | String billNo = resultItem.getString("number"); // 获取返回的单据号 |
| | | String billId = resultItem.getString("id"); // 获取返回的ID |
| | | |
| | | // 判断返回的单据号与订单号是否一致 |
| | | if (billNo != null && billNo.equals(order.getOrderNo())) { |
| | | // 如果一致,设置订单的 number |
| | | order.setNumber(billId); |
| | | log.info("订单号 {} 与返回的单据号匹配,设置订单 ID 为 {}", order.getOrderNo(), billId); |
| | | } |
| | | } |
| | | } else { |
| | | log.error("接口调用失败,失败的操作数量: {}", failCount); |
| | | // 如果有失败的单据,遍历 result 数组查看失败的详细信息 |
| | | JSONArray resultArray = data.getJSONArray("result"); |
| | | for (int i = 0; i < resultArray.size(); i++) { |
| | | JSONObject resultItem = resultArray.getJSONObject(i); |
| | | if (!resultItem.getBoolean("billStatus")) { |
| | | // 单据处理失败,记录错误信息 |
| | | String billNo = resultItem.getString("billno"); |
| | | JSONArray errors = resultItem.getJSONArray("errors"); |
| | | log.error("单据号: {}, 错误信息: {}", billNo, errors); |
| | | } |
| | | } |
| | | } |
| | | order.setSettle(10L); // 更新状态为 "已上报" |
| | | orderService.updateById(order); |
| | | } else { |
| | | log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message")); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("fail", e); |
| | | // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | log.error("请求失败", e); |
| | | return FAIL.setMsg(e.getMessage()); |
| | | } finally { |
| | | try { |
| | | // 保存接口日志 |
| | | saveApiLog(add, response, success); |
| | | } |
| | | |
| | | return success ? SUCCESS : FAIL; |
| | | } |
| | | |
| | | |
| | | private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) { |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 |
| | | return headers; |
| | | } |
| | | private void saveApiLog(JSONObject add, String response, boolean success) { |
| | | try { |
| | | apiLogService.save( |
| | | "保存", |
| | | URL+ outaddressSave, |
| | | "进仓通知单上报新增", |
| | | URL + path, |
| | | null, |
| | | "127.0.0.1", |
| | | add, |
| | | add.toJSONString(), |
| | | response, |
| | | success |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error("", 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; |
| | | } |
| | | } |
| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.ErpSecret; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.entity.OrderDetlPakin; |
| | | import com.zy.asrs.service.ApiLogService; |
| | | import com.zy.asrs.service.DocTypeService; |
| | | import com.zy.asrs.service.OrderService; |
| | | 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 org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Arrays; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | |
| | | @Service |
| | | public class SubmitOrderSyncHandler extends AbstractHandler<String> { |
| | | @Value("${erp.address.URL}") |
| | | //端口 |
| | | private String URL; |
| | | |
| | | @Value("${erp.address.outaddressSubmit}") |
| | | //审核地址 |
| | | private String outaddressSubmit; |
| | | @Value("${erp.address.imPurinbillBatchSubmit}") |
| | | private String imPurinbillBatchSubmit; |
| | | |
| | | @Autowired |
| | | private LoginAuthenticationHandler loginAuthenticationHandler; |
| | | @Autowired |
| | | private ErpSecretServiceImpl erpSecretService; |
| | | @Autowired |
| | | private OrderService orderService; |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | @Autowired |
| | | private DocTypeService docTypeService; |
| | | @Autowired |
| | | private LoginAuthenticationHandler loginAuthenticationHandler; |
| | | |
| | | @Value("${erp.login.accountId}") |
| | | private String accountId; |
| | | @Value("${erp.login.xAcfwIdentity}") |
| | | private String xAcfwIdentity; |
| | | private String path; |
| | | @Transactional |
| | | public ReturnT<String> start(Order order) { |
| | | //登录金蝶r |
| | | ReturnT<String> start = loginAuthenticationHandler.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)); |
| | | |
| | | // 获取 DocType |
| | | DocType docType = docTypeService.selectById(order.getDocType()); |
| | | if (null == docType) { |
| | | return SUCCESS; |
| | | } |
| | | if (docType == null) return SUCCESS; |
| | | |
| | | // 获取 KingDee 类型 |
| | | KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName()); |
| | | |
| | | //条件拼接 |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("Numbers",order.getOrderNo()); |
| | | JSONObject jsonObject1 = new JSONObject(); |
| | | jsonObject1.put("data", jsonObject); |
| | | jsonObject1.put("FormId",kingDeeUtilType.correspondingFormId); |
| | | String add = jsonObject1.toJSONString(); |
| | | //上报 |
| | | // 构建请求参数 |
| | | JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2); |
| | | if (add == null) return FAIL.setMsg("请求参数构建失败"); |
| | | |
| | | // 发送请求并处理响应 |
| | | return sendRequestAndProcessResponse(order, erpSecret, add); |
| | | } |
| | | |
| | | private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, |
| | | SimpleDateFormat sdf1, SimpleDateFormat sdf2) { |
| | | switch (kingDeeUtilType.formId) { |
| | | case "PUR_RECEIVEBIll": // 进仓通知单提交 |
| | | path = imPurinbillBatchSubmit; |
| | | JSONArray idArray = new JSONArray(); |
| | | idArray.add(order.getNumber()); |
| | | JSONObject dataObj = new JSONObject(); |
| | | dataObj.fluentPut("id", idArray); |
| | | return new JSONObject().fluentPut("data", dataObj); |
| | | |
| | | default: |
| | | throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId); |
| | | } |
| | | } |
| | | |
| | | |
| | | private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) { |
| | | String response = ""; |
| | | boolean success = false; |
| | | |
| | | try { |
| | | //获取Cookie值 |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("Cookie", start.getContent()); |
| | | // 设置请求头 |
| | | HashMap<String, Object> headers = buildRequestHeaders(erpSecret); |
| | | |
| | | // 发送请求,将 JSONObject 转换为 String |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(outaddressSubmit) |
| | | .setJson(add) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | JSONObject data = JSON.parseObject(response); |
| | | Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess"); |
| | | String bool=IsSuccess.toString(); |
| | | //审核完成原订单8转6 |
| | | if(bool.equals("true")){ |
| | | |
| | | // 解析响应 |
| | | JSONObject jsonResponse = JSON.parseObject(response); |
| | | |
| | | // 判断是否因为 token 过期 (errorCode = 401) |
| | | if ("401".equals(jsonResponse.getString("errorCode"))) { |
| | | log.error("认证失败,尝试重新获取 Token"); |
| | | loginAuthenticationHandler.start(); // 刷新 token |
| | | // 重新获取新的 token |
| | | erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token |
| | | // 使用新的 token 重试请求 |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | response = new HttpHandler.Builder() |
| | | .setHeaders(headers) |
| | | .setUri(URL) |
| | | .setPath(path) |
| | | .setJson(add.toJSONString()) // 将 JSONObject 转换为 String |
| | | .build() |
| | | .doPost(); |
| | | } |
| | | |
| | | // 解析返回的响应 |
| | | JSONObject data = jsonResponse.getJSONObject("data"); |
| | | String errorCode = jsonResponse.getString("errorCode"); |
| | | boolean status = jsonResponse.getBooleanValue("status"); |
| | | |
| | | // 检查接口调用的整体状态 |
| | | if ("0".equals(errorCode) && status) { |
| | | // 获取成功与失败的数量 |
| | | int successCount = data.getInteger("successCount"); |
| | | int failCount = data.getInteger("failCount"); |
| | | |
| | | if (failCount == 0) { |
| | | success = true; |
| | | order.setSettle(6L); |
| | | // orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo())); |
| | | OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null); |
| | | log.info("接口调用成功,成功的操作数量: {}", successCount); |
| | | } else { |
| | | log.error("接口调用失败,失败的操作数量: {}", failCount); |
| | | // 如果有失败的单据,遍历 result 数组查看失败的详细信息 |
| | | JSONArray resultArray = data.getJSONArray("result"); |
| | | for (int i = 0; i < resultArray.size(); i++) { |
| | | JSONObject resultItem = resultArray.getJSONObject(i); |
| | | if (!resultItem.getBoolean("billStatus")) { |
| | | // 单据处理失败,记录错误信息 |
| | | String billNo = resultItem.getString("number"); // 获取返回的单据号 |
| | | JSONArray errors = resultItem.getJSONArray("errors"); // 获取错误信息 |
| | | |
| | | // 打印单据号和错误信息 |
| | | log.error("单据号: {}, 错误信息: {}", billNo, errors); |
| | | } |
| | | } |
| | | } |
| | | |
| | | order.setSettle(9L); // 更新状态为已提交完成 10->9 |
| | | orderService.updateById(order); |
| | | } else { |
| | | log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message")); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("fail", e); |
| | | // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | log.error("请求失败", e); |
| | | return FAIL.setMsg(e.getMessage()); |
| | | } finally { |
| | | try { |
| | | // 保存接口日志 |
| | | saveApiLog(add, response, success); |
| | | } |
| | | |
| | | return success ? SUCCESS : FAIL; |
| | | } |
| | | |
| | | private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) { |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | | headers.put("accesstoken", erpSecret.getAccessToken()); |
| | | headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 |
| | | return headers; |
| | | } |
| | | |
| | | private void saveApiLog(JSONObject add, String response, boolean success) { |
| | | try { |
| | | apiLogService.save( |
| | | "提交", |
| | | URL+ outaddressSubmit, |
| | | "单据上报提交", |
| | | URL + path, |
| | | null, |
| | | "127.0.0.1", |
| | | add, |
| | | add.toJSONString(), |
| | | response, |
| | | success |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error("", 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; |
| | | } |
| | | } |
| | |
| | | return casual.getDeclaredMethod(OrderMethodVo.REMOVE.getCode(), Long.class); |
| | | case SELECT_COMPLETE: |
| | | return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE.getCode()); |
| | | case SELECT_COMPLETE9: |
| | | return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE9.getCode()); |
| | | case SELECT_COMPLETE10: |
| | | return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE10.getCode()); |
| | | case SELECT_COMPLETE8: |
| | | return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE8.getCode()); |
| | | case ADD_TO_LOG_TABLE_ORDER: |
| | |
| | | throw new CoolException(e.getCause().getMessage()); |
| | | } |
| | | } |
| | | public static List<Order> selectComplete9(boolean sign){ |
| | | try{ |
| | | Object invoke = implement(OrderMethodVo.SELECT_COMPLETE9).invoke(getOrderInAndOutType(sign)); |
| | | if (Cools.isEmpty(invoke)){ |
| | | return new ArrayList<>(); |
| | | } else if (invoke instanceof List) { |
| | | return (List<Order>) invoke; |
| | | } else { |
| | | throw new CoolException("Unexpected return type"); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new CoolException(e.getCause().getMessage()); |
| | | } |
| | | } |
| | | |
| | | public static List<Order> selectComplete9(String sign){ |
| | | try{ |
| | | Object invoke = implement(OrderMethodVo.SELECT_COMPLETE9).invoke(getOrderInAndOutType(sign)); |
| | | if (Cools.isEmpty(invoke)){ |
| | | return new ArrayList<>(); |
| | | } else if (invoke instanceof List) { |
| | | return (List<Order>) invoke; |
| | | } else { |
| | | throw new CoolException("Unexpected return type"); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new CoolException(e.getCause().getMessage()); |
| | | } |
| | | } |
| | | public static List<Order> selectComplete10(boolean sign){ |
| | | try{ |
| | | Object invoke = implement(OrderMethodVo.SELECT_COMPLETE10).invoke(getOrderInAndOutType(sign)); |
| | | if (Cools.isEmpty(invoke)){ |
| | | return new ArrayList<>(); |
| | | } else if (invoke instanceof List) { |
| | | return (List<Order>) invoke; |
| | | } else { |
| | | throw new CoolException("Unexpected return type"); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new CoolException(e.getCause().getMessage()); |
| | | } |
| | | } |
| | | |
| | | public static List<Order> selectComplete10(String sign){ |
| | | try{ |
| | | Object invoke = implement(OrderMethodVo.SELECT_COMPLETE10).invoke(getOrderInAndOutType(sign)); |
| | | if (Cools.isEmpty(invoke)){ |
| | | return new ArrayList<>(); |
| | | } else if (invoke instanceof List) { |
| | | return (List<Order>) invoke; |
| | | } else { |
| | | throw new CoolException("Unexpected return type"); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new CoolException(e.getCause().getMessage()); |
| | | } |
| | | } |
| | | |
| | | public static List<Order> selectComplete8(boolean sign){ |
| | | try{ |
| | |
| | | this.boxType3 = boxType3; |
| | | } |
| | | |
| | | |
| | | public DetlDto(String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double anfme) { |
| | | this.matnr = matnr; |
| | | this.batch = batch; |
| | |
| | | } |
| | | |
| | | @Transactional |
| | | public List<Order> selectComplete9() { |
| | | List<OrderPakin> orderPakinList = orderPakinService.selectComplete9(); |
| | | return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList); |
| | | } |
| | | @Transactional |
| | | public List<Order> selectComplete10() { |
| | | List<OrderPakin> orderPakinList = orderPakinService.selectComplete10(); |
| | | return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList); |
| | | } |
| | | |
| | | @Transactional |
| | | public List<Order> selectComplete8() { |
| | | List<OrderPakin> orderPakinList = orderPakinService.selectComplete8(); |
| | | return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList); |
| | |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete8(); |
| | | return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList); |
| | | } |
| | | @Transactional |
| | | public List<Order> selectComplete9() { |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete9(); |
| | | return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList); |
| | | } |
| | | @Transactional |
| | | public List<Order> selectComplete10() { |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete10(); |
| | | return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList); |
| | | } |
| | | |
| | | @Transactional |
| | | public boolean addToLogTableOrder(Order order) { |
| | |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete8(); |
| | | return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList); |
| | | } |
| | | @Transactional |
| | | public List<Order> selectComplete9() { |
| | | List<OrderPakin> orderPakinList = orderPakinService.selectComplete9(); |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete9(); |
| | | return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList); |
| | | } |
| | | @Transactional |
| | | public List<Order> selectComplete10() { |
| | | List<OrderPakin> orderPakinList = orderPakinService.selectComplete10(); |
| | | List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete10(); |
| | | return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList); |
| | | } |
| | | |
| | | @Transactional |
| | | public boolean addToLogTableOrder(Order order) { |
| | |
| | | public abstract List<Order> selectComplete(); |
| | | |
| | | public abstract List<Order> selectComplete8(); |
| | | public abstract List<Order> selectComplete9(); |
| | | public abstract List<Order> selectComplete10(); |
| | | |
| | | public abstract boolean addToLogTableOrder(Order order); |
| | | |
| | |
| | | UPDATE_ORDERDETL("updateOrderDetl"), |
| | | REMOVE("remove"), |
| | | SELECT_COMPLETE("selectComplete"), |
| | | |
| | | SELECT_COMPLETE10("selectComplete10"), |
| | | SELECT_COMPLETE9("selectComplete9"), |
| | | SELECT_COMPLETE8("selectComplete8"), |
| | | ADD_TO_LOG_TABLE_ORDER("addToLogTableOrder"), |
| | | SELECT_ORDER_NO_L("selectOrderNoL"), |
| | |
| | | package com.zy.erp.kingdee.enums; |
| | | |
| | | public enum KingDeeUtilType { |
| | | BD_MATERIAL(0, "物料档案","BD_MATERIAL","","","",1), |
| | | BD_RRGANIZATION(2, "供应商","BD_RRGANIZATION","","","",1), |
| | | // PUR_RECEIVEBIll(3, "收料单","PUR_RECEIVEBIll","","","",1), |
| | | |
| | | // STK_InStock(1, "采购入库单","STK_InStock","FRealQty","","",1), |
| | | // BD_MATERIAL(0, "物料档案","BD_MATERIAL","","","",1), |
| | | // BD_RRGANIZATION(2, "供应商","BD_RRGANIZATION","","","",1), |
| | | PUR_RECEIVEBIll(3, "收料单","PUR_RECEIVEBIll","","","",1), |
| | | // INR(1, "进仓通知库单上报","INR","FRealQty","","",1), |
| | | // PUR_MRB(2, "采购退料单","PUR_MRB","FRMREALQTY","","",1), |
| | | // PRD_PickMtrl(3, "生产领料单","PRD_PickMtrl","FActualQty","","",1), |
| | | // PRD_ReturnMtrl(4, "生产退料单","PRD_ReturnMtrl","FQty","","",1), |
| | |
| | | order by update_time |
| | | </select> |
| | | |
| | | <select id="selectOrderDetlsByOrderNo" resultMap="BaseResultMap"> |
| | | SELECT * |
| | | FROM man_order_detl_pakin |
| | | where 1=1 |
| | | and order_no = #{orderNo} |
| | | order by update_time |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | from man_order |
| | | where 1=1 |
| | | and settle = 4 |
| | | -- and settle = 97 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete10" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order |
| | | where 1=1 |
| | | and settle = 10 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete9" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order |
| | | where 1=1 |
| | | and settle = 9 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete9" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order_pakin |
| | | where 1=1 |
| | | and settle = 9 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete10" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order_pakin |
| | | where 1=1 |
| | | and settle = 10 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | |
| | | <select id="selectComplete8" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete9" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order_pakout |
| | | where 1=1 |
| | | and settle = 9 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | <select id="selectComplete10" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | | from man_order_pakout |
| | | where 1=1 |
| | | and settle = 10 |
| | | and status = 1 |
| | | order by create_time asc |
| | | </select> |
| | | |
| | | <select id="selectComplete8" resultMap="BaseResultMap"> |
| | | select top 5 * |
| | |
| | | cols: [[ |
| | | {type: 'numbers'}, |
| | | {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'}, |
| | | {field: 'itemName', align: 'center', title: '客户po', minWidth: 160, width: 160}, |
| | | {field: 'itemName', align: 'center', title: 'ERPID', minWidth: 160, width: 160}, |
| | | {field: 'docType$', align: 'center', title: '类型', minWidth: 160, width: 160}, |
| | | {field: 'cstmrName', align: 'center', title: '货主', minWidth: 160, width: 160}, |
| | | {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160}, |