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 { @Value("${mes.pakout.uri}") private String uri; @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; @Transactional public ReturnT 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 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 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 diaphragmInfoList = JSONObject.parseArray(jsonData.getString("orderDetails"),DiaphragmInfo.class); diaphragmInfoList.forEach(d -> { EntityWrapper 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()); } }