Browse Source

新增设备实时属性列表

dkk 3 months ago
parent
commit
5479353540

+ 17 - 1
src/main/java/com/jeesite/modules/mes/web/MesMaterialReportController.java

@@ -47,10 +47,26 @@ public class MesMaterialReportController extends BaseController {
 	private MesMaterialService mesMaterialService;
 	/**
 	 * 获取数据
+	 * 注意:不能使用默认的 mesMaterialReportService.get(id, isNewRecord),
+	 * 因为实体的 @JoinTable 与 mes_material_check_record 为一对多关系,
+	 * 当一个来料码存在多条检查记录时,selectOne() 会抛出 TooManyResultsException。
+	 * 这里改用 selectById(仅关联 mes_material,一对一),避免该问题。
 	 */
 	@ModelAttribute
 	public MesMaterialReport get(String id, boolean isNewRecord) {
-		return mesMaterialReportService.get(id, isNewRecord);
+		if (StringUtils.isBlank(id)) {
+			MesMaterialReport report = new MesMaterialReport();
+			report.setIsNewRecord(true);
+			return report;
+		}
+		MesMaterialReport query = new MesMaterialReport();
+		query.setId(id);
+		MesMaterialReport report = mesMaterialReportService.selectById(query);
+		if (report == null) {
+			report = new MesMaterialReport();
+			report.setIsNewRecord(true);
+		}
+		return report;
 	}
 	
 	/**

+ 29 - 0
src/main/java/com/jeesite/modules/tianHong/dao/MachineAttrStateDao.java

@@ -0,0 +1,29 @@
+package com.jeesite.modules.tianHong.dao;
+
+import java.util.List;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.tianHong.entity.MachineAttrState;
+
+/**
+ * 设备实时属性DAO接口
+ * 所属包路径 com.jeesite.modules.tianHong.dao 自动映射到 tianHong 数据源(bzh 库)
+ * @author ljr
+ * @version 2026-07-07
+ */
+@MyBatisDao
+public interface MachineAttrStateDao extends CrudDao<MachineAttrState> {
+
+	/**
+	 * 查询设备实时属性聚合列表(按 eqp_id 聚合,关联温度/压力/电量表)
+	 */
+	@Override
+	List<MachineAttrState> findList(MachineAttrState machineAttrState);
+
+	/**
+	 * 查询指定设备的所有属性明细(用于详情展示,包括 64 通道冷却参数等)
+	 */
+	List<MachineAttrState> findAttrList(MachineAttrState machineAttrState);
+
+}

+ 258 - 0
src/main/java/com/jeesite/modules/tianHong/entity/MachineAttrState.java

@@ -0,0 +1,258 @@
+package com.jeesite.modules.tianHong.entity;
+
+import java.util.Date;
+import java.util.List;
+
+import com.jeesite.common.entity.DataEntity;
+
+/**
+ * 设备实时属性Entity
+ * 对应 bzh 库 machine_attr_state 表,关联 crutempstate、alutempstate、mouldtempstate、pressurestate、EleConsumeState
+ * @author ljr
+ * @version 2026-07-07
+ */
+public class MachineAttrState extends DataEntity<MachineAttrState> {
+
+	private static final long serialVersionUID = 1L;
+
+	// ===== machine_attr_state 主表字段(按 eqp_id 聚合,行转列取关键属性)=====
+	private String eqpId;				// 设备号
+	private String aluVal;				// 剩余模次(attr='alu_val')
+	private String pressurizeTime;		// 保压时间(attr='pressurizeTime')
+	private String coolingTime;			// 冷却时间(attr='coolingTime')
+	private String prePres;				// 预压压力设定(attr='PrePres')
+	private String holdPressure;		// 保压开始信号(attr='HoldPressure')
+	private String moldFillingPre;		// 充型压力(attr='moldFillingPre')
+	private Date attrEventTime;			// machine_attr_state 最后更新时间
+
+	// ===== 关联表:crutempstate 炉膛温度 =====
+	private String cruTemp;				// 炉膛温度
+	private Date cruTempTime;			// 炉膛温度时间
+
+	// ===== 关联表:alutempstate 铝水温度 =====
+	private String aluTemp;				// 铝水温度
+	private Date aluTempTime;			// 铝水温度时间
+
+	// ===== 关联表:mouldtempstate 模具温度(一个设备可能多个测温点,拼接展示)=====
+	private String mouldInfo;			// 模具温度信息(如 "M1:725.5, M2:730.2")
+	private Date mouldTempTime;			// 模具温度时间
+
+	// ===== 关联表:pressurestate 压力(理论压力与实际压力)=====
+	private String theoryPressure;		// 理论压力
+	private String realPressure;		// 实际压力
+	private String pressureLevel;		// 压力段位
+	private Date pressureTime;			// 压力时间
+
+	// ===== 关联表:EleConsumeState 电量(总计)=====
+	private String eleConsume;			// 电量
+	private Date eleConsumeTime;		// 电量时间
+
+	// ===== 详情:该设备的所有属性记录列表 =====
+	private List<MachineAttrState> attrList;
+
+	public MachineAttrState() {
+		this(null);
+	}
+
+	public MachineAttrState(String id) {
+		super(id);
+	}
+
+	public String getEqpId() {
+		return eqpId;
+	}
+
+	public void setEqpId(String eqpId) {
+		this.eqpId = eqpId;
+	}
+
+	public String getAluVal() {
+		return aluVal;
+	}
+
+	public void setAluVal(String aluVal) {
+		this.aluVal = aluVal;
+	}
+
+	public String getPressurizeTime() {
+		return pressurizeTime;
+	}
+
+	public void setPressurizeTime(String pressurizeTime) {
+		this.pressurizeTime = pressurizeTime;
+	}
+
+	public String getCoolingTime() {
+		return coolingTime;
+	}
+
+	public void setCoolingTime(String coolingTime) {
+		this.coolingTime = coolingTime;
+	}
+
+	public String getPrePres() {
+		return prePres;
+	}
+
+	public void setPrePres(String prePres) {
+		this.prePres = prePres;
+	}
+
+	public String getHoldPressure() {
+		return holdPressure;
+	}
+
+	public void setHoldPressure(String holdPressure) {
+		this.holdPressure = holdPressure;
+	}
+
+	public String getMoldFillingPre() {
+		return moldFillingPre;
+	}
+
+	public void setMoldFillingPre(String moldFillingPre) {
+		this.moldFillingPre = moldFillingPre;
+	}
+
+	public Date getAttrEventTime() {
+		return attrEventTime;
+	}
+
+	public void setAttrEventTime(Date attrEventTime) {
+		this.attrEventTime = attrEventTime;
+	}
+
+	public String getCruTemp() {
+		return cruTemp;
+	}
+
+	public void setCruTemp(String cruTemp) {
+		this.cruTemp = cruTemp;
+	}
+
+	public Date getCruTempTime() {
+		return cruTempTime;
+	}
+
+	public void setCruTempTime(Date cruTempTime) {
+		this.cruTempTime = cruTempTime;
+	}
+
+	public String getAluTemp() {
+		return aluTemp;
+	}
+
+	public void setAluTemp(String aluTemp) {
+		this.aluTemp = aluTemp;
+	}
+
+	public Date getAluTempTime() {
+		return aluTempTime;
+	}
+
+	public void setAluTempTime(Date aluTempTime) {
+		this.aluTempTime = aluTempTime;
+	}
+
+	public String getMouldInfo() {
+		return mouldInfo;
+	}
+
+	public void setMouldInfo(String mouldInfo) {
+		this.mouldInfo = mouldInfo;
+	}
+
+	public Date getMouldTempTime() {
+		return mouldTempTime;
+	}
+
+	public void setMouldTempTime(Date mouldTempTime) {
+		this.mouldTempTime = mouldTempTime;
+	}
+
+	public String getTheoryPressure() {
+		return theoryPressure;
+	}
+
+	public void setTheoryPressure(String theoryPressure) {
+		this.theoryPressure = theoryPressure;
+	}
+
+	public String getRealPressure() {
+		return realPressure;
+	}
+
+	public void setRealPressure(String realPressure) {
+		this.realPressure = realPressure;
+	}
+
+	public String getPressureLevel() {
+		return pressureLevel;
+	}
+
+	public void setPressureLevel(String pressureLevel) {
+		this.pressureLevel = pressureLevel;
+	}
+
+	public Date getPressureTime() {
+		return pressureTime;
+	}
+
+	public void setPressureTime(Date pressureTime) {
+		this.pressureTime = pressureTime;
+	}
+
+	public String getEleConsume() {
+		return eleConsume;
+	}
+
+	public void setEleConsume(String eleConsume) {
+		this.eleConsume = eleConsume;
+	}
+
+	public Date getEleConsumeTime() {
+		return eleConsumeTime;
+	}
+
+	public void setEleConsumeTime(Date eleConsumeTime) {
+		this.eleConsumeTime = eleConsumeTime;
+	}
+
+	public List<MachineAttrState> getAttrList() {
+		return attrList;
+	}
+
+	public void setAttrList(List<MachineAttrState> attrList) {
+		this.attrList = attrList;
+	}
+
+	// 用于行转列详情的 attr 字段(详情查询时使用)
+	private String attr;
+	private String val;
+	private Date eventTime;
+
+	public String getAttr() {
+		return attr;
+	}
+
+	public void setAttr(String attr) {
+		this.attr = attr;
+	}
+
+	public String getVal() {
+		return val;
+	}
+
+	public void setVal(String val) {
+		this.val = val;
+	}
+
+	public Date getEventTime() {
+		return eventTime;
+	}
+
+	public void setEventTime(Date eventTime) {
+		this.eventTime = eventTime;
+	}
+
+}

+ 75 - 0
src/main/java/com/jeesite/modules/tianHong/service/MachineAttrStateService.java

@@ -0,0 +1,75 @@
+package com.jeesite.modules.tianHong.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.tianHong.dao.MachineAttrStateDao;
+import com.jeesite.modules.tianHong.entity.MachineAttrState;
+
+/**
+ * 设备实时属性Service
+ * @author ljr
+ * @version 2026-07-07
+ */
+@Service
+@Transactional(readOnly = true)
+public class MachineAttrStateService extends CrudService<MachineAttrStateDao, MachineAttrState> {
+
+	@Autowired
+	private MachineAttrStateDao machineAttrStateDao;
+
+	/**
+	 * 查询分页数据(按 eqp_id 聚合)
+	 * 重写以使用自定义 SQL(实体无 @Table 注解,框架默认 findCount 不可用)
+	 */
+	@Override
+	public Page<MachineAttrState> findPage(MachineAttrState machineAttrState) {
+		Page<MachineAttrState> page = machineAttrState.getPage();
+		if (page == null) {
+			page = new Page<>();
+		}
+		List<MachineAttrState> list = machineAttrStateDao.findList(machineAttrState);
+		page.setList(list);
+		// 列表数据量不大(按 eqp_id 聚合,设备数有限),count 直接使用 list 大小
+		page.setCount(list.size());
+		return page;
+	}
+
+	/**
+	 * 查询列表数据(按 eqp_id 聚合)
+	 */
+	@Override
+	public List<MachineAttrState> findList(MachineAttrState machineAttrState) {
+		return machineAttrStateDao.findList(machineAttrState);
+	}
+
+	/**
+	 * 查询指定设备的所有属性明细(用于详情展示)
+	 */
+	public List<MachineAttrState> findAttrList(MachineAttrState machineAttrState) {
+		return machineAttrStateDao.findAttrList(machineAttrState);
+	}
+
+	/**
+	 * 获取单条数据(按 eqp_id 查询,包含所有属性明细)
+	 */
+	@Override
+	public MachineAttrState get(MachineAttrState machineAttrState) {
+		List<MachineAttrState> list = machineAttrStateDao.findList(machineAttrState);
+		if (list != null && !list.isEmpty()) {
+			MachineAttrState entity = list.get(0);
+			MachineAttrState queryParam = new MachineAttrState();
+			queryParam.setEqpId(entity.getEqpId());
+			entity.setAttrList(machineAttrStateDao.findAttrList(queryParam));
+			return entity;
+		}
+		return null;
+	}
+
+}
+

+ 99 - 0
src/main/java/com/jeesite/modules/tianHong/web/MachineAttrStateController.java

@@ -0,0 +1,99 @@
+package com.jeesite.modules.tianHong.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.tianHong.entity.MachineAttrState;
+import com.jeesite.modules.tianHong.service.MachineAttrStateService;
+
+/**
+ * 设备实时属性Controller
+ * 对应 bzh 库 machine_attr_state 表,关联温度/压力/电量等实时表
+ * @author ljr
+ * @version 2026-07-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/tianHong/machineAttrState")
+public class MachineAttrStateController extends BaseController {
+
+	@Autowired
+	private MachineAttrStateService machineAttrStateService;
+
+	/**
+	 * 获取数据
+	 * @param id 设备号(eqp_id),仅 form 表单请求时传入
+	 */
+	@ModelAttribute
+	public MachineAttrState get(String id, boolean isNewRecord) {
+		// listData 等列表请求不传 id,直接返回空对象,避免在 @ModelAttribute 阶段执行不必要的查询
+		if (isNewRecord || id == null || id.isEmpty()) {
+			return new MachineAttrState();
+		}
+		MachineAttrState query = new MachineAttrState();
+		query.setEqpId(id);
+		MachineAttrState entity = machineAttrStateService.get(query);
+		if (entity == null) {
+			entity = new MachineAttrState();
+			entity.setEqpId(id);
+		}
+		return entity;
+	}
+
+	/**
+	 * 查询列表页面
+	 */
+	@RequiresPermissions("tianHong:machineAttrState:view")
+	@RequestMapping(value = { "list", "" })
+	public String list(MachineAttrState machineAttrState, Model model) {
+		model.addAttribute("machineAttrState", machineAttrState);
+		return "modules/tianHong/machineAttrStateList";
+	}
+
+	/**
+	 * 查询列表数据(按 eqp_id 聚合)
+	 */
+	@RequiresPermissions("tianHong:machineAttrState:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MachineAttrState> listData(MachineAttrState machineAttrState, HttpServletRequest request,
+			HttpServletResponse response) {
+		machineAttrState.setPage(new Page<>(request, response));
+		Page<MachineAttrState> page = machineAttrStateService.findPage(machineAttrState);
+		return page;
+	}
+
+	/**
+	 * 查询指定设备的所有属性明细(用于详情模态框)
+	 */
+	@RequiresPermissions("tianHong:machineAttrState:view")
+	@RequestMapping(value = "attrListData")
+	@ResponseBody
+	public List<MachineAttrState> attrListData(String eqpId) {
+		MachineAttrState query = new MachineAttrState();
+		query.setEqpId(eqpId);
+		return machineAttrStateService.findAttrList(query);
+	}
+
+	/**
+	 * 查看详情页面
+	 */
+	@RequiresPermissions("tianHong:machineAttrState:view")
+	@RequestMapping(value = "form")
+	public String form(MachineAttrState machineAttrState, Model model) {
+		model.addAttribute("machineAttrState", machineAttrState);
+		return "modules/tianHong/machineAttrStateForm";
+	}
+
+}

+ 101 - 0
src/main/resources/mappings/modules/tianHong/MachineAttrStateDao.xml

@@ -0,0 +1,101 @@
+<?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">
+<mapper namespace="com.jeesite.modules.tianHong.dao.MachineAttrStateDao">
+
+	<!-- 设备实时属性聚合查询(按 eqp_id 聚合,关联温度/压力/电量表) -->
+	<select id="findList" resultType="com.jeesite.modules.tianHong.entity.MachineAttrState">
+		SELECT
+			t.eqp_id AS "eqpId",
+			t.eqp_id AS "id",
+			t.alu_val AS "aluVal",
+			t.pressurizeTime AS "pressurizeTime",
+			t.coolingTime AS "coolingTime",
+			t.PrePres AS "prePres",
+			t.HoldPressure AS "holdPressure",
+			t.moldFillingPre AS "moldFillingPre",
+			t.attr_event_time AS "attrEventTime",
+			c.Value AS "cruTemp",
+			c.EventTime AS "cruTempTime",
+			a.Value AS "aluTemp",
+			a.EventTime AS "aluTempTime",
+			mt.mould_info AS "mouldInfo",
+			mt.mould_temp_time AS "mouldTempTime",
+			p.TheoryValue AS "theoryPressure",
+			p.RealValue AS "realPressure",
+			p.LevelID AS "pressureLevel",
+			p.EventTime AS "pressureTime",
+			e.Value AS "eleConsume",
+			e.EventTime AS "eleConsumeTime"
+		FROM (
+			SELECT
+				m.eqp_id,
+				MAX(CASE WHEN m.attr = 'alu_val' THEN m.val END) AS alu_val,
+				MAX(CASE WHEN m.attr = 'pressurizeTime' THEN m.val END) AS pressurizeTime,
+				MAX(CASE WHEN m.attr = 'coolingTime' THEN m.val END) AS coolingTime,
+				MAX(CASE WHEN m.attr = 'PrePres' THEN m.val END) AS PrePres,
+				MAX(CASE WHEN m.attr = 'HoldPressure' THEN m.val END) AS HoldPressure,
+				MAX(CASE WHEN m.attr = 'moldFillingPre' THEN m.val END) AS moldFillingPre,
+				MAX(m.event_time) AS attr_event_time
+			FROM machine_attr_state m
+			<where>
+				<if test="eqpId != null and eqpId != ''">
+					AND m.eqp_id = #{eqpId}
+				</if>
+			</where>
+			GROUP BY m.eqp_id
+		) t
+		LEFT JOIN crutempstate c ON c.EQP_ID = t.eqp_id
+		LEFT JOIN alutempstate a ON a.EQP_ID = t.eqp_id
+		LEFT JOIN (
+			SELECT
+				EQP_ID,
+				GROUP_CONCAT(CONCAT(MouldID, ':', Value) ORDER BY MouldID SEPARATOR ', ') AS mould_info,
+				MAX(EventTime) AS mould_temp_time
+			FROM mouldtempstate
+			GROUP BY EQP_ID
+		) mt ON mt.EQP_ID = t.eqp_id
+		LEFT JOIN (
+			SELECT
+				t1.EQP_ID, t1.SpecID, t1.LevelID, t1.EventTime, t1.TheoryValue, t1.RealValue
+			FROM pressurestate t1
+			INNER JOIN (
+				SELECT EQP_ID, MAX(EventTime) AS max_time
+				FROM pressurestate
+				GROUP BY EQP_ID
+			) t2 ON t1.EQP_ID = t2.EQP_ID AND t1.EventTime = t2.max_time
+		) p ON p.EQP_ID = t.eqp_id
+		LEFT JOIN (
+			SELECT
+				t1.EQP_ID, t1.EventTime, t1.Value
+			FROM EleConsumeState t1
+			INNER JOIN (
+				SELECT EQP_ID, MAX(EventTime) AS max_time
+				FROM EleConsumeState
+				GROUP BY EQP_ID
+			) t2 ON t1.EQP_ID = t2.EQP_ID AND t1.EventTime = t2.max_time
+		) e ON e.EQP_ID = t.eqp_id
+		<where>
+			<if test="eqpId != null and eqpId != ''">
+				AND t.eqp_id = #{eqpId}
+			</if>
+		</where>
+		ORDER BY t.eqp_id
+	</select>
+
+	<!-- 查询指定设备的所有属性明细(用于详情展示,包括 64 通道冷却参数等) -->
+	<select id="findAttrList" resultType="com.jeesite.modules.tianHong.entity.MachineAttrState">
+		SELECT
+			eqp_id AS "eqpId",
+			attr AS "attr",
+			val AS "val",
+			event_time AS "eventTime"
+		FROM machine_attr_state
+		<where>
+			<if test="eqpId != null and eqpId != ''">
+				AND eqp_id = #{eqpId}
+			</if>
+		</where>
+		ORDER BY attr
+	</select>
+
+</mapper>

+ 1 - 1
src/main/resources/views/modules/mes/mesMaterialReportList.html

@@ -75,7 +75,7 @@ $('#dataGrid').dataGrid({
 	searchForm: $("#searchForm"),
 	columnModel: [
 		{header:'${text("来料码")}', name:'sn', index:'a.sn', width:250, align:"center",frozen:true,},
-		{header:'${text("产品名称")}', name:'productName', index:'d.title', width:150, align:"center"},
+		{header:'${text("产品名称")}', name:'title', index:'d.title', width:150, align:"center"},
 		{header:'${text("到货日期")}', name:'faDate', index:'a.fa_date', width:120, align:"center"},
 		{header:'${text("到货数量")}', name:'faNums', index:'a.fa_nums', width:100, align:"center"},
 		{header:'${text("实际确认数量")}', name:'nums', index:'a.nums', width:100, align:"center"},

+ 111 - 0
src/main/resources/views/modules/tianHong/machineAttrStateForm.html

@@ -0,0 +1,111 @@
+<% layout('/layouts/default.html', {title: '设备实时属性详情', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-notebook"></i> ${text('设备实时属性详情')}
+			</div>
+			<div class="box-tools pull-right">
+				<a href="#" class="btn btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply"></i> ${text('返回')}</a>
+			</div>
+		</div>
+		<div class="box-body">
+			<form id="inputForm" class="form-horizontal">
+<!--				<h4 class="form-header">${text('基础信息')}</h4>-->
+<!--				<table class="table table-bordered table-condensed" style="margin-bottom:10px;">-->
+<!--					<tbody>-->
+<!--						<tr>-->
+<!--							<td class="col-xs-1 active"><b>${text('设备号')}</b></td>-->
+<!--							<td class="col-xs-2">${machineAttrState.eqpId!}</td>-->
+<!--							<td class="col-xs-1 active"><b>${text('属性更新时间')}</b></td>-->
+<!--							<td class="col-xs-2">${machineAttrState.attrEventTime!, 'yyyy-MM-dd HH:mm:ss'}</td>-->
+<!--							<td class="col-xs-1 active"><b>${text('炉膛温度(℃)')}</b></td>-->
+<!--							<td class="col-xs-1">${machineAttrState.cruTemp!}</td>-->
+<!--							<td class="col-xs-1 active"><b>${text('铝水温度(℃)')}</b></td>-->
+<!--							<td class="col-xs-1">${machineAttrState.aluTemp!}</td>-->
+<!--						</tr>-->
+<!--						<tr>-->
+<!--							<td class="active"><b>${text('模具温度(℃)')}</b></td>-->
+<!--							<td>${machineAttrState.mouldInfo!}</td>-->
+<!--							<td class="active"><b>${text('理论压力')}</b></td>-->
+<!--							<td>${machineAttrState.theoryPressure!}</td>-->
+<!--							<td class="active"><b>${text('实际压力')}</b></td>-->
+<!--							<td>${machineAttrState.realPressure!}</td>-->
+<!--							<td class="active"><b>${text('压力段位')}</b></td>-->
+<!--							<td>${machineAttrState.pressureLevel!}</td>-->
+<!--						</tr>-->
+<!--						<tr>-->
+<!--							<td class="active"><b>${text('电量总计')}</b></td>-->
+<!--							<td>${machineAttrState.eleConsume!}</td>-->
+<!--							<td class="active"><b>${text('剩余模次')}</b></td>-->
+<!--							<td>${machineAttrState.aluVal!}</td>-->
+<!--							<td class="active"><b>${text('保压时间')}</b></td>-->
+<!--							<td>${machineAttrState.pressurizeTime!}</td>-->
+<!--							<td class="active"><b>${text('冷却时间')}</b></td>-->
+<!--							<td>${machineAttrState.coolingTime!}</td>-->
+<!--						</tr>-->
+<!--						<tr>-->
+<!--							<td class="active"><b>${text('预压压力设定')}</b></td>-->
+<!--							<td>${machineAttrState.prePres!}</td>-->
+<!--							<td class="active"><b>${text('保压开始信号')}</b></td>-->
+<!--							<td>${machineAttrState.holdPressure!}</td>-->
+<!--							<td class="active"><b>${text('充型压力')}</b></td>-->
+<!--							<td>${machineAttrState.moldFillingPre!}</td>-->
+<!--							<td></td>-->
+<!--							<td></td>-->
+<!--						</tr>-->
+<!--					</tbody>-->
+<!--				</table>-->
+
+				<h4 class="form-header">${text('属性明细列表')}</h4>
+				<table id="attrDataGrid"></table>
+			</form>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+// 属性字段 -> 中文属性名 映射(含通配规则)
+var attrNameMap = {
+	'alu_val': '剩余模次',
+	'pressurizeTime': '保压时间',
+	'coolingTime': '冷却时间',
+	'PrePres': '预压压力设定',
+	'HoldPressure': '保压开始信号',
+	'moldFillingPre': '各段压力(冲型压力)'
+};
+var attrNameRules = [
+	{re:/^COOL_FLOW_(\d+)$/, name:function(m){ return '冷却流量['+m[1]+']'; }},
+	{re:/^f_stTime_(\d+)$/,  name:function(m){ return '风冷等待时间['+m[1]+']'; }},
+	{re:/^f_coolingTime_(\d+)$/, name:function(m){ return '风冷开启时间['+m[1]+']'; }},
+	{re:/^s_stTime_(\d+)$/,  name:function(m){ return '水冷等待时间['+m[1]+']'; }},
+	{re:/^s_coolingTime_(\d+)$/, name:function(m){ return '水冷开启时间['+m[1]+']'; }},
+	{re:/^F_SWITCH_(\d+)$/,  name:function(m){ return '风冷控制开关['+m[1]+']'; }},
+	{re:/^W_SWITCH_(\d+)$/,  name:function(m){ return '水冷控制开关['+m[1]+']'; }}
+];
+function getAttrCnName(attr){
+	if(attr == null) return '';
+	if(attrNameMap[attr] != null) return attrNameMap[attr];
+	for(var i=0; i<attrNameRules.length; i++){
+		var m = attr.match(attrNameRules[i].re);
+		if(m){ return attrNameRules[i].name(m); }
+	}
+	return attr;
+}
+
+$('#attrDataGrid').dataGrid({
+	data: ${toJson(machineAttrState.attrList)!'[]'},
+	datatype: "local", // 设置本地数据,避免 dataGrid 走 ajax 加载校验 searchForm/url
+	columnModel: [
+		{header:'${text("属性名")}', name:'attrCnName', width:220, align:"center", formatter:function(val, obj, row, act){
+			return getAttrCnName(js.val(row,'attr'));
+		}},
+		{header:'${text("属性字段")}', name:'attr', width:220, align:"center"},
+		{header:'${text("属性值")}', name:'val', width:200, align:"center"},
+		{header:'${text("更新时间")}', name:'eventTime', width:180, align:"center"}
+	],
+	showRownum: true,
+	// 固定显示10条数据的高度,扩大属性明细列表的显示面积
+	autoGridHeight: function(){ return 540; }
+});
+</script>

+ 69 - 0
src/main/resources/views/modules/tianHong/machineAttrStateList.html

@@ -0,0 +1,69 @@
+<% layout('/layouts/default.html', {title: '设备实时属性', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header">
+			<div class="box-title">
+				<i class="fa icon-notebook"></i> ${text('设备实时属性')}
+			</div>
+			<div class="box-tools pull-right">
+				<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
+				<a href="#" class="btn btn-default" id="btnRefresh" title="${text('刷新')}"><i class="fa fa-refresh"></i> ${text('刷新')}</a>
+				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
+			</div>
+		</div>
+		<div class="box-body">
+			<#form:form id="searchForm" model="${machineAttrState}" action="${ctx}/tianHong/machineAttrState/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<div class="form-group">
+					<label class="control-label">${text('设备号')}:</label>
+					<div class="control-inline">
+						<#form:input path="eqpId" maxlength="40" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
+					<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
+				</div>
+			</#form:form>
+			<table id="dataGrid"></table>
+			<div id="dataGridPage"></div>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+// 初始化DataGrid对象
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("设备号")}', name:'eqpId', index:'t.eqp_id', width:120, align:"center", frozen:true},
+		{header:'${text("炉膛温度(℃)")}', name:'cruTemp', index:'c.Value', width:110, align:"center"},
+		{header:'${text("铝水温度(℃)")}', name:'aluTemp', index:'a.Value', width:110, align:"center"},
+		{header:'${text("模具温度(℃)")}', name:'mouldInfo', index:'mt.mould_info', width:200, align:"center"},
+		{header:'${text("理论压力")}', name:'theoryPressure', index:'p.TheoryValue', width:100, align:"center"},
+		{header:'${text("实际压力")}', name:'realPressure', index:'p.RealValue', width:100, align:"center"},
+		{header:'${text("压力段位")}', name:'pressureLevel', index:'p.LevelID', width:90, align:"center"},
+		{header:'${text("电量总计")}', name:'eleConsume', index:'e.Value', width:110, align:"center"},
+		{header:'${text("剩余模次")}', name:'aluVal', width:90, align:"center"},
+		{header:'${text("保压时间")}', name:'pressurizeTime', width:90, align:"center"},
+		{header:'${text("冷却时间")}', name:'coolingTime', width:90, align:"center"},
+		{header:'${text("预压压力设定")}', name:'prePres', width:110, align:"center"},
+		{header:'${text("保压开始信号")}', name:'holdPressure', width:110, align:"center"},
+		{header:'${text("充型压力")}', name:'moldFillingPre', width:100, align:"center"},
+		{header:'${text("属性更新时间")}', name:'attrEventTime', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:120, align:"center", formatter: function(val, obj, row, act){
+			var actions = [];
+			actions.push('<a href="${ctx}/tianHong/machineAttrState/form?id='+js.val(row,'eqpId')+'" class="addTabPage" data-title="${text("设备属性明细")}"><i class="fa fa-list"></i> ${text("属性明细")}</a>&nbsp;');
+			return actions.join('');
+		}}
+	],
+	// 加载成功后执行事件
+	ajaxSuccess: function(data){
+	}
+});
+
+// 刷新按钮
+$('#btnRefresh').click(function(){
+	$('#dataGrid').dataGrid('refresh');
+});
+</script>