Преглед на файлове

浇筑历史数据优化和领料订单导出为excel

liuwei преди 3 месеца
родител
ревизия
e7081cc9b8

+ 23 - 1
src/main/java/com/jeesite/modules/mes/entity/MesMaterialLl.java

@@ -9,7 +9,9 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 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;
 
 /**
  * 生产领料单Entity
@@ -42,6 +44,26 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
 public class MesMaterialLl extends DataEntity<MesMaterialLl> {
 
 	private static final long serialVersionUID = 1L;
+
+	@ExcelFields({
+		@ExcelField(title="第三方数据标识", attrName="otherId", align=Align.CENTER, sort=10),
+		@ExcelField(title="单据日期", attrName="businessDate", align=Align.CENTER, sort=20, dataFormat="yyyy-MM-dd hh:mm"),
+		@ExcelField(title="生产订单号", attrName="moDocNo", align=Align.CENTER, sort=30),
+		@ExcelField(title="领料部门", attrName="deptCode", align=Align.CENTER, sort=40),
+		@ExcelField(title="领料人员", attrName="employeeCode", align=Align.CENTER, sort=50),
+		@ExcelField(title="是否无备料领料", attrName="isNoPickLine", align=Align.CENTER, sort=60),
+		@ExcelField(title="存储地点", attrName="whCode", align=Align.CENTER, sort=70),
+		@ExcelField(title="库位", attrName="binCode", align=Align.CENTER, sort=80),
+		@ExcelField(title="料品编码", attrName="itemCode", align=Align.CENTER, sort=90),
+		@ExcelField(title="批号编码", attrName="lotCode", align=Align.CENTER, sort=100),
+		@ExcelField(title="项目号", attrName="projectCode", align=Align.CENTER, sort=110),
+		@ExcelField(title="领料数量", attrName="issuedQty", align=Align.CENTER, sort=120),
+		@ExcelField(title="生产领料单号", attrName="issueDocNo", align=Align.CENTER, sort=130),
+		@ExcelField(title="生产订单备料行", attrName="mopickList", align=Align.CENTER, sort=140),
+		@ExcelField(title="状态", attrName="state", align=Align.CENTER, sort=150),
+		@ExcelField(title="更新时间", attrName="updateDate", align=Align.CENTER, sort=160, dataFormat="yyyy-MM-dd hh:mm"),
+	})
+
 	private String otherId;		// 第三方数据标识
 	private Date businessDate;		// 单据日期
 	private String moDocNo;		// 生产订单号

+ 15 - 1
src/main/java/com/jeesite/modules/mes/web/MesMaterialLlController.java

@@ -4,7 +4,6 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.jeesite.modules.erp.entity.MesProductOrder;
 import com.jeesite.modules.mes.resp.CommonResp;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +17,9 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import com.jeesite.common.config.Global;
 import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.DateUtils;
 import com.jeesite.common.service.ServiceException;
+import com.jeesite.common.utils.excel.ExcelExport;
 import com.jeesite.common.web.BaseController;
 import com.jeesite.modules.mes.entity.MesMaterialLl;
 import com.jeesite.modules.mes.service.MesMaterialLlService;
@@ -66,6 +67,19 @@ public class MesMaterialLlController extends BaseController {
 	}
 
 	/**
+	 * 导出数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:view")
+	@RequestMapping(value = "exportData")
+	public void exportData(MesMaterialLl mesMaterialLl, HttpServletResponse response) {
+		List<MesMaterialLl> list = mesMaterialLlService.findList(mesMaterialLl);
+		String fileName = "生产领料单" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
+		try (ExcelExport ee = new ExcelExport("生产领料单", MesMaterialLl.class)) {
+			ee.setDataList(list).write(response, fileName);
+		}
+	}
+
+	/**
 	 * 查看编辑表单
 	 */
 	@RequiresPermissions("mes:mesMaterialLl:view")

+ 10 - 0
src/main/java/com/jeesite/modules/tianHong/entity/MachineAttrHistory.java

@@ -62,6 +62,8 @@ public class MachineAttrHistory extends DataEntity<MachineAttrHistory> {
 	private String attr;
 	private String val;
 	private Date eventTime;
+	/** 列表行快照时间键(DATE_FORMAT event_time '%Y%m%d%H%i%s%f'),用于精确查明细 */
+	private String eventTimeKey;
 
 	public MachineAttrHistory() {
 		this(null);
@@ -295,4 +297,12 @@ public class MachineAttrHistory extends DataEntity<MachineAttrHistory> {
 		this.eventTime = eventTime;
 	}
 
+	public String getEventTimeKey() {
+		return eventTimeKey;
+	}
+
+	public void setEventTimeKey(String eventTimeKey) {
+		this.eventTimeKey = eventTimeKey;
+	}
+
 }

+ 14 - 1
src/main/java/com/jeesite/modules/tianHong/service/MachineAttrHistoryService.java

@@ -234,7 +234,8 @@ public class MachineAttrHistoryService extends CrudService<MachineAttrHistoryDao
 	}
 
 	/**
-	 * 获取单条数据(按 eqp_id 查询属性明细)
+	 * 获取单条数据(按 eqp_id + 快照时间查询属性明细)
+	 * 须带 eventTimeKey / eventTime / beginTime~endTime,禁止无时间条件全量加载
 	 */
 	@Override
 	public MachineAttrHistory get(MachineAttrHistory machineAttrHistory) {
@@ -243,8 +244,20 @@ public class MachineAttrHistoryService extends CrudService<MachineAttrHistoryDao
 		}
 		MachineAttrHistory entity = new MachineAttrHistory();
 		entity.setEqpId(machineAttrHistory.getEqpId());
+		entity.setAttrEventTime(machineAttrHistory.getEventTime());
+		entity.setEventTimeKey(machineAttrHistory.getEventTimeKey());
+		boolean hasTime = StringUtils.isNotBlank(machineAttrHistory.getEventTimeKey())
+				|| machineAttrHistory.getEventTime() != null
+				|| machineAttrHistory.getBeginTime() != null
+				|| machineAttrHistory.getEndTime() != null;
+		if (!hasTime) {
+			entity.setAttrList(Collections.emptyList());
+			return entity;
+		}
 		MachineAttrHistory queryParam = new MachineAttrHistory();
 		queryParam.setEqpId(machineAttrHistory.getEqpId());
+		queryParam.setEventTimeKey(machineAttrHistory.getEventTimeKey());
+		queryParam.setEventTime(machineAttrHistory.getEventTime());
 		queryParam.setBeginTime(machineAttrHistory.getBeginTime());
 		queryParam.setEndTime(machineAttrHistory.getEndTime());
 		entity.setAttrList(dao.findAttrList(queryParam));

+ 27 - 1
src/main/java/com/jeesite/modules/tianHong/web/MachineAttrHistoryController.java

@@ -1,5 +1,7 @@
 package com.jeesite.modules.tianHong.web;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -37,15 +39,19 @@ public class MachineAttrHistoryController extends BaseController {
 	/**
 	 * 获取数据
 	 * @param id 设备号(eqp_id),仅 form 表单请求时传入
+	 * @param eventTimeKey 列表行 id 中的时间键(精确快照)
+	 * @param eventTime 兼容旧参数(按秒范围,可能含同秒多快照)
 	 */
 	@ModelAttribute
-	public MachineAttrHistory get(String id, boolean isNewRecord) {
+	public MachineAttrHistory get(String id, String eventTimeKey, String eventTime, boolean isNewRecord) {
 		// listData 等列表请求不传 id,直接返回空对象,避免在 @ModelAttribute 阶段执行不必要的查询
 		if (isNewRecord || id == null || id.isEmpty()) {
 			return new MachineAttrHistory();
 		}
 		MachineAttrHistory query = new MachineAttrHistory();
 		query.setEqpId(id);
+		query.setEventTimeKey(StringUtils.trim(eventTimeKey));
+		query.setEventTime(parseEventTime(eventTime));
 		MachineAttrHistory entity = machineAttrHistoryService.get(query);
 		if (entity == null) {
 			entity = new MachineAttrHistory();
@@ -54,6 +60,26 @@ public class MachineAttrHistoryController extends BaseController {
 		return entity;
 	}
 
+	private Date parseEventTime(String eventTime) {
+		if (StringUtils.isBlank(eventTime)) {
+			return null;
+		}
+		String[] patterns = {
+				"yyyy-MM-dd HH:mm:ss.SSS",
+				"yyyy-MM-dd HH:mm:ss",
+				"yyyy-MM-dd'T'HH:mm:ss.SSS",
+				"yyyy-MM-dd'T'HH:mm:ss"
+		};
+		for (String pattern : patterns) {
+			try {
+				return new SimpleDateFormat(pattern).parse(eventTime.trim());
+			} catch (ParseException ignored) {
+				// try next
+			}
+		}
+		return null;
+	}
+
 	/**
 	 * 查询列表页面
 	 */

+ 12 - 2
src/main/resources/mappings/modules/tianHong/MachineAttrHistoryDao.xml

@@ -110,8 +110,18 @@
 			event_time AS "eventTime"
 		FROM machine_attr_history
 		WHERE eqp_id = #{eqpId}
-		<include refid="attrEventTimeRange"/>
-		ORDER BY event_time DESC, attr
+		<!-- 优先:列表行 id 中的时间键,精确到微秒,避免同秒多快照重复 -->
+		<if test="eventTimeKey != null and eventTimeKey != ''">
+			AND event_time = STR_TO_DATE(#{eventTimeKey}, '%Y%m%d%H%i%s%f')
+		</if>
+		<if test="(eventTimeKey == null or eventTimeKey == '') and eventTime != null">
+			AND event_time &gt;= FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(#{eventTime})))
+			AND event_time &lt; FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(#{eventTime})) + 1)
+		</if>
+		<if test="(eventTimeKey == null or eventTimeKey == '') and eventTime == null">
+			<include refid="attrEventTimeRange"/>
+		</if>
+		ORDER BY attr
 	</select>
 
 </mapper>

+ 9 - 0
src/main/resources/views/modules/mes/mesMaterialLlList.html

@@ -7,6 +7,7 @@
 			</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:mesMaterialLl:edit')){ %>
 					<a href="${ctx}/mes/mesMaterialLl/form" class="btn btn-default btnTool" title="${text('新增生产领料单')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
 				<% } %>
@@ -146,4 +147,12 @@ $('#dataGrid').dataGrid({
 		
 	}
 });
+</script>
+<script>
+$('#btnExport').click(function(){
+	js.ajaxSubmitForm($('#searchForm'), {
+		url:'${ctx}/mes/mesMaterialLl/exportData',
+		downloadFile:true
+	});
+});
 </script>

+ 13 - 1
src/main/resources/views/modules/tianHong/machineAttrHistoryList.html

@@ -68,7 +68,19 @@ $('#dataGrid').dataGrid({
 		{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/machineAttrHistory/form?id='+js.val(row,'eqpId')+'" class="addTabPage" data-title="${text("设备属性明细")}"><i class="fa fa-list"></i> ${text("属性明细")}</a>&nbsp;');
+			var eqpId = js.val(row,'eqpId');
+			var rowId = js.val(row,'id') || '';
+			var href = '${ctx}/tianHong/machineAttrHistory/form?id=' + encodeURIComponent(eqpId || '');
+			// id 形如 D001_20260803172341921000,取末尾 20 位时间键精确查明细
+			if (rowId && /_\d{20}$/.test(rowId)) {
+				href += '&eventTimeKey=' + encodeURIComponent(rowId.slice(-20));
+			} else {
+				var et = js.val(row,'attrEventTime');
+				if (et) {
+					href += '&eventTime=' + encodeURIComponent(et);
+				}
+			}
+			actions.push('<a href="'+href+'" class="addTabPage" data-title="${text("设备属性明细")}"><i class="fa fa-list"></i> ${text("属性明细")}</a>&nbsp;');
 			return actions.join('');
 		}}
 	]