src/main/java/com/zy/asrs/controller/MobileController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/param/OrderPakinParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/OpenService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/task/OrderSendScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/task/handler/OrderSendHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.text.ParseException; import java.util.*; /** @@ -58,6 +59,8 @@ private PlaService plaService; @Autowired private NodeService nodeService; @Autowired private OpenService openService; // 商品上架 @@ -424,7 +427,8 @@ @RequestMapping("/plaDetl/packin/v1") //@ManagerAuth(memo="pla入库") public R plaPackIn(@RequestBody JSONObject json){ @Transactional public R plaPackIn(@RequestBody JSONObject json) throws ParseException { String locNo = json.get("locNo").toString(); JSONArray jsonArray = JSONArray.parseArray(json.getJSONArray("pla").toJSONString()); for (Object o : jsonArray){ @@ -442,6 +446,8 @@ mobileService.plaPakin(brand,locNo,batch,packageNo,user); } } //入库成功后上报ERP openService.pakinReportErp(json); return R.ok("入库成功"); } src/main/java/com/zy/asrs/entity/param/MatSyncParam.java
@@ -23,6 +23,16 @@ /** * 商品编号 */ private String cInvCode; /** * 商品名称 */ private String cInvName; /** * 商品编号 */ private String matnr; /** @@ -194,6 +204,24 @@ * 备注 */ private String memo; public void setcInvCode(String cInvCode) { this.cInvCode = cInvCode; this.matnr = cInvCode; } public void setcInvName(String cInvName) { this.cInvName = cInvName; this.maktx = cInvName; } public void setMatnr(String matnr) { } public void setMaktx(String maktx) { } } } src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java
@@ -2,6 +2,8 @@ import lombok.Data; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -26,12 +28,51 @@ //公司 private String cAccount; //调拨 private String allocation; //备注 private String cMemo; private List<Body> ADDBody; private List<Body> aDDBody; //private List<DetlDto> orderDetails; public void setcCode(String cCode) { this.cCode = cCode; } public void setdDate(String dDate) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD hh:mm:ss"); this.dDate = sdf.parse(dDate); } public void setdDate$(Date dDate) { this.dDate = dDate; } public void setcMaker(String cMaker) { this.cMaker = cMaker; } public void setcAccount(String cAccount) { this.cAccount = cAccount; } public void setType(String type) { this.type = type; } public void setcMemo(String cMemo) { this.cMemo = cMemo; } public void setaDDBody(List<Body> aDDBody) { this.aDDBody = aDDBody; } public void setAllocation(String allocation) { this.allocation = allocation; } @Data public static class Body{ @@ -43,6 +84,22 @@ private String cBatch; //行备注 private String cbMemo; public void setcInvCode(String cInvCode) { this.cInvCode = cInvCode; } public void setiQuantity(Double iQuantity) { this.iQuantity = iQuantity; } public void setcBatch(String cBatch) { this.cBatch = cBatch; } public void setCbMemo(String cbMemo) { this.cbMemo = cbMemo; } } } src/main/java/com/zy/asrs/entity/param/OrderPakinParam.java
New file @@ -0,0 +1,26 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class OrderPakinParam { //生产订单号 private String orderNo; //入库时间 private String pakinTime; //存货编码 private String cInvCode; //牌号 private String brand; //批号 private String batch; //包号 private Integer packageNo; //入库重量 private Double iQuantity; //主体 private String account; //备注 private String memo; } src/main/java/com/zy/asrs/service/OpenService.java
@@ -5,6 +5,7 @@ import com.zy.asrs.entity.param.*; import com.zy.asrs.entity.result.StockVo; import java.text.ParseException; import java.util.List; public interface OpenService { @@ -47,4 +48,6 @@ R getInOutDetl(); DigitalTwin inventoryQuantity(); int pakinReportErp(JSONObject jsonObject) throws ParseException; } src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,5 +1,8 @@ package com.zy.asrs.service.impl; 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; @@ -14,15 +17,19 @@ import com.zy.asrs.mapper.TagMapper; import com.zy.asrs.service.*; import com.zy.asrs.utils.MatUtils; import com.zy.asrs.utils.Utils; import com.zy.common.model.DetlDto; import com.zy.common.utils.HttpHandler; import com.zy.common.utils.NodeUtils; import com.zy.system.entity.User; import com.zy.system.service.UserService; 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.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -31,8 +38,15 @@ * Created by vincent on 2022/4/9 */ @Slf4j @Service @Service("OpenService") public class OpenServiceImpl implements OpenService { @Value("${u8.url}") private String url; @Value("${u8.path}") private String orderReportPath; @Autowired private OrderService orderService; @@ -66,6 +80,10 @@ private ReportQueryMapper reportQueryMapper; @Autowired private UserService userService; @Autowired private PlaService plaService; @Autowired private ApiLogService apiLogService; @Override @Transactional @@ -207,7 +225,7 @@ param.getCCode(), // 订单编号 DateUtils.convert(now), // 单据日期 docType.getDocId(), // 单据类型 null, // 项目编号 1L, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 @@ -486,14 +504,15 @@ } if (!matService.insert(mat)) { throw new CoolException("服务器内部错误,请联系管理员"); } else { log.info("同步新物料[商品编号:{}]", mat.getMatnr()); } log.info("同步新物料[商品编号:{}]", mat.getMatnr()); } else { mat.sync(param); //mat.sync(param); mat.setMaktx(matParam.getMaktx()); if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) { throw new CoolException("更新已存在商品信息失败,请联系管理员"); } log.info("同步更新物料[商品编号:{}]", mat.getMatnr()); } } @@ -538,4 +557,125 @@ return digitalTwin; } @Override public int pakinReportErp(JSONObject json) throws ParseException { JSONArray jsonArray = JSONArray.parseArray(json.getJSONArray("pla").toJSONString()); List<OpenOrderPakoutParam> list = new ArrayList<>(); for (Object o : jsonArray){ JSONObject jsonObject = (JSONObject)o; String brand = jsonObject.get("brand").toString(); String batch = jsonObject.get("batch").toString(); Integer packageNo = Integer.parseInt(jsonObject.get("packageNo").toString()); Pla pla = plaService.selectByBatchAndPackageNo(batch, packageNo, brand); Mat mat = matService.selectByMaktx(pla.getBrand()); //当生产单号不一致时,需要新建一个param if(list.size() == 0 || checkOrder(list,pla.getProOrderNo()) == null){ OpenOrderPakoutParam param = new OpenOrderPakoutParam(); String type = Cools.isEmpty(pla.getProOrderNo()) ? "调拨入库单" : "生产入库单"; param.setcCode(pla.getProOrderNo()); param.setcAccount(pla.getOwner()); param.setdDate(Utils.getDateStr(new Date())); param.setType(type); List<OpenOrderPakoutParam.Body> bodyList = new ArrayList<>(); OpenOrderPakoutParam.Body body = new OpenOrderPakoutParam.Body(); body.setcInvCode(mat.getMatnr()); body.setiQuantity(pla.getWeightAnfme()); body.setCbMemo(pla.getMemo()); bodyList.add(body); param.setaDDBody(bodyList); list.add(param); }else { OpenOrderPakoutParam param = checkOrder(list, pla.getProOrderNo()); List<OpenOrderPakoutParam.Body> bodyList = param.getADDBody(); OpenOrderPakoutParam.Body body = checkOrderDetl(bodyList, mat.getMatnr()); //有新的牌号则添加新的orderDetl,否则累加 if(body == null){ body = new OpenOrderPakoutParam.Body(); body.setcInvCode(mat.getMatnr()); body.setiQuantity(pla.getWeightAnfme()); body.setCbMemo(pla.getMemo()); bodyList.add(body); }else { body.setiQuantity(body.getIQuantity() + pla.getWeightAnfme()); } } } return doHttpRequest(list, "入库单上报", url, orderReportPath, null, "127.0.0.1"); } private OpenOrderPakoutParam checkOrder(List<OpenOrderPakoutParam> list, String orderNo){ for (OpenOrderPakoutParam param : list){ //判断是否包含重复的订单号 if(Cools.eq(param.getCCode(),orderNo)){ return param; } } return null; } private OpenOrderPakoutParam.Body checkOrderDetl(List<OpenOrderPakoutParam.Body> bodyList, String matnr){ for (OpenOrderPakoutParam.Body param : bodyList){ //判断是否包含重复的订单号 if(Cools.eq(param.getCInvCode(),matnr)){ return param; } } return null; } 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) .setPath(path) .setJson(JSONObject.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(Cools.isEmpty(jsonObject.get("errCode"))){ throw new CoolException(jsonObject.get("Message").toString()); } int code = (int) jsonObject.get("errCode"); if(code != 0){ throw new CoolException(jsonObject.get("errMsg").toString()); } success = true; return code; }catch (Exception e){ log.error(e.getMessage()); throw new CoolException("调用接口响应错误"); }finally { apiLogService.save( namespace, url + path, appkey, ip, JSON.toJSONString(JSONObject.toJSONString(requestParam)), response, success ); } } } src/main/java/com/zy/asrs/task/OrderSendScheduler.java
@@ -5,7 +5,6 @@ import com.zy.asrs.service.OrderService; import com.zy.asrs.task.handler.OrderSendHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; @@ -21,11 +20,11 @@ @Scheduled(cron = "0/3 * * * * ? ") //@Scheduled(cron = "0/10 * * * * ? ") private void looping(){ List<Order> orders = orderService.selectList(new EntityWrapper<Order>() .eq("settle", "4") .le("item_id", 3)); .eq("item_id",1L)); for (Order order : orders) { orderSendHandler.start(order); } src/main/java/com/zy/asrs/task/handler/OrderSendHandler.java
@@ -2,87 +2,119 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.asrs.entity.DocType; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.param.OpenOrderPakoutParam; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.DocTypeService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.ErpAccessTokenScheduler; 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.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.ArrayList; import java.util.List; @Slf4j @Service @Transactional public class OrderSendHandler extends AbstractHandler<String> { private static final String erpIp = "10.100.221.19:81"; private static final String inPath = "/ierp/kapi/app/im/PurinbillApiPlugin"; private static final String outPath = "/ierp/kapi/app/im/SaloutbillApiPlugin"; @Value("${u8.url}") private String url; @Value("${u8.path}") private String orderReportPath; @Autowired private OrderService orderService; @Autowired private DocTypeService docTypeService; @Autowired private ApiLogService apiLogService; @Autowired private OrderDetlService orderDetlService; public void start(Order order) { String accessToken = ErpAccessTokenScheduler.accessToken; if (accessToken.equals("")) { return; List<OpenOrderPakoutParam> paramList = new ArrayList<>(); OpenOrderPakoutParam param = new OpenOrderPakoutParam(); paramList.add(param); List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId()); param.setcCode(order.getOrderNo()); param.setcMaker(order.getOperMemb()); param.setcAccount(order.getCstmrName()); param.setcMemo(order.getMemo()); param.setType(order.getDocType$()); param.setdDate$(order.getCreateTime()); param.setAllocation(order.getItemName()); List<OpenOrderPakoutParam.Body> bodyList = new ArrayList<>(); param.setaDDBody(bodyList); for(OrderDetl orderDetl : orderDetlList){ OpenOrderPakoutParam.Body body = new OpenOrderPakoutParam.Body(); body.setiQuantity(orderDetl.getQty()); body.setcInvCode(orderDetl.getMatnr()); body.setCbMemo(orderDetl.getMemo()); bodyList.add(body); } HashMap<String, Object> header = new HashMap<>(); header.put("accessToken",accessToken); JSONObject jsonObject = new JSONObject(); jsonObject.put("orderNo",order.getOrderNo()); HttpHandler.Builder prepBuilder = new HttpHandler.Builder() .setUri(erpIp) .setHeaders(header) .setJson(jsonObject.toJSONString()); JSONObject respJson; doHttpRequest(paramList, "上报ERP出库单据", url, orderReportPath, null, "127.0.0.1"); orderService.updateSettle(order.getId(),6L,0L); //入库单据 if (docTypeService.selectOne(new EntityWrapper<DocType>() .eq("doc_id",order.getDocType())).getPakin() == 1) { try { respJson = JSON.parseObject( prepBuilder.setPath(inPath) .build() .doPost()); } catch (IOException e) { throw new RuntimeException(e); } 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) .setPath(path) .setJson(JSONObject.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(Cools.isEmpty(jsonObject.get("errCode"))){ throw new CoolException(jsonObject.get("Message").toString()); } }else { //出库单据 try { respJson = JSON.parseObject( prepBuilder.setPath(outPath) .build() .doPost()); } catch (IOException e) { throw new RuntimeException(e); } } if ((boolean)respJson.get("success")) { orderService.updateSettle(order.getId(),6L,1L); log.info("单据:" + order.getOrderNo() + "回传成功,已更新单据状态"); }else { order.setItemId(order.getItemId() + 1); orderService.updateById(order); log.info("单据:"+ order.getOrderNo()+" 回传失败,这是第" + order.getItemId() + "次回传"); log.info(respJson.toJSONString()); int code = (int) jsonObject.get("errCode"); if(code != 0){ throw new CoolException(jsonObject.get("errMsg").toString()); } success = true; return code; }catch (Exception e){ log.error(e.getMessage()); throw new CoolException("调用接口响应错误"); }finally { apiLogService.save( namespace, url + path, appkey, ip, JSON.toJSONString(JSONObject.toJSONString(requestParam)), response, success ); } } } src/main/resources/application.yml
@@ -57,4 +57,8 @@ #erp erp: enable: false enable: false u8: url: localhost:8080 path: /test/report