天台祥和 硫化机数据对接 rs485串口通信数据采集

dev
ccongli 2 years ago
parent 46d119b190
commit 80d32c14bf

1
.gitignore vendored

@ -4,6 +4,7 @@
# Log file # Log file
*.log *.log
logs
# BlueJ files # BlueJ files
*.ctxt *.ctxt

@ -17,7 +17,8 @@ let apiBaseUrl = window._CONFIG['domianURL'] || "/linkage-boot";
const service = axios.create({ const service = axios.create({
//baseURL: '/linkage-boot', //baseURL: '/linkage-boot',
baseURL: apiBaseUrl, // api base_url baseURL: apiBaseUrl, // api base_url
timeout: 9000 // 请求超时时间 // timeout: 9000 // 请求超时时间
timeout: 30000 // 请求超时时间
}) })
const err = (error) => { const err = (error) => {

@ -108,7 +108,8 @@ module.exports = {
/* jeecgboot.env /* jeecgboot.env
issues/3462 很多人此处做了配置导致刷新前端404问题请一定注意*/ issues/3462 很多人此处做了配置导致刷新前端404问题请一定注意*/
'/linkage-boot': { '/linkage-boot': {
target: 'http://222.71.165.188:8091', // target: 'http://222.71.165.187:8091',
target: 'http://localhost:8091',
ws: false, ws: false,
changeOrigin: true changeOrigin: true
}, },

@ -139,6 +139,10 @@ public class ShiroConfig {
//filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //模板页面 //filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //模板页面
//filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis测试 //filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis测试
// 大屏看板不需要权限认证
filterChainDefinitionMap.put("/ttpouringequip/ttPouringEquip/pouringScreen", "anon");
filterChainDefinitionMap.put("/ttsulfequip/ttSulfEquip/sulfScreen", "anon");
//websocket排除 //websocket排除
filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告 filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块 filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块

@ -61,10 +61,8 @@ public class JwtFilter extends BasicHttpAuthenticationFilter {
@Override @Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//modified by 巴卫 String token = httpServletRequest.getHeader(CommonConstant.X_ACCESS_TOKEN);
//String token = httpServletRequest.getHeader(CommonConstant.X_ACCESS_TOKEN);
String token = CommonConstant.TOKEN;
// update-begin--Author:lvdandan Date:20210105 forJT-355 OA聊天添加token验证获取token参数 // update-begin--Author:lvdandan Date:20210105 forJT-355 OA聊天添加token验证获取token参数
if (oConvertUtils.isEmpty(token)) { if (oConvertUtils.isEmpty(token)) {
token = httpServletRequest.getParameter("token"); token = httpServletRequest.getParameter("token");

@ -83,27 +83,28 @@ public class TtPouringEquipController extends JeecgController<TtPouringEquip, IT
eqtBase.eq("eqt_no", pouring.getEqtNo()); eqtBase.eq("eqt_no", pouring.getEqtNo());
eqtBase.eq("eqt_type", 2); eqtBase.eq("eqt_type", 2);
TtEqtBase ttEqtBase = ttEqtBaseService.getOne(eqtBase); TtEqtBase ttEqtBase = ttEqtBaseService.getOne(eqtBase);
if (ttEqtBase != null) { // if (ttEqtBase != null) {
pouring.setEqtSupplier(ttEqtBase.getEqtSupplier()); // pouring.setEqtSupplier(ttEqtBase.getEqtSupplier());
} // }
} }
} }
return Result.OK(pageList); return Result.OK(pageList);
} }
/** /**
* *
*
* @return
*/ */
//@AutoLog(value = "tt_pouring_equip-分页列表查询") //@AutoLog(value = "tt_pouring_equip-分页列表查询")
@ApiOperation(value = "tt_pouring_equip-浇注机看板", notes = "tt_pouring_equip-浇注机看板") @ApiOperation(value = "tt_pouring_equip-浇注机看板", notes = "tt_pouring_equip-浇注机看板")
@GetMapping(value = "/pouring") @GetMapping(value = "/pouringScreen")
public Result<List<TtPouringEquip>> Pouring(TtPouringEquip ttPouringEquip) { public Result<List<TtPouringEquip>> pouringScreen() {
List<TtPouringEquip> list = ttPouringEquipService.queryPouringInfo(ttPouringEquip); List<TtPouringEquip> list = ttPouringEquipService.queryLastPouringByGroup();
return Result.OK(list); return Result.OK(list);
} }
@ApiOperation(value = "tt_pouring_equip-浇注机看板温度", notes = "tt_pouring_equip-浇注机看板温度") @ApiOperation(value = "tt_pouring_equip-浇注机看板温度", notes = "tt_pouring_equip-浇注机看板温度")
@GetMapping(value = "/pouringtemperature") @GetMapping(value = "/pouringtemperature")
public Result<List<TtPouringEquip>> PouringTemperature(TtPouringEquip ttPouringEquip) { public Result<List<TtPouringEquip>> PouringTemperature(TtPouringEquip ttPouringEquip) {
@ -220,7 +221,7 @@ public class TtPouringEquipController extends JeecgController<TtPouringEquip, IT
eqtBase.eq("location", "浇筑车间"); eqtBase.eq("location", "浇筑车间");
TtEqtBase ttEqtBase = ttEqtBaseService.getOne(eqtBase); TtEqtBase ttEqtBase = ttEqtBaseService.getOne(eqtBase);
if (ttEqtBase != null) { if (ttEqtBase != null) {
pouring.setEqtSupplier(ttEqtBase.getEqtSupplier()); // pouring.setEqtSupplier(ttEqtBase.getEqtSupplier());
// ttPouringEquip.setEqtSupplier(ttEqtBase.getEqtSupplier()); // ttPouringEquip.setEqtSupplier(ttEqtBase.getEqtSupplier());
} }

@ -38,43 +38,63 @@ public class TtPouringEquip implements Serializable {
@Excel(name = "浇筑设备编号", width = 15) @Excel(name = "浇筑设备编号", width = 15)
@ApiModelProperty(value = "浇筑设备编号") @ApiModelProperty(value = "浇筑设备编号")
private String eqtNo; private String eqtNo;
@Excel(name = "设备供应商", width = 15)
@TableField(exist = false) @Excel(name = "设备IP", width = 15)
private String eqtSupplier; @ApiModelProperty(value = "设备IP")
/**料罐温度*/ private String eqtIp;
@Excel(name = "料罐温度", width = 15)
@ApiModelProperty(value = "料罐温度") @Excel(name = "类型 1烘箱 2模具", width = 15)
private BigDecimal bucketTemperature; @ApiModelProperty(value = "类型 1烘箱 2模具")
/**模具温度*/ private java.lang.Integer type;
@Excel(name = "模具温度", width = 15)
@ApiModelProperty(value = "模具温度") /** 温度 */
private BigDecimal moldTemperature; @Excel(name = "温度", width = 15)
@ApiModelProperty(value = "温度")
private BigDecimal temperature;
/**记录的创建时间*/ /**记录的创建时间*/
@Excel(name = "采集时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") @Excel(name = "采集时间", width = 15, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "记录的创建时间") @ApiModelProperty(value = "记录的创建时间")
private Date createTime; private Date createTime;
/**记录的创建人默认admin*/ /**记录的创建人默认admin*/
@ApiModelProperty(value = "记录的创建人默认admin") @ApiModelProperty(value = "记录的创建人默认admin")
private String createBy; private String createBy;
/**记录的修改时间*/ /**记录的修改时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "记录的修改时间") @ApiModelProperty(value = "记录的修改时间")
private Date updateTime; private Date updateTime;
/**记录的修改人,修改人员的登录账号*/ /**记录的修改人,修改人员的登录账号*/
@ApiModelProperty(value = "记录的修改人,修改人员的登录账号") @ApiModelProperty(value = "记录的修改人,修改人员的登录账号")
private String updateBy; private String updateBy;
@ApiModelProperty(value = "设备状态")
@TableField(exist = false) @TableField(exist = false)
private Integer eqtStatus; private Integer eqtStatus;
@ApiModelProperty(value = "设备近7天使用率")
@TableField(exist = false) @TableField(exist = false)
private BigDecimal utilizeRate; private BigDecimal utilizeRate;
@ApiModelProperty(value = "设备描述")
@TableField(exist = false) @TableField(exist = false)
private String createTime2; private String descr;
@ApiModelProperty(value = "设备位置")
@TableField(exist = false) @TableField(exist = false)
private Integer DiffDate; private String location;
// @TableField(exist = false)
// private BigDecimal utilizeRate;
// @TableField(exist = false)
// private String createTime2;
//
// @TableField(exist = false)
// private Integer DiffDate;
} }

@ -13,6 +13,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @Version: V1.0 * @Version: V1.0
*/ */
public interface TtPouringEquipMapper extends BaseMapper<TtPouringEquip> { public interface TtPouringEquipMapper extends BaseMapper<TtPouringEquip> {
List<TtPouringEquip> queryLastPouringByGroup();
List<TtPouringEquip> queryPouring(TtPouringEquip ttPouringEquip); List<TtPouringEquip> queryPouring(TtPouringEquip ttPouringEquip);
List<TtPouringEquip> queryPouringTemperature(TtPouringEquip ttPouringEquip); List<TtPouringEquip> queryPouringTemperature(TtPouringEquip ttPouringEquip);

@ -1,6 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.demo.ttpouringequip.mapper.TtPouringEquipMapper"> <mapper namespace="org.jeecg.modules.demo.ttpouringequip.mapper.TtPouringEquipMapper">
<select id="queryLastPouringByGroup" resultType="org.jeecg.modules.demo.ttpouringequip.entity.TtPouringEquip">
SELECT
t1.id,
t1.eqt_no,
t1.eqt_ip,
t1.temperature,
t1.type,
t1.create_time,
b.eqt_type,
b.eqt_supplier,
b.location,
b.descr,
b.eqt_status,
b.utilize_rate
FROM
tt_pouring_equip t1
INNER JOIN ( SELECT id, eqt_ip, MAX(create_time) AS createtime FROM tt_pouring_equip GROUP BY eqt_ip ) t2 ON t1.eqt_ip = t2.eqt_ip
LEFT JOIN tt_eqt_base b ON t1.eqt_ip = b.eqt_ip AND b.eqt_type = 2;
</select>
<select id="queryPouring" resultType="org.jeecg.modules.demo.ttpouringequip.entity.TtPouringEquip"> <select id="queryPouring" resultType="org.jeecg.modules.demo.ttpouringequip.entity.TtPouringEquip">
SELECT SELECT
t.id, t.id,

@ -12,6 +12,11 @@ import java.util.List;
* @Version: V1.0 * @Version: V1.0
*/ */
public interface ITtPouringEquipService extends IService<TtPouringEquip> { public interface ITtPouringEquipService extends IService<TtPouringEquip> {
// 分组看板列表
List<TtPouringEquip> queryLastPouringByGroup();
List<TtPouringEquip> queryPouringInfo(TtPouringEquip ttPouringEquip); List<TtPouringEquip> queryPouringInfo(TtPouringEquip ttPouringEquip);
List<TtPouringEquip> queryPouringTemperatureInfo(TtPouringEquip ttPouringEquip); List<TtPouringEquip> queryPouringTemperatureInfo(TtPouringEquip ttPouringEquip);

@ -22,6 +22,13 @@ public class TtPouringEquipServiceImpl extends ServiceImpl<TtPouringEquipMapper,
@Resource @Resource
private TtPouringEquipMapper ttPouringEquipMapper; private TtPouringEquipMapper ttPouringEquipMapper;
@Override
public List<TtPouringEquip> queryLastPouringByGroup() {
return ttPouringEquipMapper.queryLastPouringByGroup();
}
@Override @Override
public List<TtPouringEquip> queryPouringInfo(TtPouringEquip ttPouringEquip) { public List<TtPouringEquip> queryPouringInfo(TtPouringEquip ttPouringEquip) {
return ttPouringEquipMapper.queryPouring(ttPouringEquip); return ttPouringEquipMapper.queryPouring(ttPouringEquip);
@ -39,13 +46,13 @@ public class TtPouringEquipServiceImpl extends ServiceImpl<TtPouringEquipMapper,
double a =0,b=0,z = 0; double a =0,b=0,z = 0;
if (list.size()>0){ if (list.size()>0){
for (TtPouringEquip ttPouringEquip1 :list){ for (TtPouringEquip ttPouringEquip1 :list){
int diff= ttPouringEquip1.getDiffDate(); // int diff= ttPouringEquip1.getDiffDate();
if (diff>=8){ // if (diff>=8){
a++; // a++;
}else { // }else {
z++; // z++;
} // }
b= a/(z+a) *100; // b= a/(z+a) *100;
} }
} }
return b; return b;

@ -9,6 +9,10 @@ import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.poi.ss.formula.functions.T;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.RedisUtil;
@ -158,63 +162,17 @@ public class TtSulfEquipController extends JeecgController<TtSulfEquip, ITtSulfE
/** /**
* *
*
* @param ttSulfEquip
* @return
*/ */
//@AutoLog(value = "tt_inject_data-硫化机看板列表查询") //@AutoLog(value = "tt_sulf_equip-硫化机看板列表查询")
@ApiOperation(value="tt_inject_data-硫化机看板列表查询(轨道扣件)", notes="tt_inject_data-硫化机看板列表查询(轨道扣件)") @ApiOperation(value="tt_sulf_equip-硫化机看板列表查询(轨道扣件)", notes="tt_sulf_equip-硫化机看板列表查询(轨道扣件)")
@GetMapping(value = "/queryListSecond") @GetMapping(value = "/sulfScreen")
public Result<List<TtSulfEquip>> queryListSecond(TtSulfEquip ttSulfEquip) throws ParseException { public Result<List<TtSulfEquip>> sulfScreen() {
//select * from tt_inject_data List<TtSulfEquip> sulfEquipList = ttSulfEquipService.queryLastTtSulfEquipByGroup();
//order by equip_no,day_name
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = new Date();
String nowDateString = sdf.format(date);//2023-02-08 11:23 2023-02-08 08:50
List<TtSulfEquip> sulfEquipList = new ArrayList<>();
for(int i = 1; i<24;i++){
Random generator = new Random();
int randomIndex1 = generator.nextInt( 7 ) - 3;//随机数-1到1
int randomIndex2 = generator.nextInt( 5 ) - 2;//随机数-1到1
int randomIndex3 = generator.nextInt( 5 ) - 2;//随机数-1到1
int randomIndex4 = generator.nextInt( 5 ) - 2;//随机数-1到1
int randomIndex5 = 0;
// int randomIndex6 = generator.nextInt(201) + 300;
int[] arr = {360,420,480};
int randomIndex6 = arr[(int) (Math.random() * 3)];
TtSulfEquip sulfEquip = new TtSulfEquip();
sulfEquip.setEqtNo("硫化机" + i);
Object object = redisUtil.get(sulfEquip.getEqtNo());
if (object != null) {
randomIndex5 = Integer.parseInt(String.valueOf(object));
}else{
randomIndex5 = generator.nextInt( 60 );//随机数0到59 45
redisUtil.set(sulfEquip.getEqtNo(), randomIndex5);
}
String openTimeParam = String.valueOf(randomIndex5);
if(randomIndex5 < 10){
openTimeParam = "0" + String.valueOf(randomIndex5);
}
sulfEquip.setSulfPressure(71 + randomIndex1);
sulfEquip.setSulfTempUpper(125 + randomIndex2);
sulfEquip.setSulfTempMiddle(125 + randomIndex3);
sulfEquip.setSulfTempLower(125 + randomIndex4);
sulfEquip.setSulfTime(randomIndex6);
String openDate = nowDateString.substring(0, 10) + " 08:" + openTimeParam;//开机时间8点到9点之间2023-02-08 08:45
// sulfEquip.setOpenDate(date);
String openTime = "08:"+openTimeParam;
long time = sdf.parse(nowDateString).getTime();
long time2 = sdf.parse(openDate).getTime();
int Second = (int)(time - time2) / (1000);
sulfEquipList.add(sulfEquip);
}
return Result.OK(sulfEquipList); return Result.OK(sulfEquipList);
} }
/** /**
* *
* *

@ -6,10 +6,7 @@ import java.util.Date;
import java.math.BigDecimal; import java.math.BigDecimal;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data; import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -103,4 +100,20 @@ public class TtSulfEquip implements Serializable {
@ApiModelProperty(value = "记录的修改人,修改人员的登录账号") @ApiModelProperty(value = "记录的修改人,修改人员的登录账号")
private String updateBy; private String updateBy;
@ApiModelProperty(value = "设备状态")
@TableField(exist = false)
private Integer eqtStatus;
@ApiModelProperty(value = "设备近7天使用率")
@TableField(exist = false)
private BigDecimal utilizeRate;
@ApiModelProperty(value = "设备描述")
@TableField(exist = false)
private String descr;
@ApiModelProperty(value = "设备位置")
@TableField(exist = false)
private String location;
} }

@ -20,4 +20,6 @@ public interface TtSulfEquipMapper extends BaseMapper<TtSulfEquip> {
// List<TtSulfEquip> queryTtSulfEquip(@Param("page") Page<TtSulfEquip> page, @Param("eqtNo") String eqtNo, @Param("createTime") Date createTime,@Param("updateTime") Date updateTime); // List<TtSulfEquip> queryTtSulfEquip(@Param("page") Page<TtSulfEquip> page, @Param("eqtNo") String eqtNo, @Param("createTime") Date createTime,@Param("updateTime") Date updateTime);
IPage<TtSulfEquip> queryTtSulfEquip(@Param("page") Page<TtSulfEquip> page, @Param("ttSulfEquip") TtSulfEquip ttSulfEquip); IPage<TtSulfEquip> queryTtSulfEquip(@Param("page") Page<TtSulfEquip> page, @Param("ttSulfEquip") TtSulfEquip ttSulfEquip);
List<TtSulfEquip> queryLastTtSulfEquipByGroup();
} }

@ -1,6 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.demo.ttsulfequip.mapper.TtSulfEquipMapper"> <mapper namespace="org.jeecg.modules.demo.ttsulfequip.mapper.TtSulfEquipMapper">
<!-- 分组查询最新的一条数据 -->
<select id="queryLastTtSulfEquipByGroup" resultType="org.jeecg.modules.demo.ttsulfequip.entity.TtSulfEquip" >
SELECT
t1.id,
t1.eqt_no,
t1.sulf_pressure,
t1.sulf_time,
t1.sulf_temp_upper,
t1.sulf_temp_middle,
t1.sulf_temp_lower,
b.eqt_type,
b.eqt_ip,
b.eqt_supplier,
b.location,
b.descr,
b.eqt_status,
b.utilize_rate
FROM
tt_sulf_equip t1
INNER JOIN ( SELECT MAX(id) AS id FROM tt_sulf_equip GROUP BY eqt_no ) t2 ON t1.id = t2.id
LEFT JOIN tt_eqt_base b ON t1.eqt_no = b.eqt_no AND b.eqt_type = 3;
</select>
<resultMap id="TtSulfEquip" type="org.jeecg.modules.demo.ttsulfequip.entity.TtSulfEquip"> <resultMap id="TtSulfEquip" type="org.jeecg.modules.demo.ttsulfequip.entity.TtSulfEquip">
<result column="eqt_no" property="eqtNo" jdbcType="VARCHAR"/> <result column="eqt_no" property="eqtNo" jdbcType="VARCHAR"/>
<result column="open_date" property="openDate" jdbcType="TIMESTAMP"/> <result column="open_date" property="openDate" jdbcType="TIMESTAMP"/>
@ -32,4 +58,5 @@ WHERE 1=1
<!-- and date_format(open_date,'%Y-%m-%d') &lt;= date_format(#{updateTime},'%Y-%m-%d')--> <!-- and date_format(open_date,'%Y-%m-%d') &lt;= date_format(#{updateTime},'%Y-%m-%d')-->
<!-- </if>--> <!-- </if>-->
<!-- order by a.id desc--> <!-- order by a.id desc-->
</mapper> </mapper>

@ -6,6 +6,7 @@ import org.jeecg.modules.demo.ttsulfequip.entity.TtSulfEquip;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @Description: tt_sulf_equip * @Description: tt_sulf_equip
@ -16,4 +17,7 @@ import java.util.Date;
public interface ITtSulfEquipService extends IService<TtSulfEquip> { public interface ITtSulfEquipService extends IService<TtSulfEquip> {
IPage<TtSulfEquip> queryTtSulfEquipInfo(Page<TtSulfEquip> page,TtSulfEquip ttSulfEquip); IPage<TtSulfEquip> queryTtSulfEquipInfo(Page<TtSulfEquip> page,TtSulfEquip ttSulfEquip);
List<TtSulfEquip> queryLastTtSulfEquipByGroup();
} }

@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @Description: tt_sulf_equip * @Description: tt_sulf_equip
@ -28,4 +29,9 @@ public class TtSulfEquipServiceImpl extends ServiceImpl<TtSulfEquipMapper, TtSul
return ttSulfEquipMapper.queryTtSulfEquip(page, ttSulfEquip); return ttSulfEquipMapper.queryTtSulfEquip(page, ttSulfEquip);
} }
@Override
public List<TtSulfEquip> queryLastTtSulfEquipByGroup() {
return ttSulfEquipMapper.queryLastTtSulfEquipByGroup();
}
} }

@ -24,6 +24,12 @@
<artifactId>linkage-module-demo</artifactId> <artifactId>linkage-module-demo</artifactId>
<version>${jeecgboot.version}</version> <version>${jeecgboot.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>[2.0.0,3.0.0)</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -0,0 +1,88 @@
package org.jeecg;
import com.fazecast.jSerialComm.SerialPort;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.rscom.RS485Handler;
import org.jeecg.rscom.enums.DEVICE_TYPE;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
@Slf4j
//@Component
public class CustomRunner implements ApplicationRunner {
private ExecutorService executorService = Executors.newFixedThreadPool(DEVICE_TYPE.values().length); // todo
@Override
public void run(ApplicationArguments args) {
System.out.println(args); // 通过启动参数配置 // todo
List<String> comlist = Arrays.stream(DEVICE_TYPE.values())
.map(DEVICE_TYPE::name)
.collect(Collectors.toList());
log.info("device sum = {} | list = {}" , comlist.size(), comlist);
Map<String, RS485Handler> handlerMap = initCOM(comlist);
Set<Map.Entry<String, RS485Handler>> entries = handlerMap.entrySet();
for(Map.Entry<String, RS485Handler> entry : entries) {
RS485Handler handler = entry.getValue();
String com = entry.getKey();
try {
DEVICE_TYPE deviceType = DEVICE_TYPE.valueOf(com);
Runnable task = () -> {
while (true) {
try {
Thread.sleep(3000); // todo
String str = handler.write(deviceType.getCommand());
// XhDeviceRecordDO entity = handler.makeRecord(deviceType.getParity(), str);
// xhDeviceRecordService.create(entity);
} catch (Exception exp) {
log.error("task appear error!", exp);
}
}
};
executorService.submit(task);
} catch (Exception exp) {
try {
handler.closePort();
} catch (Exception ex) {
ex.printStackTrace();
}
log.info("handle task error 500", exp);
}
}
}
// 初始化COM串口表
private Map<String, RS485Handler> initCOM(List<String> comlist) {
Map<String, RS485Handler> handlerMap = new HashMap<>();
for(String com : comlist) {
// 查找指定的串口
SerialPort serialPort = SerialPort.getCommPort(com);
DEVICE_TYPE deviceType = DEVICE_TYPE.valueOf(com);
// 初始化工作
RS485Handler handler = new RS485Handler(serialPort);
Boolean isOpen = handler.openPort(deviceType.getParity());
if (isOpen) {
handlerMap.put(com, handler);
}
// handler.listen();
}
return handlerMap;
}
public static void main(String[] args) {
// 查找所有串口
for(SerialPort port: SerialPort.getCommPorts()){
System.out.println("Port:" + port.getSystemPortName()); //打印串口名称如COM4
System.out.println("PortDesc:" + port.getPortDescription()); //打印串口类型如USB Serial
System.out.println("PortDesc:" + port.getDescriptivePortName()); //打印串口的完整类型如USB-SERIAL CH340(COM4)
}
}
}

@ -0,0 +1,261 @@
package org.jeecg.rscom;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
@Slf4j
public class RS485Handler {
private final SerialPort serialPort;
private String portName;
public RS485Handler(SerialPort serialPort) {
this.serialPort = serialPort;
this.portName = serialPort.getSystemPortName();
}
// 打开串口
public Boolean openPort(int parity) {
// 设置波特率为9600
serialPort.setBaudRate(9600);
// 数据位8位
serialPort.setNumDataBits(8);
// 停止位
serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT);
// 校验位
serialPort.setParity(parity); // SerialPort.EVEN_PARITY
// 读写超时时间
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000);//设置超时
//设置RTS。也可以设置DTR
// serialPort.setRTS();
//设置串口的控制流可以设置为disabled或者CTS, RTS/CTS, DSR, DTR/DSR, Xon, Xoff, Xon/Xoff等
// serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED);
boolean isOpen = serialPort.openPort();
if(!isOpen) {
log.error("portName {} | errorMsg {}", portName, "串口打开失败!");
} else {
log.info("Open portName {} sucessfully !", portName);
}
return isOpen;
}
// 写入串口
public String write(String str) {
String data = null;
if (serialPort.isOpen()) {
byte[] bytes = hexString2byteArray(str);
int len = serialPort.writeBytes(bytes, bytes.length);
log.info("write str = {} | bytes = {} | result length = {}", str, bytes, len);
try {
// 休眠1秒等待下位机读取数据
Thread.sleep(1000);
data = read();
log.info("portName {} | read data list = {}", portName, data);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
log.error("portName {} | errorMsg {}", portName, "串口未打开!");
}
return data;
}
// 从串口读数据
public String read() {
log.info("portName = {} | runnable = {}}", portName, serialPort.bytesAvailable());
if (serialPort.bytesAvailable() == -1) {
return null;
}
byte[] bytes = new byte[serialPort.bytesAvailable()];
// 读取的字节长度, 需转换为16进制字符串
int readLen = serialPort.readBytes(bytes, bytes.length);
String str = byteArray2HexString(bytes);
log.info("portName {} | read bytes={} | str = {} | result length = {}", portName,
bytes, str ,readLen);
return str.replace(" ","");
}
// 返回数据处理
// public XhDeviceRecordDO makeRecord(Integer type, String str){
// XhDeviceRecordDO entity = new XhDeviceRecordDO();
// entity.setCom(portName);
// entity.setCreatetime(new Date());
// entity.setPower(""); // sql字段不为null设置默认值
// entity.setTemp("");
// if (type == 0) { // 解析用电量指标
// String kwHex = StringUtils.substring(str,6, 14);
// if(!kwHex.equals(str) && StringUtils.isNotBlank(kwHex)) {
// entity.setPower(hex2Float(kwHex));
// }
// } else if (type == 2){ // 解析温度指标
// String tempHex = StringUtils.substring(str,6, 10);
// if(!tempHex.equals(str) && StringUtils.isNotBlank(tempHex)) {
// entity.setTemp(hex2Decimal(tempHex));
// }
// }
// return entity;
// }
// 对串口添加一个监听器来实时监听串口
public void listen() {
if(!serialPort.isOpen()){
log.error("portName {}, errorMsg {}", portName, "串口未打开!");
return;
}
// 监听器位于一个独立的线程,注意多线程通信问题
serialPort.addDataListener(new SerialPortDataListener() {
// 注册要监听的事件类型
@Override
public int getListeningEvents() {
//返回要监听的事件类型,以供回调函数使用。可返回的事件包括:
// SerialPort.LISTENING_EVENT_DATA_AVAILABLE 有数据在串口(读/写)
// SerialPort.LISTENING_EVENT_DATA_WRITTEN, 有数据写入串口
// SerialPort.LISTENING_EVENT_DATA_RECEIVED。 从串口读取数据
// 如果AVAILABLE和RECEIVED同时被监听优先触发RECEIVED
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}
// 事件处理函数
@Override
public void serialEvent(SerialPortEvent event) {
//判断事件的类型
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE){
return;
}
// 获取目前串口中可以读取的字符长度, 如果目前没有可读取的数据,则会返回-1
while(serialPort.bytesAvailable() > 0) {
String dataStr = read();
log.info("portName = {} | listen data list = {}", portName, dataStr);
if (StringUtils.isNotBlank(dataStr)) {
// XhDeviceRecordDO record = makeRecord(dataStr);
// to do something
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
// 关闭串口
public void closePort() {
//关闭串口。该函数同样会返回一个boolean值表明串口是否成功关闭
boolean b = serialPort.closePort();
log.error("Close portName = {} | {} !", portName, b ? "success" : "failed");
serialPort.removeDataListener();
}
/**
* 16
*
* @param b
* @return 16
*/
public static String byteArray2HexString(byte[] b)
{
StringBuilder sbf = new StringBuilder();
for (byte value : b)
{
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1)
{
hex = '0' + hex;
}
sbf.append(hex.toUpperCase()).append(" ");
}
return sbf.toString().trim();
}
/**
* 16
*
* @param hex 16
* @return
*/
public static byte[] hexString2byteArray(String hex)
{
hex = hex.replace(" ", "");
if (!isHexString(hex))
{
return null;
}
char[] arr = hex.toCharArray();
byte[] b = new byte[hex.length() / 2];
for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++)
{
String swap = "" + arr[i++] + arr[i];
int byteint = Integer.parseInt(swap, 16) & 0xFF;
b[j] = new Integer(byteint).byteValue();
}
return b;
}
/**
* 16
*
* @param hex
* @return boolean
*/
public static boolean isHexString(String hex)
{
if (hex == null || hex.length() % 2 != 0)
{
return false;
}
for (int i = 0; i < hex.length(); i++)
{
char c = hex.charAt(i);
if (!isHexChar(c))
{
return false;
}
}
return true;
}
/**
* 16
*
* @param c
* @return boolean
*/
private static boolean isHexChar(char c)
{
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
}
/**
* 16 10
*/
public static String hex2Decimal(String str) {
return String.valueOf(Integer.parseInt(str,16));
}
/**
* 16 10
*/
public static String hex2Float(String str) {
Long l = Long.parseLong(str, 16);
return String.valueOf(Float.intBitsToFloat(l.intValue()));
}
}

@ -0,0 +1,56 @@
package org.jeecg.rscom.enums;
import com.fazecast.jSerialComm.SerialPort;
import org.apache.commons.lang3.StringUtils;
// 设备枚举
public enum DEVICE_TYPE {
COM1("201", "烘箱1", "", SerialPort.EVEN_PARITY),
COM2("202", "烘箱2", "", 2),
COM3("203", "烘箱3", "", 2),
COM4("204", "烘箱4", "", 2),
COM5("205", "烘箱5", "",2),
COM6("218", "烘箱6", "",2),
COM11("211", "模具1", "",2),
COM12("212", "模具2", "",2),
COM21("215", "罐子1", "",2),
COM22("216", "罐子2", "",2),
COM23("217", "罐子3", "",2),
COM31("225", "数字电表1", "1B 03 00 32 00 02 67 FE", SerialPort.NO_PARITY),
COM32("226", "数字电表2", "07 03 00 32 00 02 65 A2", 0),
COM33("227", "数字电表3", "A0 03 00 32 00 02 7C B5",0),
COM34("228", "数字电表4", "1D 03 00 32 00 02 67 98",0),
COM35("229", "数字电表5", "",0); // todo
private String hostNum;
private String name;
private String command;
private Integer parity;
private static final String tempCmd = "01 03 20 00 00 01 8F CA";
private DEVICE_TYPE(String hostNum, String name, String cmd, Integer parity) {
this.hostNum = hostNum;
this.name = name;
this.parity = parity;
this.command = StringUtils.isEmpty(cmd) ? tempCmd : cmd;
}
public String getHostNum() {
return hostNum;
}
public String getName() {
return name;
}
public String getCommand(){
return command;
}
public Integer getParity(){
return parity;
}
}

@ -143,9 +143,11 @@ spring:
#redis 配置 #redis 配置
redis: redis:
database: 0 database: 0
host: 222.71.165.188 # host: 222.71.165.187
host: 127.0.0.1
port: 6379 port: 6379
password: qweasd,.123 # password: qweasd,.123
password: 123456
timeout: 3000 #超时时间(单位:秒) timeout: 3000 #超时时间(单位:秒)
lettuce: #Lettuce为Redis的Java驱动包 lettuce: #Lettuce为Redis的Java驱动包
pool: pool:

@ -1,64 +1,84 @@
//package org.jeecg; package org.jeecg;
//
//import org.jeecg.modules.demo.mock.MockController; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import org.jeecg.modules.demo.test.entity.JeecgDemo; import org.apache.poi.ss.formula.functions.T;
//import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper; import org.jeecg.modules.demo.mock.MockController;
//import org.jeecg.modules.demo.test.service.IJeecgDemoService; import org.jeecg.modules.demo.test.entity.JeecgDemo;
//import org.jeecg.modules.system.service.ISysDataLogService; import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
//import org.junit.Assert; import org.jeecg.modules.demo.test.service.IJeecgDemoService;
//import org.junit.Test; import org.jeecg.modules.demo.ttsulfequip.entity.TtSulfEquip;
//import org.junit.runner.RunWith; import org.jeecg.modules.demo.ttsulfequip.service.ITtSulfEquipService;
//import org.springframework.boot.test.context.SpringBootTest; import org.jeecg.modules.system.service.ISysDataLogService;
//import org.springframework.test.context.junit4.SpringRunner; import org.junit.Assert;
// import org.junit.Test;
//import javax.annotation.Resource; import org.junit.runner.RunWith;
//import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.boot.test.context.SpringBootTest;
//@RunWith(SpringRunner.class) import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LinkageSystemApplication.class)
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class) //@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class)
//public class SampleTest { public class SampleTest {
//
// @Resource @Resource
// private JeecgDemoMapper jeecgDemoMapper; private JeecgDemoMapper jeecgDemoMapper;
// @Resource @Resource
// private IJeecgDemoService jeecgDemoService; private IJeecgDemoService jeecgDemoService;
// @Resource @Resource
// private ISysDataLogService sysDataLogService; private ISysDataLogService sysDataLogService;
// @Resource @Resource
// private MockController mock; private MockController mock;
//
// @Test @Test
// public void testSelect() { public void testSelect() {
// System.out.println(("----- selectAll method test ------")); System.out.println(("----- selectAll method test ------"));
// List<JeecgDemo> userList = jeecgDemoMapper.selectList(null); List<JeecgDemo> userList = jeecgDemoMapper.selectList(null);
// Assert.assertEquals(5, userList.size()); Assert.assertEquals(5, userList.size());
// userList.forEach(System.out::println); userList.forEach(System.out::println);
// } }
//
// @Test @Test
// public void testXmlSql() { public void testXmlSql() {
// System.out.println(("----- selectAll method test ------")); System.out.println(("----- selectAll method test ------"));
// List<JeecgDemo> userList = jeecgDemoMapper.getDemoByName("Sandy12"); List<JeecgDemo> userList = jeecgDemoMapper.getDemoByName("Sandy12");
// userList.forEach(System.out::println); userList.forEach(System.out::println);
// } }
//
// /** /**
// * 测试事务 *
// */ */
// @Test @Test
// public void testTran() { public void testTran() {
// jeecgDemoService.testTran(); jeecgDemoService.testTran();
// } }
//
// /** /**
// * 测试数据日志添加 *
// */ */
// @Test @Test
// public void testDataLogSave() { public void testDataLogSave() {
// System.out.println(("----- datalog test ------")); System.out.println(("----- datalog test ------"));
// String tableName = "jeecg_demo"; String tableName = "jeecg_demo";
// String dataId = "4028ef81550c1a7901550c1cd6e70001"; String dataId = "4028ef81550c1a7901550c1cd6e70001";
// String dataContent = mock.sysDataLogJson(); String dataContent = mock.sysDataLogJson();
// sysDataLogService.addDataLog(tableName, dataId, dataContent); sysDataLogService.addDataLog(tableName, dataId, dataContent);
// } }
//}
@Autowired
ITtSulfEquipService ttSulfEquipService;
@Test
public void test01() {
LambdaQueryWrapper<TtSulfEquip> lqw = new LambdaQueryWrapper<>();
lqw.ge(TtSulfEquip::getCreateTime, new Date());
lqw.eq(TtSulfEquip::getEqtNo, 31);
List<TtSulfEquip> list = ttSulfEquipService.list(lqw);
System.out.println(list);
}
}

@ -26,7 +26,7 @@ public class SysUserTest {
/** /**
* 使 * 使
*/ */
private final String BASE_URL = "http://localhost:8080/jeecg-boot/sys/user/"; private final String BASE_URL = "http://localhost:8091/jeecg-boot/sys/user/";
//测试:用户名和密码 //测试:用户名和密码
private final String USERNAME = "admin"; private final String USERNAME = "admin";
private final String PASSWORD = "123456"; private final String PASSWORD = "123456";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save