Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

hbx 3 gün önce
ebeveyn
işleme
b470559962

+ 19 - 0
db/mes_check_config.sql

@@ -0,0 +1,19 @@
+-- 二次判定配置表(气密及其他工序通用)
+CREATE TABLE IF NOT EXISTS `mes_check_config` (
+  `id` varchar(64) NOT NULL COMMENT '主键',
+  `oprno` varchar(20) DEFAULT NULL COMMENT '工位号,如 OP230',
+  `check_key` varchar(64) DEFAULT NULL COMMENT '校验键名,需与上传字段一致,如 testPressure/leakVal',
+  `check_name` varchar(100) DEFAULT NULL COMMENT '校验项名称',
+  `min_val` varchar(50) DEFAULT NULL COMMENT '最小值,空表示不限下限',
+  `max_val` varchar(50) DEFAULT NULL COMMENT '最大值,空表示不限上限',
+  `enable_flag` char(1) DEFAULT '1' COMMENT '是否启用:1是 0否',
+  `remarks` varchar(500) DEFAULT NULL COMMENT '备注',
+  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1删除 2停用)',
+  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
+  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
+  `update_date` datetime DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_check_oprno` (`oprno`),
+  KEY `idx_check_enable` (`enable_flag`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二次判定配置';

+ 25 - 0
db/mes_timeout_config.sql

@@ -0,0 +1,25 @@
+-- 工位标准工时/超时配置(提交结果时按 mes_device_time 校验)
+CREATE TABLE IF NOT EXISTS `mes_timeout_config` (
+  `id` varchar(64) NOT NULL COMMENT '主键',
+  `oprno` varchar(20) DEFAULT NULL COMMENT '工位号',
+  `max_seconds` int DEFAULT NULL COMMENT '最大加工时间(秒)',
+  `enable_flag` char(1) DEFAULT '1' COMMENT '是否启用:1是 0否',
+  `remarks` varchar(500) DEFAULT NULL COMMENT '备注',
+  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1删除 2停用)',
+  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
+  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
+  `update_date` datetime DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_timeout_oprno` (`oprno`),
+  KEY `idx_timeout_enable` (`enable_flag`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工位超时配置';
+
+-- 示例:
+-- INSERT INTO mes_timeout_config(id, oprno, max_seconds, enable_flag, status, create_date, update_date)
+-- VALUES (REPLACE(UUID(),'-',''), 'OP060', 300, '1', '0', NOW(), NOW());
+
+-- 菜单:
+-- 名称:工位超时配置
+-- 链接:/mes/mesTimeoutConfig/list
+-- 权限:mes:mesTimeoutConfig:view 、 mes:mesTimeoutConfig:edit

+ 14 - 0
src/main/java/com/jeesite/modules/mes/dao/MesCheckConfigDao.java

@@ -0,0 +1,14 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesCheckConfig;
+
+/**
+ * 二次判定配置DAO接口
+ * @author mes
+ * @version 2026-10-30
+ */
+@MyBatisDao
+public interface MesCheckConfigDao extends CrudDao<MesCheckConfig> {
+}

+ 14 - 0
src/main/java/com/jeesite/modules/mes/dao/MesTimeoutConfigDao.java

@@ -0,0 +1,14 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesTimeoutConfig;
+
+/**
+ * 工位超时配置DAO接口
+ * @author mes
+ * @version 2026-10-30
+ */
+@MyBatisDao
+public interface MesTimeoutConfigDao extends CrudDao<MesTimeoutConfig> {
+}

+ 108 - 0
src/main/java/com/jeesite/modules/mes/entity/MesCheckConfig.java

@@ -0,0 +1,108 @@
+package com.jeesite.modules.mes.entity;
+
+import javax.validation.constraints.Size;
+
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+
+/**
+ * 二次判定配置Entity(按工位配置参数校验项,可用于气密及其他工序)
+ * @author mes
+ * @version 2026-10-30
+ */
+@Table(name="mes_check_config", alias="a", label="二次判定配置", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="oprno", attrName="oprno", label="工位号", queryType=QueryType.LIKE),
+		@Column(name="check_key", attrName="checkKey", label="校验键名"),
+		@Column(name="check_name", attrName="checkName", label="校验项名称", queryType=QueryType.LIKE),
+		@Column(name="min_val", attrName="minVal", label="最小值"),
+		@Column(name="max_val", attrName="maxVal", label="最大值"),
+		@Column(name="enable_flag", attrName="enableFlag", label="是否启用"),
+		@Column(name="remarks", attrName="remarks", label="备注", queryType=QueryType.LIKE),
+		@Column(name="status", attrName="status", label="状态", isUpdate=true),
+		@Column(name="create_by", attrName="createBy", label="创建人", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建日期", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="更新人", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新日期", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.oprno ASC, a.check_key ASC"
+)
+public class MesCheckConfig extends DataEntity<MesCheckConfig> {
+
+	private static final long serialVersionUID = 1L;
+
+	/** 启用 */
+	public static final String ENABLE_YES = "1";
+	/** 未启用 */
+	public static final String ENABLE_NO = "0";
+
+	private String oprno;
+	private String checkKey;
+	private String checkName;
+	private String minVal;
+	private String maxVal;
+	private String enableFlag;
+
+	public MesCheckConfig() {
+		this(null);
+	}
+
+	public MesCheckConfig(String id) {
+		super(id);
+	}
+
+	@Size(min=0, max=20, message="工位号长度不能超过 20 个字符")
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	@Size(min=0, max=64, message="校验键名长度不能超过 64 个字符")
+	public String getCheckKey() {
+		return checkKey;
+	}
+
+	public void setCheckKey(String checkKey) {
+		this.checkKey = checkKey;
+	}
+
+	@Size(min=0, max=100, message="校验项名称长度不能超过 100 个字符")
+	public String getCheckName() {
+		return checkName;
+	}
+
+	public void setCheckName(String checkName) {
+		this.checkName = checkName;
+	}
+
+	@Size(min=0, max=50, message="最小值长度不能超过 50 个字符")
+	public String getMinVal() {
+		return minVal;
+	}
+
+	public void setMinVal(String minVal) {
+		this.minVal = minVal;
+	}
+
+	@Size(min=0, max=50, message="最大值长度不能超过 50 个字符")
+	public String getMaxVal() {
+		return maxVal;
+	}
+
+	public void setMaxVal(String maxVal) {
+		this.maxVal = maxVal;
+	}
+
+	@Size(min=0, max=1, message="是否启用长度不能超过 1 个字符")
+	public String getEnableFlag() {
+		return enableFlag;
+	}
+
+	public void setEnableFlag(String enableFlag) {
+		this.enableFlag = enableFlag;
+	}
+}

+ 72 - 0
src/main/java/com/jeesite/modules/mes/entity/MesTimeoutConfig.java

@@ -0,0 +1,72 @@
+package com.jeesite.modules.mes.entity;
+
+import javax.validation.constraints.Size;
+
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+
+/**
+ * 工位标准工时/超时配置Entity
+ * @author mes
+ * @version 2026-10-30
+ */
+@Table(name="mes_timeout_config", alias="a", label="工位超时配置", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="oprno", attrName="oprno", label="工位号", queryType=QueryType.LIKE),
+		@Column(name="max_seconds", attrName="maxSeconds", label="最大加工时间秒"),
+		@Column(name="enable_flag", attrName="enableFlag", label="是否启用"),
+		@Column(name="remarks", attrName="remarks", label="备注", queryType=QueryType.LIKE),
+		@Column(name="status", attrName="status", label="状态", isUpdate=true),
+		@Column(name="create_by", attrName="createBy", label="创建人", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建日期", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="更新人", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新日期", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.oprno ASC"
+)
+public class MesTimeoutConfig extends DataEntity<MesTimeoutConfig> {
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String ENABLE_YES = "1";
+	public static final String ENABLE_NO = "0";
+
+	private String oprno;
+	private Integer maxSeconds;
+	private String enableFlag;
+
+	public MesTimeoutConfig() {
+		this(null);
+	}
+
+	public MesTimeoutConfig(String id) {
+		super(id);
+	}
+
+	@Size(min=0, max=20, message="工位号长度不能超过 20 个字符")
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	public Integer getMaxSeconds() {
+		return maxSeconds;
+	}
+
+	public void setMaxSeconds(Integer maxSeconds) {
+		this.maxSeconds = maxSeconds;
+	}
+
+	@Size(min=0, max=1, message="是否启用长度不能超过 1 个字符")
+	public String getEnableFlag() {
+		return enableFlag;
+	}
+
+	public void setEnableFlag(String enableFlag) {
+		this.enableFlag = enableFlag;
+	}
+}

+ 137 - 0
src/main/java/com/jeesite/modules/mes/service/MesCheckConfigService.java

@@ -0,0 +1,137 @@
+package com.jeesite.modules.mes.service;
+
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesCheckConfigDao;
+import com.jeesite.modules.mes.entity.MesCheckConfig;
+import com.jeesite.modules.mes.util.CommonUitl;
+
+/**
+ * 二次判定配置Service
+ * @author mes
+ * @version 2026-10-30
+ */
+@Service
+public class MesCheckConfigService extends CrudService<MesCheckConfigDao, MesCheckConfig> {
+
+	@Override
+	public MesCheckConfig get(MesCheckConfig mesCheckConfig) {
+		return super.get(mesCheckConfig);
+	}
+
+	@Override
+	public Page<MesCheckConfig> findPage(MesCheckConfig mesCheckConfig) {
+		return super.findPage(mesCheckConfig);
+	}
+
+	@Override
+	public List<MesCheckConfig> findList(MesCheckConfig mesCheckConfig) {
+		return super.findList(mesCheckConfig);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesCheckConfig mesCheckConfig) {
+		if (StringUtils.isBlank(mesCheckConfig.getEnableFlag())) {
+			mesCheckConfig.setEnableFlag(MesCheckConfig.ENABLE_YES);
+		}
+		if (StringUtils.isBlank(mesCheckConfig.getCheckName()) && StringUtils.isNotBlank(mesCheckConfig.getCheckKey())) {
+			mesCheckConfig.setCheckName(mesCheckConfig.getCheckKey());
+		}
+		super.save(mesCheckConfig);
+	}
+
+	@Override
+	@Transactional
+	public void delete(MesCheckConfig mesCheckConfig) {
+		super.delete(mesCheckConfig);
+	}
+
+	/**
+	 * 二次判定:该工位无启用配置时原样返回设备结果;
+	 * 有启用配置时,需设备结果为 OK 且全部启用项都在范围内,才返回 OK,否则 NG。
+	 *
+	 * @param oprno 工位号
+	 * @param deviceResult 设备上传的判定结果
+	 * @param valueMap 校验键 -> 实测值(键需与配置 check_key 一致)
+	 */
+	public String judge(String oprno, String deviceResult, Map<String, String> valueMap) {
+		if (StringUtils.isBlank(oprno)) {
+			return deviceResult;
+		}
+		List<MesCheckConfig> configs = findEnabledByOprno(oprno);
+		if (configs == null || configs.isEmpty()) {
+			return deviceResult;
+		}
+
+		boolean rangeOk = true;
+		for (MesCheckConfig config : configs) {
+			String value = valueMap == null ? null : valueMap.get(config.getCheckKey());
+			if (!checkRange(config, value)) {
+				rangeOk = false;
+				logger.info("二次判定未通过 oprno={} checkKey={} checkName={} value={} min={} max={} deviceResult={}",
+						oprno, config.getCheckKey(), config.getCheckName(),
+						value, config.getMinVal(), config.getMaxVal(), deviceResult);
+			}
+		}
+
+		if (!"OK".equalsIgnoreCase(StringUtils.trim(deviceResult)) || !rangeOk) {
+			return "NG";
+		}
+		return "OK";
+	}
+
+	public List<MesCheckConfig> findEnabledByOprno(String oprno) {
+		Set<String> oprnos = new HashSet<>();
+		oprnos.add(oprno.trim());
+		String formatted = CommonUitl.formatOprno(oprno.trim());
+		if (StringUtils.isNotBlank(formatted)) {
+			oprnos.add(formatted);
+		}
+		MesCheckConfig query = new MesCheckConfig();
+		query.setEnableFlag(MesCheckConfig.ENABLE_YES);
+		query.getSqlMap().getWhere().and("oprno", QueryType.IN, oprnos.toArray());
+		return findList(query);
+	}
+
+	private boolean checkRange(MesCheckConfig config, String rawValue) {
+		if (config == null || StringUtils.isBlank(config.getCheckKey())) {
+			return true;
+		}
+		BigDecimal value = parseDecimal(rawValue);
+		if (value == null) {
+			return false;
+		}
+		BigDecimal min = parseDecimal(config.getMinVal());
+		BigDecimal max = parseDecimal(config.getMaxVal());
+		if (min != null && value.compareTo(min) < 0) {
+			return false;
+		}
+		if (max != null && value.compareTo(max) > 0) {
+			return false;
+		}
+		return true;
+	}
+
+	private BigDecimal parseDecimal(String raw) {
+		if (StringUtils.isBlank(raw)) {
+			return null;
+		}
+		try {
+			return new BigDecimal(raw.trim());
+		} catch (Exception e) {
+			return null;
+		}
+	}
+}

+ 8 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java

@@ -56,6 +56,9 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 	private MesDeviceTimeService mesDeviceTimeService;
 
 	@Autowired
+	private MesTimeoutConfigService mesTimeoutConfigService;
+
+	@Autowired
 	private MesDeviceService mesDeviceService;
 
 	@Autowired
@@ -583,6 +586,11 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		String cateSn = "";
 		content = content.equals("OK")?"OK":"NG";
 
+		// 主结果提交时按标准工时校验:超时则强制 NG(无启用配置则跳过)
+		if ("100000".equals(craft)) {
+			content = mesTimeoutConfigService.applyTimeout(oldOprno, sn, lineSn, content);
+		}
+
 		MesProductRecord mesProductRecord1 = new MesProductRecord();
 		List<MesProductRecord> lists = new ArrayList<>();
 		if(!mesLineProcess1.getType().equals("3")){ // 不是单部件

+ 125 - 0
src/main/java/com/jeesite/modules/mes/service/MesTimeoutConfigService.java

@@ -0,0 +1,125 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+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.lang.ObjectUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesTimeoutConfigDao;
+import com.jeesite.modules.mes.entity.MesDeviceTime;
+import com.jeesite.modules.mes.entity.MesTimeoutConfig;
+import com.jeesite.modules.mes.util.CommonUitl;
+
+/**
+ * 工位超时配置Service
+ * @author mes
+ * @version 2026-10-30
+ */
+@Service
+public class MesTimeoutConfigService extends CrudService<MesTimeoutConfigDao, MesTimeoutConfig> {
+
+	@Autowired
+	private MesDeviceTimeService mesDeviceTimeService;
+
+	@Override
+	public MesTimeoutConfig get(MesTimeoutConfig mesTimeoutConfig) {
+		return super.get(mesTimeoutConfig);
+	}
+
+	@Override
+	public Page<MesTimeoutConfig> findPage(MesTimeoutConfig mesTimeoutConfig) {
+		return super.findPage(mesTimeoutConfig);
+	}
+
+	@Override
+	public List<MesTimeoutConfig> findList(MesTimeoutConfig mesTimeoutConfig) {
+		return super.findList(mesTimeoutConfig);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesTimeoutConfig mesTimeoutConfig) {
+		if (StringUtils.isBlank(mesTimeoutConfig.getEnableFlag())) {
+			mesTimeoutConfig.setEnableFlag(MesTimeoutConfig.ENABLE_YES);
+		}
+		super.save(mesTimeoutConfig);
+	}
+
+	@Override
+	@Transactional
+	public void delete(MesTimeoutConfig mesTimeoutConfig) {
+		super.delete(mesTimeoutConfig);
+	}
+
+	/**
+	 * 提交结果时按加工时间表校验:无启用配置则原样返回;
+	 * 有配置且加工时长超过最大秒数则返回 NG。
+	 */
+	public String applyTimeout(String oprno, String sn, String lineSn, String content) {
+		if (StringUtils.isBlank(oprno) || StringUtils.isBlank(sn)) {
+			return content;
+		}
+		MesTimeoutConfig config = findEnabledByOprno(oprno);
+		if (config == null || config.getMaxSeconds() == null || config.getMaxSeconds() <= 0) {
+			return content;
+		}
+
+		MesDeviceTime deviceTime = findDeviceTime(oprno, sn, lineSn);
+		if (ObjectUtils.isEmpty(deviceTime) || deviceTime.getStartDate() == null) {
+			return content;
+		}
+
+		Date end = deviceTime.getEndDate() != null ? deviceTime.getEndDate() : new Date();
+		long elapsedSeconds = (end.getTime() - deviceTime.getStartDate().getTime()) / 1000L;
+		if (elapsedSeconds < 0) {
+			return content;
+		}
+		if (elapsedSeconds > config.getMaxSeconds()) {
+			logger.info("工位加工超时 oprno={} sn={} lineSn={} elapsed={}s max={}s deviceResult={}",
+					oprno, sn, lineSn, elapsedSeconds, config.getMaxSeconds(), content);
+			return "NG";
+		}
+		return content;
+	}
+
+	public MesTimeoutConfig findEnabledByOprno(String oprno) {
+		Set<String> oprnos = new HashSet<>();
+		oprnos.add(oprno.trim());
+		String formatted = CommonUitl.formatOprno(oprno.trim());
+		if (StringUtils.isNotBlank(formatted)) {
+			oprnos.add(formatted);
+		}
+		MesTimeoutConfig query = new MesTimeoutConfig();
+		query.setEnableFlag(MesTimeoutConfig.ENABLE_YES);
+		query.getSqlMap().getWhere().and("oprno", QueryType.IN, oprnos.toArray());
+		List<MesTimeoutConfig> list = findList(query);
+		if (list == null || list.isEmpty()) {
+			return null;
+		}
+		return list.get(0);
+	}
+
+	private MesDeviceTime findDeviceTime(String oprno, String sn, String lineSn) {
+		MesDeviceTime byCate = mesDeviceTimeService.getInfoByOprnoAndSnAndCate(oprno, sn.trim(), lineSn);
+		if (!ObjectUtils.isEmpty(byCate)) {
+			return byCate;
+		}
+		String formatted = CommonUitl.formatOprno(oprno);
+		if (!oprno.equals(formatted)) {
+			byCate = mesDeviceTimeService.getInfoByOprnoAndSnAndCate(formatted, sn.trim(), lineSn);
+			if (!ObjectUtils.isEmpty(byCate)) {
+				return byCate;
+			}
+		}
+		return mesDeviceTimeService.getInfoByOprnoAndSn(oprno, sn.trim());
+	}
+}

+ 79 - 0
src/main/java/com/jeesite/modules/mes/web/MesCheckConfigController.java

@@ -0,0 +1,79 @@
+package com.jeesite.modules.mes.web;
+
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesCheckConfig;
+import com.jeesite.modules.mes.service.MesCheckConfigService;
+
+/**
+ * 二次判定配置Controller
+ * @author mes
+ * @version 2026-10-30
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesCheckConfig")
+public class MesCheckConfigController extends BaseController {
+
+	@Autowired
+	private MesCheckConfigService mesCheckConfigService;
+
+	@ModelAttribute
+	public MesCheckConfig get(String id, boolean isNewRecord) {
+		return mesCheckConfigService.get(id, isNewRecord);
+	}
+
+	@RequiresPermissions("mes:mesCheckConfig:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesCheckConfig mesCheckConfig, Model model) {
+		model.addAttribute("mesCheckConfig", mesCheckConfig);
+		return "modules/mes/mesCheckConfigList";
+	}
+
+	@RequiresPermissions("mes:mesCheckConfig:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesCheckConfig> listData(MesCheckConfig mesCheckConfig, HttpServletRequest request, HttpServletResponse response) {
+		mesCheckConfig.setPage(new Page<>(request, response));
+		return mesCheckConfigService.findPage(mesCheckConfig);
+	}
+
+	@RequiresPermissions("mes:mesCheckConfig:view")
+	@RequestMapping(value = "form")
+	public String form(MesCheckConfig mesCheckConfig, Model model) {
+		if (mesCheckConfig.getIsNewRecord() && mesCheckConfig.getEnableFlag() == null) {
+			mesCheckConfig.setEnableFlag(MesCheckConfig.ENABLE_YES);
+		}
+		model.addAttribute("mesCheckConfig", mesCheckConfig);
+		return "modules/mes/mesCheckConfigForm";
+	}
+
+	@RequiresPermissions("mes:mesCheckConfig:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesCheckConfig mesCheckConfig) {
+		mesCheckConfigService.save(mesCheckConfig);
+		return renderResult(Global.TRUE, text("保存二次判定配置成功!"));
+	}
+
+	@RequiresPermissions("mes:mesCheckConfig:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesCheckConfig mesCheckConfig) {
+		mesCheckConfigService.delete(mesCheckConfig);
+		return renderResult(Global.TRUE, text("删除二次判定配置成功!"));
+	}
+}

+ 13 - 12
src/main/java/com/jeesite/modules/mes/web/MesProductQmController.java

@@ -3,7 +3,9 @@ package com.jeesite.modules.mes.web;
 import java.io.UnsupportedEncodingException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -13,6 +15,7 @@ import com.jeesite.common.lang.StringUtils;
 import com.jeesite.modules.mes.entity.MesProduct;
 import com.jeesite.modules.mes.req.MesSearchDateReq;
 import com.jeesite.modules.mes.resp.CommonResp;
+import com.jeesite.modules.mes.service.MesCheckConfigService;
 import com.jeesite.modules.mes.util.CommonUitl;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.apache.tomcat.util.codec.binary.Base64;
@@ -47,6 +50,9 @@ public class MesProductQmController extends BaseController {
 	@Autowired
 	private MesProductQmService mesProductQmService;
 
+	@Autowired
+	private MesCheckConfigService mesCheckConfigService;
+
 	/**
 	 * 获取数据
 	 */
@@ -163,18 +169,13 @@ public class MesProductQmController extends BaseController {
 			return renderResult(Global.FALSE, text("操作失败!"));
 		}
 
-//		String oprno = request.getParameter("oprno").trim();
-//		MesProductQm mesProductQm = new MesProductQm();
-//		mesProductQm.setOprno(oprno);
-//		mesProductQm.setComponentNum("5024026600851241211999000047");
-//		mesProductQm.setProductCate("XT");
-//		mesProductQm.setDeviceType("1");
-//		mesProductQm.setLeakVal("20");
-//		mesProductQm.setLeakValUnit("Pa");
-//		mesProductQm.setTestPressure("23");
-//		mesProductQm.setTestPressureUnit("Pa");
-//		mesProductQm.setTestResult("OK");
-//		mesProductQm.setTestTime(new Date());
+		// 二次判定:无启用配置则跳过,有配置则需设备OK且参数在范围内
+		Map<String, String> checkValues = new HashMap<>();
+		checkValues.put("testPressure", mesProductQm.getTestPressure());
+		checkValues.put("leakVal", mesProductQm.getLeakVal());
+		String judged = mesCheckConfigService.judge(mesProductQm.getOprno(), mesProductQm.getTestResult(), checkValues);
+		mesProductQm.setTestResult(judged);
+
 		mesProductQmService.add(mesProductQm);
 		return renderResult(Global.TRUE, text("操作成功!"));
 	}

+ 79 - 0
src/main/java/com/jeesite/modules/mes/web/MesTimeoutConfigController.java

@@ -0,0 +1,79 @@
+package com.jeesite.modules.mes.web;
+
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesTimeoutConfig;
+import com.jeesite.modules.mes.service.MesTimeoutConfigService;
+
+/**
+ * 工位超时配置Controller
+ * @author mes
+ * @version 2026-10-30
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesTimeoutConfig")
+public class MesTimeoutConfigController extends BaseController {
+
+	@Autowired
+	private MesTimeoutConfigService mesTimeoutConfigService;
+
+	@ModelAttribute
+	public MesTimeoutConfig get(String id, boolean isNewRecord) {
+		return mesTimeoutConfigService.get(id, isNewRecord);
+	}
+
+	@RequiresPermissions("mes:mesTimeoutConfig:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesTimeoutConfig mesTimeoutConfig, Model model) {
+		model.addAttribute("mesTimeoutConfig", mesTimeoutConfig);
+		return "modules/mes/mesTimeoutConfigList";
+	}
+
+	@RequiresPermissions("mes:mesTimeoutConfig:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesTimeoutConfig> listData(MesTimeoutConfig mesTimeoutConfig, HttpServletRequest request, HttpServletResponse response) {
+		mesTimeoutConfig.setPage(new Page<>(request, response));
+		return mesTimeoutConfigService.findPage(mesTimeoutConfig);
+	}
+
+	@RequiresPermissions("mes:mesTimeoutConfig:view")
+	@RequestMapping(value = "form")
+	public String form(MesTimeoutConfig mesTimeoutConfig, Model model) {
+		if (mesTimeoutConfig.getIsNewRecord() && mesTimeoutConfig.getEnableFlag() == null) {
+			mesTimeoutConfig.setEnableFlag(MesTimeoutConfig.ENABLE_YES);
+		}
+		model.addAttribute("mesTimeoutConfig", mesTimeoutConfig);
+		return "modules/mes/mesTimeoutConfigForm";
+	}
+
+	@RequiresPermissions("mes:mesTimeoutConfig:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesTimeoutConfig mesTimeoutConfig) {
+		mesTimeoutConfigService.save(mesTimeoutConfig);
+		return renderResult(Global.TRUE, text("保存工位超时配置成功!"));
+	}
+
+	@RequiresPermissions("mes:mesTimeoutConfig:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesTimeoutConfig mesTimeoutConfig) {
+		mesTimeoutConfigService.delete(mesTimeoutConfig);
+		return renderResult(Global.TRUE, text("删除工位超时配置成功!"));
+	}
+}

+ 109 - 0
src/main/resources/views/modules/mes/mesCheckConfigForm.html

@@ -0,0 +1,109 @@
+<% layout('/layouts/default.html', {title: '二次判定配置', libs: ['validate']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-note"></i> ${text(mesCheckConfig.isNewRecord ? '新增二次判定配置' : '编辑二次判定配置')}
+			</div>
+			<div class="box-tools pull-right">
+				<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
+			</div>
+		</div>
+		<#form:form id="inputForm" model="${mesCheckConfig}" action="${ctx}/mes/mesCheckConfig/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('工位号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="oprno" maxlength="20" class="form-control required" placeholder="如 OP230"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('校验键名')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="checkKey" maxlength="64" class="form-control required" placeholder="需与上传字段一致,如 testPressure、leakVal"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('校验项名称')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="checkName" maxlength="100" class="form-control" placeholder="如 测试压、泄漏值"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('是否启用')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:radio path="enableFlag" dictType="sys_yes_no" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('最小值')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="minVal" maxlength="50" class="form-control number" placeholder="可空表示不限下限"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('最大值')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="maxVal" maxlength="50" class="form-control number" placeholder="可空表示不限上限"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2" title="">
+								<span class="required hide">*</span> ${text('备注')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:textarea path="remarks" rows="3" maxlength="500" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesCheckConfig:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
+					</div>
+				</div>
+			</div>
+		</#form:form>
+	</div>
+</div>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 75 - 0
src/main/resources/views/modules/mes/mesCheckConfigList.html

@@ -0,0 +1,75 @@
+<% 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>
+				<% if(hasPermi('mes:mesCheckConfig:edit')){ %>
+					<a href="${ctx}/mes/mesCheckConfig/form" class="btn btn-default btnTool" title="${text('新增二次判定配置')}"><i class="fa fa-plus"></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="${mesCheckConfig}" action="${ctx}/mes/mesCheckConfig/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="oprno" maxlength="20" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('校验项名称')}:</label>
+					<div class="control-inline">
+						<#form:input path="checkName" maxlength="100" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('是否启用')}:</label>
+					<div class="control-inline width-90">
+						<#form:select path="enableFlag" dictType="sys_yes_no" blankOption="true" class="form-control"/>
+					</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({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:100, align:"center", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesCheckConfig/form?id='+row.id+'" class="btnList" data-title="${text("编辑二次判定配置")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("校验键名")}', name:'checkKey', index:'a.check_key', width:140, align:"center"},
+		{header:'${text("校验项名称")}', name:'checkName', index:'a.check_name', width:120, align:"center"},
+		{header:'${text("最小值")}', name:'minVal', index:'a.min_val', width:100, align:"center"},
+		{header:'${text("最大值")}', name:'maxVal', index:'a.max_val', width:100, align:"center"},
+		{header:'${text("是否启用")}', name:'enableFlag', index:'a.enable_flag', width:90, align:"center", formatter: function(val){
+			return val === '1' ? '${text("是")}' : '${text("否")}';
+		}},
+		{header:'${text("备注")}', name:'remarks', index:'a.remarks', width:180, align:"left"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesCheckConfig:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesCheckConfig/form?id='+row.id+'" class="btnList" title="${text("编辑")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesCheckConfig/delete?id='+row.id+'" class="btnList" title="${text("删除")}" data-confirm="${text("确认要删除该配置吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	ajaxSuccess: function(data){
+	}
+});
+</script>

+ 82 - 0
src/main/resources/views/modules/mes/mesTimeoutConfigForm.html

@@ -0,0 +1,82 @@
+<% layout('/layouts/default.html', {title: '工位超时配置', libs: ['validate']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-note"></i> ${text(mesTimeoutConfig.isNewRecord ? '新增工位超时配置' : '编辑工位超时配置')}
+			</div>
+			<div class="box-tools pull-right">
+				<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
+			</div>
+		</div>
+		<#form:form id="inputForm" model="${mesTimeoutConfig}" action="${ctx}/mes/mesTimeoutConfig/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('工位号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="oprno" maxlength="20" class="form-control required" placeholder="如 OP060"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('最大加工时间(秒)')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="maxSeconds" maxlength="10" class="form-control required digits" placeholder="超过该秒数提交结果将判定为NG"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required">*</span> ${text('是否启用')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:radio path="enableFlag" dictType="sys_yes_no" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2" title="">
+								<span class="required hide">*</span> ${text('备注')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:textarea path="remarks" rows="3" maxlength="500" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesTimeoutConfig:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
+					</div>
+				</div>
+			</div>
+		</#form:form>
+	</div>
+</div>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 66 - 0
src/main/resources/views/modules/mes/mesTimeoutConfigList.html

@@ -0,0 +1,66 @@
+<% 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>
+				<% if(hasPermi('mes:mesTimeoutConfig:edit')){ %>
+					<a href="${ctx}/mes/mesTimeoutConfig/form" class="btn btn-default btnTool" title="${text('新增工位超时配置')}"><i class="fa fa-plus"></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="${mesTimeoutConfig}" action="${ctx}/mes/mesTimeoutConfig/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="oprno" maxlength="20" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('是否启用')}:</label>
+					<div class="control-inline width-90">
+						<#form:select path="enableFlag" dictType="sys_yes_no" blankOption="true" class="form-control"/>
+					</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({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:120, align:"center", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesTimeoutConfig/form?id='+row.id+'" class="btnList" data-title="${text("编辑工位超时配置")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("最大加工时间(秒)")}', name:'maxSeconds', index:'a.max_seconds', width:140, align:"center"},
+		{header:'${text("是否启用")}', name:'enableFlag', index:'a.enable_flag', width:90, align:"center", formatter: function(val){
+			return val === '1' ? '${text("是")}' : '${text("否")}';
+		}},
+		{header:'${text("备注")}', name:'remarks', index:'a.remarks', width:200, align:"left"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesTimeoutConfig:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesTimeoutConfig/form?id='+row.id+'" class="btnList" title="${text("编辑")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesTimeoutConfig/delete?id='+row.id+'" class="btnList" title="${text("删除")}" data-confirm="${text("确认要删除该配置吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	ajaxSuccess: function(data){
+	}
+});
+</script>