소스 검색

单部件页面显示

hou 1 개월 전
부모
커밋
a88dcdb04f
18개의 변경된 파일1168개의 추가작업 그리고 6개의 파일을 삭제
  1. 13 0
      src/main/java/com/jeesite/modules/mes/dao/MesProductDbjRecordDao.java
  2. 13 0
      src/main/java/com/jeesite/modules/mes/dao/MesProductDbjRecordItemDao.java
  3. 19 3
      src/main/java/com/jeesite/modules/mes/entity/MesProductDbjBind.java
  4. 206 0
      src/main/java/com/jeesite/modules/mes/entity/MesProductDbjRecord.java
  5. 90 0
      src/main/java/com/jeesite/modules/mes/entity/MesProductDbjRecordItem.java
  6. 70 0
      src/main/java/com/jeesite/modules/mes/service/MesProductDbjRecordItemService.java
  7. 232 0
      src/main/java/com/jeesite/modules/mes/service/MesProductDbjRecordService.java
  8. 11 1
      src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java
  9. 10 0
      src/main/java/com/jeesite/modules/mes/web/MesProductDbjBindController.java
  10. 100 0
      src/main/java/com/jeesite/modules/mes/web/MesProductDbjRecordController.java
  11. 2 1
      src/main/java/com/jeesite/modules/mes/web/MesProductRecordController.java
  12. 1 1
      src/main/resources/config/application.yml
  13. 5 0
      src/main/resources/mappings/modules/mes/MesProductDbjRecordDao.xml
  14. 5 0
      src/main/resources/mappings/modules/mes/MesProductDbjRecordItemDao.xml
  15. 74 0
      src/main/resources/views/modules/mes/mesProductDbjBindForm.html
  16. 87 0
      src/main/resources/views/modules/mes/mesProductDbjBindList.html
  17. 123 0
      src/main/resources/views/modules/mes/mesProductDbjRecordInfo.html
  18. 107 0
      src/main/resources/views/modules/mes/mesProductDbjRecordList.html

+ 13 - 0
src/main/java/com/jeesite/modules/mes/dao/MesProductDbjRecordDao.java

@@ -0,0 +1,13 @@
+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.MesProductDbjRecord;
+
+/**
+ * 单部件加工记录Dao
+ */
+@MyBatisDao
+public interface MesProductDbjRecordDao extends CrudDao<MesProductDbjRecord> {
+
+}

+ 13 - 0
src/main/java/com/jeesite/modules/mes/dao/MesProductDbjRecordItemDao.java

@@ -0,0 +1,13 @@
+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.MesProductDbjRecordItem;
+
+/**
+ * 单部件加工过程参数Dao
+ */
+@MyBatisDao
+public interface MesProductDbjRecordItemDao extends CrudDao<MesProductDbjRecordItem> {
+
+}

+ 19 - 3
src/main/java/com/jeesite/modules/mes/entity/MesProductDbjBind.java

@@ -21,7 +21,7 @@ import java.util.Date;
         @Column(name="id", attrName="id", label="ID", isPK=true),
         @Column(name="dbj_sn", attrName="dbjSn", label="主工件码", queryType=QueryType.LIKE),
         @Column(name="oprno", attrName="oprno", label="工位号", queryType=QueryType.LIKE),
-        @Column(name="materiel_sn", attrName="materielSn", label="绑定内容", queryType=QueryType.LIKE),
+        @Column(name="materiel_sn", attrName="materielSn", label="精追码", queryType=QueryType.LIKE),
         @Column(name="create_by", attrName="createBy", label="create_by", isUpdate=false, isQuery=false),
         @Column(name="create_date", attrName="createDate", label="create_date", isPK=true),
         @Column(name="update_by", attrName="updateBy", label="update_by", isQuery=false),
@@ -38,7 +38,7 @@ public class MesProductDbjBind extends DataEntity<MesProductDbjBind> {
     @ExcelFields({
             @ExcelField(title="主工件码", attrName="dbjSn", align=Align.CENTER, sort=20),
             @ExcelField(title="工位号", attrName="oprno", align=Align.CENTER, sort=30),
-            @ExcelField(title="绑定内容", attrName="materielSn", align=Align.CENTER, sort=40),
+            @ExcelField(title="精追码", attrName="materielSn", align=Align.CENTER, sort=40),
             @ExcelField(title="create_by", attrName="createBy", align=Align.CENTER, sort=50),
             @ExcelField(title="create_date", attrName="createDate", align=Align.CENTER, sort=60),
             @ExcelField(title="update_by", attrName="updateBy", align=Align.CENTER, sort=70),
@@ -71,7 +71,7 @@ public class MesProductDbjBind extends DataEntity<MesProductDbjBind> {
         this.oprno = oprno;
     }
 
-    @Size(min=0, max=255, message="绑定内容长度不能超过 255 个字符")
+    @Size(min=0, max=255, message="精追码长度不能超过 255 个字符")
     public String getMaterielSn() {
         return materielSn;
     }
@@ -80,4 +80,20 @@ public class MesProductDbjBind extends DataEntity<MesProductDbjBind> {
         this.materielSn = materielSn;
     }
 
+    public Date getCreateDate_gte() {
+        return sqlMap.getWhere().getValue("create_date", QueryType.GTE);
+    }
+
+    public void setCreateDate_gte(Date createDate) {
+        sqlMap.getWhere().and("create_date", QueryType.GTE, createDate);
+    }
+
+    public Date getCreateDate_lte() {
+        return sqlMap.getWhere().getValue("create_date", QueryType.LTE);
+    }
+
+    public void setCreateDate_lte(Date createDate) {
+        sqlMap.getWhere().and("create_date", QueryType.LTE, createDate);
+    }
+
 }

+ 206 - 0
src/main/java/com/jeesite/modules/mes/entity/MesProductDbjRecord.java

@@ -0,0 +1,206 @@
+package com.jeesite.modules.mes.entity;
+
+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;
+import com.jeesite.common.utils.excel.annotation.ExcelField;
+import com.jeesite.common.utils.excel.annotation.ExcelField.Align;
+import com.jeesite.common.utils.excel.annotation.ExcelFields;
+
+import javax.validation.constraints.Size;
+import java.util.Date;
+
+/**
+ * 单部件加工记录Entity
+ */
+@Table(name = "mes_product_dbj_record", alias = "a", label = "单部件加工记录", columns = {
+		@Column(name = "id", attrName = "id", label = "id", isPK = true),
+		@Column(name = "line_sn", attrName = "lineSn", label = "产线编号", queryType = QueryType.LIKE),
+		@Column(name = "oprno", attrName = "oprno", label = "工位号", queryType = QueryType.LIKE),
+		@Column(name = "sn", attrName = "sn", label = "精追码", queryType = QueryType.LIKE),
+		@Column(name = "dbj_sn", attrName = "dbjSn", label = "主工件码", queryType = QueryType.LIKE),
+		@Column(name = "craft", attrName = "craft", label = "工艺号"),
+		@Column(name = "result", attrName = "result", label = "结果", queryType = QueryType.EQ),
+		@Column(name = "materiel_sn", attrName = "materielSn", label = "绑定物料"),
+		@Column(name = "device_no", attrName = "deviceNo", label = "设备编号"),
+		@Column(name = "gz_no", attrName = "gzNo", label = "工装编号"),
+		@Column(name = "interval_sec", attrName = "intervalSec", label = "加工时长"),
+		@Column(name = "user_code", attrName = "userCode", label = "操作员工号", queryType = QueryType.LIKE),
+		@Column(name = "source", attrName = "source", label = "来源"),
+		@Column(name = "batch_id", attrName = "batchId", label = "上传批次", queryType = QueryType.LIKE),
+		@Column(name = "remark", attrName = "remark", label = "备注"),
+		@Column(name = "create_by", attrName = "createBy", label = "创建人", isUpdate = false),
+		@Column(name = "create_date", attrName = "createDate", label = "完成时间", isUpdate = false, isUpdateForce = true),
+		@Column(name = "update_by", attrName = "updateBy", label = "更新人"),
+		@Column(name = "update_date", attrName = "updateDate", label = "更新时间", isUpdateForce = true),
+}, orderBy = "a.create_date DESC")
+public class MesProductDbjRecord extends DataEntity<MesProductDbjRecord> {
+
+	private static final long serialVersionUID = 1L;
+	private String lineSn;
+	private String oprno;
+	private String sn;
+	private String dbjSn;
+	private String craft;
+	private String result;
+	private String materielSn;
+	private String deviceNo;
+	private String gzNo;
+	private Integer intervalSec;
+	private String userCode;
+	private String source;
+	private String batchId;
+	private String remark;
+
+	@ExcelFields({
+			@ExcelField(title = "主工件码", attrName = "dbjSn", align = Align.CENTER, sort = 10),
+			@ExcelField(title = "精追码", attrName = "sn", align = Align.CENTER, sort = 20),
+			@ExcelField(title = "产线编号", attrName = "lineSn", align = Align.CENTER, sort = 30),
+			@ExcelField(title = "工位号", attrName = "oprno", align = Align.CENTER, sort = 40),
+			@ExcelField(title = "结果", attrName = "result", align = Align.CENTER, sort = 50),
+			@ExcelField(title = "绑定物料", attrName = "materielSn", align = Align.CENTER, sort = 60),
+			@ExcelField(title = "加工时长(秒)", attrName = "intervalSec", align = Align.CENTER, sort = 70),
+			@ExcelField(title = "操作员工号", attrName = "userCode", align = Align.CENTER, sort = 80),
+			@ExcelField(title = "完成时间", attrName = "createDate", align = Align.CENTER, sort = 90, dataFormat = "yyyy-MM-dd hh:mm:ss"),
+	})
+	public MesProductDbjRecord() {
+		this(null);
+	}
+
+	public MesProductDbjRecord(String id) {
+		super(id);
+	}
+
+	@Size(min = 0, max = 30, message = "产线编号长度不能超过 30 个字符")
+	public String getLineSn() {
+		return lineSn;
+	}
+
+	public void setLineSn(String lineSn) {
+		this.lineSn = lineSn;
+	}
+
+	@Size(min = 0, max = 20, message = "工位号长度不能超过 20 个字符")
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	@Size(min = 0, max = 50, message = "精追码长度不能超过 50 个字符")
+	public String getSn() {
+		return sn;
+	}
+
+	public void setSn(String sn) {
+		this.sn = sn;
+	}
+
+	@Size(min = 0, max = 50, message = "主工件码长度不能超过 50 个字符")
+	public String getDbjSn() {
+		return dbjSn;
+	}
+
+	public void setDbjSn(String dbjSn) {
+		this.dbjSn = dbjSn;
+	}
+
+	public String getCraft() {
+		return craft;
+	}
+
+	public void setCraft(String craft) {
+		this.craft = craft;
+	}
+
+	public String getResult() {
+		return result;
+	}
+
+	public void setResult(String result) {
+		this.result = result;
+	}
+
+	public String getMaterielSn() {
+		return materielSn;
+	}
+
+	public void setMaterielSn(String materielSn) {
+		this.materielSn = materielSn;
+	}
+
+	public String getDeviceNo() {
+		return deviceNo;
+	}
+
+	public void setDeviceNo(String deviceNo) {
+		this.deviceNo = deviceNo;
+	}
+
+	public String getGzNo() {
+		return gzNo;
+	}
+
+	public void setGzNo(String gzNo) {
+		this.gzNo = gzNo;
+	}
+
+	public Integer getIntervalSec() {
+		return intervalSec;
+	}
+
+	public void setIntervalSec(Integer intervalSec) {
+		this.intervalSec = intervalSec;
+	}
+
+	public String getUserCode() {
+		return userCode;
+	}
+
+	public void setUserCode(String userCode) {
+		this.userCode = userCode;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getBatchId() {
+		return batchId;
+	}
+
+	public void setBatchId(String batchId) {
+		this.batchId = batchId;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Date getCreateDate_gte() {
+		return sqlMap.getWhere().getValue("create_date", QueryType.GTE);
+	}
+
+	public void setCreateDate_gte(Date createDate) {
+		sqlMap.getWhere().and("create_date", QueryType.GTE, createDate);
+	}
+
+	public Date getCreateDate_lte() {
+		return sqlMap.getWhere().getValue("create_date", QueryType.LTE);
+	}
+
+	public void setCreateDate_lte(Date createDate) {
+		sqlMap.getWhere().and("create_date", QueryType.LTE, createDate);
+	}
+}

+ 90 - 0
src/main/java/com/jeesite/modules/mes/entity/MesProductDbjRecordItem.java

@@ -0,0 +1,90 @@
+package com.jeesite.modules.mes.entity;
+
+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;
+
+import javax.validation.constraints.Size;
+import java.util.Date;
+
+/**
+ * 单部件加工过程参数Entity
+ */
+@Table(name = "mes_product_dbj_record_item", alias = "a", label = "单部件加工过程参数", columns = {
+		@Column(name = "id", attrName = "id", label = "id", isPK = true),
+		@Column(name = "record_id", attrName = "recordId", label = "主记录ID", queryType = QueryType.EQ),
+		@Column(name = "craft", attrName = "craft", label = "工艺号"),
+		@Column(name = "craft_name", attrName = "craftName", label = "物料名称"),
+		@Column(name = "result", attrName = "result", label = "结果"),
+		@Column(name = "val", attrName = "val", label = "参数值"),
+		@Column(name = "sort", attrName = "sort", label = "排序"),
+		@Column(name = "create_date", attrName = "createDate", label = "创建时间", isUpdate = false, isUpdateForce = true),
+}, orderBy = "a.sort ASC, a.create_date ASC")
+public class MesProductDbjRecordItem extends DataEntity<MesProductDbjRecordItem> {
+
+	private static final long serialVersionUID = 1L;
+	private String recordId;
+	private String craft;
+	private String craftName;
+	private String result;
+	private String val;
+	private Integer sort;
+
+	public MesProductDbjRecordItem() {
+		this(null);
+	}
+
+	public MesProductDbjRecordItem(String id) {
+		super(id);
+	}
+
+	@Size(min = 0, max = 64, message = "主记录ID长度不能超过 64 个字符")
+	public String getRecordId() {
+		return recordId;
+	}
+
+	public void setRecordId(String recordId) {
+		this.recordId = recordId;
+	}
+
+	public String getCraft() {
+		return craft;
+	}
+
+	public void setCraft(String craft) {
+		this.craft = craft;
+	}
+
+	public String getCraftName() {
+		return craftName;
+	}
+
+	public void setCraftName(String craftName) {
+		this.craftName = craftName;
+	}
+
+	public String getResult() {
+		return result;
+	}
+
+	public void setResult(String result) {
+		this.result = result;
+	}
+
+	public String getVal() {
+		return val;
+	}
+
+	public void setVal(String val) {
+		this.val = val;
+	}
+
+	public Integer getSort() {
+		return sort;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+}

+ 70 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductDbjRecordItemService.java

@@ -0,0 +1,70 @@
+package com.jeesite.modules.mes.service;
+
+import com.jeesite.common.collect.ListUtils;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesProductDbjRecordItemDao;
+import com.jeesite.modules.mes.entity.MesProductDbjRecordItem;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 单部件加工过程参数Service
+ */
+@Service
+public class MesProductDbjRecordItemService extends CrudService<MesProductDbjRecordItemDao, MesProductDbjRecordItem> {
+
+	@Override
+	public MesProductDbjRecordItem get(MesProductDbjRecordItem mesProductDbjRecordItem) {
+		return super.get(mesProductDbjRecordItem);
+	}
+
+	@Override
+	public Page<MesProductDbjRecordItem> findPage(MesProductDbjRecordItem mesProductDbjRecordItem) {
+		return super.findPage(mesProductDbjRecordItem);
+	}
+
+	@Override
+	public List<MesProductDbjRecordItem> findList(MesProductDbjRecordItem mesProductDbjRecordItem) {
+		return super.findList(mesProductDbjRecordItem);
+	}
+
+	public List<MesProductDbjRecordItem> findByRecordId(String recordId) {
+		if (StringUtils.isEmpty(recordId)) {
+			return ListUtils.newArrayList();
+		}
+		MesProductDbjRecordItem query = new MesProductDbjRecordItem();
+		query.setRecordId(recordId);
+		return findList(query);
+	}
+
+	@Transactional
+	public void saveBatch(String recordId, List<MesProductDbjRecordItem> items) {
+		if (StringUtils.isEmpty(recordId) || ListUtils.isEmpty(items)) {
+			return;
+		}
+		Date now = new Date();
+		int sort = 0;
+		for (MesProductDbjRecordItem item : items) {
+			item.setIsNewRecord(true);
+			item.setRecordId(recordId);
+			if (item.getSort() == null) {
+				item.setSort(sort++);
+			}
+			if (item.getCreateDate() == null) {
+				item.setCreateDate(now);
+			}
+			super.save(item);
+		}
+	}
+
+	@Override
+	@Transactional
+	public void save(MesProductDbjRecordItem mesProductDbjRecordItem) {
+		super.save(mesProductDbjRecordItem);
+	}
+}

+ 232 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductDbjRecordService.java

@@ -0,0 +1,232 @@
+package com.jeesite.modules.mes.service;
+
+import com.jeesite.common.collect.ListUtils;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.idgen.IdGen;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesProductDbjRecordDao;
+import com.jeesite.modules.mes.entity.MesLineProcess;
+import com.jeesite.modules.mes.entity.MesLineProcessMaterial;
+import com.jeesite.modules.mes.entity.MesProductDbjBind;
+import com.jeesite.modules.mes.entity.MesProductDbjRecord;
+import com.jeesite.modules.mes.entity.MesProductDbjRecordItem;
+import com.jeesite.modules.mes.resp.BindMaterialResp;
+import com.jeesite.modules.mes.resp.ParamsResp;
+import com.jeesite.modules.mes.util.CommonUitl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 单部件加工记录Service
+ */
+@Service
+public class MesProductDbjRecordService extends CrudService<MesProductDbjRecordDao, MesProductDbjRecord> {
+
+	@Autowired
+	private MesProductDbjRecordItemService mesProductDbjRecordItemService;
+
+	@Autowired
+	private MesProductDbjBindService mesProductDbjBindService;
+
+	@Autowired
+	private MesLineProcessMaterialService mesLineProcessMaterialService;
+
+	@Override
+	public MesProductDbjRecord get(MesProductDbjRecord mesProductDbjRecord) {
+		return super.get(mesProductDbjRecord);
+	}
+
+	@Override
+	public Page<MesProductDbjRecord> findPage(MesProductDbjRecord mesProductDbjRecord) {
+		return super.findPage(mesProductDbjRecord);
+	}
+
+	@Override
+	public List<MesProductDbjRecord> findList(MesProductDbjRecord mesProductDbjRecord) {
+		return super.findList(mesProductDbjRecord);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesProductDbjRecord mesProductDbjRecord) {
+		super.save(mesProductDbjRecord);
+	}
+
+	/**
+	 * 单部件工位质量上传后落库
+	 */
+	@Transactional
+	public void saveFromUpload(String sn, String oldOprno, String lineSn, String craft, String content,
+	                           String userCode, List<ParamsResp> paramsResps, List<BindMaterialResp> bmlists,
+	                           MesLineProcess mesLineProcess, Integer intervalSec) {
+		String partSn = StringUtils.trimToEmpty(sn);
+		String result = "OK".equals(content) ? "OK" : "NG";
+		String batchId = IdGen.nextId();
+		String materielSn = buildMaterielSn(bmlists);
+
+		MesProductDbjRecord record = new MesProductDbjRecord();
+		record.setLineSn(lineSn);
+		record.setOprno(oldOprno);
+		record.setSn(StringUtils.isEmpty(partSn) ? null : partSn);
+		// 单部件工位仅扫精追码,主工件码在后续工序绑定后再回写
+		record.setDbjSn(null);
+		record.setCraft(StringUtils.isEmpty(craft) ? "100000" : craft);
+		record.setResult(result);
+		record.setMaterielSn(materielSn);
+		record.setDeviceNo(mesLineProcess.getDevices());
+		record.setGzNo(mesLineProcess.getGzs());
+		record.setIntervalSec(intervalSec);
+		record.setUserCode(userCode);
+		record.setSource("0");
+		record.setBatchId(batchId);
+		if (StringUtils.isNotEmpty(userCode)) {
+			record.setCreateBy(userCode);
+			record.setUpdateBy(userCode);
+		}
+		super.save(record);
+
+		List<MesProductDbjRecordItem> items = buildItems(paramsResps, oldOprno, lineSn, bmlists);
+		mesProductDbjRecordItemService.saveBatch(record.getId(), items);
+	}
+
+	/**
+	 * 详情展示:补全过程参数的物料名称(兼容历史数据)
+	 */
+	public List<MesProductDbjRecordItem> findItemsForRecord(MesProductDbjRecord record) {
+		if (record == null || StringUtils.isEmpty(record.getId())) {
+			return ListUtils.newArrayList();
+		}
+		List<MesProductDbjRecordItem> items = mesProductDbjRecordItemService.findByRecordId(record.getId());
+		enrichItemMaterialNames(items, record.getOprno(), record.getLineSn());
+		return items;
+	}
+
+	private String buildMaterielSn(List<BindMaterialResp> bmlists) {
+		if (ListUtils.isEmpty(bmlists)) {
+			return null;
+		}
+		List<String> sns = new ArrayList<>();
+		for (BindMaterialResp bindMaterialResp : bmlists) {
+			if (StringUtils.isNotEmpty(bindMaterialResp.getBatchSn())) {
+				sns.add(bindMaterialResp.getBatchSn());
+			}
+		}
+		return sns.isEmpty() ? null : StringUtils.join(sns, ",");
+	}
+
+	/**
+	 * 后续工序绑定主工件码后,回写历史单部件加工记录
+	 */
+	@Transactional
+	public void backfillDbjSn(String partSn, String dbjSn) {
+		if (StringUtils.isEmpty(partSn) || StringUtils.isEmpty(dbjSn)) {
+			return;
+		}
+		MesProductDbjRecord query = new MesProductDbjRecord();
+		query.setSn(partSn);
+		List<MesProductDbjRecord> records = findList(query);
+		for (MesProductDbjRecord record : records) {
+			if (StringUtils.isEmpty(record.getDbjSn())) {
+				record.setDbjSn(dbjSn);
+				super.save(record);
+			}
+		}
+	}
+
+	/**
+	 * 按精追码或主工件码查询关联绑定记录
+	 */
+	public List<MesProductDbjBind> findBindListForRecord(MesProductDbjRecord record) {
+		List<MesProductDbjBind> bindList = new ArrayList<>();
+		if (record == null) {
+			return bindList;
+		}
+		if (StringUtils.isNotEmpty(record.getSn())) {
+			MesProductDbjBind byPartSn = new MesProductDbjBind();
+			byPartSn.setMaterielSn(record.getSn());
+			byPartSn.getSqlMap().getOrder().setOrderBy("a.create_date DESC");
+			bindList.addAll(mesProductDbjBindService.findList(byPartSn));
+		}
+		if (StringUtils.isNotEmpty(record.getDbjSn())) {
+			MesProductDbjBind byDbjSn = new MesProductDbjBind();
+			byDbjSn.setDbjSn(record.getDbjSn());
+			byDbjSn.getSqlMap().getOrder().setOrderBy("a.create_date DESC");
+			for (MesProductDbjBind bind : mesProductDbjBindService.findList(byDbjSn)) {
+				if (bindList.stream().noneMatch(item -> item.getId().equals(bind.getId()))) {
+					bindList.add(bind);
+				}
+			}
+		}
+		return bindList;
+	}
+
+	private List<MesProductDbjRecordItem> buildItems(List<ParamsResp> paramsResps, String oprno, String lineSn,
+	                                                 List<BindMaterialResp> bmlists) {
+		List<MesProductDbjRecordItem> items = new ArrayList<>();
+		if (ListUtils.isEmpty(paramsResps)) {
+			return items;
+		}
+		Map<String, String> craftMaterialMap = buildCraftMaterialNameMap(oprno, lineSn, bmlists);
+		int sort = 0;
+		for (ParamsResp paramsResp : paramsResps) {
+			if (paramsResp == null || StringUtils.isEmpty(paramsResp.getCraft())) {
+				continue;
+			}
+			MesProductDbjRecordItem item = new MesProductDbjRecordItem();
+			item.setCraft(paramsResp.getCraft());
+			item.setCraftName(craftMaterialMap.get(paramsResp.getCraft()));
+			item.setResult(paramsResp.getResult());
+			item.setVal(paramsResp.getVal());
+			item.setSort(sort++);
+			items.add(item);
+		}
+		return items;
+	}
+
+	private void enrichItemMaterialNames(List<MesProductDbjRecordItem> items, String oprno, String lineSn) {
+		if (ListUtils.isEmpty(items)) {
+			return;
+		}
+		Map<String, String> craftMaterialMap = buildCraftMaterialNameMap(oprno, lineSn, null);
+		for (MesProductDbjRecordItem item : items) {
+			if (StringUtils.isEmpty(item.getCraftName()) && StringUtils.isNotEmpty(item.getCraft())) {
+				item.setCraftName(craftMaterialMap.get(item.getCraft()));
+			}
+		}
+	}
+
+	private Map<String, String> buildCraftMaterialNameMap(String oprno, String lineSn, List<BindMaterialResp> bmlists) {
+		Map<String, String> craftMaterialMap = new HashMap<>();
+		if (!ListUtils.isEmpty(bmlists)) {
+			for (BindMaterialResp bindMaterialResp : bmlists) {
+				if (StringUtils.isNotEmpty(bindMaterialResp.getCraft())
+						&& StringUtils.isNotEmpty(bindMaterialResp.getMaterialTitle())) {
+					craftMaterialMap.put(bindMaterialResp.getCraft(), bindMaterialResp.getMaterialTitle());
+				}
+			}
+		}
+		if (StringUtils.isEmpty(oprno) || StringUtils.isEmpty(lineSn)) {
+			return craftMaterialMap;
+		}
+		MesLineProcessMaterial query = new MesLineProcessMaterial();
+		query.setOprno(CommonUitl.formatOprno(oprno));
+		query.setLineSn(lineSn);
+		List<MesLineProcessMaterial> materials = mesLineProcessMaterialService.findList(query);
+		if (!ListUtils.isEmpty(materials)) {
+			for (MesLineProcessMaterial material : materials) {
+				if (StringUtils.isNotEmpty(material.getCraft())
+						&& StringUtils.isNotEmpty(material.getMaterialTitle())) {
+					craftMaterialMap.putIfAbsent(material.getCraft(), material.getMaterialTitle());
+				}
+			}
+		}
+		return craftMaterialMap;
+	}
+}

+ 11 - 1
src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java

@@ -43,6 +43,9 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 	@Autowired
 	private MesProductRecordDao mesProductRecordDao;
 
+    @Autowired
+    private MesProductDbjRecordService mesProductDbjRecordService;
+
 	@Autowired
 	private MesProductCateService mesProductCateService;
 
@@ -556,7 +559,7 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 	public void updateRecordResult(String sn, String oprno, String craft, String materielSn, String content, String userCode, List<ParamsResp> paramsResps,String lineSn,Boolean optime,List<BindMaterialResp> bmlists) {
 		String oldOprno = oprno;
 		oprno = CommonUitl.formatOprno(oprno);
-		sn = sn.trim();
+		sn = StringUtils.trimToEmpty(sn);
 
 		// 获取当前工位的设备及工装编号
 		MesLineProcess mesLineProcess1 = mesLineProcessService.findInfoByOprnoLineSn(oldOprno,lineSn);
@@ -718,6 +721,7 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		}
 
 		// 是否更新工位时间
+		Integer intervalSec = null;
 		if(optime){
 			String sns = sn;
 			MesDeviceTime mesDeviceTime = mesDeviceTimeService.getInfoByOprnoAndSnAndCate(oldOprno,sns,lineSn);
@@ -731,6 +735,7 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 				}else{
 					mesDeviceTime.setInterval(0);
 				}
+				intervalSec = mesDeviceTime.getInterval();
 				mesDeviceTime.setSn(sn);
 				mesDeviceTimeService.save(mesDeviceTime);
 			}
@@ -817,6 +822,11 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 			}
 		}
 
+		if(mesLineProcess1.getType().equals("3")){
+			mesProductDbjRecordService.saveFromUpload(sn, oldOprno, lineSn, craft, content, userCode,
+					paramsResps, bmlists, mesLineProcess1, intervalSec);
+		}
+
 	}
 
 	// 获取模板的ID

+ 10 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductDbjBindController.java

@@ -27,6 +27,9 @@ import org.springframework.web.multipart.MultipartFile;
 import com.jeesite.common.web.BaseController;
 import com.jeesite.modules.mes.entity.MesProductDbjBind;
 import com.jeesite.modules.mes.service.MesProductDbjBindService;
+import com.jeesite.modules.mes.service.MesProductDbjRecordService;
+import com.jeesite.modules.mes.util.CommonUitl;
+import com.jeesite.modules.mes.req.MesSearchDateReq;
 
 /**
  * 单部件绑定表Controller
@@ -39,6 +42,9 @@ public class MesProductDbjBindController extends BaseController {
 
     @Autowired
     private MesProductDbjBindService mesProductDbjBindService;
+	@Autowired
+	private MesProductDbjRecordService mesProductDbjRecordService;
+
     @Autowired
     private MesLogService mesLogService;
 
@@ -60,6 +66,9 @@ public class MesProductDbjBindController extends BaseController {
     @RequiresPermissions("mes:mesProductDbjBind:view")
     @RequestMapping(value = {"list", ""})
     public String list(MesProductDbjBind mesProductDbjBind, Model model) {
+        MesSearchDateReq dateMap = CommonUitl.getSearchDate();
+        mesProductDbjBind.setCreateDate_gte(dateMap.getStartDate());
+        mesProductDbjBind.setCreateDate_lte(dateMap.getEndtDate());
         model.addAttribute("mesProductDbjBind", mesProductDbjBind);
         return "modules/mes/mesProductDbjBindList";
     }
@@ -162,6 +171,7 @@ public class MesProductDbjBindController extends BaseController {
         mesProductDbjBind.setOprno(oprno);
         mesProductDbjBind.setMaterielSn(materielSn);
         mesProductDbjBindService.save(mesProductDbjBind);
+        mesProductDbjRecordService.backfillDbjSn(materielSn, dbjSn);
         resp.setResult(Global.TRUE);
         resp.setMessage("绑定成功");
         return  resp;

+ 100 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductDbjRecordController.java

@@ -0,0 +1,100 @@
+package com.jeesite.modules.mes.web;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.utils.excel.ExcelExport;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesProductDbjRecord;
+import com.jeesite.modules.mes.entity.MesProductDbjRecordItem;
+import com.jeesite.modules.mes.service.MesProductDbjRecordItemService;
+import com.jeesite.modules.mes.service.MesProductDbjRecordService;
+import com.jeesite.modules.mes.util.CommonUitl;
+import com.jeesite.modules.mes.req.MesSearchDateReq;
+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 javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 单部件加工记录Controller
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesProductDbjRecord")
+public class MesProductDbjRecordController extends BaseController {
+
+	@Autowired
+	private MesProductDbjRecordService mesProductDbjRecordService;
+
+	@Autowired
+	private MesProductDbjRecordItemService mesProductDbjRecordItemService;
+
+	@ModelAttribute
+	public MesProductDbjRecord get(String id, boolean isNewRecord) {
+		return mesProductDbjRecordService.get(id, isNewRecord);
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesProductDbjRecord mesProductDbjRecord, Model model) {
+		MesSearchDateReq dateMap = CommonUitl.getSearchDate();
+		mesProductDbjRecord.setCreateDate_gte(dateMap.getStartDate());
+		mesProductDbjRecord.setCreateDate_lte(dateMap.getEndtDate());
+		model.addAttribute("mesProductDbjRecord", mesProductDbjRecord);
+		return "modules/mes/mesProductDbjRecordList";
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesProductDbjRecord> listData(MesProductDbjRecord mesProductDbjRecord, HttpServletRequest request,
+	                                          HttpServletResponse response) {
+		mesProductDbjRecord.setPage(new Page<>(request, response));
+		return mesProductDbjRecordService.findPage(mesProductDbjRecord);
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:view")
+	@RequestMapping(value = "info")
+	public String info(MesProductDbjRecord mesProductDbjRecord, Model model) {
+		model.addAttribute("mesProductDbjRecord", mesProductDbjRecord);
+		model.addAttribute("itemList", mesProductDbjRecordService.findItemsForRecord(mesProductDbjRecord));
+		model.addAttribute("bindList", mesProductDbjRecordService.findBindListForRecord(mesProductDbjRecord));
+		return "modules/mes/mesProductDbjRecordInfo";
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesProductDbjRecord mesProductDbjRecord) {
+		mesProductDbjRecordService.save(mesProductDbjRecord);
+		return renderResult(Global.TRUE, text("保存单部件加工记录成功!"));
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:view")
+	@RequestMapping(value = "exportData")
+	public void exportData(MesProductDbjRecord mesProductDbjRecord, HttpServletResponse response) {
+		List<MesProductDbjRecord> list = mesProductDbjRecordService.findList(mesProductDbjRecord);
+		String fileName = "单部件加工记录" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
+		try (ExcelExport ee = new ExcelExport("单部件加工记录", MesProductDbjRecord.class)) {
+			ee.setDataList(list).write(response, fileName);
+		}
+	}
+
+	@RequiresPermissions("mes:mesProductDbjRecord:view")
+	@RequestMapping(value = "itemListData")
+	@ResponseBody
+	public Page<MesProductDbjRecordItem> itemListData(MesProductDbjRecordItem mesProductDbjRecordItem,
+	                                                  HttpServletRequest request, HttpServletResponse response) {
+		mesProductDbjRecordItem.setPage(new Page<>(request, response));
+		return mesProductDbjRecordItemService.findPage(mesProductDbjRecordItem);
+	}
+}

+ 2 - 1
src/main/java/com/jeesite/modules/mes/web/MesProductRecordController.java

@@ -1109,7 +1109,8 @@ public class MesProductRecordController extends BaseController {
 		}
 
 		// ========== 新增:当前产线生产类型限制 ==========
-		if (!mesProductCateService.isCurrentProductAllowed(lineSn, sn)) {
+		// 单部件工位扫精追码,不做整件产品类型限制
+		if (!mesLineProcess1.getType().equals("3") && !mesProductCateService.isCurrentProductAllowed(lineSn, sn)) {
 			MesProductCate scannedCate = mesProductCateService.getCateBySn(sn);
 			if (!ObjectUtils.isEmpty(scannedCate)) {
 				if ("SJXT".equalsIgnoreCase(scannedCate.getSn())) {

+ 1 - 1
src/main/resources/config/application.yml

@@ -907,7 +907,7 @@ file:
   enabled: true
 
 #  # 文件上传根路径,设置路径中不允许包含“userfiles”,在指定目录中系统会自动创建userfiles目录,如果不设置默认为contextPath路径
-  baseDir: E:/mescloud
+  baseDir: D:/mescloud
 #  baseDir: /www/wwwroot/mes_cloud_dy
 #
 #  # 上传文件的相对路径(支持:yyyy, MM, dd, HH, mm, ss, E)

+ 5 - 0
src/main/resources/mappings/modules/mes/MesProductDbjRecordDao.xml

@@ -0,0 +1,5 @@
+<?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.mes.dao.MesProductDbjRecordDao">
+
+</mapper>

+ 5 - 0
src/main/resources/mappings/modules/mes/MesProductDbjRecordItemDao.xml

@@ -0,0 +1,5 @@
+<?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.mes.dao.MesProductDbjRecordItemDao">
+
+</mapper>

+ 74 - 0
src/main/resources/views/modules/mes/mesProductDbjBindForm.html

@@ -0,0 +1,74 @@
+<% 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(mesProductDbjBind.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="${mesProductDbjBind}" action="${ctx}/mes/mesProductDbjBind/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<#form:hidden path="createDate"/>
+				<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('主工件码')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="dbjSn" maxlength="50" 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 ">*</span> ${text('工位号')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="oprno" maxlength="20" 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 ">*</span> ${text('精追码')}:</label>
+							<div class="col-sm-10">
+								<#form:input path="materielSn" maxlength="255" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesProductDbjBind: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>

+ 87 - 0
src/main/resources/views/modules/mes/mesProductDbjBindList.html

@@ -0,0 +1,87 @@
+<% 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="btnExport"><i class="glyphicon glyphicon-export"></i> 导出</a>
+				<% if(hasPermi('mes:mesProductDbjBind:edit')){ %>
+					<a href="${ctx}/mes/mesProductDbjBind/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="${mesProductDbjBind}" action="${ctx}/mes/mesProductDbjBind/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="dbjSn" maxlength="50" class="form-control width-260"/>
+					</div>
+				</div>
+				<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="materielSn" maxlength="255" class="form-control width-260"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('绑定时间')}:</label>
+					<div class="control-inline">
+						<#form:input path="createDate_gte" readonly="true" maxlength="20" class="form-control laydate width-datetime2"
+							dataFormat="datetime2" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss" data-done="createDate_lte.click()"/>
+						&nbsp;-&nbsp;
+						<#form:input path="createDate_lte" readonly="true" maxlength="20" class="form-control laydate width-datetime2"
+							dataFormat="datetime2" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss"/>
+					</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:'dbjSn', index:'a.dbj_sn', width:280, align:"center", frozen:true},
+		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:100, align:"center"},
+		{header:'${text("精追码")}', name:'materielSn', index:'a.materiel_sn', width:320, align:"center"},
+		{header:'${text("绑定人")}', name:'createBy', index:'a.create_by', width:120, align:"center"},
+		{header:'${text("绑定时间")}', name:'createDate', index:'a.create_date', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:80, align:"center", formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesProductDbjBind:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesProductDbjBind/form?id='+row.id+'&createDate='+row.createDate+'" class="btnList" title="${text("编辑")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	frozenCols: true,
+	ajaxSuccess: function(data){}
+});
+</script>
+<script>
+$('#btnExport').click(function(){
+	js.ajaxSubmitForm($('#searchForm'), {
+		url:'${ctx}/mes/mesProductDbjBind/exportData',
+		downloadFile:true
+	});
+});
+</script>

+ 123 - 0
src/main/resources/views/modules/mes/mesProductDbjRecordInfo.html

@@ -0,0 +1,123 @@
+<% 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("单部件加工记录详情")}
+			</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>
+		<div class="box-body">
+			<div class="form-unit">${text('基本信息')}</div>
+			<table class="table table-bordered">
+				<tr>
+					<th class="mpc-header">精追码</th>
+					<td>${mesProductDbjRecord.sn!''}</td>
+					<th class="mpc-header">主工件码</th>
+					<td>${mesProductDbjRecord.dbjSn!'未绑定'}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">产线编号</th>
+					<td>${mesProductDbjRecord.lineSn!''}</td>
+					<th class="mpc-header">工位号</th>
+					<td>${mesProductDbjRecord.oprno!''}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">工艺号</th>
+					<td>${mesProductDbjRecord.craft!''}</td>
+					<th class="mpc-header">结果</th>
+					<td>${mesProductDbjRecord.result!''}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">绑定物料</th>
+					<td colspan="3">${mesProductDbjRecord.materielSn!''}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">设备编号</th>
+					<td>${mesProductDbjRecord.deviceNo!''}</td>
+					<th class="mpc-header">工装编号</th>
+					<td>${mesProductDbjRecord.gzNo!''}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">加工时长(秒)</th>
+					<td>${mesProductDbjRecord.intervalSec!''}</td>
+					<th class="mpc-header">操作员工号</th>
+					<td>${mesProductDbjRecord.userCode!''}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">上传批次</th>
+					<td>${mesProductDbjRecord.batchId!''}</td>
+					<th class="mpc-header">完成时间</th>
+					<td>${@DateUtils.formatDateTime(mesProductDbjRecord.createDate)}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">备注</th>
+					<td colspan="3">${mesProductDbjRecord.remark!''}</td>
+				</tr>
+			</table>
+
+			<div class="form-unit">${text('过程参数')}</div>
+			<table class="table table-bordered text-center">
+				<thead>
+				<tr>
+					<th class="text-center" style="width:120px;background-color:#d2d6de;">工艺号</th>
+					<th class="text-center" style="width:180px;background-color:#d2d6de;">物料名称</th>
+					<th class="text-center" style="width:80px;background-color:#d2d6de;">结果</th>
+					<th class="text-center" style="background-color:#d2d6de;">参数值</th>
+				</tr>
+				</thead>
+				<tbody>
+				<% if(itemList != null && itemList.~size > 0){ %>
+					<% for(item in itemList){ %>
+					<tr>
+						<td class="text-center">${item.craft!''}</td>
+						<td class="text-center">${item.craftName!''}</td>
+						<td class="text-center">${item.result!''}</td>
+						<td class="text-center">${item.val!''}</td>
+					</tr>
+					<% } %>
+				<% } else { %>
+					<tr><td colspan="4" class="text-center text-muted">暂无过程参数</td></tr>
+				<% } %>
+				</tbody>
+			</table>
+
+			<% if(bindList != null && bindList.~size > 0){ %>
+			<div class="form-unit">${text('关联绑定记录')}</div>
+			<table class="table table-bordered">
+				<thead>
+				<tr>
+					<th class="mpc-header">主工件码</th>
+					<th class="mpc-header">工位号</th>
+					<th class="mpc-header">精追码</th>
+					<th class="mpc-header">绑定时间</th>
+				</tr>
+				</thead>
+				<tbody>
+				<% for(bind in bindList){ %>
+				<tr>
+					<td>${bind.dbjSn!''}</td>
+					<td>${bind.oprno!''}</td>
+					<td>${bind.materielSn!''}</td>
+					<td>${@DateUtils.formatDateTime(bind.createDate)}</td>
+				</tr>
+				<% } %>
+				</tbody>
+			</table>
+			<% } else { %>
+			<div class="form-unit">${text('关联绑定记录')}</div>
+			<p class="text-muted">该精追码尚未绑定主工件码</p>
+			<% } %>
+		</div>
+		<div class="box-footer">
+			<div class="row">
+				<div class="col-sm-offset-2 col-sm-10">
+					<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>
+	</div>
+</div>
+<% } %>

+ 107 - 0
src/main/resources/views/modules/mes/mesProductDbjRecordList.html

@@ -0,0 +1,107 @@
+<% 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="btnExport"><i class="glyphicon glyphicon-export"></i> 导出</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="${mesProductDbjRecord}" action="${ctx}/mes/mesProductDbjRecord/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="sn" maxlength="50" class="form-control width-260"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('主工件码')}:</label>
+					<div class="control-inline">
+						<#form:input path="dbjSn" maxlength="50" class="form-control width-260"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('产线编号')}:</label>
+					<div class="control-inline">
+						<#form:input path="lineSn" maxlength="30" class="form-control width-120"/>
+					</div>
+				</div>
+				<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="result" maxlength="4" class="form-control width-80"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('操作员工号')}:</label>
+					<div class="control-inline">
+						<#form:input path="userCode" maxlength="64" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('完成时间')}:</label>
+					<div class="control-inline">
+						<#form:input path="createDate_gte" readonly="true" maxlength="20" class="form-control laydate width-datetime2"
+							dataFormat="datetime2" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss" data-done="createDate_lte.click()"/>
+						&nbsp;-&nbsp;
+						<#form:input path="createDate_lte" readonly="true" maxlength="20" class="form-control laydate width-datetime2"
+							dataFormat="datetime2" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss"/>
+					</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:'sn', index:'a.sn', width:260, align:"center", frozen:true, formatter: function(val, obj, row, act){
+			var title = val || row.dbjSn || row.id;
+			return '<a href="${ctx}/mes/mesProductDbjRecord/info?id='+row.id+'" class="btnList" data-title="${text("单部件加工记录详情")}">'+(title||'-')+'</a>';
+		}},
+		{header:'${text("主工件码")}', name:'dbjSn', index:'a.dbj_sn', width:260, align:"center", formatter: function(val, obj, row, act){
+			return val || '<span class="text-muted">未绑定</span>';
+		}},
+		{header:'${text("产线编号")}', name:'lineSn', index:'a.line_sn', width:100, align:"center"},
+		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:100, align:"center"},
+		{header:'${text("结果")}', name:'result', index:'a.result', width:80, align:"center"},
+		{header:'${text("绑定物料")}', name:'materielSn', index:'a.materiel_sn', width:200, align:"center"},
+		{header:'${text("加工时长(秒)")}', name:'intervalSec', index:'a.interval_sec', width:110, align:"center"},
+		{header:'${text("操作员工号")}', name:'userCode', index:'a.user_code', width:120, align:"center"},
+		{header:'${text("完成时间")}', name:'createDate', index:'a.create_date', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:80, align:"center", formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesProductDbjRecord/info?id='+row.id+'" class="btnList" title="${text("查看详情")}"><i class="fa fa-fw fa-eye"></i></a>';
+		}}
+	],
+	frozenCols: true,
+	ajaxSuccess: function(data){}
+});
+</script>
+<script>
+$('#btnExport').click(function(){
+	js.ajaxSubmitForm($('#searchForm'), {
+		url:'${ctx}/mes/mesProductDbjRecord/exportData',
+		downloadFile:true
+	});
+});
+</script>