zjh
2025-11-17 cfb616bf02b554b185f04bf92a8b8af489490102
StandardPda/MES.Service/service/Warehouse/WomdaaManager.cs
@@ -740,5 +740,183 @@
            return result;
        }
        public string[] SyncStackCodeFromApi(string stackCode, string loginId)
        {
            string[] msg = new string[2];
            msg[0] = "true";
            var sqlHelper = new OracleSQLHelper();
            var (conn, tran) = sqlHelper.BeginTransaction();
            try
            {
                // ---------------------------
                // 1. 判断是否已入库(IS_INBOUND = 1)
                // ---------------------------
                string sqlCheck = @"
            SELECT COUNT(*)
              FROM MES_PALLET_BINDING
             WHERE STACKCODE = :stackCode
               AND IS_INBOUND = 1";
                int count = Convert.ToInt32(sqlHelper.ExecuteScalarWithTransaction(
                    conn,
                    tran,
                    sqlCheck,
                    new[] { new OracleParameter(":stackCode", stackCode) }
                ));
                if (count > 0)
                {
                    msg[0] = "false";
                    msg[1] = $"该栈板已入库,不允许重新绑定!栈板码:{stackCode}";
                    tran.Rollback();
                    return msg;
                }
                // ---------------------------
                // 2. 调用接口获取最新 SN 列表
                // ---------------------------
                var apiUrl = "http://no2api.dream-maker.com/storage/getTransferList";
                var reqObj = new { stackCode = stackCode };
                string jsonReq = Newtonsoft.Json.JsonConvert.SerializeObject(reqObj);
                string apiResult = HttpHelper.HttpPost(apiUrl, jsonReq);
                var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(apiResult);
                if ((int)obj.code != 0)
                {
                    msg[0] = "false";
                    msg[1] = "接口返回错误:" + (string)obj.msg;
                    tran.Rollback();
                    return msg;
                }
                var snList = obj.data.snList;
                if (snList == null || snList.Count == 0)
                {
                    msg[0] = "false";
                    msg[1] = "接口返回SN列表为空!";
                    tran.Rollback();
                    return msg;
                }
                // ---------------------------
                // 3. 删除旧绑定
                // ---------------------------
                string sqlDelete = @"DELETE FROM MES_PALLET_BINDING WHERE STACKCODE = :stackCode";
                sqlHelper.ExecuteNonQueryWithTransaction(
                    sqlDelete,
                    new[] { new OracleParameter(":stackCode", stackCode) },
                    conn,
                    tran
                );
                // ---------------------------
                // 4. 批量插入(方式 1:提前处理 transitTime)
                // ---------------------------
                int rowCount = snList.Count;
                string[] arrSnNo = new string[rowCount];
                string[] arrStackCode = new string[rowCount];
                string[] arrLoginId = new string[rowCount];
                string[] arrCreatedBy = new string[rowCount];
                DateTime?[] arrTransitTime = new DateTime?[rowCount];
                string[] arrLineNo = new string[rowCount];
                for (int i = 0; i < rowCount; i++)
                {
                    arrSnNo[i] = (string)snList[i].snNo;
                    arrStackCode[i] = stackCode;
                    arrLoginId[i] = loginId;
                    arrCreatedBy[i] = loginId;
                    arrLineNo[i] = (string)snList[i].lineNo;
                    // ------------------------
                    // transitTime 转换(关键)
                    // ------------------------
                    string timeStr = (string)snList[i].transitTime;
                    if (string.IsNullOrWhiteSpace(timeStr))
                    {
                        arrTransitTime[i] = null;
                    }
                    else
                    {
                        DateTime dt;
                        if (DateTime.TryParse(timeStr, out dt))
                            arrTransitTime[i] = dt;
                        else
                            arrTransitTime[i] = null;  // 非法时间直接置空
                    }
                }
                string sqlBatchInsert = @"
            INSERT INTO MES_PALLET_BINDING
            (ID, STACKCODE, LOGIN_ID, SN_NO, TICKET_NO, MEDIUMBOXCODE, CREATE_DATE, CREATED_BY, BIND_TRANSIT_TIME, LINE_NO)
            VALUES
            (
                SEQ_MES_PALLET_BINDING_ID.NEXTVAL,
                :STACKCODE,
                :LOGIN_ID,
                :SN_NO,
                NULL,
                NULL,
                SYSDATE,
                :CREATED_BY,
                :BIND_TRANSIT_TIME,
                :LINE_NO
            )";
                using (OracleCommand cmd = (OracleCommand)conn.CreateCommand())
                {
                    cmd.Transaction = (OracleTransaction)tran;
                    cmd.CommandText = sqlBatchInsert;
                    cmd.ArrayBindCount = rowCount;
                    cmd.Parameters.Add(new OracleParameter(":STACKCODE", arrStackCode));
                    cmd.Parameters.Add(new OracleParameter(":LOGIN_ID", arrLoginId));
                    cmd.Parameters.Add(new OracleParameter(":SN_NO", arrSnNo));
                    cmd.Parameters.Add(new OracleParameter(":CREATED_BY", arrCreatedBy));
                    // 关键:null 会自动存为 Oracle NULL
                    var pTransit = new OracleParameter(":BIND_TRANSIT_TIME", OracleDbType.Date);
                    pTransit.Value = arrTransitTime;
                    cmd.Parameters.Add(pTransit);
                    cmd.Parameters.Add(new OracleParameter(":LINE_NO", arrLineNo));
                    cmd.ExecuteNonQuery();
                }
                // ---------------------------
                // 5. 提交事务
                // ---------------------------
                tran.Commit();
                msg[1] = "同步成功!";
            }
            catch (Exception ex)
            {
                tran.Rollback();
                msg[0] = "false";
                msg[1] = ex.Message;
                throw;
            }
            finally
            {
                sqlHelper.CloseConnection(conn);
            }
            return msg;
        }
    }
}