Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

hfy před 3 měsíci
rodič
revize
e7aabfc47d
24 změnil soubory, kde provedl 258 přidání a 27 odebrání
  1. 23 0
      src/main/java/com/jeesite/modules/mes/entity/MesErpInteractionLog.java
  2. 4 1
      src/main/java/com/jeesite/modules/mes/entity/MesRepairItems.java
  3. 9 0
      src/main/java/com/jeesite/modules/mes/erp/ErpInStockResult.java
  4. 4 1
      src/main/java/com/jeesite/modules/mes/erp/ErpInStockSaveService.java
  5. 4 0
      src/main/java/com/jeesite/modules/mes/erp/ErpInteractionLogService.java
  6. 9 0
      src/main/java/com/jeesite/modules/mes/erp/ErpPickMaterialResult.java
  7. 2 0
      src/main/java/com/jeesite/modules/mes/erp/ErpPickMaterialService.java
  8. 9 0
      src/main/java/com/jeesite/modules/mes/erp/ErpPrdInStockResult.java
  9. 2 0
      src/main/java/com/jeesite/modules/mes/erp/ErpPrdInStockSaveService.java
  10. 9 0
      src/main/java/com/jeesite/modules/mes/erp/ErpTransferDirectResult.java
  11. 4 1
      src/main/java/com/jeesite/modules/mes/erp/ErpTransferDirectSaveService.java
  12. 17 0
      src/main/java/com/jeesite/modules/mes/erp/MesErpInteractionLogTableInitializer.java
  13. 1 1
      src/main/java/com/jeesite/modules/mes/service/MesProductCcdService.java
  14. 65 0
      src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java
  15. 35 1
      src/main/java/com/jeesite/modules/mes/service/MesRepairItemsService.java
  16. 14 0
      src/main/java/com/jeesite/modules/mes/web/MesBatchSnController.java
  17. 1 0
      src/main/java/com/jeesite/modules/mes/web/MesErpInteractionLogController.java
  18. 1 1
      src/main/java/com/jeesite/modules/mes/web/MesProductRepairController.java
  19. 8 1
      src/main/java/com/jeesite/modules/mes/web/MesRepairController.java
  20. 24 12
      src/main/java/com/jeesite/modules/mes/web/MesRepairItemsController.java
  21. 5 5
      src/main/resources/config/application.yml
  22. 1 1
      src/main/resources/views/modules/mes/mesClientForm.html
  23. 6 2
      src/main/resources/views/modules/mes/mesErpInteractionLogDetail.html
  24. 1 0
      src/main/resources/views/modules/mes/mesErpInteractionLogList.html

+ 23 - 0
src/main/java/com/jeesite/modules/mes/entity/MesErpInteractionLog.java

@@ -33,6 +33,7 @@ import java.util.Date;
 		@Column(name = "operator_name", attrName = "operatorName", label = "操作人", queryType = QueryType.LIKE),
 		@Column(name = "request_summary", attrName = "requestSummary", label = "请求摘要"),
 		@Column(name = "response_summary", attrName = "responseSummary", label = "响应摘要"),
+		@Column(name = "response_duration_ms", attrName = "responseDurationMs", label = "响应时长", isUpdateForce = true),
 		@Column(name = "status", attrName = "status", label = "状态"),
 		@Column(name = "create_by", attrName = "createBy", label = "创建者", isUpdate = false),
 		@Column(name = "create_date", attrName = "createDate", label = "操作时间", isUpdate = false, isUpdateForce = true),
@@ -59,6 +60,8 @@ public class MesErpInteractionLog extends DataEntity<MesErpInteractionLog> {
 	private String operatorName;
 	private String requestSummary;
 	private String responseSummary;
+	/** ERP 接口响应时长(毫秒) */
+	private Integer responseDurationMs;
 
 	@ExcelFields({
 			@ExcelField(title = "操作时间", attrName = "createDate", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd HH:mm:ss"),
@@ -69,6 +72,7 @@ public class MesErpInteractionLog extends DataEntity<MesErpInteractionLog> {
 			@ExcelField(title = "数量摘要", attrName = "qtySummary", align = Align.CENTER, sort = 60),
 			@ExcelField(title = "结果", attrName = "pushResultLabel", align = Align.CENTER, sort = 70),
 			@ExcelField(title = "结果说明", attrName = "resultMessage", align = Align.LEFT, sort = 80, width = 40 * 256),
+			@ExcelField(title = "响应时长", attrName = "responseDurationLabel", align = Align.CENTER, sort = 85),
 			@ExcelField(title = "渠道", attrName = "channel", align = Align.CENTER, sort = 90),
 	})
 	public MesErpInteractionLog() {
@@ -201,6 +205,25 @@ public class MesErpInteractionLog extends DataEntity<MesErpInteractionLog> {
 		this.responseSummary = responseSummary;
 	}
 
+	public Integer getResponseDurationMs() {
+		return responseDurationMs;
+	}
+
+	public void setResponseDurationMs(Integer responseDurationMs) {
+		this.responseDurationMs = responseDurationMs;
+	}
+
+	/** 响应时长展示(如 350毫秒、1.2秒) */
+	public String getResponseDurationLabel() {
+		if (responseDurationMs == null || responseDurationMs < 0) {
+			return "";
+		}
+		if (responseDurationMs < 1000) {
+			return responseDurationMs + "毫秒";
+		}
+		return String.format("%.1f秒", responseDurationMs / 1000.0);
+	}
+
 	public String getBizTypeLabel() {
 		return ErpInteractionBizType.label(bizType);
 	}

+ 4 - 1
src/main/java/com/jeesite/modules/mes/entity/MesRepairItems.java

@@ -35,8 +35,11 @@ import javax.validation.constraints.Size;
 		@Column(name="update_date", attrName="updateDate", label="更新日期", isQuery=false, isUpdateForce=true),
 	},
 	joinTable = {
+		@JoinTable(type = JoinTable.Type.LEFT_JOIN, entity = MesLine.class, attrName = "this",
+			alias = "c", on = "c.sn = a.line_sn",
+			columns = {}),
 		@JoinTable(type = JoinTable.Type.LEFT_JOIN, entity = MesLineProcess.class, attrName = "this",
-			alias = "b", on = "b.oprno = a.oprno",
+			alias = "b", on = "b.oprno = a.oprno AND b.line_id = c.id",
 			columns = {
 				@Column(name = "title", attrName = "oprnoName", label = "工位名称")
 			})

+ 9 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpInStockResult.java

@@ -13,6 +13,7 @@ public class ErpInStockResult implements Serializable {
 	private String inStockBillNo;
 	private String inStockBillId;
 	private String message;
+	private Integer responseDurationMs;
 
 	public static ErpInStockResult success(String inStockBillNo, String inStockBillId) {
 		ErpInStockResult result = new ErpInStockResult();
@@ -45,4 +46,12 @@ public class ErpInStockResult implements Serializable {
 	public String getMessage() {
 		return message;
 	}
+
+	public Integer getResponseDurationMs() {
+		return responseDurationMs;
+	}
+
+	public void setResponseDurationMs(Integer responseDurationMs) {
+		this.responseDurationMs = responseDurationMs;
+	}
 }

+ 4 - 1
src/main/java/com/jeesite/modules/mes/erp/ErpInStockSaveService.java

@@ -122,8 +122,11 @@ public class ErpInStockSaveService {
 
 		JSONObject saveData = buildSaveData(poBillNo, stockNumber, stockLocNumber, stockLocKey, inStockLines);
 		logger.info("ERP in-stock save request: {}", saveData.toJSONString());
+		long erpStart = System.currentTimeMillis();
 		JSONObject response = erpClient.save(FORM_ID, saveData);
-		return parseSaveResponse(response);
+		ErpInStockResult result = parseSaveResponse(response);
+		result.setResponseDurationMs((int) (System.currentTimeMillis() - erpStart));
+		return result;
 	}
 
 	private String validateDetail(ErpPurchaseOrder detail, BigDecimal inspectQty) {

+ 4 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpInteractionLogService.java

@@ -43,6 +43,7 @@ public class ErpInteractionLogService {
 		log.setRequestSummary(buildInStockRequestSummary(request, lineCount, totalQty));
 		String failDetail = result.isSuccess() ? null : result.getMessage();
 		fillResult(log, result.isSuccess(), result.getMessage(), result.getInStockBillNo(), failDetail);
+		log.setResponseDurationMs(result.getResponseDurationMs());
 		persist(log);
 	}
 
@@ -62,6 +63,7 @@ public class ErpInteractionLogService {
 		log.setRequestSummary(buildRequestSummary(request.getMoBillNo(), null, lineCount, totalQty));
 		String failDetail = result.isSuccess() ? null : result.getMessage();
 		fillResult(log, result.isSuccess(), result.getMessage(), result.getBillNo(), failDetail);
+		log.setResponseDurationMs(result.getResponseDurationMs());
 		persist(log);
 	}
 
@@ -81,6 +83,7 @@ public class ErpInteractionLogService {
 		log.setRequestSummary(buildRequestSummary(request.getBillNo(), null, lineCount, totalQty));
 		String failDetail = result.isSuccess() ? null : result.getMessage();
 		fillResult(log, result.isSuccess(), result.getMessage(), result.getPickBillNo(), failDetail);
+		log.setResponseDurationMs(result.getResponseDurationMs());
 		persist(log);
 	}
 
@@ -99,6 +102,7 @@ public class ErpInteractionLogService {
 		log.setRequestSummary(buildTransferRequestSummary(request, totalQty));
 		String failDetail = result.isSuccess() ? null : result.getMessage();
 		fillResult(log, result.isSuccess(), result.getMessage(), result.getBillNo(), failDetail);
+		log.setResponseDurationMs(result.getResponseDurationMs());
 		persist(log);
 	}
 

+ 9 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpPickMaterialResult.java

@@ -16,6 +16,7 @@ public class ErpPickMaterialResult implements Serializable {
 	private int syncedMaterialCount;
 	private int syncedKcCount;
 	private boolean kcSyncFailed;
+	private Integer responseDurationMs;
 
 	public static ErpPickMaterialResult success(String pickBillNo, String pickBillId) {
 		ErpPickMaterialResult result = new ErpPickMaterialResult();
@@ -72,4 +73,12 @@ public class ErpPickMaterialResult implements Serializable {
 	public void setKcSyncFailed(boolean kcSyncFailed) {
 		this.kcSyncFailed = kcSyncFailed;
 	}
+
+	public Integer getResponseDurationMs() {
+		return responseDurationMs;
+	}
+
+	public void setResponseDurationMs(Integer responseDurationMs) {
+		this.responseDurationMs = responseDurationMs;
+	}
 }

+ 2 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpPickMaterialService.java

@@ -97,8 +97,10 @@ public class ErpPickMaterialService {
 
 		JSONObject saveData = buildSaveData(pickLines);
 		logger.info("ERP pick material save request: {}", saveData.toJSONString());
+		long erpStart = System.currentTimeMillis();
 		JSONObject response = erpClient.save(FORM_ID, saveData);
 		ErpPickMaterialResult result = parseSaveResponse(response);
+		result.setResponseDurationMs((int) (System.currentTimeMillis() - erpStart));
 		if (result.isSuccess()) {
 			syncMesInventory(result, pickLines);
 		}

+ 9 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpPrdInStockResult.java

@@ -17,6 +17,7 @@ public class ErpPrdInStockResult implements Serializable {
 	private BigDecimal totalQty;
 	private int batchCount;
 	private String message;
+	private Integer responseDurationMs;
 
 	public static ErpPrdInStockResult success(String billNo, String billId, String lotNumber,
 			BigDecimal totalQty, int batchCount) {
@@ -65,4 +66,12 @@ public class ErpPrdInStockResult implements Serializable {
 	public String getMessage() {
 		return message;
 	}
+
+	public Integer getResponseDurationMs() {
+		return responseDurationMs;
+	}
+
+	public void setResponseDurationMs(Integer responseDurationMs) {
+		this.responseDurationMs = responseDurationMs;
+	}
 }

+ 2 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpPrdInStockSaveService.java

@@ -139,8 +139,10 @@ public class ErpPrdInStockSaveService {
 		JSONObject saveData = buildSaveData(moEntry, totalQty, unitNumber, stockNumber, stockLocNumber,
 				stockLocKey, workshopNumber, saveLotNumber);
 		logger.info("ERP production in-stock save request: {}", saveData.toJSONString());
+		long erpStart = System.currentTimeMillis();
 		JSONObject response = erpClient.save(FORM_ID, saveData);
 		ErpPrdInStockResult result = parseSaveResponse(response, totalQty, batches.size());
+		result.setResponseDurationMs((int) (System.currentTimeMillis() - erpStart));
 		if (!result.isSuccess()) {
 			return result;
 		}

+ 9 - 0
src/main/java/com/jeesite/modules/mes/erp/ErpTransferDirectResult.java

@@ -13,6 +13,7 @@ public class ErpTransferDirectResult implements Serializable {
 	private String billNo;
 	private String billId;
 	private String message;
+	private Integer responseDurationMs;
 
 	public static ErpTransferDirectResult success(String billNo, String billId) {
 		ErpTransferDirectResult result = new ErpTransferDirectResult();
@@ -45,4 +46,12 @@ public class ErpTransferDirectResult implements Serializable {
 	public String getMessage() {
 		return message;
 	}
+
+	public Integer getResponseDurationMs() {
+		return responseDurationMs;
+	}
+
+	public void setResponseDurationMs(Integer responseDurationMs) {
+		this.responseDurationMs = responseDurationMs;
+	}
 }

+ 4 - 1
src/main/java/com/jeesite/modules/mes/erp/ErpTransferDirectSaveService.java

@@ -112,8 +112,11 @@ public class ErpTransferDirectSaveService {
 		JSONObject saveData = buildSaveData(instock, qty, unitNumber, srcStockNumber, srcStockLocNumber, srcStockLocKey,
 				destStockNumber, destStockLocNumber, destStockLocKey);
 		logger.info("ERP transfer direct save request: {}", saveData.toJSONString());
+		long erpStart = System.currentTimeMillis();
 		JSONObject response = erpClient.save(FORM_ID, saveData);
-		return parseSaveResponse(response);
+		ErpTransferDirectResult result = parseSaveResponse(response);
+		result.setResponseDurationMs((int) (System.currentTimeMillis() - erpStart));
+		return result;
 	}
 
 	private ErpPrdInStock findInstockRow(ErpTransferDirectSubmitRequest request) {

+ 17 - 0
src/main/java/com/jeesite/modules/mes/erp/MesErpInteractionLogTableInitializer.java

@@ -34,6 +34,7 @@ public class MesErpInteractionLogTableInitializer implements ApplicationRunner {
 			+ "`operator_name` varchar(100) DEFAULT NULL COMMENT '操作人姓名',"
 			+ "`request_summary` varchar(500) DEFAULT NULL COMMENT '请求摘要JSON',"
 			+ "`response_summary` varchar(1000) DEFAULT NULL COMMENT '失败时ERP错误摘要',"
+			+ "`response_duration_ms` int DEFAULT NULL COMMENT 'ERP接口响应时长(毫秒)',"
 			+ "`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态',"
 			+ "`create_by` varchar(64) NOT NULL COMMENT '创建者',"
 			+ "`create_date` datetime NOT NULL COMMENT '创建时间',"
@@ -60,6 +61,7 @@ public class MesErpInteractionLogTableInitializer implements ApplicationRunner {
 	public void run(ApplicationArguments args) {
 		try {
 			jdbcTemplate.execute(CREATE_TABLE_SQL);
+			ensureResponseDurationColumn();
 			logger.info("ERP 下推日志表已就绪: mes_erp_interaction_log");
 			int repaired = repairMislabeledSuccessLogs();
 			if (repaired > 0) {
@@ -75,6 +77,21 @@ public class MesErpInteractionLogTableInitializer implements ApplicationRunner {
 		}
 	}
 
+	/** 已有表补加响应时长列(兼容旧库) */
+	private void ensureResponseDurationColumn() {
+		try {
+			jdbcTemplate.execute(
+					"ALTER TABLE mes_erp_interaction_log ADD COLUMN `response_duration_ms` int DEFAULT NULL "
+							+ "COMMENT 'ERP接口响应时长(毫秒)' AFTER `response_summary`");
+			logger.info("ERP 下推日志表已补加列: response_duration_ms");
+		} catch (Exception ex) {
+			String msg = ex.getMessage() == null ? "" : ex.getMessage();
+			if (!msg.contains("Duplicate column")) {
+				logger.warn("补加 ERP 下推日志 response_duration_ms 列失败: {}", msg);
+			}
+		}
+	}
+
 	/** 修正已有 ERP 单号且说明为保存成功、但 push_result 误记为 0 的历史数据 */
 	private int repairMislabeledSuccessLogs() {
 		try {

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

@@ -203,7 +203,7 @@ public class MesProductCcdService extends CrudService<MesProductCcdDao, MesProdu
 			mesProductCcd.setSn(sn);
 			mesProductCcd.setOprno(oprno);
 			mesProductCcd.setLineSn(lineSn);
-			mesProductCcd.setCate("C005电池盒");
+			mesProductCcd.setCate("115电池盒");
 			mesProductCcd.setTitle(title);
 			//测试编号--序号
 			mesProductCcd.setTestNum(dtl.split("@")[0]);

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

@@ -181,6 +181,71 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		return mesProductRecordDao.findSnByMsn(mesProductRecord);
 	}
 
+	/**
+	 * 根据工件号解析产线编号:优先生产记录,其次工件类型(如 HEVXT、115XT)
+	 */
+	public String resolveLineSnBySn(String sn) {
+		if (StringUtils.isEmpty(sn)) {
+			return null;
+		}
+		if (sn.length() != 28) {
+			MesProductRecord msnRecord = findSnByMsn(sn);
+			if (!ObjectUtils.isEmpty(msnRecord) && StringUtils.isNotEmpty(msnRecord.getSn())) {
+				sn = msnRecord.getSn();
+			}
+		}
+		MesProductRecord record = findBySn(sn);
+		if (!ObjectUtils.isEmpty(record)) {
+			if (StringUtils.isNotEmpty(record.getLineSn())) {
+				return normalizeLineSn(record.getLineSn());
+			}
+			if (StringUtils.isNotEmpty(record.getCateSn())) {
+				return normalizeLineSn(record.getCateSn());
+			}
+		}
+		MesProduct mesProduct = new MesProduct();
+		mesProduct.setSn(sn);
+		MesProduct pd = mesProductService.findInfo(mesProduct);
+		if (!ObjectUtils.isEmpty(pd) && StringUtils.isNotEmpty(pd.getCate())) {
+			return normalizeLineSn(pd.getCate());
+		}
+		return null;
+	}
+
+	/**
+	 * 统一产线编号写法(如 115→115XT,HEV→HEVXT)
+	 */
+	public String normalizeLineSn(String lineSn) {
+		if (StringUtils.isEmpty(lineSn)) {
+			return lineSn;
+		}
+		String trimmed = lineSn.trim();
+		if ("HEV".equalsIgnoreCase(trimmed)) {
+			return "HEVXT";
+		}
+		if ("115".equals(trimmed) || "\u6b23\u65fa\u8fbe115".equals(trimmed)) {
+			return "115XT";
+		}
+		return trimmed;
+	}
+
+	/**
+	 * 产线编号短写(用于兼容返修项主数据中 115、HEV 等旧写法)
+	 */
+	public String toShortLineSn(String lineSn) {
+		if (StringUtils.isEmpty(lineSn)) {
+			return null;
+		}
+		String normalized = normalizeLineSn(lineSn);
+		if ("HEVXT".equalsIgnoreCase(normalized)) {
+			return "HEV";
+		}
+		if ("115XT".equalsIgnoreCase(normalized)) {
+			return "115";
+		}
+		return null;
+	}
+
     // 更新时获取记录详情
 	public MesProductRecord findByUpdate(String sn,String oprno,String craft){
 		oprno = CommonUitl.formatOprno(oprno);

+ 35 - 1
src/main/java/com/jeesite/modules/mes/service/MesRepairItemsService.java

@@ -1,9 +1,12 @@
 package com.jeesite.modules.mes.service;
 
 import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
 import com.jeesite.common.service.CrudService;
 import com.jeesite.modules.mes.dao.MesRepairItemsDao;
 import com.jeesite.modules.mes.entity.MesRepairItems;
+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;
 
@@ -16,7 +19,9 @@ import java.util.List;
  */
 @Service
 public class MesRepairItemsService extends CrudService<MesRepairItemsDao, MesRepairItems> {
-	
+
+	@Autowired
+	private MesProductRecordService mesProductRecordService;
 	/**
 	 * 获取单条数据
 	 * @param mesRepairItems
@@ -47,6 +52,35 @@ public class MesRepairItemsService extends CrudService<MesRepairItemsDao, MesRep
 	public List<MesRepairItems> findList(MesRepairItems mesRepairItems) {
 		return super.findList(mesRepairItems);
 	}
+
+	/**
+	 * 查询启用的返修项:可按工件号、工位号、产线编号筛选
+	 */
+	public List<MesRepairItems> findEnabledList(String sn, String oprno, String lineSn) {
+		String resolvedLineSn = lineSn;
+		if (StringUtils.isEmpty(resolvedLineSn) && StringUtils.isNotEmpty(sn)) {
+			resolvedLineSn = mesProductRecordService.resolveLineSnBySn(sn);
+		}
+		MesRepairItems query = new MesRepairItems();
+		query.setStatus(MesRepairItems.STATUS_NORMAL);
+		if (StringUtils.isNotEmpty(oprno)) {
+			query.setOprno(CommonUitl.formatOprno(oprno));
+		}
+		if (StringUtils.isNotEmpty(resolvedLineSn)) {
+			query.setLineSn(resolvedLineSn);
+			List<MesRepairItems> lists = findList(query);
+			if (!lists.isEmpty()) {
+				return lists;
+			}
+			String shortLineSn = mesProductRecordService.toShortLineSn(resolvedLineSn);
+			if (StringUtils.isNotEmpty(shortLineSn)) {
+				query.setLineSn(shortLineSn);
+				return findList(query);
+			}
+			return lists;
+		}
+		return findList(query);
+	}
 	
 	/**
 	 * 保存数据(插入或更新)

+ 14 - 0
src/main/java/com/jeesite/modules/mes/web/MesBatchSnController.java

@@ -34,6 +34,7 @@ import com.jeesite.common.entity.Page;
 import com.jeesite.common.service.ServiceException;
 import com.jeesite.common.web.BaseController;
 import com.jeesite.modules.mes.entity.MesBatchSn;
+import com.jeesite.modules.mes.erp.ErpPdaRespHelper;
 import com.jeesite.modules.mes.service.MesBatchSnService;
 
 /**
@@ -80,6 +81,19 @@ public class MesBatchSnController extends BaseController {
 	}
 
 	/**
+	 * PDA:批次码列表(CommonResp 包装)。
+	 */
+	@RequiresPermissions("mes:mesBatchSn:view")
+	@PostMapping(value = "pda/listData")
+	@ResponseBody
+	public CommonResp<Page<MesBatchSn>> pdaListData(MesBatchSn mesBatchSn, HttpServletRequest request,
+			HttpServletResponse response) {
+		mesBatchSn.setPage(new Page<>(request, response));
+		Page<MesBatchSn> page = mesBatchSnService.findPage(mesBatchSn);
+		return ErpPdaRespHelper.ok(page);
+	}
+
+	/**
 	 * 查看编辑表单
 	 */
 	@RequiresPermissions("mes:mesBatchSn:view")

+ 1 - 0
src/main/java/com/jeesite/modules/mes/web/MesErpInteractionLogController.java

@@ -63,6 +63,7 @@ public class MesErpInteractionLogController extends BaseController {
 	public String detail(MesErpInteractionLog mesErpInteractionLog, Model model) {
 		model.addAttribute("mesErpInteractionLog", mesErpInteractionLog);
 		model.addAttribute("bizTypeLabel", ErpInteractionBizType.label(mesErpInteractionLog.getBizType()));
+		model.addAttribute("pushSuccess", mesErpInteractionLog.isPushSuccess());
 		return "modules/mes/mesErpInteractionLogDetail";
 	}
 

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

@@ -258,7 +258,7 @@ public class MesProductRepairController extends BaseController {
 
 		mesProductRepairService.save(mesProductRepair);
 
-		resp.setMessage("操作成");
+		resp.setMessage("操作成功");
 		resp.setResult(Global.TRUE);
 		return resp;
 	}

+ 8 - 1
src/main/java/com/jeesite/modules/mes/web/MesRepairController.java

@@ -650,7 +650,14 @@ public class MesRepairController extends BaseController {
 		MesRepair mesRepair2 = new MesRepair();
 		mesRepair2.setSn(sn);
 		mesRepair2.setFxOprno(fxOprno);
-		mesRepair2.setLineSn(mesRepairItems.getLineSn());
+		String lineSn = ngInfo.getLineSn();
+		if (StringUtils.isEmpty(lineSn)) {
+			lineSn = ngInfo.getCateSn();
+		}
+		if (StringUtils.isEmpty(lineSn)) {
+			lineSn = pd.getCate();
+		}
+		mesRepair2.setLineSn(mesProductRecordService.normalizeLineSn(lineSn));
 		mesRepair2.setItemId(itemId);
 		mesRepair2.setRemark(remark);
 		mesRepair2.setOprno(oprno);

+ 24 - 12
src/main/java/com/jeesite/modules/mes/web/MesRepairItemsController.java

@@ -13,6 +13,7 @@ import com.jeesite.common.validator.ValidatorUtils;
 import com.jeesite.common.web.BaseController;
 import com.jeesite.modules.mes.entity.MesRepairItems;
 import com.jeesite.modules.mes.resp.CommonResp;
+import com.jeesite.modules.mes.service.MesProductRecordService;
 import com.jeesite.modules.mes.service.MesRepairItemsService;
 import com.jeesite.modules.mes.util.CommonUitl;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -45,6 +46,9 @@ public class MesRepairItemsController extends BaseController {
 
 	@Autowired
 	private MesRepairItemsService mesRepairItemsService;
+
+	@Autowired
+	private MesProductRecordService mesProductRecordService;
 	
 	/**
 	 * 获取数据
@@ -164,15 +168,14 @@ public class MesRepairItemsController extends BaseController {
 			return resp1;
 		}
 		if(StringUtils.isEmpty(lineSn)){
-			resp1.setResult(Global.FALSE);
-			resp1.setMessage("参数错误");
-			return resp1;
+			lineSn = mesProductRecordService.resolveLineSnBySn(sn);
+			if(StringUtils.isEmpty(lineSn)){
+				resp1.setResult(Global.FALSE);
+				resp1.setMessage("无法根据工件号获取产线编号,请传入 lineSn 或有效的 sn");
+				return resp1;
+			}
 		}
-		 oprno = CommonUitl.formatOprno(oprno);
-
-		mesRepairItems.setOprno(oprno);
-		mesRepairItems.setLineSn(lineSn);
-		List<MesRepairItems> lists = mesRepairItemsService.findList(mesRepairItems);
+		List<MesRepairItems> lists = mesRepairItemsService.findEnabledList(sn, oprno, lineSn);
 		for (MesRepairItems mesRepairItem : lists) {
 			mesRepairItem.setTitle(mesRepairItem.getTitle());
 		}
@@ -186,14 +189,23 @@ public class MesRepairItemsController extends BaseController {
 	@RequestMapping(value = "allItems")
 	@ResponseBody
 	public CommonResp allItems(MesRepairItems mesRepairItems, HttpServletRequest request, HttpServletResponse response) {
-		mesRepairItems.setStatus("0");
-		List<MesRepairItems> lists = mesRepairItemsService.findList(mesRepairItems);
+		CommonResp<List<MesRepairItems>> resp = new CommonResp<>();
+		String sn = request.getParameter("sn");
+		String oprno = request.getParameter("oprno");
+		String lineSn = request.getParameter("lineSn");
+		if (StringUtils.isNotEmpty(sn) && StringUtils.isEmpty(lineSn)) {
+			lineSn = mesProductRecordService.resolveLineSnBySn(sn);
+			if (StringUtils.isEmpty(lineSn)) {
+				resp.setResult(Global.FALSE);
+				resp.setMessage("无法根据工件号获取产线编号");
+				return resp;
+			}
+		}
+		List<MesRepairItems> lists = mesRepairItemsService.findEnabledList(sn, oprno, lineSn);
 		for (MesRepairItems mesRepairItem : lists) {
 			mesRepairItem.setTitle(mesRepairItem.getTitle());
 		}
 
-		CommonResp<List<MesRepairItems>> resp = new CommonResp<>();
-
 		resp.setData(lists);
 		resp.setResult(Global.TRUE);
 		return resp;

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

@@ -163,13 +163,13 @@ jdbc:
   # Mysql 数据库配置
   type: mysql
   driver: com.mysql.cj.jdbc.Driver
- # url: jdbc:mysql://127.0.0.1:3306/mes_cloud_dy?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+#  url: jdbc:mysql://127.0.0.1:3306/mes_cloud_dy?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
 #  url: jdbc:mysql://127.0.0.1:3306/mes_cloude_npd?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
   url: jdbc:mysql://192.168.9.181:3306/mes_cloud?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
   username: mes_cloud
   password: s2ENj7KaEySTC7dW
 #  username: root
- # password: root
+#  password: root
   testSql: SELECT 1
 
   #  # Oracle 数据库配置(若使用 12c,请修改 /modules/core/pom.xml 文件,打开 12c 依赖,去掉 11g 依赖)
@@ -1056,19 +1056,19 @@ 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)
   uploadPath: 'files1/{yyyy}{MM}/'
   #
   #  # 上传单个文件最大字节(500M),在这之上还有 > Tomcat限制 > Nginx限制,等,此设置会覆盖 spring.http.multipart.maxFileSize 设置
-  #  maxFileSize: '500*1024*1024'
+  maxFileSize: '500*1024*1024'
   #
   #  # 设置允许上传的文件后缀(全局设置)
   #  imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,
   #  mediaAllowSuffixes: .flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,
-  #  fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
+  fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,.exe,
   #
   #  # 允许上传的文件内容类型(图片、word、excel、ppt)防止修改后缀恶意上传文件(默认不启用验证)
   #  #allowContentTypes: image/jpeg,image/gif,image/bmp,image/png,image/x-png,

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

@@ -53,7 +53,7 @@
 								<span class="required hide">*</span> ${text('附件上传')}:</label>
 							<div class="col-sm-10">
 								<#form:fileupload id="uploadFile" bizKey="${mesClient.id}" bizType="mesClient_file"
-									uploadType="all" class="" readonly="false" preview="true"/>
+									uploadType="all" class="" allowSuffixes="exe" maxUploadNum="1" readonly="false" preview="true"/>
 							</div>
 						</div>
 					</div>

+ 6 - 2
src/main/resources/views/modules/mes/mesErpInteractionLogDetail.html

@@ -14,7 +14,7 @@
 				<tbody>
 					<tr>
 						<th class="text-right" style="width:140px;">${text('操作时间')}</th>
-						<td>${mesErpInteractionLog.createDate!, 'yyyy-MM-dd HH:mm:ss')}</td>
+						<td>${mesErpInteractionLog.createDate,dateFormat='yyyy-MM-dd HH:mm:ss'}</td>
 						<th class="text-right" style="width:140px;">${text('操作人')}</th>
 						<td>${mesErpInteractionLog.operatorName!} <span class="text-muted">(${mesErpInteractionLog.operatorCode!})</span></td>
 					</tr>
@@ -35,7 +35,7 @@
 						<td><strong>${mesErpInteractionLog.erpBillNo!}</strong></td>
 						<th class="text-right">${text('结果')}</th>
 						<td>
-							<% if(mesErpInteractionLog.isPushSuccess()){ %>
+							<% if(pushSuccess!){ %>
 							<span class="text-success">${text('成功')}</span>
 							<% } else { %>
 							<span class="text-danger">${text('失败')}</span>
@@ -49,6 +49,10 @@
 						<td>${mesErpInteractionLog.lineCount!} / ${mesErpInteractionLog.totalQty!}</td>
 					</tr>
 					<tr>
+						<th class="text-right">${text('响应时长')}</th>
+						<td colspan="3">${mesErpInteractionLog.responseDurationLabel!}</td>
+					</tr>
+					<tr>
 						<th class="text-right">${text('结果说明')}</th>
 						<td colspan="3">${mesErpInteractionLog.resultMessage!}</td>
 					</tr>

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

@@ -109,6 +109,7 @@ $('#dataGrid').dataGrid({
 			return ok ? '<span class="text-success">${text("成功")}</span>' : '<span class="text-danger">${text("失败")}</span>';
 		}},
 		{header:'${text("结果说明")}', name:'resultMessage', index:'a.result_message', width:280, align:"left"},
+		{header:'${text("响应时长")}', name:'responseDurationLabel', index:'a.response_duration_ms', width:90, align:"center"},
 		{header:'${text("渠道")}', name:'channel', index:'a.channel', width:70, align:"center"}
 	],
 	ajaxSuccess: function(){}