| package com.zy.asrs.task.handler; | 
|   | 
| import cn.hutool.core.util.NumberUtil; | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
| import com.core.common.Cools; | 
| import com.core.common.DateUtils; | 
| import com.core.exception.CoolException; | 
| import com.zy.asrs.entity.*; | 
| import com.zy.asrs.entity.param.ReportErpParam; | 
| import com.zy.asrs.service.*; | 
| import com.zy.asrs.task.AbstractHandler; | 
| import com.zy.asrs.task.core.ReturnT; | 
| import com.zy.common.utils.HttpHandler; | 
| 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.util.ArrayList; | 
| import java.util.Arrays; | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.concurrent.TimeUnit; | 
|   | 
| /** | 
|  * Created by vincent on 2020/7/7 | 
|  */ | 
| @Slf4j | 
| @Service | 
| public class OrderSyncHandler extends AbstractHandler<String> { | 
|   | 
|     @Autowired | 
|     private OrderService orderService; | 
|     @Autowired | 
|     private OrderDetlService orderDetlService; | 
|     @Autowired | 
|     private ApiLogService apiLogService; | 
|     @Autowired | 
|     private DocTypeService docTypeService; | 
|   | 
|     @Autowired | 
|     private AgvWrkDetlLogService agvWrkDetlLogService; | 
|   | 
|     @Autowired | 
|     private AgvWrkMastLogService agvWrkMastLogService; | 
|   | 
|     @Autowired | 
|     private AgvLocMastService agvLocMastService; | 
|   | 
|     @Value("${spring.profiles.active}") | 
|     private String active; | 
|   | 
|     @Value("${u8.report}") | 
|     private Boolean report; | 
|   | 
|     @Value("${u8.url}") | 
|     private String url; | 
|   | 
|     @Value("${u8.orderReportPath}") | 
|     private String orderReportPath; | 
|   | 
|   | 
|     @Transactional | 
|     public ReturnT<String> start(Order order) { | 
|         List<String> docNames = new ArrayList<>(Arrays.asList("银座采购入库单")); | 
|   | 
|         DocType docType = docTypeService.selectById(order.getDocType()); | 
|         if (!docNames.contains(docType.getDocName())) { | 
|             order.setSettle(8L); | 
|             orderService.updateById(order); | 
|             return SUCCESS; | 
|         } else { | 
|             boolean flag = true; | 
|             List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId()); | 
|             List<OrderDetl> report = new ArrayList<>(); | 
|             for (OrderDetl orderDetl : orderDetlList) { | 
|                 if (orderDetl.getReportQty() == null || orderDetl.getQty() > orderDetl.getReportQty() || orderDetl.getQty() < orderDetl.getAnfme()) { | 
|                     flag = false; | 
|                 } | 
|             } | 
|             if (flag) { | 
|                 log.info("单据完结,{}", order); | 
|                 order.setSettle(6L); | 
|                 orderService.updateById(order); | 
|             } | 
|             return SUCCESS; | 
|         } | 
|     } | 
|   | 
|     @Transactional | 
|     public synchronized void timelyStart(Order order) { | 
|         if (!report) { | 
|             return; | 
|         } | 
|         if (order == null) { | 
|             return; | 
|         } | 
|         //List<String> docNames = new ArrayList<>(Arrays.asList("银座采购入库单")); | 
|         //List<String> docNames = new ArrayList<>(Arrays.asList("银座采购入库单", "银座委外材料出库单", "银座生产材料出库单")); | 
|   | 
|   | 
|         //if (docNames.contains(docType.getDocName())) { | 
|         List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId()); | 
|         List<OrderDetl> report = new ArrayList<>(); | 
|         for (OrderDetl orderDetl : orderDetlList) { | 
|             if (orderDetl.getQty() > 0 && orderDetl.getQty() > (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty())) { | 
|                 report.add(orderDetl); | 
|             } | 
|         } | 
|         if (Cools.isEmpty(order.getPltType())) { | 
|             List<AgvWrkDetlLog> agvWrkDetlLogs = agvWrkDetlLogService.selectList(new EntityWrapper<AgvWrkDetlLog>().eq("order_no", order.getOrderNo()).orderBy("appe_time", false)); | 
|             if (!Cools.isEmpty(agvWrkDetlLogs)) { | 
|                 AgvWrkDetlLog agvWrkDetlLog = agvWrkDetlLogs.get(0); | 
|                 List<AgvWrkMastLog> agvWrkMastLogs = agvWrkMastLogService.selectList(new EntityWrapper<AgvWrkMastLog>().eq("wrk_no", agvWrkDetlLog.getWrkNo()).eq("io_type", 1).orderBy("appe_time", false)); | 
|                 if (!Cools.isEmpty(agvWrkMastLogs)) { | 
|                     AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMastLogs.get(0).getLocNo()); | 
|                     if (agvLocMast != null) { | 
|                         log.info("补充逻辑生效:{}", order.getOrderNo()); | 
|                         order.setPltType(agvLocMast.getPltType()); | 
|                     } | 
|                 } | 
|             } | 
|             if (Cools.isEmpty(order.getPltType())) { | 
|                 return; | 
|             } | 
|         } | 
|         if (Cools.isEmpty(order.getInTime())) { | 
|             order.setInTime(DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmsssss_F)); | 
|         } | 
|         if (!Cools.isEmpty(report)) { | 
|             ReportErpParam param = new ReportErpParam(); | 
|             mappingParam(order, param); | 
|             mappingParamChildren(report, param); | 
|             log.info(JSON.toJSONString(param)); | 
|             int code = doHttpRequest(param, "单据审核", url, orderReportPath, null, "127.0.0.1"); | 
|             if (code == 0) { | 
|                 Date date = new Date(); | 
|                 order.setInTime(DateUtils.convert(date, DateUtils.yyyyMMddHHmmsssss_F)); | 
|                 orderService.updateById(order); | 
|                 for (OrderDetl orderDetl : report) { | 
|                     log.info("{}单据审核上报了:{}", order.getOrderNo(), orderDetl.getQty() - (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty())); | 
|                     orderDetl.setReportQty(orderDetl.getQty()); | 
|                     orderDetl.setUpdateTime(date); | 
|                     orderDetlService.updateById(orderDetl); | 
|                 } | 
|             } | 
|             // } | 
|   | 
|         } | 
|     } | 
|   | 
|     public void mappingParam(Order order, ReportErpParam param) { | 
|         if (active.equals("prod")) { | 
|             param.set操作系统号(order.getDefNumber()); | 
|         } else if (active.equals("dev") || active.equals("loc")) { | 
|             param.set操作系统号("998"); | 
|         } else { | 
|             param.set操作系统号(order.getDefNumber()); | 
|         } | 
|         param.set操作单据(order.getDocType$()); | 
|         param.set操作类型("add"); | 
|         param.setDdate(DateUtils.convert(new Date(), DateUtils.yyyyMMdd_F)); | 
|         param.setCWhCode(Cools.isEmpty(order.getPltType()) ? "" : order.getPltType() + ""); | 
|         param.setCDepCode("YZ"); | 
|         param.setCOrderCode(order.getOrderNo()); | 
|         param.setCMaker(""); | 
|         param.setCHandler(""); | 
|         param.setCDefine14(order.getOrderNo() + "_" + order.getInTime()); | 
|         //param.setCDefine14(order.getOrderNo() + "_" + order.getInTime() + "_" + order.getPltType())); | 
|     } | 
|   | 
|     public void mappingParamChildren(List<OrderDetl> orderDetlList, ReportErpParam param) { | 
|         List<ReportErpParam.ChildInfo> paramChild = new ArrayList<>(); | 
|         param.setChildren(paramChild); | 
|         for (OrderDetl orderDetl : orderDetlList) { | 
|             ReportErpParam.ChildInfo childInfo = new ReportErpParam.ChildInfo(); | 
|             childInfo.setIrowno(orderDetl.getItemNum()); | 
|             childInfo.setCInvCode(orderDetl.getMatnr()); | 
|             childInfo.setIQuantity(orderDetl.getQty() - (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty()) + ""); | 
|             String batch = orderDetl.getBatch(); | 
|             if (Cools.isEmpty(batch)) { | 
|                 childInfo.setCBatch(""); | 
|                 childInfo.setBFree1(""); | 
|             } else { | 
|                 String[] s = batch.split("__"); | 
|                 if (s.length > 1) { | 
|                     childInfo.setCBatch(s[0]); | 
|                     childInfo.setBFree1(s[1]); | 
|                 } else if (s.length == 1) { | 
|                     childInfo.setCBatch(s[0]); | 
|                     childInfo.setBFree1(""); | 
|                 } else { | 
|                     childInfo.setCBatch(""); | 
|                     childInfo.setBFree1(""); | 
|                 } | 
|             } | 
|             childInfo.setINum(orderDetl.getLength() + ""); | 
|             childInfo.setIinvexchrate(""); | 
|             childInfo.setIPOsID(orderDetl.getSku()); | 
|             childInfo.setCOrderCode(orderDetl.getOrderNo()); | 
|             childInfo.setIvouchrowno(orderDetl.getItemNum()); | 
|             childInfo.setDefine22(orderDetl.getThreeCode()); | 
|             if (!Cools.isEmpty(orderDetl.getWeight()) && !Cools.isEmpty(orderDetl.getVolume())) { | 
|                 BigDecimal mul = NumberUtil.div(childInfo.getIQuantity(), orderDetl.getVolume() + ""); | 
|                 childInfo.setINum(mul.toString()); | 
|             } else { | 
|                 childInfo.setINum("1"); | 
|             } | 
|             childInfo.setIinvexchrate(Cools.isEmpty(orderDetl.getVolume()) ? "" : orderDetl.getVolume() + ""); | 
|             paramChild.add(childInfo); | 
|         } | 
|   | 
|     } | 
|   | 
|   | 
|     private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String | 
|             ip) { | 
|         String response = ""; | 
|         boolean success = false; | 
|   | 
|         try { | 
|             response = new HttpHandler.Builder().setUri(url).setTimeout(30, TimeUnit.SECONDS).setPath(path).setJson(JSONObject.toJSONString(requestParam)).build().doPost(); | 
|             JSONObject jsonObject = JSON.parseObject(response); | 
|   | 
|             if (Cools.isEmpty(jsonObject.get("succeed"))) { | 
|                 throw new CoolException(jsonObject.get("dsc").toString()); | 
|             } | 
|   | 
|             String succeed = jsonObject.get("succeed").toString(); | 
|   | 
|             int code = Cools.eq("0", succeed) ? 0 : 1; | 
|             if (code != 0) { | 
|                 throw new CoolException(jsonObject.get("dsc").toString()); | 
|             } | 
|             success = true; | 
|             return code; | 
|         } catch (Exception e) { | 
|             log.error("报错信息:{},{}", e.getMessage(), JSON.toJSONString(requestParam)); | 
|             throw new CoolException("调用接口响应错误"); | 
|         } finally { | 
|             apiLogService.save(namespace, url + path, appkey, ip, JSON.toJSONString(JSONObject.toJSONString(requestParam)), response, success); | 
|         } | 
|   | 
|     } | 
|   | 
| } |