src/main/java/com/zy/ints/entity/DetTb.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/entity/ErpLk.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/entity/Prdt.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/erp/ErpDbProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/erp/ErpSqlServer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/task/scheduler/ErpDetTbScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/ints/task/scheduler/ErpPrdtScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/ints/entity/DetTb.java
New file @@ -0,0 +1,142 @@ package com.zy.ints.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("erp_det_tb") public class DetTb implements Serializable { private static final long serialVersionUID = 1L; /** * 单据号码 */ @ApiModelProperty(value= "单据号码") @TableId(value = "bill_no", type = IdType.INPUT) @TableField("bill_no") private String billNo; /** * 品号 */ @ApiModelProperty(value= "品号") @TableId(value = "prd_no", type = IdType.INPUT) @TableField("prd_no") private String prdNo; /** * 单据类别 */ @ApiModelProperty(value= "单据类别") private String iokindid; /** * 增减符号:1(加,入库)、2(减,出库) */ @ApiModelProperty(value= "增减符号:1(加,入库)、2(减,出库)") @TableField("add_id") private String addId; /** * 数量 */ @ApiModelProperty(value= "数量") private Double qty; /** * 货品特征 */ @ApiModelProperty(value= "货品特征") @TableId(value = "prd_mark", type = IdType.INPUT) @TableField("prd_mark") private String prdMark; /** * 仓库 */ @ApiModelProperty(value= "仓库") private String wh; /** * 日期 */ @ApiModelProperty(value= "日期") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date billdate; /** * 状态:0(初始状态)、1(已接收)、2(异常) */ @ApiModelProperty(value= "状态:0(初始状态)、1(已接收)、2(异常)") private Integer status; /** * 备用字段1 */ @ApiModelProperty(value= "备用字段1") private String temp1; /** * 备用字段2 */ @ApiModelProperty(value= "备用字段2") private String temp2; /** * 备用字段3 */ @ApiModelProperty(value= "备用字段3") private String temp3; public DetTb() {} public DetTb(String billNo,String prdNo,String iokindid,String addId,Double qty,String prdMark,String wh,Date billdate,Integer status,String temp1,String temp2,String temp3) { this.billNo = billNo; this.prdNo = prdNo; this.iokindid = iokindid; this.addId = addId; this.qty = qty; this.prdMark = prdMark; this.wh = wh; this.billdate = billdate; this.status = status; this.temp1 = temp1; this.temp2 = temp2; this.temp3 = temp3; } // DetTb detTb = new DetTb( // null, // id[非空] // null, // 单据号码[非空] // null, // 品号[非空] // null, // 单据类别[非空] // null, // 增减符号:1(加,入库)、2(减,出库)[非空] // null, // 数量[非空] // null, // 货品特征[非空] // null, // 仓库 // null, // 日期[非空] // null, // 状态:0(初始状态)、1(已接收)、2(异常)[非空] // null, // 备用字段1 // null, // 备用字段2 // null // 备用字段3 // ); public String getBilldate$(){ if (Cools.isEmpty(this.billdate)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.billdate); } } src/main/java/com/zy/ints/entity/ErpLk.java
New file @@ -0,0 +1,96 @@ package com.zy.ints.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("bas_erp_lk") public class ErpLk implements Serializable { private static final long serialVersionUID = 1L; /** * 品号 */ @ApiModelProperty(value= "品号") @TableId(value = "prd_no", type = IdType.INPUT) @TableField("prd_no") private String prdNo; /** * 货品特征 */ @ApiModelProperty(value= "货品特征") @TableId(value = "prd_mark", type = IdType.INPUT) @TableField("prd_mark") private String prdMark; /** * 数量 */ @ApiModelProperty(value= "数量") private Double qty; /** * 仓库 */ @ApiModelProperty(value= "仓库") private String wh; /** * 状态:0(初始状态)、1(已接收)、2(异常) */ @ApiModelProperty(value= "状态:0(初始状态)、1(已接收)、2(异常)") private Integer status; /** * 备用字段1 */ @ApiModelProperty(value= "备用字段1") private String temp1; /** * 备用字段2 */ @ApiModelProperty(value= "备用字段2") private String temp2; /** * 备用字段3 */ @ApiModelProperty(value= "备用字段3") private String temp3; public ErpLk() {} public ErpLk(String prdNo,String prdMark,Double qty,String wh,Integer status,String temp1,String temp2,String temp3) { this.prdNo = prdNo; this.prdMark = prdMark; this.qty = qty; this.wh = wh; this.status = status; this.temp1 = temp1; this.temp2 = temp2; this.temp3 = temp3; } // ErpLk erpLk = new ErpLk( // null, // id[非空] // null, // 品号[非空] // null, // 货品特征[非空] // null, // 数量[非空] // null, // 仓库 // null, // 状态:0(初始状态)、1(已接收)、2(异常)[非空] // null, // 备用字段1 // null, // 备用字段2 // null // 备用字段3 // ); } src/main/java/com/zy/ints/entity/Prdt.java
New file @@ -0,0 +1,78 @@ package com.zy.ints.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("erp_prdt") public class Prdt implements Serializable { private static final long serialVersionUID = 1L; /** * 品号 */ @ApiModelProperty(value= "品号") @TableId(value = "prd_no", type = IdType.INPUT) @TableField("prd_no") private String prdNo; /** * 品名 */ @ApiModelProperty(value= "品名") private String name; /** * 单位 */ @ApiModelProperty(value= "单位") private String ut; /** * 规格 */ @ApiModelProperty(value= "规格") private String spc; /** * 类型 */ @ApiModelProperty(value= "类型") private Integer type; /** * 状态 */ @ApiModelProperty(value= "状态") private Integer status; public Prdt() {} public Prdt(String prdNo,String name,String ut,String spc,Integer type,Integer status) { this.prdNo = prdNo; this.name = name; this.ut = ut; this.spc = spc; this.type = type; this.status = status; } // Prdt prdt = new Prdt( // null, // id[非空] // null, // 品号[非空] // null, // 品名[非空] // null, // 单位 // null, // 规格 // null, // 类型[非空] // null // 状态[非空] // ); } src/main/java/com/zy/ints/erp/ErpDbProperties.java
New file @@ -0,0 +1,30 @@ package com.zy.ints.erp; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * Created by vincent on 2020/11/26 */ @Data @ConfigurationProperties(prefix = "erp.db") @Component public class ErpDbProperties { private String driver_class_name; private String url; private String username; private String password; // { // driver_class_name = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // ur = "jdbc:sqlserver://127.0.0.1:1433;databasename=byrk"; // username = "sa"; // password = "sa@123"; // } } src/main/java/com/zy/ints/erp/ErpSqlServer.java
New file @@ -0,0 +1,364 @@ package com.zy.ints.erp; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableName; import com.core.common.Cools; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 简单持久层框架 * Created by vincent on 2020/11/26 */ @Slf4j @Service public class ErpSqlServer { // 数据库连接 // private Connection conn; // 创建预编译语句对象,一般都是用这个而不用Statement private PreparedStatement pstm = null; // 创建一个结果集对象 private ResultSet rs = null; @Autowired private ErpDbProperties erpDbProperties; /*****************************************************************************/ /********************************** 封装 **********************************/ /*****************************************************************************/ /** * 查询 */ public <T> List<T> select(String sql, Class<T> cls) { List<Map<String, Object>> result = executeQuery(sql); List<T> list = new ArrayList<>(); if (null != result) { for (Map<String, Object> entity : result) { list.add(Cools.conver(entity, cls)); } } return list; } /** * 扫描所有实力类属性里的TableField注解,并将里面的值作为column * @param cls * @param <T> * @return */ public <T> String selectFrontPart(Class<T> cls){ String tableName = cls.getDeclaredAnnotation(TableName.class).value(); List<HashMap<String,String>> columnAndField = new ArrayList<>(); String sql = "SELECT "; if (Cools.isEmpty(tableName)) { return null; } Field[] allFields = Cools.getAllFields(cls); for (Field f : allFields) { if (Modifier.isFinal(f.getModifiers()) || Modifier.isStatic(f.getModifiers()) || Modifier.isTransient(f.getModifiers())){ continue; } String column = null; if (f.isAnnotationPresent(TableField.class)) { column = f.getAnnotation(TableField.class).value(); } if (Cools.isEmpty(column)) { column = f.getName(); } String name = f.getName(); HashMap<String, String> container = new HashMap<>(); container.put(column,name); columnAndField.add(container); } for (int i = 0; i < columnAndField.size(); i++) { HashMap<String, String> stringStringHashMap = columnAndField.get(i); if (i == columnAndField.size() - 1){ for (String s : stringStringHashMap.keySet()) { sql = sql + s + " AS " + stringStringHashMap.get(s); } }else { for (String s : stringStringHashMap.keySet()) { sql = sql + s + " AS " + stringStringHashMap.get(s) + ", "; } } } sql = sql + " FROM " + tableName; return sql; } public String addWhere(String sql, Map<String,String> condition){ int conditionSize = 1; sql = sql + " WHERE "; for (String s : condition.keySet()) { if (conditionSize == condition.keySet().size()){ sql = sql + s + " = " + condition.get(s); }else { sql = sql + s + " = " + condition.get(s) + " and "; } conditionSize = conditionSize + 1; } return sql; } /** * map的键是列名, 值等同于值 * key: id, value: 1 等同于 WHERE id = 1 * 如果要查询字符串需要自行加上'' * key:name, value: 'zhs'等同于 WHERE name = 'zhs' * @param cls * @param condition * @param <T> * @return */ public <T> List<T> selectList(Class<T> cls, Map<String,String> condition){ String sql = selectFrontPart(cls); String finalSQL = addWhere(sql, condition); return select(finalSQL,cls); } public <T> List<T> selectAll(Class<T> cls){ String sql = selectFrontPart(cls); return select(sql,cls); } public List<Map<String, Object>> select(String sql) { return executeQuery(sql); } /** * 修改 */ public int update(String sql) { return executeUpdate(sql); } public <T> int delete(Class<T> cls, Map<String,String> condition) { String tableName = cls.getDeclaredAnnotation(TableName.class).value(); if (Cools.isEmpty(tableName)) { return 0; } String sql = "DELETE FROM " + tableName; String finalSQL = addWhere(sql, condition); return executeUpdate(finalSQL); } public <T> int insert(Class<T> cls, Map<String,Object> condition){ String tableName = cls.getDeclaredAnnotation(TableName.class).value(); if (Cools.isEmpty(tableName)) { return 0; } String sql = "INSERT INTO " + tableName + " ("; int conditionSize = 1; for (String s : condition.keySet()) { if (conditionSize == condition.keySet().size()){ sql = sql +s+")"; }else { sql = sql + s + ","; } conditionSize = conditionSize + 1; } sql = sql + " VALUES("; int valuesSize = 1; for (String s : condition.keySet()) { if (valuesSize == condition.keySet().size()){ sql = sql + condition.get(s)+")"; }else { sql = sql + condition.get(s) + ","; } valuesSize = valuesSize + 1; } return executeUpdate(sql); } /*****************************************************************************/ /********************************* 核心层 *********************************/ /*****************************************************************************/ private List<Map<String, Object>> executeQuery(String sql) { Connection conn = null; try { conn = getConn(); pstm = conn.prepareStatement(sql); rs = pstm.executeQuery(); // List<Map<String, Object>> maps = convertList(rs); return convertList(rs); } catch (Exception e) { e.printStackTrace(); return null; } finally { release(); if (conn != null) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } } } public Number executeQueryCount(String sql, String column) { Number value = 0; Connection conn = null; try { conn = getConn(); pstm = conn.prepareStatement(sql); rs = pstm.executeQuery(); // ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { value = (Number) rs.getInt(column); } return value; } catch (Exception e) { e.printStackTrace(); return 0; } finally { release(); if (conn != null) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } } } private int executeUpdate(String sql) { Connection conn = null; try { conn = getConn(); if(null != conn) { pstm = conn.prepareStatement(sql); } else { log.error("更新ERP中间表失败===>>数据库连接conn为空"); log.error("更新ERP中间表失败===>>" + sql); } return pstm.executeUpdate(); } catch (Exception e) { e.printStackTrace(); log.error("更新ERP中间表失败===>>" + sql); log.error("更新ERP中间表失败===>>" + e); return 0; } finally { release(); if (conn != null) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } } } private static List<Map<String, Object>> convertList(ResultSet rs) throws SQLException { List<Map<String, Object>> list = new ArrayList<>(); ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); while (rs.next()) { Map<String, Object> rowData = new HashMap<>(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; } //synchronized public Connection getConn() throws SQLException { Connection conn = null; try { Class.forName(erpDbProperties.getDriver_class_name()).newInstance(); conn = DriverManager.getConnection(erpDbProperties.getUrl(), erpDbProperties.getUsername(), erpDbProperties.getPassword()); } catch (Exception e) { log.error("获取ERP数据库连接失败"); e.printStackTrace(); throw new RuntimeException("获取ERP数据库连接失败"); } return conn; // if (null == this.conn || this.conn.isClosed()) { // try { // Class.forName(erpDbProperties.getDriver_class_name()).newInstance(); // this.conn = DriverManager.getConnection(erpDbProperties.getUr(), erpDbProperties.getUsername(), erpDbProperties.getPassword()); // } catch (Exception e) { // log.error("获取ERP数据库连接失败"); // e.printStackTrace(); // throw new RuntimeException("获取ERP数据库连接失败"); // } // } // return this.conn; } private void release() { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstm != null) { try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } // if (conn != null) { // try { // conn.close(); // conn = null; // } catch (SQLException e) { // e.printStackTrace(); // } // } } /** * 深拷贝 */ public ArrayList deepClone(List list) throws Exception { // 序列化 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(list); // 反序列化 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (ArrayList) ois.readObject(); } } src/main/java/com/zy/ints/task/scheduler/ErpDetTbScheduler.java
New file @@ -0,0 +1,19 @@ package com.zy.ints.task.scheduler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * erp任务控制器 * Created by vincent on 2020/11/27 */ @Slf4j @Component public class ErpDetTbScheduler { /** * ERP接口是否启用 */ @Value("${erp.enabled}") private Boolean erpEnabled; } src/main/java/com/zy/ints/task/scheduler/ErpPrdtScheduler.java
New file @@ -0,0 +1,122 @@ package com.zy.ints.task.scheduler; import com.core.common.Cools; import com.zy.asrs.entity.Mat; import com.zy.asrs.entity.Tag; import com.zy.asrs.service.MatService; import com.zy.asrs.service.TagService; import com.zy.ints.entity.Prdt; import com.zy.ints.erp.ErpSqlServer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.List; /** * erp任务控制器 * Created by vincent on 2020/11/27 */ @Slf4j @Component public class ErpPrdtScheduler { /** * ERP接口是否启用 */ @Value("${erp.enabled}") private Boolean erpEnabled; @Autowired private TagService tagService; @Autowired private ErpSqlServer erpSqlServer; @Autowired private MatService matService; /** * 获取商品信息表资料 */ @Scheduled(cron = "${erp.refreshtime}") public void obtainPedt() { if (!erpEnabled) return; String sqlSelectPrdt = "select prd_no as prdNo,name,ut,spc,type,status from erp_prdt where 1=1"; String sqlUpDatePrdtOne = "update erp_prdt set status=1 where prd_no="; String sqlUpDatePrdtTwo = "update erp_prdt set status=2 where prd_no="; Tag tag = tagService.selectByName("全部", 1); List<Prdt> prdts = erpSqlServer.select(sqlSelectPrdt,Prdt.class); if (prdts.size() > 0){ for (Prdt prdt : prdts) { Date date = new Date(); if (prdt.getStatus()==0) { Integer type = prdt.getType(); if (type==1){ Mat mat = matService.selectByMatnr(prdt.getPrdNo()); if (Cools.isEmpty(mat)){ Mat matNew = new Mat(); matNew.setTagId(tag.getId()); matNew.setMatnr(prdt.getPrdNo()); matNew.setMaktx(prdt.getName()); matNew.setUnit(prdt.getUt()); matNew.setSpecs(prdt.getSpc()); matNew.setCreateBy(9999L); matNew.setCreateTime(date); matNew.setUpdateBy(9999L); matNew.setUpdateTime(date); if (matService.insert(matNew)){ erpSqlServer.update(sqlUpDatePrdtOne+"'" + prdt.getPrdNo() + "'"); }else { erpSqlServer.update(sqlUpDatePrdtTwo+"'" + prdt.getPrdNo() + "'"); } } }else if (type==2){ Mat mat = matService.selectByMatnr(prdt.getPrdNo()); if (!Cools.isEmpty(mat)){ mat.setMaktx(prdt.getName()); mat.setUnit(prdt.getUt()); mat.setSpecs(prdt.getSpc()); if (matService.updateById(mat)){ erpSqlServer.update(sqlUpDatePrdtOne+"'" + prdt.getPrdNo() + "'"); }else { erpSqlServer.update(sqlUpDatePrdtTwo+"'" + prdt.getPrdNo() + "'"); } } }else if (type==3){ Mat mat = matService.selectByMatnr(prdt.getPrdNo()); if (!Cools.isEmpty(mat)){ if (matService.deleteById(mat.getId())){ erpSqlServer.update(sqlUpDatePrdtOne+"'" + prdt.getPrdNo() + "'"); }else { erpSqlServer.update(sqlUpDatePrdtTwo+"'" + prdt.getPrdNo() + "'"); } } }else { } }else if (prdt.getStatus()==1){ // HashMap<String, Object> condition = new HashMap<>(); // condition.put("prd_no","'" + prdt.getPrdNo() + "'"); // condition.put("name","'" + prdt.getName() + "'"); // condition.put("ut","'" + prdt.getUt() + "'"); // condition.put("spc","'" + prdt.getSpc() + "'"); // condition.put("type","'" + prdt.getType() + "'"); // condition.put("status","'" + prdt.getStatus() + "'"); // erpSqlServer.insert(Prdt.class, condition); // // HashMap<String, String> condition2 = new HashMap<>(); // condition2.put("prd_no","'" + prdt.getPrdNo() + "'"); // erpSqlServer.delete(Prdt.class,condition2); }else if (prdt.getStatus()==2){ }else { } } } } } src/main/resources/application.yml
@@ -48,4 +48,19 @@ # 双深库位排号 doubleLocs: 9,12,15,18 # 一个堆垛机负责的货架排数 groupCount: 4 groupCount: 4 #ERP接口 erp: enabled: true # enabled: false #查看ERP中间表间隔 refreshtime: 0/5 * * * * ? db: driver_class_name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=lfdasrs username: sa password: sa@123 comb: limit: 5000