Explorar el Código

● feat(piecework): 新增piecework_date字段修复计件统计时间问题
问题:
- mes_product_record使用update_date统计计件
- 后续修改/复检会更新update_date
- 导致历史记录被错误统计到当天
解决方案:
- 新增piecework_date字段记录首次加工完成时间
- 仅在content从UDF首次变为OK/NG时记录
- 后续修改不影响piecework_date
- 计件统计改用piecework_date过滤
改动文件:
- Entity: MesProductRecord.java (新增字段+getter/setter)
- Service: MesProductRecordService.java (save逻辑+3个统计方法)
- DDL: mes_product_record表新增piecework_date字段
计件规则:OK和NG都计件,按首次完成时间统计,避免重复计件
需要先执行DDL: mescloud/db/ddl-piecework-date.sql

wangxichen hace 23 horas
padre
commit
4cbb542cf9

+ 28 - 0
db/ddl-piecework-date.sql

@@ -0,0 +1,28 @@
+-- T09计件统计修复 - DDL脚本
+-- 执行时间:2026-07-17
+-- 目标库:mes_cloud_t09
+
+-- 1. 新增 piecework_date 字段
+ALTER TABLE mes_product_record
+ADD COLUMN piecework_date DATETIME NULL
+COMMENT '计件时间(首次加工完成时间)'
+AFTER update_date;
+
+-- 2. 添加索引提升查询性能
+CREATE INDEX idx_piecework_oprno_date
+ON mes_product_record(oprno, piecework_date, craft);
+
+-- 3. 历史数据迁移(已完成的记录用 update_date 初始化)
+UPDATE mes_product_record
+SET piecework_date = update_date
+WHERE craft = '100000'
+  AND content NOT IN ('UDF', '')
+  AND piecework_date IS NULL;
+
+-- 验证查询
+SELECT
+    COUNT(*) as total,
+    SUM(CASE WHEN piecework_date IS NOT NULL THEN 1 ELSE 0 END) as has_piecework_date,
+    SUM(CASE WHEN content = 'UDF' THEN 1 ELSE 0 END) as udf_count
+FROM mes_product_record
+WHERE craft = '100000';

+ 10 - 0
src/main/java/com/jeesite/modules/mes/entity/MesProductRecord.java

@@ -43,6 +43,7 @@ import java.util.List;
 		@Column(name="create_date", attrName="createDate", label="create_date", isUpdate=false,  isUpdateForce=true),
 		@Column(name="update_by", attrName="updateBy", label="update_by", isQuery=false),
 		@Column(name="update_date", attrName="updateDate", label="update_date", isUpdateForce=true),
+		@Column(name="piecework_date", attrName="pieceworkDate", label="计件时间"),
 	},
 //		joinTable={
 //		@JoinTable(type= JoinTable.Type.JOIN, entity=MesTemplateItems.class, attrName="this", alias="b",
@@ -77,6 +78,7 @@ public class MesProductRecord extends DataEntity<MesProductRecord> {
 	private String tid;
 	private Long cdate;
 	private Date updateDate;
+	private Date pieceworkDate;  // 计件时间(首次加工完成时间)
 	private String lineSn;
 	private String zcontent;
 	private String ngType;
@@ -265,6 +267,14 @@ public class MesProductRecord extends DataEntity<MesProductRecord> {
 		this.updateDate = updateDate;
 	}
 
+	public Date getPieceworkDate() {
+		return pieceworkDate;
+	}
+
+	public void setPieceworkDate(Date pieceworkDate) {
+		this.pieceworkDate = pieceworkDate;
+	}
+
 	public String getLineSn() {
 		return lineSn;
 	}

+ 19 - 6
src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java

@@ -128,6 +128,19 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		if (StringUtils.isEmpty(mesProductRecord.getSource())) {
 			mesProductRecord.setSource("0");
 		}
+
+		// 计件时间逻辑:首次从UDF变为OK或NG时,记录计件时间
+		if (!StringUtils.isEmpty(mesProductRecord.getId())) {
+			MesProductRecord oldRecord = super.get(mesProductRecord);
+			if (oldRecord != null
+				&& "UDF".equals(oldRecord.getContent())
+				&& !"UDF".equals(mesProductRecord.getContent())
+				&& !StringUtils.isEmpty(mesProductRecord.getContent())
+				&& mesProductRecord.getPieceworkDate() == null) {
+				mesProductRecord.setPieceworkDate(new Date());
+			}
+		}
+
 		super.save(mesProductRecord);
 	}
 	public Long insertBatch(List<MesProductRecord> mesProductRecordList,int num) {
@@ -1373,8 +1386,8 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 				.and("a.oprno",QueryType.RIGHT_LIKE,oprno)
 				.and("craft",QueryType.EQ,"100000")
 				.and("content",QueryType.NE,"UDF")
-				.and("update_date", QueryType.GTE,sdate)
-				.and("update_date",QueryType.LT,edate);
+				.and("piecework_date", QueryType.GTE,sdate)
+				.and("piecework_date",QueryType.LT,edate);
 		Long jpp1 = super.findCount(mesProductRecord);
 		return String.valueOf(jpp1);
 	}
@@ -1386,8 +1399,8 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 		mesProductRecord.getSqlMap().getWhere()
 				.and("a.oprno",QueryType.RIGHT_LIKE,oprno)
 				.and("craft",QueryType.EQ,"100000")
-				.and("update_date", QueryType.GTE,sdate)
-				.and("update_date",QueryType.LT,edate);
+				.and("piecework_date", QueryType.GTE,sdate)
+				.and("piecework_date",QueryType.LT,edate);
 		Long jpp1 = super.findCount(mesProductRecord);
 		return String.valueOf(jpp1);
 	}
@@ -1400,8 +1413,8 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 				.and("a.sn",QueryType.RIGHT_LIKE,type)
 				.and("a.oprno",QueryType.RIGHT_LIKE,oprno)
 				.and("craft",QueryType.EQ,"100000")
-				.and("update_date", QueryType.GTE,sdate)
-				.and("update_date",QueryType.LT,edate);
+				.and("piecework_date", QueryType.GTE,sdate)
+				.and("piecework_date",QueryType.LT,edate);
 		Long jpp1 = super.findCount(mesProductRecord);
 		return String.valueOf(jpp1);
 	}