| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.SnowflakeIdWorker; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.DiaphragmInfo; |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.entity.OrderDetl; |
| | | 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.core.ReturnT; |
| | | import com.zy.asrs.utils.MesSyncUtil; |
| | | 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.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class MesPakoutHandler extends AbstractHandler<String> { |
| | | @Value("${mes.pakin.url}") |
| | | private String url; |
| | | @Value("${mes.pakout.url}") |
| | | private String uri; |
| | | |
| | | @Value("${mes.pakin.path}") |
| | | @Value("${mes.pakout.path}") |
| | | private String path; |
| | | |
| | | @Autowired |
| | | private DocTypeService docTypeService; |
| | | |
| | | @Autowired |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | |
| | | @Autowired |
| | | private OrderService orderService; |
| | | |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | |
| | | @Autowired |
| | | private OrderDetlService orderDetlService; |
| | | |
| | | public ReturnT<String> start() throws IOException { |
| | | @Transactional |
| | | public ReturnT<String> start() { |
| | | boolean success = true; |
| | | log.info("url:" + uri + path); |
| | | JSONObject jsonObject = null; |
| | | try { |
| | | jsonObject = doPostJsonData(); |
| | | } catch (IOException e) { |
| | | success = false; |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | int code = jsonObject.getInteger("code"); |
| | | |
| | | if(code == 200){ |
| | | if(!Cools.isEmpty(jsonObject.getString("data")) && jsonObject.getString("data").length()>2){ |
| | | |
| | | JSONArray jsonArray = jsonObject.getJSONArray("data"); |
| | | List<JSONObject> jsonDataList = jsonArray.toJavaList(JSONObject.class); |
| | | |
| | | jsonDataList.forEach(data -> { |
| | | String orderNo = data.getString("orderNo"); |
| | | Order o = insertOrder(data,orderNo); |
| | | insertOrUpdateOrderDetl(data, o); |
| | | }); |
| | | } |
| | | |
| | | }else { |
| | | success = false; |
| | | log.error("请求mes接口响应错误,响应码为: " + code); |
| | | } |
| | | saveApiLog(jsonObject.toJSONString(),success); |
| | | return SUCCESS; |
| | | } |
| | | |
| | | /* |
| | | 保存日志 |
| | | */ |
| | | private void saveApiLog(String response, boolean success){ |
| | | apiLogService.save( |
| | | "生成出库单据", |
| | | uri + path, |
| | | null, |
| | | "127.0.0.1", |
| | | null, |
| | | response, |
| | | success |
| | | ); |
| | | } |
| | | |
| | | /* |
| | | 发起一个请求来获取未获取过的单据信息 |
| | | */ |
| | | private JSONObject doPostJsonData() throws IOException { |
| | | |
| | | Map<String, Object> requestParamMap = MesSyncUtil.getRequestParamMap(); |
| | | //获取未获取过的所有单据 |
| | | requestParamMap.put("type",0); |
| | | |
| | | return JSON.parseObject( new HttpHandler.Builder() |
| | | .setUri(uri) |
| | | .setPath(path) |
| | | .setParams(requestParamMap) |
| | | .build() |
| | | .doPostWithParam()); |
| | | } |
| | | |
| | | /* |
| | | 新增order信息 |
| | | */ |
| | | private Order insertOrder(JSONObject jsonData, String orderNo){ |
| | | Order o = orderService.selectByNo(orderNo); |
| | | if (!Cools.isEmpty(o)) { |
| | | throw new CoolException(jsonData.getString("orderNo") + "单据已存在,请勿重复提交"); |
| | | } |
| | | |
| | | o = orderMapping(jsonData); |
| | | if (!orderService.insert(o)) { |
| | | throw new CoolException("生成单据主档失败,请联系管理员"); |
| | | } |
| | | return o; |
| | | } |
| | | |
| | | /* |
| | | 根据orderNo、matnr、batch,新增或者更改orderDetl信息 |
| | | */ |
| | | private void insertOrUpdateOrderDetl(JSONObject jsonData, Order o){ |
| | | List<DiaphragmInfo> diaphragmInfoList = JSONObject.parseArray(jsonData.getString("orderDetails"),DiaphragmInfo.class); |
| | | |
| | | diaphragmInfoList.forEach(d -> { |
| | | EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>(); |
| | | wrapper.eq("order_no",o.getOrderNo()).eq("matnr",d.getItemCode()).eq("batch",d.getBatchNo()); |
| | | OrderDetl od = orderDetlService.selectOne(wrapper); |
| | | if(od == null){ |
| | | od = new OrderDetl(); |
| | | od.setOrderNo(o.getOrderNo()); |
| | | od.setOrderId(o.getId()); |
| | | orderDetlMapping(d,od); |
| | | orderDetlService.insert(od); |
| | | }else { |
| | | od.setQty(od.getQty() + d.getQuantity().doubleValue()); |
| | | od.setAnfme(od.getAnfme() + d.getAssQuantity().doubleValue()); |
| | | od.setUpdateTime(new Date()); |
| | | orderDetlService.updateById(od); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /* |
| | | 映射Order类和jsonData的字段 |
| | | */ |
| | | private Order orderMapping(JSONObject jsonData){ |
| | | Order o = new Order(); |
| | | o.setStatus(1); |
| | | //设置订单状态 --- 初始化状态 |
| | | o.setSettle(0L); |
| | | //uuid |
| | | o.setUuid(String.valueOf(snowflakeIdWorker.nextId())); |
| | | //单据编号 |
| | | o.setOrderNo(jsonData.getString("orderNo")); |
| | | //单据时间 |
| | | o.setOrderTime(jsonData.getString("orderTime")); |
| | | //单据类型 |
| | | DocType docType = docTypeService.selectOrAdd(jsonData.getString("orderType"), Boolean.TRUE); |
| | | //物流名称 -- 入库库房名称(立体库名称) |
| | | o.setShipName(jsonData.getString("storage")); |
| | | o.setDocType(docType.getDocId()); |
| | | o.setCreateTime(new Date()); |
| | | o.setUpdateTime(new Date()); |
| | | return o; |
| | | } |
| | | |
| | | /* |
| | | 映射OrderDetl与隔膜信息类的字段关系 |
| | | */ |
| | | private void orderDetlMapping(DiaphragmInfo d, OrderDetl od){ |
| | | //批号 -- 生产批号 |
| | | od.setBatch(d.getBatchNo()); |
| | | //商品编码 -- 物料编码 |
| | | od.setMatnr(d.getItemCode()); |
| | | //商品名称 -- 物料名称 |
| | | od.setMaktx(d.getItemName()); |
| | | //数量 -- 数量 |
| | | od.setAnfme(d.getQuantity() == null ? null : d.getQuantity().doubleValue()); |
| | | //完成数量 -- 辅数量 |
| | | od.setQty(d.getAssQuantity() == null ? null : d.getAssQuantity().doubleValue()); |
| | | //规格 -- 规格/型号 |
| | | od.setSpecs(d.getStd()); |
| | | //备注 -- 备注 |
| | | od.setMemo(d.getNote()); |
| | | //条形码 -- 条形码 |
| | | od.setQrCode(d.getBarCode()); |
| | | //颜色 -- 大卷位置 |
| | | od.setColor(d.getPosition()); |
| | | //型号 -- 小卷位置 |
| | | od.setModel(d.getPosition2()); |
| | | //品牌 -- 等级 |
| | | od.setBrand(d.getGrade()); |
| | | //收卷开始日期 |
| | | od.setStartDate(d.getStartDate()); |
| | | //收卷结束日期 |
| | | od.setEndDate(d.getEndDate()); |
| | | |
| | | od.setCreateTime(new Date()); |
| | | od.setUpdateTime(new Date()); |
| | | } |
| | | } |