package com.zy.common.service.erp.task; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.MatCode; import com.zy.asrs.entity.WaitPakin; import com.zy.asrs.service.MatCodeService; import com.zy.asrs.service.OutStockMainService; import com.zy.asrs.service.OutStockService; import com.zy.asrs.service.WaitPakinService; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.utils.VersionUtils; import com.zy.common.service.erp.ErpService; import com.zy.common.service.erp.dto.InStockDto; import com.zy.common.service.erp.entity.*; import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * erp任务控制器 * Created by vincent on 2020/11/27 */ @Slf4j @Component public class ErpScheduler extends AbstractHandler { @Autowired private ErpService erpService; @Autowired private MatCodeService matCodeService; @Autowired private WaitPakinService waitPakinService; @Autowired private OutStockMainService outStockMainService; @Autowired private OutStockService outStockService; private Map itemMap = new HashMap<>(); /** * 原材料入库单 */ @Scheduled(cron = "0/30 * * * * ? ") @Synchronized // @PostConstruct public void inStockExecute(){ // inStock的表头和表身 List readyInStock = erpService.getReadyInStock(); for (InStockDto dto : readyInStock) { //同一单号存在相同物料编码数据,该单号不予处理 Number fnumberCount = erpService.QueryFnumberInCount(dto.getInStockBill().getFInterID()); if(fnumberCount.intValue() > 1){ if (!erpService.haveReadInStock(dto.getInStockBill().getFBillNo(),-1)) { log.error("标记原材料入库通知单已读InStockBill为-1失败[FBillNo={},FInterID={}]", dto.getInStockBill().getFBillNo(),dto.getInStockBill().getFInterID()); } continue; } if (Cools.isEmpty(dto) || Cools.isEmpty(dto.getInStockBillEntries())) { continue; } for (InStockBillEntry entry : dto.getInStockBillEntries()) { MatCode matCode = matCodeService.selectById(entry.getFnumber()); if (null != matCode) { // 生成入库通知单 WaitPakin waitPakin = new WaitPakin(); waitPakin.setMemo("原材料"); waitPakin.setStatus("Y"); // 状态 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAppeTime(new Date()); waitPakin.setModiTime(new Date()); VersionUtils.setWaitPakIn(waitPakin, matCode); waitPakin.setMnemonic(entry.getFOrderBillNo()); // todo:luxiaotao 生产单号 waitPakin.setSupplier(dto.getInStockBill().getFBillNo()); // todo:luxiaotao 通知单号 // String Fnumber = (Cools.isEmpty(entry.getFSourceBillNo())) ? matCode.getMatNo() : matCode.getMatNo() + "|" + entry.getFSourceBillNo(); // waitPakin.setMatnr(Fnumber); //产品代码|生产单号 // waitPakin.setBname(matCode.getMatNo()); Wrapper wrapper = new EntityWrapper() .eq("supplier", waitPakin.getSupplier()) .eq("matnr", waitPakin.getMatnr()); // .isNull("zpallet"); WaitPakin one = waitPakinService.selectOne(wrapper); try { if (one == null) { waitPakin.setAnfme(entry.getFAuxQty()); if (!waitPakinService.insert(waitPakin)) { log.error("提取原材料入库通知单InStockBillEntry失败[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } else { log.info("提取原材料入库通知单InStockBillEntry成功[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } } else { waitPakin.setAnfme(entry.getFAuxQty()); if (!waitPakinService.update(waitPakin, wrapper)) { log.error("更新原材料入库通知单InStockBillEntry失败[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } else { log.info("更新原材料入库通知单InStockBillEntry成功[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } } } catch (Exception e) { log.error("fail", e); e.printStackTrace(); System.out.println(JSON.toJSON(waitPakin)); } } } if (!erpService.haveReadInStock(dto.getInStockBill().getFBillNo(),1)) { log.error("标记原材料入库通知单已读InStockBill失败[FBillNo={}]", dto.getInStockBill().getFBillNo()); } } } /** * 成品入库单 */ @Scheduled(cron = "0/20 * * * * ? ") @Synchronized // @PostConstruct public void inCPICMOExecute(){ List cpicmos = erpService.getReadyCPICMO(); for (CPICMO cpicmo : cpicmos) { //同一单号存在相同物料编码数据,该单号不予处理 Number fnumberCount = erpService.QueryFnumberCPICMOCount(cpicmo.getFInterID()); if(fnumberCount.intValue() > 1){ if (!erpService.haveReadCPICMO(cpicmo.getFInterID(),-1)) { log.error("标记成品入库通知单已读CPICMO为-1失败[Fnumber={},FInterID={}]", cpicmo.getFnumber(),cpicmo.getFInterID()); } continue; } MatCode matCode = matCodeService.selectById(cpicmo.getFnumber()); if (null != matCode) { // 生成入库通知单 WaitPakin waitPakin = new WaitPakin(); waitPakin.setMemo("成品"); waitPakin.setStatus("Y"); // 状态 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAppeTime(new Date()); waitPakin.setModiTime(new Date()); VersionUtils.setWaitPakIn(waitPakin, matCode); waitPakin.setMnemonic(cpicmo.getFSourceBillNo()); // todo:luxiaotao 生产单号 waitPakin.setSupplier(cpicmo.getFBillNo()); // todo:luxiaotao 通知单号 // String Fnumber = (Cools.isEmpty(cpicmo.getFSourceBillNo())) ? matCode.getMatNo() : matCode.getMatNo() + "|" + cpicmo.getFSourceBillNo(); // waitPakin.setMatnr(Fnumber); //产品代码|生产单号 // waitPakin.setBname(matCode.getMatNo()); Wrapper wrapper = new EntityWrapper() .eq("supplier", waitPakin.getSupplier()) .eq("matnr", waitPakin.getMatnr()); // .isNull("zpallet"); WaitPakin one = waitPakinService.selectOne(wrapper); if (one == null) { waitPakin.setAnfme(cpicmo.getFAuxQty()); if (!waitPakinService.insert(waitPakin)) { log.error("提取成品入库通知单CPICMO失败[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } else { log.info("提取成品入库通知单CPICMO成功[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } } else { waitPakin.setAnfme(cpicmo.getFAuxQty()); if (!waitPakinService.update(waitPakin, wrapper)) { log.error("同步更新成品入库通知单CPICMO失败[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } else { log.info("同步更新成品入库通知单CPICMO失败[FBillNo={},Fnumber={}]", waitPakin.getSupplier(), waitPakin.getMatnr()); } } if (!erpService.haveReadCPICMO(cpicmo.getFInterID(),1)) { log.error("标记成品入库通知单已读CPICMO失败[FBillNo={}]", cpicmo.getFBillNo()); } } } } @Scheduled(cron = "0/30 * * * * ? ") @Synchronized public void syncMat(){ List items = erpService.getItem(); for (M_item item : items) { MatCode matCode = matCodeService.selectById(item.getMnumber()); if (matCode == null) { matCode = new MatCode(); VersionUtils.setMatCode(matCode, item); matCode.setAppeTime(new Date()); matCode.setModiTime(new Date()); boolean insert = matCodeService.insert(matCode); if (insert) { log.info("=====>> 新增物料成功 : {}", JSON.toJSONString(item)); } else { log.error("=====>> 新增物料失败!!! : {}", JSON.toJSONString(item)); } } else { VersionUtils.setMatCode(matCode, item); matCode.setModiTime(new Date()); boolean b = matCodeService.updateById(matCode); if (b) { log.info("=====>> 更新物料成功 : {}", JSON.toJSONString(item)); } else { log.error("=====>> 更新物料失败!!! : {}", JSON.toJSONString(item)); } } // 更新完之后删除 erpService.deleteItem(item.getMnumber()); } } /** * 成品出库 发货通知单表头,表明细 */ @Scheduled(cron = "0/15 * * * * ? ") @Synchronized @Transactional public void syncOutStock(){ List outStockBills = erpService.syncOutStock(); for (Integer i = 0; i < outStockBills.size(); i++) { OutStockBill outStockBill = outStockBills.get(i); //同一单号存在相同物料编码数据,该单号不予处理 Number fnumberCount = erpService.QueryFnumberOutCount(outStockBill.getFInterID()); if(fnumberCount.intValue() > 1){ if (!erpService.haveReadOutBill(outStockBill.getFBillNo(),outStockBill.getFInterID(),-1)) { log.error("更新出库通知单读取状态为-1失败[FBrNo={},FInterID={}]", outStockBill.getFBrNo(),outStockBill.getFInterID()); } continue; } OutStockBill main = outStockMainService.selectOne(new EntityWrapper().eq("FBillNo",outStockBill.getFBillNo()).and().eq("FInterID", outStockBill.getFInterID())); if (null == main) { outStockBill.setFflag_rw(1); if (!outStockMainService.insert(outStockBill)) { log.info("同步出库通知主表OutStockBill失败"); exceptionHandle("同步出库通知主表OutStockBill失败[FBillNo={0},FInterID={1}]",outStockBill.getFBillNo(),outStockBill.getFInterID()); }; List outStockBillEntries = erpService.syncOutStockDetail(outStockBill.getFInterID()); for (Integer j = 0; j < outStockBillEntries.size(); j++) { OutStockBillEntry outStockBillEntry = outStockBillEntries.get(j); Wrapper wrapper = new EntityWrapper().eq("FInterID", outStockBillEntry.getFInterID()). eq("FEntryID", outStockBillEntry.getFEntryID()).eq("FBrNo",outStockBillEntry.getFBrNo()); OutStockBillEntry one = outStockService.selectOne(wrapper); if (null == one) { // String Fnumber = (Cools.isEmpty(outStockBillEntry.getFSourceBillNo())) ? outStockBillEntry.getFnumber() : outStockBillEntry.getFnumber()+"|"+outStockBillEntry.getFSourceBillNo(); // outStockBillEntry.setFnumber(Fnumber); //产品代码|生产单号 outStockBillEntry.setFAmount(new BigDecimal(0)); if (!outStockService.insert(outStockBillEntry)) { log.info("提取出库通知明细表OutStockBillEntry失败[FBrNo={},FInterID={},FEntryID={}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); exceptionHandle("提取出库通知明细表OutStockBillEntry失败[FBrNo={0},FInterID={1},FEntryID={2}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); } else { log.info("提取出库通知明细表OutStockBillEntry成功[FBrNo={},FInterID={},FEntryID={}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); } } else { // 数量有变化进行更新 if (Double.doubleToLongBits(one.getFAuxQty().doubleValue()) != Double.doubleToLongBits(outStockBillEntry.getFAuxQty().doubleValue())) { outStockBillEntry.setFAmount(new BigDecimal(0)); if (!outStockService.update(outStockBillEntry, wrapper)) { log.info("同步更新通知明细表OutStockBillEntry失败[FBrNo={},FInterID={},FEntryID={}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); exceptionHandle("同步更新通知明细表OutStockBillEntry失败[FBrNo={0},FInterID={1},FEntryID={2}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); } else { log.info("同步更新通知明细表OutStockBillEntry成功[FBrNo={},FInterID={},FEntryID={}]",outStockBillEntry.getFBrNo(), outStockBillEntry.getFInterID(),outStockBillEntry.getFEntryID()); } } } } } else { } if (!erpService.haveReadOutBill(outStockBill.getFBillNo(),outStockBill.getFInterID(),1)) { log.error("更新出库通知单读取状态失败[FBrNo={},FInterID={}]", outStockBill.getFBrNo(),outStockBill.getFInterID()); } } } // /** // * 成品出库 发货通知单表体 // */ // @Scheduled(cron = "0/15 * * * * ? ") // public void syncOutStockDetail(){ // List result = erpService.syncOutStockDetail(); // for (Integer i = 0; i < result.size(); i++) { // OutStockBillEntry main = outStockService.selectOne(new EntityWrapper().eq("FInterID", result.get(i).getFInterID()).and().eq("FEntryID", result.get(i).getFEntryID())); // if (null == main) { // OutStockBillEntry outStockBillEntry = result.get(i); // outStockBillEntry.setFnumber(outStockBillEntry.getFnumber()+"|"+outStockBillEntry.getFSourceBillNo()); //产品代码|生产单号 // if (!outStockService.insert(outStockBillEntry)) { // log.info("出库通知明细表OutStockBillEntry同步失败"); // }; // } else { // // 数量有变化进行更新 // if (Double.doubleToLongBits(main.getFAuxQty().doubleValue()) != Double.doubleToLongBits(result.get(i).getFAuxQty().doubleValue())) { // if (!outStockService.update(result.get(i), new EntityWrapper().eq("FInterID", result.get(i).getFInterID()).and().eq("FEntryID", result.get(i).getFEntryID()))) { // log.info("出库通知明细表OutStockBillEntry同步失败"); // }; // } // } // } // } /** * 原材料出库 */ // @Scheduled(cron = "0/3 * * * * ? ") public void outStockExecute(){ } }