Browse Source

QMS项目优化

master
shenzhouyu 4 weeks ago
parent
commit
7bcb5ba04e
  1. 5
      cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java
  2. 10
      cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java
  3. 178
      cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java
  4. 3
      cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java
  5. 116
      cclqms-java/src/main/resources/mapper/pms/QcMapper.xml

5
cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java

@ -192,6 +192,8 @@ public class QcFAIRecordData extends QueryPage {
private String poItemNo; // 关联单行号
// 子明细数据数量
private Integer subDetailRecordNum;
/** 采集标识(来自检验项目 eam_properties_item.collection_flag) */
private String collectionFlag;
// 加工中心
private String workCenterNo;
// 加工中心
@ -355,4 +357,7 @@ public class QcFAIRecordData extends QueryPage {
private BigDecimal pendingInspectQty;
private BigDecimal inspectedQty;
private Date arrivalDate;
/** 检验模块:iqc/ipqc/fqc/sqc/fqas(oqc) */
private String qcModule;
}

10
cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java

@ -82,6 +82,8 @@ public interface QcMapper {
void updateIPQCDetailedRecord(QcFAIRecordData data);
void patchIPQCDetailedItemResult(QcFAIRecordData data);
void updateIPQCMasterSubmitFlag(QcFAIRecordData data);
void updateIPQCDetailSubmitFlag(QcFAIRecordData data);
@ -136,6 +138,8 @@ public interface QcMapper {
void updateIQCDetailedRecord(QcFAIRecordData data);
void patchIQCDetailedItemResult(QcFAIRecordData data);
List<QcFAIRecordData> checkIQCDetail(QcFAIRecordData data);
QcFAIRecordData checkIQCIsSubmit(SubDetailValues data);
@ -190,6 +194,8 @@ public interface QcMapper {
void updateFQCDetailedRecord(QcFAIRecordData data);
void patchFQCDetailedItemResult(QcFAIRecordData data);
void updateFQCMasterSubmitFlag(QcFAIRecordData qcData);
void updateFQCDetailSubmitFlag(QcFAIRecordData qcData);
@ -393,6 +399,8 @@ public interface QcMapper {
void updateSQCDetailedRecord(QcFAIRecordData data);
void patchSQCDetailedItemResult(QcFAIRecordData data);
void updateSQCMasterSubmitFlag(QcFAIRecordData data);
void updateSQCDetailSubmitFlag(QcFAIRecordData data);
@ -586,6 +594,8 @@ public interface QcMapper {
void updateFQASDetailedRecord(QcFAIRecordData qcFAIRecordData);
void patchFQASDetailedItemResult(QcFAIRecordData data);
QcFAIRecordData getFQASInspectionRecord(QcFAIRecordData data);
void updateFQASMasterSubmitFlag(QcFAIRecordData record);

178
cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java

@ -706,11 +706,9 @@ public class QcServiceImpl implements QcService {
List<SubDetailValues> subDetailValues = data.getSubDetailValues();
// 删除子明细的老数据
qcMapper.delFQCSubDetailedRecord(data);
if (subDetailValues.isEmpty()) {
return null;
}
// 统计是否有不符合上下限得值
Integer count = 0;
if (subDetailValues != null && !subDetailValues.isEmpty()) {
// 统计是否有不符合上下限得值
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
@ -752,6 +750,8 @@ public class QcServiceImpl implements QcService {
qcMapper.saveFQCSubDetailed(subList);
}
}
syncDetailItemResultFromSubDetail("fqc", data, count);
return count;
}
@ -1031,11 +1031,9 @@ public class QcServiceImpl implements QcService {
List<SubDetailValues> subDetailValues = data.getSubDetailValues();
// 删除子明细的老数据
qcMapper.delIPQCSubDetailedRecord(data);
if (subDetailValues.isEmpty()) {
return null;
}
// 统计是否有不符合上下限得值
Integer count = 0;
if (subDetailValues != null && !subDetailValues.isEmpty()) {
// 统计是否有不符合上下限得值
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
@ -1078,6 +1076,8 @@ public class QcServiceImpl implements QcService {
qcMapper.saveIPQCSubDetailed(subList);
}
}
syncDetailItemResultFromSubDetail("ipqc", data, count);
return count;
}
@ -1243,10 +1243,8 @@ public class QcServiceImpl implements QcService {
public Integer saveSQCSubDetailed(QcSubDetailInformationData data) {
List<SubDetailValues> subDetailValues = data.getSubDetailValues();
qcMapper.delSQCSubDetailedRecord(data);
if (subDetailValues.isEmpty()) {
return null;
}
Integer count = 0;
if (subDetailValues != null && !subDetailValues.isEmpty()) {
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
@ -1281,6 +1279,8 @@ public class QcServiceImpl implements QcService {
List<SubDetailValues> subList = subDetailValues.subList(i, end);
qcMapper.saveSQCSubDetailed(subList);
}
}
syncDetailItemResultFromSubDetail("sqc", data, count);
return count;
}
@ -1856,6 +1856,80 @@ public class QcServiceImpl implements QcService {
// }
}
/**
* 实测值变更后即时应用单条明细结论/实测值落库
**/
@Override
@Transactional
public void applyQcDetailedItem(QcFAIRecordData data) {
String qcModule = data.getQcModule();
if (qcModule == null || qcModule.trim().isEmpty()) {
throw new RuntimeException("qcModule is required");
}
if (data.getItemNo() != null) {
data.setItemNo(data.getItemNo().trim());
}
QcFAIRecordData currentRecord = getRecordStatusByModule(data, qcModule);
if (currentRecord != null && ("Y".equals(currentRecord.getSubmitFlag()) || "已完成".equals(currentRecord.getState()))) {
throw new RuntimeException(pmsI18nHelper.text("pms.error.inspection.approved.noModify", null, "该检验单已审核完成,无法修改!"));
}
switch (qcModule.trim().toLowerCase()) {
case "iqc":
qcMapper.patchIQCDetailedItemResult(data);
break;
case "ipqc":
qcMapper.patchIPQCDetailedItemResult(data);
break;
case "fqc":
qcMapper.patchFQCDetailedItemResult(data);
break;
case "sqc":
qcMapper.patchSQCDetailedItemResult(data);
break;
case "fqas":
case "oqc":
qcMapper.patchFQASDetailedItemResult(data);
break;
default:
throw new RuntimeException("unsupported qcModule: " + qcModule);
}
}
/** 子明细保存后同步项目检验结论/不合格数到明细主表 */
private void syncDetailItemResultFromSubDetail(String qcModule, QcSubDetailInformationData data, Integer count) {
if (data == null || data.getItemNo() == null || data.getItemNo().trim().isEmpty()) {
return;
}
int unqualified = count == null ? 0 : count;
QcFAIRecordData record = new QcFAIRecordData();
record.setSite(data.getSite());
record.setBuNo(data.getBuNo());
record.setInspectionNo(data.getInspectionNo());
record.setItemNo(data.getItemNo().trim());
record.setUnqualifiedQuantity(BigDecimal.valueOf(unqualified));
record.setItemResult(unqualified > 0 ? "N" : "Y");
record.setQcModule(qcModule);
applyQcDetailedItem(record);
}
private QcFAIRecordData getRecordStatusByModule(QcFAIRecordData data, String qcModule) {
switch (qcModule.trim().toLowerCase()) {
case "iqc":
return qcMapper.getIQCRecordStatus(data);
case "ipqc":
return qcMapper.getIPQCRecordStatus(data);
case "fqc":
return qcMapper.getFQCRecordStatus(data);
case "sqc":
return qcMapper.getSQCRecordStatus(data);
case "fqas":
case "oqc":
return qcMapper.getFQASRecordStatus(data);
default:
return null;
}
}
/**
* 检查是否已提交
**/
@ -1878,53 +1952,53 @@ public class QcServiceImpl implements QcService {
List<SubDetailValues> subDetailValues = data.getSubDetailValues();
// 删除子明细的老数据
qcMapper.delIQCSubDetailedRecord(data);
if (subDetailValues.isEmpty()) {
return null;
}
// 统计是否有不符合上下限得值
Integer count = 0;
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
subDetailValues.get(i).setInspectionNo(data.getInspectionNo());
subDetailValues.get(i).setItemNo(data.getItemNo());
// 如果该项目维护了上下限且实测值类型为数值
if ("N".equals(data.getValueTypeDb()) && (data.getMaxValue() != null || data.getMinValue() != null)) {
// 如果实际填入值为数值
if (isNumberString(subDetailValues.get(i).getSubDetailValue())) {
BigDecimal value = new BigDecimal(subDetailValues.get(i).getSubDetailValue());
// 只维护上限
if (data.getMaxValue() != null && data.getMinValue() == null) {
if (value.compareTo(data.getMaxValue()) > 0) {
count ++;
if (subDetailValues != null && !subDetailValues.isEmpty()) {
// 统计是否有不符合上下限得值
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
subDetailValues.get(i).setInspectionNo(data.getInspectionNo());
subDetailValues.get(i).setItemNo(data.getItemNo());
// 如果该项目维护了上下限且实测值类型为数值
if ("N".equals(data.getValueTypeDb()) && (data.getMaxValue() != null || data.getMinValue() != null)) {
// 如果实际填入值为数值
if (isNumberString(subDetailValues.get(i).getSubDetailValue())) {
BigDecimal value = new BigDecimal(subDetailValues.get(i).getSubDetailValue());
// 只维护上限
if (data.getMaxValue() != null && data.getMinValue() == null) {
if (value.compareTo(data.getMaxValue()) > 0) {
count ++;
}
}
}
// 只维护下限
if (data.getMaxValue() == null && data.getMinValue() != null) {
if (value.compareTo(data.getMinValue()) < 0) {
count ++;
// 只维护下限
if (data.getMaxValue() == null && data.getMinValue() != null) {
if (value.compareTo(data.getMinValue()) < 0) {
count ++;
}
}
}
// 同时维护上下限
if (data.getMaxValue() != null && data.getMinValue() != null) {
if (value.compareTo(data.getMaxValue()) > 0 || value.compareTo(data.getMinValue()) < 0) {
count ++;
// 同时维护上下限
if (data.getMaxValue() != null && data.getMinValue() != null) {
if (value.compareTo(data.getMaxValue()) > 0 || value.compareTo(data.getMinValue()) < 0) {
count ++;
}
}
} else {
count ++;
}
} else {
count ++;
}
}
}
// 分批插入
int batchSize = 150; // 假设每批200条记录
for (int i = 0; i < subDetailValues.size(); i += batchSize) {
int end = Math.min(i + batchSize, subDetailValues.size());
List<SubDetailValues> subList = subDetailValues.subList(i, end);
qcMapper.saveIQCSubDetailed(subList);
// 分批插入
int batchSize = 150; // 假设每批200条记录
for (int i = 0; i < subDetailValues.size(); i += batchSize) {
int end = Math.min(i + batchSize, subDetailValues.size());
List<SubDetailValues> subList = subDetailValues.subList(i, end);
qcMapper.saveIQCSubDetailed(subList);
}
}
syncDetailItemResultFromSubDetail("iqc", data, count);
return count;
}
@ -5017,11 +5091,9 @@ public class QcServiceImpl implements QcService {
List<SubDetailValues> subDetailValues = data.getSubDetailValues();
// 删除子明细的老数据
qcMapper.delFQASSubDetailedRecord(data);
if (subDetailValues.isEmpty()) {
return null;
}
// 统计是否有不符合上下限得值
Integer count = 0;
if (subDetailValues != null && !subDetailValues.isEmpty()) {
// 统计是否有不符合上下限得值
for (int i = 0; i < subDetailValues.size(); i++) {
subDetailValues.get(i).setSite(data.getSite());
subDetailValues.get(i).setBuNo(data.getBuNo());
@ -5057,6 +5129,8 @@ public class QcServiceImpl implements QcService {
}
// 新增子明细新数据
qcMapper.saveFQASSubDetailed(subDetailValues);
}
syncDetailItemResultFromSubDetail("oqc", data, count);
return count;
}

3
cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java

@ -84,6 +84,9 @@ public interface QcService {
void saveIQCDetailedRecord(QcFAIRecordData data);
/** 实测值变更后即时应用单条明细(结论/实测值落库) */
void applyQcDetailedItem(QcFAIRecordData data);
Integer checkIQCIsSubmit(SubDetailValues data);
Integer saveIQCSubDetailed(QcSubDetailInformationData data);

116
cclqms-java/src/main/resources/mapper/pms/QcMapper.xml

@ -704,7 +704,14 @@
c.method_name,
c.method_remark,
sw.color_code as qcSpecWarningColorCode,
sw.threshold_value as qcSpecWarningThresholdValue
sw.threshold_value as qcSpecWarningThresholdValue,
(SELECT TOP 1 epi.collection_flag
FROM eam_properties_item epi
WHERE epi.site = a.site
AND epi.bu_no = a.bu_no
AND RTRIM(epi.ItemNo) = RTRIM(a.item_no)
ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END,
epi.inspection_type_no) AS collectionFlag
FROM qc_ipqc_detailed_record as a
LEFT JOIN qc_ipqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no
OUTER APPLY (
@ -799,6 +806,20 @@
WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo}
</update>
<update id="patchIPQCDetailedItemResult" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_ipqc_detailed_record
<set>
<if test="itemResult != null and itemResult != ''">item_result = #{itemResult},</if>
<if test="unqualifiedQuantity != null">unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL},</if>
<if test="numberValue != null">number_value = #{numberValue,jdbcType=DECIMAL},</if>
<if test="textValue != null">text_value = #{textValue},</if>
</set>
WHERE inspection_no = #{inspectionNo}
and RTRIM(item_no) = RTRIM(#{itemNo})
and site = #{site}
and bu_no = #{buNo}
</update>
<!-- 修改IPQC主记录标识为已提交 -->
<update id="updateIPQCMasterSubmitFlag" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_ipqc_record
@ -1115,7 +1136,14 @@
c.method_name,
c.method_remark,
sw.color_code as qcSpecWarningColorCode,
sw.threshold_value as qcSpecWarningThresholdValue
sw.threshold_value as qcSpecWarningThresholdValue,
(SELECT TOP 1 epi.collection_flag
FROM eam_properties_item epi
WHERE epi.site = a.site
AND epi.bu_no = a.bu_no
AND RTRIM(epi.ItemNo) = RTRIM(a.item_no)
ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END,
epi.inspection_type_no) AS collectionFlag
FROM qc_sqc_detailed_record as a
LEFT JOIN qc_sqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no
OUTER APPLY (
@ -1206,6 +1234,20 @@
WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo}
</update>
<update id="patchSQCDetailedItemResult" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_sqc_detailed_record
<set>
<if test="itemResult != null and itemResult != ''">item_result = #{itemResult},</if>
<if test="unqualifiedQuantity != null">unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL},</if>
<if test="numberValue != null">number_value = #{numberValue,jdbcType=DECIMAL},</if>
<if test="textValue != null">text_value = #{textValue},</if>
</set>
WHERE inspection_no = #{inspectionNo}
and RTRIM(item_no) = RTRIM(#{itemNo})
and site = #{site}
and bu_no = #{buNo}
</update>
<update id="updateSQCMasterSubmitFlag" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_sqc_record
SET submit_flag = 'Y',
@ -1907,7 +1949,14 @@
c.method_remark,
sw.color_code as qcSpecWarningColorCode,
sw.threshold_value as qcSpecWarningThresholdValue,
a.sampling_qty
a.sampling_qty,
(SELECT TOP 1 epi.collection_flag
FROM eam_properties_item epi
WHERE epi.site = a.site
AND epi.bu_no = a.bu_no
AND RTRIM(epi.ItemNo) = RTRIM(a.item_no)
ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END,
epi.inspection_type_no) AS collectionFlag
FROM qc_iqc_detailed_record as a
LEFT JOIN qc_iqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no
OUTER APPLY (
@ -1993,6 +2042,21 @@
WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo}
</update>
<!-- 部分更新IQC明细(实测值/结论即时落库,避免 null 覆盖其他字段) -->
<update id="patchIQCDetailedItemResult" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_iqc_detailed_record
<set>
<if test="itemResult != null and itemResult != ''">item_result = #{itemResult},</if>
<if test="unqualifiedQuantity != null">unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL},</if>
<if test="numberValue != null">number_value = #{numberValue,jdbcType=DECIMAL},</if>
<if test="textValue != null">text_value = #{textValue},</if>
</set>
WHERE inspection_no = #{inspectionNo}
and RTRIM(item_no) = RTRIM(#{itemNo})
and site = #{site}
and bu_no = #{buNo}
</update>
<!-- 查询该记录明细是否已存在 -->
<select id="checkIQCDetail" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData" resultType="com.gaotao.modules.pms.data.QcFAIRecordData">
SELECT inspection_no,
@ -2352,7 +2416,14 @@
c.method_name,
c.method_remark,
sw.color_code as qcSpecWarningColorCode,
sw.threshold_value as qcSpecWarningThresholdValue
sw.threshold_value as qcSpecWarningThresholdValue,
(SELECT TOP 1 epi.collection_flag
FROM eam_properties_item epi
WHERE epi.site = a.site
AND epi.bu_no = a.bu_no
AND RTRIM(epi.ItemNo) = RTRIM(a.item_no)
ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END,
epi.inspection_type_no) AS collectionFlag
FROM qc_fqc_detailed_record as a
LEFT JOIN qc_fqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no
OUTER APPLY (
@ -2447,6 +2518,20 @@
WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo}
</update>
<update id="patchFQCDetailedItemResult" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_fqc_detailed_record
<set>
<if test="itemResult != null and itemResult != ''">item_result = #{itemResult},</if>
<if test="unqualifiedQuantity != null">unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL},</if>
<if test="numberValue != null">number_value = #{numberValue,jdbcType=DECIMAL},</if>
<if test="textValue != null">text_value = #{textValue},</if>
</set>
WHERE inspection_no = #{inspectionNo}
and RTRIM(item_no) = RTRIM(#{itemNo})
and site = #{site}
and bu_no = #{buNo}
</update>
<!-- 修改FQC主记录标识为已提交 -->
<update id="updateFQCMasterSubmitFlag" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_fqc_record
@ -4739,7 +4824,14 @@
c.method_remark,
sw.color_code as qcSpecWarningColorCode,
sw.threshold_value as qcSpecWarningThresholdValue,
a.sampling_qty
a.sampling_qty,
(SELECT TOP 1 epi.collection_flag
FROM eam_properties_item epi
WHERE epi.site = a.site
AND epi.bu_no = a.bu_no
AND RTRIM(epi.ItemNo) = RTRIM(a.item_no)
ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END,
epi.inspection_type_no) AS collectionFlag
FROM qc_oqc_detailed_record as a
LEFT JOIN qc_oqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no
OUTER APPLY (
@ -4821,6 +4913,20 @@
WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo}
</update>
<update id="patchFQASDetailedItemResult" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData">
UPDATE qc_oqc_detailed_record
<set>
<if test="itemResult != null and itemResult != ''">item_result = #{itemResult},</if>
<if test="unqualifiedQuantity != null">unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL},</if>
<if test="numberValue != null">number_value = #{numberValue,jdbcType=DECIMAL},</if>
<if test="textValue != null">text_value = #{textValue},</if>
</set>
WHERE inspection_no = #{inspectionNo}
and RTRIM(item_no) = RTRIM(#{itemNo})
and site = #{site}
and bu_no = #{buNo}
</update>
<!-- 查询FQAS主记录信息 -->
<select id="getFQASInspectionRecord" parameterType="com.gaotao.modules.pms.data.QcFAIRecordData" resultType="com.gaotao.modules.pms.data.QcFAIRecordData">
SELECT

Loading…
Cancel
Save