cnf
2025-09-10 1b3db8f5683373dd8e179b006e7314783dd1f9db
WebApi/GS.QC/Service/MesQaMjManager.cs
@@ -1,5 +1,4 @@
using System.Data;
using System.Text;
using System.Text;
using Gs.Entity.BaseInfo;
using Gs.Entity.Sys;
using GS.QC.Models;
@@ -12,6 +11,7 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using SqlSugar;
using System.Data;
namespace GS.QC.Service;
@@ -46,15 +46,14 @@
            var _sbBy =
                new StringBuilder(query.sortName + " " + query.sortOrder);
            var totalCount = 0;
            var itemsList = Db
                .Queryable<MesQaMj, MesItems, SysOrganization, MesSupplier>((a,
                    b, org, d) => new JoinQueryInfos(
                    JoinType.Inner, a.ItemId == b.Id,
                    JoinType.Inner, b.FSubsidiary == org.Fid,
                    JoinType.Left, a.SuppId == d.Id.ToString()
                ))
                .Where(_sbWhere.ToString())
                .OrderBy(_sbBy.ToString())
            var itemsList = Db.Queryable<MesQaMj, MesItems, SysOrganization, MesSupplier>(
                    (a, b, org, d) => new JoinQueryInfos(
                        JoinType.Inner, a.ItemId == b.Id,
                        JoinType.Inner, b.FSubsidiary == org.Fid,
                        JoinType.Left, a.SuppId == d.Id.ToString()
                    ))
                 .Where(_sbWhere.ToString())
                 .OrderBy(_sbBy.ToString())
                .Select((a, b, org, d) => new MesQaMj
                {
                    FSubsidiary = "(" + org.FNumber + ") " + org.Name,
@@ -66,7 +65,7 @@
                .ToPageList(query.currentPage, query.everyPageSize,
                    ref totalCount);
            pageList = new PageList<MesQaMj>(itemsList, totalCount,
                query.everyPageSize);
               query.everyPageSize);
            return ReturnDto<PageList<MesQaMj>>.QuickReturn(pageList,
                ReturnCode.Success, "读取成功");
        }
@@ -87,17 +86,15 @@
        [FromBody] MesQaMj model)
    {
        var m = base.GetById(model.Guid);
        var sbSql = new StringBuilder();
        sbSql.Append(
            "select  i.FSubsidiary,i.[item_name],i.[item_model],i.item_no,mj.SUPP_ID,sup.supp_name,sup.supp_no");
        sbSql.Append(
            " from MES_ITEMS i right join [dbo].[MES_QA_MJ] mj on i.id=mj.ITEM_ID left join [dbo].[MES_SUPPLIER] sup on sup.id=mj.SUPP_ID ");
        System.Text.StringBuilder sbSql = new StringBuilder();
        sbSql.Append("select  i.FSubsidiary,i.[item_name],i.[item_model],i.item_no,mj.SUPP_ID,sup.supp_name,sup.supp_no");
        sbSql.Append(" from MES_ITEMS i right join [dbo].[MES_QA_MJ] mj on i.id=mj.ITEM_ID left join [dbo].[MES_SUPPLIER] sup on sup.id=mj.SUPP_ID ");
        sbSql.Append("  where i.id=" + m.ItemId);
        try
        {
            var dset = new DataSet();
            dset = DbHelperSQL.Query(sbSql.ToString());
            var r = dset.Tables[0].Rows[0];
            DataSet dset = new DataSet();
            dset = Gs.Toolbox.DbHelperSQL.Query(sbSql.ToString());
            System.Data.DataRow r = dset.Tables[0].Rows[0];
            m.FSubsidiary = r["FSubsidiary"].ToString();
            m.ItemNo = r["item_no"].ToString();
            m.suppNo = r["supp_no"].ToString();
@@ -106,7 +103,6 @@
        {
            LogHelper.Debug(ToString(), "GetModel error:" + ex.Message);
        }
        if (m != null)
            return ReturnDto<MesQaMj>.QuickReturn(m,
                ReturnCode.Success, "读取成功!");
@@ -127,25 +123,30 @@
            var cont = 0;
            cont = IsChkOrUnChk(model.Guid.ToString());
            if (cont > 0)
                return ReturnDto<string>.QuickReturn("", ReturnCode.Exception,
                    "修改失败,该信息已被审核!");
                return ReturnDto<string>.QuickReturn("", ReturnCode.Exception, "修改失败,该信息已被审核!");
        }
        try
        {
            //防呆是不是属于同一组织
            string supOrg = "", itemOrg = "";
            supOrg = DbHelperSQL
                .GetSingle(
                    "select top 1 FSubsidiary from MES_SUPPLIER a where a.id=" +
                    model.SuppId).ToString();
            itemOrg = DbHelperSQL
                .GetSingle(
                    "select top 1 FSubsidiary from MES_ITEMS a where a.id=" +
                    model.ItemId).ToString();
            if (supOrg != itemOrg)
                return ReturnDto<string>.QuickReturn("",
                    ReturnCode.Default, "供应商和物料不在同一组织下,请重新选择!");
            // ===== 新增:简化的免检维护校验逻辑 =====
            var validationResult = ValidateItemMaintenance(model);
            if (!validationResult.IsSuccess)
            {
                return ReturnDto<string>.QuickReturn("", ReturnCode.Default, validationResult.Message);
            }
            // ===== 修改:组织一致性校验(仅在有供应商时进行) =====
            // 当没有维护供应商时(全免检),跳过组织校验
            if (!string.IsNullOrEmpty(model.SuppId))
            {
                string supOrg = "", itemOrg = "";
                supOrg = Gs.Toolbox.DbHelperSQL.GetSingle("select top 1 FSubsidiary from MES_SUPPLIER a where a.id=" + model.SuppId.ToString()).ToString();
                itemOrg = Gs.Toolbox.DbHelperSQL.GetSingle("select top 1 FSubsidiary from MES_ITEMS a where a.id=" + model.ItemId.ToString()).ToString();
                if (supOrg != itemOrg)
                {
                    return ReturnDto<string>.QuickReturn("",
                  ReturnCode.Default, "供应商和物料不在同一组织下,请重新选择!");
                }
            }
            Db.Ado.BeginTran();
            if (!UtilityHelper.CheckGuid(model.Guid))
            {
@@ -169,10 +170,9 @@
        }
        catch (Exception ex)
        {
            LogHelper.Debug(ToString(), "EditModel error:" + ex.Message);
            LogHelper.Debug(this.ToString(), "EditModel error:" + ex.Message);
            Db.Ado.RollbackTran();
            return ReturnDto<string>.QuickReturn("", ReturnCode.Exception,
                ex.Message);
            return ReturnDto<string>.QuickReturn("", ReturnCode.Exception, ex.Message);
        }
        return ReturnDto<string>.QuickReturn(model.Guid.ToString(),
@@ -236,4 +236,64 @@
            .Count();
        return cont;
    }
    /// <summary>
    /// ===== 新增方法:简化的免检维护校验逻辑 =====
    /// 业务规则(互斥原则):
    /// 1. 全免检模式:物料不维护供应商(SuppId为空),表示对所有供应商免检
    /// 2. 指定免检模式:物料维护特定供应商,表示仅对指定供应商免检
    /// 3. 两种模式不能共存,一旦选择了一种模式,就不能切换到另一种模式
    /// 4. 同物料+同供应商的记录不允许重复
    /// </summary>
    /// <param name="model">要保存的免检记录</param>
    /// <returns>校验结果</returns>
    private (bool IsSuccess, string Message) ValidateItemMaintenance(MesQaMj model)
    {
        // 查询当前物料的所有免检记录
        var query = Db.Queryable<MesQaMj>()
            .Where(x => x.ItemId == model.ItemId);
        // 如果是编辑操作,排除当前记录避免误判
        if (UtilityHelper.CheckGuid(model.Guid))
        {
            query = query.Where(x => x.Guid != model.Guid);
        }
        var existingRecords = query.ToList();
        bool isCurrentGlobalMode = string.IsNullOrEmpty(model.SuppId); // 当前要保存的是否为全免检模式
        // 检查现有记录的模式
        var hasGlobalRecord = existingRecords.Any(x => string.IsNullOrEmpty(x.SuppId));      // 是否已有全免检记录
        var hasSpecificRecord = existingRecords.Any(x => !string.IsNullOrEmpty(x.SuppId));  // 是否已有指定供应商免检记录
        if (isCurrentGlobalMode)
        {
            // 要保存全免检模式
            if (hasGlobalRecord)
            {
                return (false, "该物料已存在全免检记录,不能重复添加!");
            }
            if (hasSpecificRecord)
            {
                return (false, "该物料已维护了指定供应商免检,不能再设置全免检模式!请继续维护具体供应商。");
            }
        }
        else
        {
            // 要保存指定供应商免检模式
            if (hasGlobalRecord)
            {
                return (false, "该物料已设置为全免检模式,不能再添加指定供应商免检记录!");
            }
            // 检查是否与现有的指定供应商记录重复
            var hasDuplicateSupplier = existingRecords.Any(x => x.SuppId == model.SuppId);
            if (hasDuplicateSupplier)
            {
                return (false, "该物料与该供应商的免检记录已存在,不能重复添加!");
            }
        }
        return (true, ""); // 校验通过
    }
}