Browse Source

新品流程ok

master
常熟吴彦祖 6 days ago
parent
commit
a1598d7a1a
  1. 48
      src/main/java/com/xujie/modules/qms/controller/QcController.java
  2. 95
      src/main/java/com/xujie/modules/qms/data/QcPartAttributeTemplateCopyData.java
  3. 39
      src/main/java/com/xujie/modules/qms/mapper/QcMapper.java
  4. 15
      src/main/java/com/xujie/modules/qms/service/QcService.java
  5. 253
      src/main/java/com/xujie/modules/qms/service/impl/QcServiceImpl.java
  6. 4
      src/main/resources/application-dev.yml
  7. 184
      src/main/resources/mapper/qms/QcMapper.xml

48
src/main/java/com/xujie/modules/qms/controller/QcController.java

@ -803,6 +803,54 @@ public class QcController {
return R.ok();
}
/**
* @description: 查询检验模板复制候选物料只查在用物料并排除源物料自身
* @author: system
* @date: 2026/8/5
* @param: [data]
* @return: com.xujie.common.utils.R
*
* 业务说明
* 1) 用于复制检验模板弹窗内的目标物料清单
* 2) 支持基准料号/物料名称/SKU/item/物料分类1~3名称筛选
* 3) 不按供应商过滤范围为当前 site status='Y' 的全部物料
*/
@PostMapping("/listPartAttributeTemplateCopyTargetParts")
public R listPartAttributeTemplateCopyTargetParts(@RequestBody QcPartAttributeTemplateCopyData data){
List<QcPartAttributeTemplateCopyData> list = qcService.listPartAttributeTemplateCopyTargetParts(data);
return R.ok().put("rows", list).put("total", list.size());
}
/**
* @description: 校验复制目标中已存在检验模板的物料前端用于提示是否覆盖
* @author: system
* @date: 2026/8/5
* @param: [data]
* @return: com.xujie.common.utils.R
*/
@PostMapping("/checkPartAttributeTemplateCopyConflicts")
public R checkPartAttributeTemplateCopyConflicts(@RequestBody QcPartAttributeTemplateCopyData data){
List<QcPartAttributeTemplateCopyData> list = qcService.checkPartAttributeTemplateCopyConflicts(data);
return R.ok().put("rows", list).put("total", list.size());
}
/**
* @description: 复制检验模板主从记录到目标物料可覆盖
* @author: system
* @date: 2026/8/5
* @param: [data]
* @return: com.xujie.common.utils.R
*
* 关键行为
* 1) 覆盖模式先删目标物料既有模板主从记录再复制源物料配置
* 2) 非覆盖模式若目标已存在模板后端直接拦截避免脏写入
*/
@PostMapping("/copyPartAttributeTemplateToParts")
public R copyPartAttributeTemplateToParts(@RequestBody QcPartAttributeTemplateCopyData data){
qcService.copyPartAttributeTemplateToParts(data);
return R.ok();
}
/**
* @description: 物料属性导入
* @author: fengyuan_yang

95
src/main/java/com/xujie/modules/qms/data/QcPartAttributeTemplateCopyData.java

@ -0,0 +1,95 @@
package com.xujie.modules.qms.data;
import com.xujie.common.utils.QueryPage;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 物料检验模板复制请求/响应模型
*
* 业务语义说明
* 1) 本模型服务于/qc-qcPartAttribute页面的模板复制能力
* 2) 复制对象包含
* - 主记录qc_attribute_template检验模板清单
* - 子记录qc_attribute_template_item检验标准明细
* 3) 复制目标物料来源于 part 且仅允许 status = 'Y' 的在用物料
* 4) 覆盖模式下会先删除目标物料既有模板主从记录再复制源物料配置
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QcPartAttributeTemplateCopyData extends QueryPage {
/**
* 站点唯一业务来源前端 user.site
*/
private String site;
/**
* BU编码模板主从表分区字段
*/
private String buNo;
/**
* 源物料编码被复制模板的来源物料
*/
private String sourcePartNo;
/**
* 目标物料编码列表复制到哪些物料
*/
private List<String> targetPartNos;
/**
* 是否覆盖已存在模板
* - false若目标已存在模板则拦截
* - true 先删目标模板主从记录再复制
*/
private Boolean overwriteExisting;
/**
* 操作人用于复制后子表创建/更新人字段回填
*/
private String submitBy;
/**
* 基准料号筛选part.bast_part_no支持模糊匹配
*/
private String basePartNo;
/**
* 物料编码筛选part.part_no支持模糊匹配
*/
private String partNo;
/**
* 物料名称筛选part.part_desc支持模糊匹配
*/
private String partDesc;
/**
* Item筛选part.item支持模糊匹配
*/
private String item;
/**
* SKU筛选part.sku支持模糊匹配
*/
private String sku;
/**
* 物料分类1名称筛选part.category -> part_family.family_name
*/
private String categoryName;
/**
* 物料分类2名称筛选part.category_level2 -> part_family.family_name
*/
private String categoryLevel2Name;
/**
* 物料分类3名称筛选part.category_level3 -> part_family.family_name
*/
private String categoryLevel3Name;
}

39
src/main/java/com/xujie/modules/qms/mapper/QcMapper.java

@ -206,6 +206,45 @@ public interface QcMapper {
int copyQcTemplateDetailedToAttributeTemplateItem(QcTemplateData data);
/**
* 查询检验模板复制候选物料status='Y'排除源物料
*/
List<QcPartAttributeTemplateCopyData> listPartAttributeTemplateCopyTargetParts(QcPartAttributeTemplateCopyData data);
/**
* 按物料编码集合查询在用物料明细用于后端二次校验目标合法性
*/
List<QcPartAttributeTemplateCopyData> listEnabledPartRowsByPartNos(QcPartAttributeTemplateCopyData data);
/**
* 查询目标物料中已存在检验模板的记录
*/
List<QcPartAttributeTemplateCopyData> listPartAttributeTemplateCopyConflicts(QcPartAttributeTemplateCopyData data);
/**
* 查询源物料已绑定的模板主记录
*/
List<QcTemplateData> listPartAttributeTemplateMainByPartNo(@Param("site") String site,
@Param("buNo") String buNo,
@Param("sourcePartNo") String sourcePartNo);
/**
* 复制源物料模板主记录到目标物料
*/
int copyPartAttributeTemplateMainToTarget(@Param("site") String site,
@Param("buNo") String buNo,
@Param("sourcePartNo") String sourcePartNo,
@Param("targetPartNo") String targetPartNo);
/**
* 复制源物料模板检验标准明细到目标物料
*/
int copyPartAttributeTemplateItemToTarget(@Param("site") String site,
@Param("buNo") String buNo,
@Param("sourcePartNo") String sourcePartNo,
@Param("targetPartNo") String targetPartNo,
@Param("submitBy") String submitBy);
QcTemplateData selectTemplateData(QcTemplateData data);
void qcPartAttributeDelete(QcPartAttributeData data);

15
src/main/java/com/xujie/modules/qms/service/QcService.java

@ -135,6 +135,21 @@ public interface QcService {
void qcAttributeTemplateItemSave(QcTemplateData data);
/**
* 查询检验模板复制候选物料仅在用物料且排除源物料
*/
List<QcPartAttributeTemplateCopyData> listPartAttributeTemplateCopyTargetParts(QcPartAttributeTemplateCopyData data);
/**
* 校验目标物料中哪些已存在检验模板用于前端是否覆盖确认
*/
List<QcPartAttributeTemplateCopyData> checkPartAttributeTemplateCopyConflicts(QcPartAttributeTemplateCopyData data);
/**
* 复制源物料检验模板主从记录到目标物料支持覆盖模式
*/
void copyPartAttributeTemplateToParts(QcPartAttributeTemplateCopyData data);
void qcPartAttributeDelete(QcPartAttributeData data);
PageUtils qcFamilyAttributeSearch(QcPartAttributeData data);

253
src/main/java/com/xujie/modules/qms/service/impl/QcServiceImpl.java

@ -70,6 +70,7 @@ import java.util.stream.Collectors;
@Slf4j
public class QcServiceImpl implements QcService {
private static final String TEMPLATE_SUPPLIER_WILDCARD = "*";
private static final String PART_ATTRIBUTE_TYPE_MATERIAL = "A";
//记录日志使用
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
@ -1102,6 +1103,117 @@ public class QcServiceImpl implements QcService {
return list;
}
/**
* 查询检验模板复制候选物料
*
* 关键约束
* 1) 只返回 status='Y' 的在用物料
* 2) 排除源物料自身避免出现复制到自己
* 3) 不按供应商过滤按用户要求支持全在用物料范围
* 4) 支持基准料号/物料名称/SKU/item/物料分类1~3名称筛选
*/
@Override
public List<QcPartAttributeTemplateCopyData> listPartAttributeTemplateCopyTargetParts(QcPartAttributeTemplateCopyData data) {
normalizeAndValidateCopyContext(data, true);
trimCopyQueryFields(data);
return qcMapper.listPartAttributeTemplateCopyTargetParts(data);
}
/**
* 校验目标物料中已存在模板的冲突数据
*
* 返回值用途
* - 前端据此展示以下物料已经有检验模板是否覆盖的确认提示
*/
@Override
public List<QcPartAttributeTemplateCopyData> checkPartAttributeTemplateCopyConflicts(QcPartAttributeTemplateCopyData data) {
normalizeAndValidateCopyContext(data, true);
List<String> targetPartNos = normalizeCopyTargetPartNos(data.getTargetPartNos(), data.getSourcePartNo());
if (targetPartNos.isEmpty()) {
throw new RuntimeException("请至少选择一个目标物料");
}
data.setTargetPartNos(targetPartNos);
validateAllTargetPartsEnabled(data, targetPartNos);
return qcMapper.listPartAttributeTemplateCopyConflicts(data);
}
/**
* 执行模板复制
*
* 业务流程
* 1) 校验源物料是否存在模板主记录
* 2) 校验目标物料均为在用物料且不包含源物料
* 3) 非覆盖模式若任一目标已有模板则直接拦截
* 4) 覆盖模式先删目标模板主从记录再复制源模板主从记录
* 5) 若目标物料尚未建立 qc_part_attribute 主记录则自动补建保证后续页面可见
*/
@Override
@Transactional
public void copyPartAttributeTemplateToParts(QcPartAttributeTemplateCopyData data) {
normalizeAndValidateCopyContext(data, true);
String submitBy = StringUtils.trimToEmpty(data.getSubmitBy());
if (StringUtils.isBlank(submitBy)) {
throw new RuntimeException("操作人不能为空");
}
List<String> targetPartNos = normalizeCopyTargetPartNos(data.getTargetPartNos(), data.getSourcePartNo());
if (targetPartNos.isEmpty()) {
throw new RuntimeException("请至少选择一个目标物料");
}
data.setTargetPartNos(targetPartNos);
// 防止前端绕过筛选条件手工构造请求后端再次校验目标物料必须真实存在且为在用
validateAllTargetPartsEnabled(data, targetPartNos);
// 源模板必须存在否则复制没有业务意义
List<QcTemplateData> sourceTemplateRows = qcMapper.listPartAttributeTemplateMainByPartNo(
data.getSite(), data.getBuNo(), data.getSourcePartNo());
if (sourceTemplateRows == null || sourceTemplateRows.isEmpty()) {
throw new RuntimeException("源物料未维护检验模板,无法复制");
}
List<QcPartAttributeTemplateCopyData> conflictRows = qcMapper.listPartAttributeTemplateCopyConflicts(data);
boolean overwriteExisting = Boolean.TRUE.equals(data.getOverwriteExisting());
if (!overwriteExisting && conflictRows != null && !conflictRows.isEmpty()) {
throw new RuntimeException("以下物料已经有检验模板,请确认覆盖后重试:" + joinPartNos(conflictRows));
}
// 逐个目标复制保证每个目标物料的主从记录完整迁移
for (String targetPartNo : targetPartNos) {
QcPartAttributeData targetPartAttribute = buildTargetPartAttributeForCopy(data, targetPartNo, submitBy);
QcPartAttributeData existsPartAttribute = qcMapper.selectPartAttributeByNo(targetPartAttribute);
if (existsPartAttribute == null) {
// 补建物料属性主记录避免复制后在物料属性列表不可见
qcMapper.qcPartAttributeSave(targetPartAttribute);
}
if (overwriteExisting) {
// 覆盖模式必须先删旧记录避免历史模板残留导致重复/脏数据
qcMapper.deletePartAttributeTemplate(targetPartAttribute);
qcMapper.deleteQcAttributeTemplateItemByAttribute(targetPartAttribute);
}
int copiedMainCount = qcMapper.copyPartAttributeTemplateMainToTarget(
data.getSite(), data.getBuNo(), data.getSourcePartNo(), targetPartNo);
if (copiedMainCount <= 0) {
throw new RuntimeException("复制失败:目标物料[" + targetPartNo + "]未生成模板主记录");
}
// 子表检验标准按源物料覆盖表复制若源物料未维护覆盖表系统会回退到模板默认明细读取
qcMapper.copyPartAttributeTemplateItemToTarget(
data.getSite(), data.getBuNo(), data.getSourcePartNo(), targetPartNo, submitBy);
// 统一刷新目标物料属性的更新时间便于前端列表和审计追踪
QcTemplateData updateTimeData = new QcTemplateData();
updateTimeData.setSite(data.getSite());
updateTimeData.setBuNo(data.getBuNo());
updateTimeData.setAttributeNo(targetPartNo);
updateTimeData.setAttributeType(PART_ATTRIBUTE_TYPE_MATERIAL);
updateTimeData.setUpdateBy(submitBy);
qcMapper.updatePartAttributeTime(updateTimeData);
}
}
/**
* 新增物料属性模板
**/
@ -1295,7 +1407,7 @@ public class QcServiceImpl implements QcService {
* 3) 校验放在 Service 层且与保存同事务避免前端并发或绕过页面导致脏数据入库
*/
private void validateSingleTemplatePerPartAndInspectionType(QcTemplateData partData) {
if (!"A".equals(partData.getAttributeType())) {
if (!PART_ATTRIBUTE_TYPE_MATERIAL.equals(partData.getAttributeType())) {
return;
}
if (StringUtils.isBlank(partData.getInspectionTypeNo())) {
@ -1311,7 +1423,7 @@ public class QcServiceImpl implements QcService {
* 首次绑定模板时将模板默认明细复制到物料模板明细覆盖表
*/
private void copyPartAttributeTemplateItemsIfNeed(QcTemplateData partData, QcTemplateData requestData) {
if (!"A".equals(partData.getAttributeType())) {
if (!PART_ATTRIBUTE_TYPE_MATERIAL.equals(partData.getAttributeType())) {
return;
}
QcTemplateData query = new QcTemplateData();
@ -1340,7 +1452,7 @@ public class QcServiceImpl implements QcService {
return;
}
if (StringUtils.isBlank(data.getAttributeType())) {
data.setAttributeType("A");
data.setAttributeType(PART_ATTRIBUTE_TYPE_MATERIAL);
}
Integer bindCount = qcMapper.countPartAttributeTemplateByTemplateKey(data);
if (bindCount == null || bindCount == 0) {
@ -1353,6 +1465,141 @@ public class QcServiceImpl implements QcService {
}
}
/**
* 标准化并校验复制上下文的基础参数
*
* @param requireSourcePart 是否强制要求传 sourcePartNo列表查询/校验/复制场景均建议为 true
*/
private void normalizeAndValidateCopyContext(QcPartAttributeTemplateCopyData data, boolean requireSourcePart) {
if (data == null) {
throw new RuntimeException("复制参数不能为空");
}
data.setSite(StringUtils.trimToEmpty(data.getSite()));
data.setBuNo(StringUtils.trimToEmpty(data.getBuNo()));
data.setSourcePartNo(StringUtils.trimToEmpty(data.getSourcePartNo()));
if (StringUtils.isBlank(data.getSite())) {
throw new RuntimeException("site不能为空");
}
if (StringUtils.isBlank(data.getBuNo())) {
throw new RuntimeException("buNo不能为空");
}
if (requireSourcePart && StringUtils.isBlank(data.getSourcePartNo())) {
throw new RuntimeException("源物料编码不能为空");
}
}
/**
* 统一去除查询字符串两端空格避免看起来相同但实际有空格导致筛选偏差
*/
private void trimCopyQueryFields(QcPartAttributeTemplateCopyData data) {
data.setBasePartNo(StringUtils.trimToEmpty(data.getBasePartNo()));
data.setPartNo(StringUtils.trimToEmpty(data.getPartNo()));
data.setPartDesc(StringUtils.trimToEmpty(data.getPartDesc()));
data.setItem(StringUtils.trimToEmpty(data.getItem()));
data.setSku(StringUtils.trimToEmpty(data.getSku()));
data.setCategoryName(StringUtils.trimToEmpty(data.getCategoryName()));
data.setCategoryLevel2Name(StringUtils.trimToEmpty(data.getCategoryLevel2Name()));
data.setCategoryLevel3Name(StringUtils.trimToEmpty(data.getCategoryLevel3Name()));
}
/**
* 规范化目标物料编码列表
* 1) 去空值
* 2) 去重按不区分大小写
* 3) 排除源物料自身
*/
private List<String> normalizeCopyTargetPartNos(List<String> rawTargetPartNos, String sourcePartNo) {
if (rawTargetPartNos == null || rawTargetPartNos.isEmpty()) {
return Collections.emptyList();
}
String sourceKey = StringUtils.trimToEmpty(sourcePartNo).toUpperCase(Locale.ROOT);
LinkedHashMap<String, String> normalizedMap = new LinkedHashMap<>();
for (String partNo : rawTargetPartNos) {
String normalizedPartNo = StringUtils.trimToEmpty(partNo);
if (StringUtils.isBlank(normalizedPartNo)) {
continue;
}
String key = normalizedPartNo.toUpperCase(Locale.ROOT);
if (StringUtils.isNotBlank(sourceKey) && sourceKey.equals(key)) {
continue;
}
normalizedMap.putIfAbsent(key, normalizedPartNo);
}
return new ArrayList<>(normalizedMap.values());
}
/**
* 校验目标物料是否全部为在用物料
*
* 失败场景
* - 目标编码不存在
* - 目标编码存在但 status != 'Y'
* - 前端绕过页面限制手工提交非法编码
*/
private void validateAllTargetPartsEnabled(QcPartAttributeTemplateCopyData data, List<String> targetPartNos) {
if (targetPartNos == null || targetPartNos.isEmpty()) {
throw new RuntimeException("请至少选择一个目标物料");
}
List<QcPartAttributeTemplateCopyData> enabledRows = qcMapper.listEnabledPartRowsByPartNos(data);
Set<String> enabledPartNoSet = new HashSet<>();
if (enabledRows != null) {
for (QcPartAttributeTemplateCopyData row : enabledRows) {
if (row != null && StringUtils.isNotBlank(row.getPartNo())) {
enabledPartNoSet.add(row.getPartNo().trim().toUpperCase(Locale.ROOT));
}
}
}
List<String> invalidPartNos = new ArrayList<>();
for (String targetPartNo : targetPartNos) {
String key = StringUtils.trimToEmpty(targetPartNo).toUpperCase(Locale.ROOT);
if (!enabledPartNoSet.contains(key)) {
invalidPartNos.add(targetPartNo);
}
}
if (!invalidPartNos.isEmpty()) {
throw new RuntimeException("以下物料不存在或非在用状态,不允许复制:" + String.join("、", invalidPartNos));
}
}
/**
* 组装目标物料的 qc_part_attribute 主记录
*
* 注意
* - 仅当目标尚未维护主记录时才会插入
* - 插入时不覆盖业务备注默认空字符串避免误带源物料备注语义
*/
private QcPartAttributeData buildTargetPartAttributeForCopy(QcPartAttributeTemplateCopyData data,
String targetPartNo,
String submitBy) {
QcPartAttributeData targetPartAttribute = new QcPartAttributeData();
targetPartAttribute.setSite(data.getSite());
targetPartAttribute.setBuNo(data.getBuNo());
targetPartAttribute.setPartNo(targetPartNo);
targetPartAttribute.setAttributeType(PART_ATTRIBUTE_TYPE_MATERIAL);
targetPartAttribute.setAttributeRemark("");
targetPartAttribute.setExemptInspection("");
targetPartAttribute.setCreateBy(submitBy);
targetPartAttribute.setUpdateBy(submitBy);
return targetPartAttribute;
}
/**
* 冲突列表转文本便于异常提示和日志定位
*/
private String joinPartNos(List<QcPartAttributeTemplateCopyData> rows) {
if (rows == null || rows.isEmpty()) {
return "";
}
List<String> partNos = rows.stream()
.filter(Objects::nonNull)
.map(QcPartAttributeTemplateCopyData::getPartNo)
.filter(StringUtils::isNotBlank)
.map(String::trim)
.distinct()
.collect(Collectors.toList());
return String.join("、", partNos);
}
/**
* 物料属性导入
**/

4
src/main/resources/application-dev.yml

@ -4,8 +4,8 @@ spring:
druid:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:sqlserver://192.168.1.90:1433;databaseName=krd_srm
# url: jdbc:sqlserver://xujiesoft.vicp.net:11515;databaseName=krd_srm
# url: jdbc:sqlserver://192.168.1.90:1433;databaseName=krd_srm
url: jdbc:sqlserver://xujiesoft.vicp.net:11515;databaseName=krd_srm
username: sa
password: XJsoft123
initial-size: 10

184
src/main/resources/mapper/qms/QcMapper.xml

@ -1464,6 +1464,190 @@
)
</insert>
<!-- 查询“模板复制”候选物料:全量在用物料(status='Y'),并排除源物料 -->
<select id="listPartAttributeTemplateCopyTargetParts"
parameterType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData"
resultType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData">
SELECT
p.part_no AS partNo,
p.part_desc AS partDesc,
p.item AS item,
p.sku AS sku,
p.bast_part_no AS basePartNo,
pf1.family_name AS categoryName,
pf2.family_name AS categoryLevel2Name,
pf3.family_name AS categoryLevel3Name
FROM part p
LEFT JOIN part_family pf1 ON p.site = pf1.site AND p.category = pf1.family_id
LEFT JOIN part_family pf2 ON p.site = pf2.site AND p.category_level2 = pf2.family_id
LEFT JOIN part_family pf3 ON p.site = pf3.site AND p.category_level3 = pf3.family_id
<where>
p.site = #{site}
AND p.status = 'Y'
<if test="sourcePartNo != null and sourcePartNo != ''">
AND p.part_no <![CDATA[<>]]> #{sourcePartNo}
</if>
<if test="basePartNo != null and basePartNo != ''">
AND p.bast_part_no LIKE '%' + #{basePartNo} + '%'
</if>
<if test="partNo != null and partNo != ''">
AND p.part_no LIKE '%' + #{partNo} + '%'
</if>
<if test="partDesc != null and partDesc != ''">
AND p.part_desc LIKE '%' + #{partDesc} + '%'
</if>
<if test="item != null and item != ''">
AND p.item LIKE '%' + #{item} + '%'
</if>
<if test="sku != null and sku != ''">
AND p.sku LIKE '%' + #{sku} + '%'
</if>
<if test="categoryName != null and categoryName != ''">
AND pf1.family_name LIKE '%' + #{categoryName} + '%'
</if>
<if test="categoryLevel2Name != null and categoryLevel2Name != ''">
AND pf2.family_name LIKE '%' + #{categoryLevel2Name} + '%'
</if>
<if test="categoryLevel3Name != null and categoryLevel3Name != ''">
AND pf3.family_name LIKE '%' + #{categoryLevel3Name} + '%'
</if>
</where>
ORDER BY p.part_no
</select>
<!-- 后端防绕过校验:仅返回目标集合中“在用且存在”的物料 -->
<select id="listEnabledPartRowsByPartNos"
parameterType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData"
resultType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData">
SELECT
p.part_no AS partNo,
p.part_desc AS partDesc,
p.item AS item,
p.sku AS sku,
p.bast_part_no AS basePartNo,
pf1.family_name AS categoryName,
pf2.family_name AS categoryLevel2Name,
pf3.family_name AS categoryLevel3Name
FROM part p
LEFT JOIN part_family pf1 ON p.site = pf1.site AND p.category = pf1.family_id
LEFT JOIN part_family pf2 ON p.site = pf2.site AND p.category_level2 = pf2.family_id
LEFT JOIN part_family pf3 ON p.site = pf3.site AND p.category_level3 = pf3.family_id
WHERE p.site = #{site}
AND p.status = 'Y'
AND p.part_no IN
<foreach collection="targetPartNos" item="partNo" open="(" close=")" separator=",">
#{partNo}
</foreach>
ORDER BY p.part_no
</select>
<!-- 冲突校验:目标物料中哪些已经维护过检验模板 -->
<select id="listPartAttributeTemplateCopyConflicts"
parameterType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData"
resultType="com.xujie.modules.qms.data.QcPartAttributeTemplateCopyData">
SELECT DISTINCT
p.part_no AS partNo,
p.part_desc AS partDesc,
p.item AS item,
p.sku AS sku,
p.bast_part_no AS basePartNo,
pf1.family_name AS categoryName,
pf2.family_name AS categoryLevel2Name,
pf3.family_name AS categoryLevel3Name
FROM qc_attribute_template qat
INNER JOIN part p
ON qat.site = p.site
AND qat.attribute_no = p.part_no
LEFT JOIN part_family pf1 ON p.site = pf1.site AND p.category = pf1.family_id
LEFT JOIN part_family pf2 ON p.site = pf2.site AND p.category_level2 = pf2.family_id
LEFT JOIN part_family pf3 ON p.site = pf3.site AND p.category_level3 = pf3.family_id
WHERE qat.site = #{site}
AND qat.bu_no = #{buNo}
AND qat.attribute_type = 'A'
AND p.part_no IN
<foreach collection="targetPartNos" item="partNo" open="(" close=")" separator=",">
#{partNo}
</foreach>
ORDER BY p.part_no
</select>
<!-- 查询源物料模板主记录(复制前必须存在) -->
<select id="listPartAttributeTemplateMainByPartNo" resultType="com.xujie.modules.qms.data.QcTemplateData">
SELECT
site,
bu_no AS buNo,
attribute_no AS attributeNo,
template_id AS templateId,
sampling_level_no AS samplingLevelNo,
inspection_cycle AS inspectionCycle,
sampling_programme_no AS samplingProgrammeNo,
AQL AS aql,
AC AS ac,
RE AS re,
attribute_type AS attributeType,
operation,
manufacturer_id AS manufacturerID,
resource_id AS resourceID,
inspection_type_no AS inspectionTypeNo
FROM qc_attribute_template
WHERE site = #{site}
AND bu_no = #{buNo}
AND attribute_no = #{sourcePartNo}
AND attribute_type = 'A'
</select>
<!-- 复制模板主记录:将源物料 qc_attribute_template 复制到目标物料 -->
<insert id="copyPartAttributeTemplateMainToTarget">
INSERT INTO qc_attribute_template
(attribute_no, template_id, sampling_level_no, inspection_cycle, sampling_programme_no, AQL, AC, RE,
attribute_type, operation, manufacturer_id, resource_id, site, bu_no, inspection_type_no)
SELECT
#{targetPartNo},
template_id,
sampling_level_no,
inspection_cycle,
sampling_programme_no,
AQL,
AC,
RE,
attribute_type,
operation,
manufacturer_id,
resource_id,
site,
bu_no,
inspection_type_no
FROM qc_attribute_template
WHERE site = #{site}
AND bu_no = #{buNo}
AND attribute_no = #{sourcePartNo}
AND attribute_type = 'A'
</insert>
<!-- 复制模板检验标准明细:将源物料 qc_attribute_template_item 复制到目标物料 -->
<insert id="copyPartAttributeTemplateItemToTarget">
INSERT INTO qc_attribute_template_item
(site, bu_no, attribute_no, template_id, item_no, default_value, max_value, min_value, order_id, create_by, create_time, update_by, update_date)
SELECT
site,
bu_no,
#{targetPartNo},
template_id,
item_no,
default_value,
max_value,
min_value,
order_id,
#{submitBy},
getDate(),
#{submitBy},
getDate()
FROM qc_attribute_template_item
WHERE site = #{site}
AND bu_no = #{buNo}
AND attribute_no = #{sourcePartNo}
</insert>
<!-- 查询模板的基础数据 -->
<select id="selectTemplateData" resultType="com.xujie.modules.qms.data.QcTemplateData" parameterType="com.xujie.modules.qms.data.QcTemplateData">
SELECT

Loading…
Cancel
Save